feat(ext/sw): parse + commit handlers for LastPass import
parse_lastpass_csv is a pure pass-through to the WASM bridge. import_lastpass_commit re-mints each item's ID via state.wasm.new_item_id() (same pattern as add_item), encrypts and writes per-item via git.writeFile, then writes the manifest last. Per-item commits + a final manifest commit — extension GitHost has no atomic-batch API, so the single-commit semantics the CLI provides aren't replicable here. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -507,6 +507,52 @@ export async function handle(
|
|||||||
return { ok: false, error: (e as Error).message };
|
return { ok: false, error: (e as Error).message };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'parse_lastpass_csv': {
|
||||||
|
try {
|
||||||
|
const json: string = state.wasm.parse_lastpass_csv_json(new Uint8Array(msg.bytes));
|
||||||
|
const parsed = JSON.parse(json) as {
|
||||||
|
items: Item[];
|
||||||
|
warnings: Array<{ row: number; title?: string; message: string }>;
|
||||||
|
};
|
||||||
|
return { ok: true, data: parsed };
|
||||||
|
} catch (e) {
|
||||||
|
return { ok: false, error: (e as Error).message };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'import_lastpass_commit': {
|
||||||
|
const handle = session.getCurrent();
|
||||||
|
if (!handle || !state.gitHost || !state.manifest) return { ok: false, error: 'vault_locked' };
|
||||||
|
if (msg.items.length === 0) return { ok: false, error: 'no items to import' };
|
||||||
|
|
||||||
|
try {
|
||||||
|
const total = msg.items.length;
|
||||||
|
for (let i = 0; i < msg.items.length; i++) {
|
||||||
|
const item = msg.items[i];
|
||||||
|
// Items arrive with IDs already minted by the WASM bridge. We
|
||||||
|
// overwrite that with a fresh extension-generated ID so the SW
|
||||||
|
// remains the single ID-issuance authority for new items in the
|
||||||
|
// remote — same pattern as `add_item`.
|
||||||
|
const id = state.wasm.new_item_id();
|
||||||
|
const reIdItem: Item = { ...item, id };
|
||||||
|
|
||||||
|
await vault.encryptAndWriteItem(
|
||||||
|
state.gitHost, handle, id, reIdItem,
|
||||||
|
`import: ${reIdItem.title} (${i + 1}/${total})`,
|
||||||
|
);
|
||||||
|
state.manifest.items[id] = itemToManifestEntry(reIdItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
await vault.encryptAndWriteManifest(
|
||||||
|
state.gitHost, handle, state.manifest,
|
||||||
|
`manifest: import ${total} items from LastPass`,
|
||||||
|
);
|
||||||
|
return { ok: true, data: { summary: { itemCount: total } } };
|
||||||
|
} catch (e) {
|
||||||
|
return { ok: false, error: (e as Error).message };
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user