@synap-core/cli 1.11.0 → 1.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -198
- package/dist/build-info.json +6 -0
- package/dist/commands/agent-run.js +3 -2
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/agents.d.ts +33 -17
- package/dist/commands/agents.js +203 -237
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/app.d.ts +143 -0
- package/dist/commands/app.js +523 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/automate.d.ts +21 -0
- package/dist/commands/automate.js +42 -0
- package/dist/commands/automate.js.map +1 -0
- package/dist/commands/automation-schema.test.d.ts +16 -0
- package/dist/commands/automation-schema.test.js +77 -0
- package/dist/commands/automation-schema.test.js.map +1 -0
- package/dist/commands/automation.d.ts +12 -0
- package/dist/commands/automation.js +80 -35
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/bridge-setup.d.ts +14 -1
- package/dist/commands/bridge-setup.js +392 -128
- package/dist/commands/bridge-setup.js.map +1 -1
- package/dist/commands/cap-connections.d.ts +4 -4
- package/dist/commands/cap-connections.js +14 -14
- package/dist/commands/cap-connections.js.map +1 -1
- package/dist/commands/capability.d.ts +2 -0
- package/dist/commands/capability.js +218 -168
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/catalog.d.ts +275 -0
- package/dist/commands/catalog.js +481 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/cell.d.ts +155 -8
- package/dist/commands/cell.js +416 -40
- package/dist/commands/cell.js.map +1 -1
- package/dist/commands/centrality.js +1 -13
- package/dist/commands/centrality.js.map +1 -1
- package/dist/commands/connect.d.ts +38 -13
- package/dist/commands/connect.js +68 -167
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.d.ts +3 -2
- package/dist/commands/connections.js +95 -25
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/context.js +7 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +193 -23
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +293 -20
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +66 -4
- package/dist/commands/diagnose.js +285 -28
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/doc.d.ts +11 -4
- package/dist/commands/doc.js +39 -14
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +112 -3
- package/dist/commands/doctor.js +657 -32
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.js +5 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/import.d.ts +368 -13
- package/dist/commands/import.js +1064 -54
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +20 -9
- package/dist/commands/init.js +433 -973
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +1 -0
- package/dist/commands/keys.js +15 -2
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/knowledge.d.ts +22 -6
- package/dist/commands/knowledge.js +117 -55
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +192 -71
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +29 -2
- package/dist/commands/market-authoring.js +348 -7
- package/dist/commands/market-authoring.js.map +1 -1
- package/dist/commands/market-official.d.ts +58 -0
- package/dist/commands/market-official.js +84 -0
- package/dist/commands/market-official.js.map +1 -0
- package/dist/commands/market.d.ts +400 -16
- package/dist/commands/market.js +1802 -146
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +60 -25
- package/dist/commands/mcp.js +251 -64
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/open.d.ts +39 -9
- package/dist/commands/open.js +80 -25
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/playbook.d.ts +42 -0
- package/dist/commands/playbook.js +162 -0
- package/dist/commands/playbook.js.map +1 -0
- package/dist/commands/pod.js +1 -1
- package/dist/commands/pod.js.map +1 -1
- package/dist/commands/pods.d.ts +5 -0
- package/dist/commands/pods.js +97 -116
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +62 -0
- package/dist/commands/proposals-actions.js +143 -8
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/proposals-await.d.ts +68 -0
- package/dist/commands/proposals-await.js +248 -0
- package/dist/commands/proposals-await.js.map +1 -0
- package/dist/commands/proton-setup.d.ts +73 -0
- package/dist/commands/proton-setup.js +577 -0
- package/dist/commands/proton-setup.js.map +1 -0
- package/dist/commands/providers.d.ts +23 -0
- package/dist/commands/providers.js +126 -1
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/raycast.js +6 -2
- package/dist/commands/raycast.js.map +1 -1
- package/dist/commands/rule.d.ts +150 -0
- package/dist/commands/rule.js +447 -0
- package/dist/commands/rule.js.map +1 -0
- package/dist/commands/session-wait.d.ts +111 -0
- package/dist/commands/session-wait.js +209 -0
- package/dist/commands/session-wait.js.map +1 -0
- package/dist/commands/sessions.d.ts +52 -0
- package/dist/commands/sessions.js +478 -58
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +136 -19
- package/dist/commands/skill-manage.js.map +1 -1
- package/dist/commands/skills.js +16 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +1 -4
- package/dist/commands/status.js +5 -34
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.backoff.test.d.ts +13 -0
- package/dist/commands/statusline.backoff.test.js +100 -0
- package/dist/commands/statusline.backoff.test.js.map +1 -0
- package/dist/commands/statusline.js +16 -9
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/sync-status.d.ts +12 -0
- package/dist/commands/sync-status.js +125 -0
- package/dist/commands/sync-status.js.map +1 -0
- package/dist/commands/templates-retire.d.ts +34 -0
- package/dist/commands/templates-retire.js +192 -0
- package/dist/commands/templates-retire.js.map +1 -0
- package/dist/commands/tools.js +6 -21
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/tracks.d.ts +51 -0
- package/dist/commands/tracks.js +291 -0
- package/dist/commands/tracks.js.map +1 -0
- package/dist/commands/update.d.ts +3 -11
- package/dist/commands/update.js +5 -134
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upload.d.ts +41 -3
- package/dist/commands/upload.js +120 -18
- package/dist/commands/upload.js.map +1 -1
- package/dist/commands/vendor.d.ts +28 -0
- package/dist/commands/vendor.js +110 -0
- package/dist/commands/vendor.js.map +1 -0
- package/dist/commands/versions.js +6 -0
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/view.js +10 -5
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/whoami.d.ts +23 -3
- package/dist/commands/whoami.js +169 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker.d.ts +122 -0
- package/dist/commands/worker.js +435 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/commands/worker.test.d.ts +1 -0
- package/dist/commands/worker.test.js +116 -0
- package/dist/commands/worker.test.js.map +1 -0
- package/dist/commands/workspace-ops.d.ts +35 -0
- package/dist/commands/workspace-ops.js +153 -0
- package/dist/commands/workspace-ops.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +900 -180
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-connections.d.ts +31 -0
- package/dist/lib/agent-connections.js +33 -0
- package/dist/lib/agent-connections.js.map +1 -0
- package/dist/lib/agent-detect.d.ts +27 -0
- package/dist/lib/agent-detect.js +71 -0
- package/dist/lib/agent-detect.js.map +1 -0
- package/dist/lib/agent-door.d.ts +138 -0
- package/dist/lib/agent-door.js +426 -0
- package/dist/lib/agent-door.js.map +1 -0
- package/dist/lib/agents-config.d.ts +2 -0
- package/dist/lib/agents-config.js +4 -9
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +31 -2
- package/dist/lib/approval-poll.js +20 -7
- package/dist/lib/approval-poll.js.map +1 -1
- package/dist/lib/atomic-file.d.ts +48 -0
- package/dist/lib/atomic-file.js +129 -0
- package/dist/lib/atomic-file.js.map +1 -0
- package/dist/lib/auth.d.ts +14 -9
- package/dist/lib/auth.js +44 -61
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/batch-approval.d.ts +85 -0
- package/dist/lib/batch-approval.js +170 -0
- package/dist/lib/batch-approval.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +6 -5
- package/dist/lib/capture-lane.js +6 -5
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +230 -11
- package/dist/lib/capture-structure.js +251 -13
- package/dist/lib/capture-structure.js.map +1 -1
- package/dist/lib/catalog-templates.d.ts +59 -0
- package/dist/lib/catalog-templates.js +126 -0
- package/dist/lib/catalog-templates.js.map +1 -0
- package/dist/lib/cli-build.d.ts +19 -0
- package/dist/lib/cli-build.js +37 -0
- package/dist/lib/cli-build.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +18 -0
- package/dist/lib/conversation-headers.js +32 -0
- package/dist/lib/conversation-headers.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +167 -11
- package/dist/lib/cp-packages.js +253 -21
- package/dist/lib/cp-packages.js.map +1 -1
- package/dist/lib/credential-class.d.ts +117 -0
- package/dist/lib/credential-class.js +116 -0
- package/dist/lib/credential-class.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +35 -0
- package/dist/lib/describe-lens.js +40 -0
- package/dist/lib/describe-lens.js.map +1 -1
- package/dist/lib/device-connect.d.ts +125 -0
- package/dist/lib/device-connect.js +256 -0
- package/dist/lib/device-connect.js.map +1 -0
- package/dist/lib/directory-lens.d.ts +99 -0
- package/dist/lib/directory-lens.js +187 -0
- package/dist/lib/directory-lens.js.map +1 -0
- package/dist/lib/exporter-coverage.d.ts +71 -0
- package/dist/lib/exporter-coverage.js +97 -0
- package/dist/lib/exporter-coverage.js.map +1 -0
- package/dist/lib/hub-client.d.ts +29 -8
- package/dist/lib/hub-client.js +328 -55
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/init-connect.d.ts +41 -0
- package/dist/lib/init-connect.js +75 -0
- package/dist/lib/init-connect.js.map +1 -0
- package/dist/lib/init-exit.d.ts +24 -0
- package/dist/lib/init-exit.js +41 -0
- package/dist/lib/init-exit.js.map +1 -0
- package/dist/lib/init-flow.d.ts +25 -0
- package/dist/lib/init-flow.js +40 -0
- package/dist/lib/init-flow.js.map +1 -0
- package/dist/lib/init-handoff.d.ts +16 -0
- package/dist/lib/init-handoff.js +19 -0
- package/dist/lib/init-handoff.js.map +1 -0
- package/dist/lib/init-output.d.ts +18 -0
- package/dist/lib/init-output.js +43 -0
- package/dist/lib/init-output.js.map +1 -0
- package/dist/lib/init-pod.d.ts +45 -0
- package/dist/lib/init-pod.js +36 -0
- package/dist/lib/init-pod.js.map +1 -0
- package/dist/lib/installed.d.ts +210 -11
- package/dist/lib/installed.js +234 -36
- package/dist/lib/installed.js.map +1 -1
- package/dist/lib/key-approval.d.ts +57 -0
- package/dist/lib/key-approval.js +117 -0
- package/dist/lib/key-approval.js.map +1 -0
- package/dist/lib/key-diagnosis.d.ts +56 -0
- package/dist/lib/key-diagnosis.js +227 -0
- package/dist/lib/key-diagnosis.js.map +1 -0
- package/dist/lib/key-doctor.d.ts +136 -0
- package/dist/lib/key-doctor.js +286 -0
- package/dist/lib/key-doctor.js.map +1 -0
- package/dist/lib/key-locations.d.ts +120 -0
- package/dist/lib/key-locations.js +326 -0
- package/dist/lib/key-locations.js.map +1 -0
- package/dist/lib/key-source.d.ts +66 -0
- package/dist/lib/key-source.js +106 -0
- package/dist/lib/key-source.js.map +1 -0
- package/dist/lib/key-state.d.ts +70 -0
- package/dist/lib/key-state.js +115 -0
- package/dist/lib/key-state.js.map +1 -0
- package/dist/lib/kind-package.d.ts +181 -0
- package/dist/lib/kind-package.js +679 -0
- package/dist/lib/kind-package.js.map +1 -0
- package/dist/lib/knowledge-title.d.ts +24 -0
- package/dist/lib/knowledge-title.js +46 -0
- package/dist/lib/knowledge-title.js.map +1 -0
- package/dist/lib/knowledge-title.test.d.ts +1 -0
- package/dist/lib/knowledge-title.test.js +34 -0
- package/dist/lib/knowledge-title.test.js.map +1 -0
- package/dist/lib/machine-instance.d.ts +64 -0
- package/dist/lib/machine-instance.js +142 -0
- package/dist/lib/machine-instance.js.map +1 -0
- package/dist/lib/mcp-bridge.d.ts +42 -0
- package/dist/lib/mcp-bridge.js +147 -0
- package/dist/lib/mcp-bridge.js.map +1 -0
- package/dist/lib/mcp-bridge.test.d.ts +1 -0
- package/dist/lib/mcp-bridge.test.js +90 -0
- package/dist/lib/mcp-bridge.test.js.map +1 -0
- package/dist/lib/mcp-call.d.ts +30 -0
- package/dist/lib/mcp-call.js +107 -0
- package/dist/lib/mcp-call.js.map +1 -0
- package/dist/lib/mcp-snippets.d.ts +53 -0
- package/dist/lib/mcp-snippets.js +82 -0
- package/dist/lib/mcp-snippets.js.map +1 -0
- package/dist/lib/next-steps.d.ts +8 -0
- package/dist/lib/next-steps.js +31 -1
- package/dist/lib/next-steps.js.map +1 -1
- package/dist/lib/package-wire.d.ts +179 -0
- package/dist/lib/package-wire.js +68 -0
- package/dist/lib/package-wire.js.map +1 -0
- package/dist/lib/pair-link.d.ts +38 -0
- package/dist/lib/pair-link.js +68 -0
- package/dist/lib/pair-link.js.map +1 -0
- package/dist/lib/pod-wide.d.ts +40 -0
- package/dist/lib/pod-wide.js +46 -0
- package/dist/lib/pod-wide.js.map +1 -0
- package/dist/lib/pod.d.ts +66 -112
- package/dist/lib/pod.js +134 -412
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +9 -3
- package/dist/lib/project-ref.js +10 -4
- package/dist/lib/project-ref.js.map +1 -1
- package/dist/lib/review-credential.d.ts +119 -0
- package/dist/lib/review-credential.js +147 -0
- package/dist/lib/review-credential.js.map +1 -0
- package/dist/lib/safe-open.d.ts +49 -0
- package/dist/lib/safe-open.js +119 -0
- package/dist/lib/safe-open.js.map +1 -0
- package/dist/lib/session-lens.d.ts +40 -1
- package/dist/lib/session-lens.js +54 -4
- package/dist/lib/session-lens.js.map +1 -1
- package/dist/lib/superwhisper-import.d.ts +8 -0
- package/dist/lib/superwhisper-import.js +14 -7
- package/dist/lib/superwhisper-import.js.map +1 -1
- package/dist/lib/superwhisper-title.test.d.ts +1 -0
- package/dist/lib/superwhisper-title.test.js +18 -0
- package/dist/lib/superwhisper-title.test.js.map +1 -0
- package/dist/lib/targets.d.ts +134 -10
- package/dist/lib/targets.js +962 -258
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-file.d.ts +4 -0
- package/dist/lib/template-file.js.map +1 -1
- package/dist/lib/template-lifecycle.d.ts +217 -0
- package/dist/lib/template-lifecycle.js +433 -0
- package/dist/lib/template-lifecycle.js.map +1 -0
- package/dist/lib/template-steps.d.ts +88 -0
- package/dist/lib/template-steps.js +118 -0
- package/dist/lib/template-steps.js.map +1 -0
- package/dist/lib/time-ago.d.ts +2 -0
- package/dist/lib/time-ago.js +15 -0
- package/dist/lib/time-ago.js.map +1 -0
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +23 -17
- package/skills/README.md +12 -10
- package/skills/agent-os/SKILL.md +214 -99
- package/skills/manifest.json +1 -1
- package/skills/onboard/SKILL.md +55 -26
- package/skills/synap/README.md +5 -8
- package/skills/synap/SKILL.md +1086 -283
- package/skills/synap/_order.txt +7 -0
- package/skills/synap/_skill.yaml +1 -1
- package/skills/synap/automations.md +15 -0
- package/skills/synap/capture.md +5 -0
- package/skills/synap/cli-operations.md +24 -18
- package/skills/synap/concepts.md +28 -0
- package/skills/synap/content-os.md +10 -1
- package/skills/synap/creative-loop.md +15 -10
- package/skills/synap/crm.md +21 -52
- package/skills/synap/document-embeds.md +141 -47
- package/skills/synap/escalation-ladder.md +20 -10
- package/skills/synap/focus-sessions.md +47 -21
- package/skills/synap/from-intent.md +142 -0
- package/skills/synap/governance-rules.md +4 -4
- package/skills/synap/governance.md +10 -7
- package/skills/synap/hand-off.md +33 -0
- package/skills/synap/inline-patterns.md +15 -7
- package/skills/synap/lenses.md +33 -15
- package/skills/synap/linking.md +41 -40
- package/skills/synap/mcp-remote-servers.md +64 -0
- package/skills/synap/mental-model.md +17 -15
- package/skills/synap/operating-mode-rules.md +1 -1
- package/skills/synap/processes.md +118 -0
- package/skills/synap/quick-reference.md +5 -1
- package/skills/synap/reading.md +3 -1
- package/skills/synap/reflexes.md +12 -42
- package/skills/synap/viewframe-cells.md +38 -5
- package/skills/synap/work-flow.md +1 -1
- package/skills/synap/work-model.md +96 -0
- package/skills/synap/worked-examples.md +4 -5
- package/skills/synap/workspace-design.md +14 -10
- package/skills/synap/writes.md +97 -24
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +2 -2
- package/skills/synap-app/_skill.yaml +1 -1
- package/skills/synap-app/install-commands.md +1 -1
- package/skills/synap-design/SKILL.md +474 -0
- package/skills/synap-design/_order.txt +4 -0
- package/skills/synap-design/_skill.yaml +21 -0
- package/skills/synap-design/loop.md +134 -0
- package/skills/synap-design/overview.md +44 -0
- package/skills/synap-design/principles.md +130 -0
- package/skills/synap-design/system.md +133 -0
- package/skills/synap-market/SKILL.md +306 -16
- package/skills/synap-market/_skill.yaml +1 -1
- package/skills/synap-market/author-and-publish.md +145 -8
- package/skills/synap-market/governance-and-catalog.md +7 -0
- package/skills/synap-market/install.md +79 -1
- package/skills/synap-market/overview.md +74 -6
- package/skills/synap-schema/SKILL.md +172 -10
- package/skills/synap-schema/_order.txt +2 -0
- package/skills/synap-schema/_skill.yaml +4 -2
- package/skills/synap-schema/common-mistakes.md +4 -2
- package/skills/synap-schema/discover-profiles.md +1 -1
- package/skills/synap-schema/entity-scope.md +15 -3
- package/skills/synap-schema/extend-first.md +29 -0
- package/skills/synap-schema/extend-vs-create.md +1 -1
- package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
- package/skills/synap-schema/property-types.md +1 -1
- package/skills/synap-schema/relations.md +1 -1
- package/skills/synap-ui/SKILL.md +19 -12
- package/skills/synap-ui/_skill.yaml +1 -1
- package/skills/synap-ui/ai-companion.md +1 -1
- package/skills/synap-ui/arranging-bento.md +2 -0
- package/skills/synap-ui/bento-layouts.md +10 -10
- package/skills/synap-ui/bento-recipes.md +313 -543
- package/skills/synap-ui/four-builds.md +5 -0
- package/skills/synap-ui/view-types.md +2 -2
- package/skills/synap-ui/widget-catalog.md +22 -278
- package/templates/automations/bookmark-enrichment.automation.json +290 -13
- package/templates/automations/url-bookmark-capture.automation.json +73 -11
- package/templates/skills/authoring-playbooks/SKILL.md +6 -3
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
- package/dist/commands/infra.d.ts +0 -21
- package/dist/commands/infra.js +0 -262
- package/dist/commands/infra.js.map +0 -1
- package/dist/commands/template.d.ts +0 -42
- package/dist/commands/template.js +0 -191
- package/dist/commands/template.js.map +0 -1
- package/dist/lib/browser-auth.d.ts +0 -35
- package/dist/lib/browser-auth.js +0 -170
- package/dist/lib/browser-auth.js.map +0 -1
- package/dist/lib/openclaw.d.ts +0 -32
- package/dist/lib/openclaw.js +0 -164
- package/dist/lib/openclaw.js.map +0 -1
- package/dist/lib/seed.d.ts +0 -13
- package/dist/lib/seed.js +0 -135
- package/dist/lib/seed.js.map +0 -1
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -1261
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -1647
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -1647
- package/node_modules/@synap/hub-rest-client/dist/index.js +0 -1231
- package/node_modules/@synap/hub-rest-client/package.json +0 -45
- package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1631
- package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
- package/node_modules/@synap/hub-rest-client/src/index.ts +0 -153
- package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -133
- package/node_modules/@synap/hub-rest-client/src/types.ts +0 -1299
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap proton-setup (HIDDEN)
|
|
3
|
+
*
|
|
4
|
+
* One-shot provisioning for the Proton Mail ↔ Synap bridge — a fork of
|
|
5
|
+
* `bridge-setup` (the Discord bridge) for the SOVEREIGN self-host Proton path:
|
|
6
|
+
* a locally-run, headless Proton Bridge decrypts Proton's end-to-end-encrypted
|
|
7
|
+
* mail and exposes it as plain IMAP/SMTP on localhost; this command wires that
|
|
8
|
+
* bridge up to a Synap pod. See the catalog's `synap-app/packages/
|
|
9
|
+
* workspace-templates/capabilities/proton.capability.json` for the template
|
|
10
|
+
* (vault ref `proton-account`, tool `proton`) and its documented
|
|
11
|
+
* MUTUAL-EXCLUSIVITY rule against the `mailgun` template's Proton-forward path
|
|
12
|
+
* — do not run both for the same mailbox (double-ingest).
|
|
13
|
+
*
|
|
14
|
+
* CREDENTIAL MODEL: the operator enters their Proton ACCOUNT credentials
|
|
15
|
+
* (email + password + optional TOTP seed + optional mailbox password for
|
|
16
|
+
* two-password-mode accounts) ONCE, here — NOT a Bridge-generated password.
|
|
17
|
+
* They are assembled into one JSON secret
|
|
18
|
+
* (`{"email","password","totpSeed","mailboxPassword"}`, last two optional) and
|
|
19
|
+
* stored in the pod vault under ref `proton-account`. The headless bridge redeems
|
|
20
|
+
* that secret and auto-logs-in with it on boot (implemented in the
|
|
21
|
+
* synap-proton-bridge repo); no manual `protonmail-bridge login` step remains. If
|
|
22
|
+
* Proton throws a one-time human-verification challenge (more likely on
|
|
23
|
+
* datacenter/VPS IPs), a URL appears in the bridge logs to click once — see
|
|
24
|
+
* `printNextSteps`.
|
|
25
|
+
*
|
|
26
|
+
* Automates everything that CAN be automated:
|
|
27
|
+
*
|
|
28
|
+
* 1. lets you CHOOSE which saved pod the bridge connects to (kept separate
|
|
29
|
+
* from your global CLI pod via the "proton" surface override), then
|
|
30
|
+
* resolves a durable hub key + workspace from it
|
|
31
|
+
* 2. sanity-checks pod reachability + key scope (GET /capabilities)
|
|
32
|
+
* 3. applies the bridge's OWN capability definition (POST /capabilities/apply)
|
|
33
|
+
* — read from the bridge repo so there is ONE source of truth
|
|
34
|
+
* 4. writes the bridge .env (pod creds + vault ref), preserving any other
|
|
35
|
+
* existing keys, and purges any raw Proton env credentials once vaulted
|
|
36
|
+
* 5. prints the one-time human-verification note (only a human can click it)
|
|
37
|
+
*
|
|
38
|
+
* Hidden on purpose: this is a dogfood/dev convenience, not a first-class
|
|
39
|
+
* surface. Not shown in `synap --help`.
|
|
40
|
+
*
|
|
41
|
+
* The bridge lands data POD-WIDE by default. An OPTIONAL project scope can be
|
|
42
|
+
* picked interactively (or via --project-id); --workspace-id remains an
|
|
43
|
+
* advanced/legacy escape hatch to pin a single workspace, never prompted.
|
|
44
|
+
*
|
|
45
|
+
* Usage:
|
|
46
|
+
* synap proton-setup [--bridge-dir <path>] [--pod <profile-name>]
|
|
47
|
+
* [--workspace-id <uuid>] [--project-id <uuid>] [--pod-url <url>] [--api-key <key>]
|
|
48
|
+
* [--proton-email <email>] [--proton-password <password>]
|
|
49
|
+
* [--proton-totp-seed <seed>] [--proton-mailbox-password <password>]
|
|
50
|
+
*/
|
|
51
|
+
import path from "node:path";
|
|
52
|
+
import os from "node:os";
|
|
53
|
+
import fs from "node:fs";
|
|
54
|
+
import { writeSecretFile } from "../lib/atomic-file.js";
|
|
55
|
+
import { createRequire } from "node:module";
|
|
56
|
+
import chalk from "chalk";
|
|
57
|
+
import ora from "ora";
|
|
58
|
+
import prompts from "prompts";
|
|
59
|
+
import { hubGet, hubPost, resolveUserId, renderHubError } from "../lib/hub-client.js";
|
|
60
|
+
import { fetchProjects } from "../lib/project.js";
|
|
61
|
+
import { checkPodHealth, getSurfaceAgentKey, setSurfaceAgentKey, listPodProfiles, getSurfacePodName, setSurfacePod, podNotFoundError, } from "../lib/pod.js";
|
|
62
|
+
import { enrollAgentIfNeeded, ensureAgentGovernance, provisionAgentKey, configureAgentContext, } from "../lib/targets.js";
|
|
63
|
+
import { log, banner } from "../utils/logger.js";
|
|
64
|
+
const DEFAULT_BRIDGE_DIR = path.join(os.homedir(), "Documents", "Code", "synap-proton-bridge");
|
|
65
|
+
/**
|
|
66
|
+
* Pick the pod the BRIDGE connects to — independent of the global CLI pod.
|
|
67
|
+
*
|
|
68
|
+
* The bridge is the "proton" surface, so we resolve/persist its pod via the
|
|
69
|
+
* per-surface override (setSurfacePod) and NEVER touch the global activePod.
|
|
70
|
+
* That lets the operator keep a personal pod as their CLI default while the
|
|
71
|
+
* Proton bridge points at a different (e.g. team / client) pod.
|
|
72
|
+
*
|
|
73
|
+
* Order: explicit --pod-url/--api-key escape hatch → --pod <name> →
|
|
74
|
+
* single saved profile (auto) → interactive picker (default = the pod already
|
|
75
|
+
* assigned to the proton surface, else the CLI-active one).
|
|
76
|
+
*/
|
|
77
|
+
async function resolveBridgePod(opts) {
|
|
78
|
+
// 1. Raw URL+key escape hatch — bypasses profiles entirely.
|
|
79
|
+
if (opts.podUrl && opts.apiKey) {
|
|
80
|
+
return {
|
|
81
|
+
cfg: { podUrl: opts.podUrl, apiKey: opts.apiKey, userId: process.env.SYNAP_USER_ID ?? "cli" },
|
|
82
|
+
podName: null,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const profiles = listPodProfiles();
|
|
86
|
+
if (profiles.length === 0) {
|
|
87
|
+
throw new Error("No pod profiles saved. Run `synap pods add` first, or pass --pod-url and --api-key.");
|
|
88
|
+
}
|
|
89
|
+
// 2. Resolve which profile to use.
|
|
90
|
+
let chosen;
|
|
91
|
+
if (opts.pod) {
|
|
92
|
+
chosen = profiles.find((p) => p.name === opts.pod);
|
|
93
|
+
if (!chosen)
|
|
94
|
+
throw podNotFoundError(opts.pod);
|
|
95
|
+
}
|
|
96
|
+
else if (profiles.length === 1) {
|
|
97
|
+
chosen = profiles[0];
|
|
98
|
+
log.dim(`Using your only saved pod profile: ${chosen.name}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const defaultName = getSurfacePodName("proton") ?? profiles.find((p) => p.active)?.name ?? profiles[0].name;
|
|
102
|
+
const initial = Math.max(0, profiles.findIndex((p) => p.name === defaultName));
|
|
103
|
+
const { picked } = await prompts({
|
|
104
|
+
type: "select",
|
|
105
|
+
name: "picked",
|
|
106
|
+
message: "Which data pod should the Proton bridge connect to?",
|
|
107
|
+
initial,
|
|
108
|
+
choices: profiles.map((p) => ({
|
|
109
|
+
title: `${p.name}${p.active ? " (CLI default)" : ""}`,
|
|
110
|
+
description: p.config.podUrl,
|
|
111
|
+
value: p.name,
|
|
112
|
+
})),
|
|
113
|
+
});
|
|
114
|
+
if (!picked)
|
|
115
|
+
throw new Error("No pod selected — aborting.");
|
|
116
|
+
chosen = profiles.find((p) => p.name === picked);
|
|
117
|
+
}
|
|
118
|
+
// Remember the choice for the proton surface — without changing the CLI default.
|
|
119
|
+
setSurfacePod("proton", chosen.name);
|
|
120
|
+
const c = chosen.config;
|
|
121
|
+
return {
|
|
122
|
+
cfg: {
|
|
123
|
+
podUrl: c.podUrl,
|
|
124
|
+
apiKey: c.hubApiKey,
|
|
125
|
+
userId: c.agentUserId,
|
|
126
|
+
workspaceId: c.workspaceId || undefined,
|
|
127
|
+
},
|
|
128
|
+
podName: chosen.name,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export async function protonSetup(opts) {
|
|
132
|
+
banner();
|
|
133
|
+
log.heading("Proton Mail bridge — one-shot setup");
|
|
134
|
+
// ── 1. Choose the pod the BRIDGE connects to (independent of the CLI pod) ──
|
|
135
|
+
let cfg;
|
|
136
|
+
let bridgePodName = null;
|
|
137
|
+
try {
|
|
138
|
+
const resolved = await resolveBridgePod(opts);
|
|
139
|
+
cfg = resolved.cfg;
|
|
140
|
+
bridgePodName = resolved.podName;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
log.error(err.message);
|
|
144
|
+
log.dim("Run `synap init` or `synap pods add` first to save a pod + key.");
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
if (!cfg.podUrl || !cfg.apiKey) {
|
|
148
|
+
log.error("No pod URL / API key resolved. Run `synap init` first.");
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
// ── 2. Pod health ────────────────────────────────────────────────────────
|
|
152
|
+
const health = await checkPodHealth(cfg.podUrl);
|
|
153
|
+
if (!health.healthy) {
|
|
154
|
+
log.error(`Pod not reachable at ${cfg.podUrl}`);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
log.success(`Pod healthy: ${cfg.podUrl}${bridgePodName ? ` (profile: ${bridgePodName})` : ""}`);
|
|
158
|
+
// ── 3. Resolve scope — pod-wide by default, workspace/project optional ───
|
|
159
|
+
const { workspaceId, projectId } = await resolveScope(opts, cfg);
|
|
160
|
+
log.dim(workspaceId ? `Workspace: ${workspaceId} (explicit pin)` : "Workspace: pod-wide (no pin)");
|
|
161
|
+
if (projectId)
|
|
162
|
+
log.dim(`Project: ${projectId}`);
|
|
163
|
+
// ── 3b. Key + scope sanity check (GET /capabilities needs hub-protocol.read) ─
|
|
164
|
+
const probe = ora("Checking key scope…").start();
|
|
165
|
+
try {
|
|
166
|
+
await hubGet("/capabilities", { workspaceId }, cfg);
|
|
167
|
+
probe.succeed("Key valid (hub-protocol scope OK)");
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
probe.fail("Key/scope check failed");
|
|
171
|
+
renderHubError(err);
|
|
172
|
+
log.dim("The key may be expired or missing scope. Run `synap keys rotate` or `synap init`.");
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
// ── 3c. Provision a Proton AGENT key linked to the operator ──────────────
|
|
176
|
+
// The bridge must run as a real backend agent — NOT with the operator's raw
|
|
177
|
+
// key. An agent key carries linkedUserId=<operator>; the backend remaps its
|
|
178
|
+
// reads to the operator's data floor (hub-protocol-rest.ts auth middleware)
|
|
179
|
+
// while attributing writes to the agent for governed proposals. All the
|
|
180
|
+
// operator-key work below (capability apply, vault grant) keeps using `cfg`.
|
|
181
|
+
const agentKey = await provisionProtonAgentKey(cfg.podUrl, cfg.apiKey, cfg.workspaceId);
|
|
182
|
+
// ── 4. Provision the capability (vault credential + tool) ────────────────
|
|
183
|
+
const bridgeDir = opts.bridgeDir ?? DEFAULT_BRIDGE_DIR;
|
|
184
|
+
const protonCredentials = await resolveProtonCredentials(opts);
|
|
185
|
+
const protonCredentialsJson = protonCredentials
|
|
186
|
+
? JSON.stringify(protonCredentials)
|
|
187
|
+
: undefined;
|
|
188
|
+
const { vaultRef, secretId } = await applyBridgeCapability(bridgeDir, workspaceId, cfg, protonCredentialsJson);
|
|
189
|
+
// ── 5. Choose agent governance mode ──────────────────────────────────
|
|
190
|
+
const protonAgentUserId = getSurfaceAgentKey("proton")?.agentUserId;
|
|
191
|
+
if (protonAgentUserId) {
|
|
192
|
+
await ensureAgentGovernance(cfg, protonAgentUserId, opts.governance);
|
|
193
|
+
}
|
|
194
|
+
// ── 6. Grant the bridge redeem access — credentials live ONLY in the vault ─
|
|
195
|
+
let granted = false;
|
|
196
|
+
if (secretId && protonCredentialsJson) {
|
|
197
|
+
// Grant to the AGENT (the bridge's redeem identity), not the operator.
|
|
198
|
+
const agentUserId = getSurfaceAgentKey("proton")?.agentUserId;
|
|
199
|
+
granted = await grantRedeemAccess(secretId, cfg, agentUserId);
|
|
200
|
+
}
|
|
201
|
+
// ── 7. Write the bridge .env ─────────────────────────────────────────────
|
|
202
|
+
const envPath = path.join(bridgeDir, ".env");
|
|
203
|
+
const managed = {
|
|
204
|
+
SYNAP_POD_URL: cfg.podUrl,
|
|
205
|
+
// The bridge runs as the Proton AGENT (linked to the operator), not with
|
|
206
|
+
// the operator's raw key. Reads remap to the operator floor; writes are
|
|
207
|
+
// governed as the agent.
|
|
208
|
+
SYNAP_HUB_API_KEY: agentKey,
|
|
209
|
+
};
|
|
210
|
+
// Pod-wide by default: SYNAP_WORKSPACE_ID/SYNAP_PROJECT_ID are only written
|
|
211
|
+
// when the operator explicitly pinned a workspace (--workspace-id) or chose
|
|
212
|
+
// a project in the picker. Neither is required.
|
|
213
|
+
if (workspaceId)
|
|
214
|
+
managed.SYNAP_WORKSPACE_ID = workspaceId;
|
|
215
|
+
if (projectId)
|
|
216
|
+
managed.SYNAP_PROJECT_ID = projectId;
|
|
217
|
+
// The account credentials are NEVER written to .env — they live in the pod
|
|
218
|
+
// vault (one JSON secret: email/password/totpSeed) and the bridge redeems
|
|
219
|
+
// them on boot via this ref to auto-log-in. (Requires the grant below to
|
|
220
|
+
// land; if it didn't, we warn loudly rather than leaking creds to env.)
|
|
221
|
+
// The bridge reads SYNAP_PROTON_CREDENTIALS_REF (see
|
|
222
|
+
// synap-proton-bridge/src/synapCapabilities.js).
|
|
223
|
+
if (vaultRef)
|
|
224
|
+
managed.SYNAP_PROTON_CREDENTIALS_REF = vaultRef;
|
|
225
|
+
try {
|
|
226
|
+
// Once the credentials are in the vault, purge any stale raw env copies.
|
|
227
|
+
// Also purge a stale scope pin from a prior run — re-running pod-wide (no
|
|
228
|
+
// --workspace-id / no project picked) must actually clear an old pin, not
|
|
229
|
+
// leave it dangling since managed only WRITES the keys it resolves.
|
|
230
|
+
const removeKeys = [
|
|
231
|
+
...(vaultRef
|
|
232
|
+
? [
|
|
233
|
+
"PROTON_BRIDGE_PASSWORD",
|
|
234
|
+
"SYNAP_PROTON_PASSWORD_REF",
|
|
235
|
+
"PROTON_EMAIL",
|
|
236
|
+
"PROTON_PASSWORD",
|
|
237
|
+
"PROTON_TOTP_SEED",
|
|
238
|
+
]
|
|
239
|
+
: []),
|
|
240
|
+
...(workspaceId ? [] : ["SYNAP_WORKSPACE_ID"]),
|
|
241
|
+
...(projectId ? [] : ["SYNAP_PROJECT_ID"]),
|
|
242
|
+
];
|
|
243
|
+
upsertEnv(envPath, managed, removeKeys);
|
|
244
|
+
log.success(`Wrote pod credentials → ${envPath}`);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
log.warn(`Could not write ${envPath}: ${err.message}`);
|
|
248
|
+
log.dim("Set these manually in the bridge .env:");
|
|
249
|
+
for (const [k, v] of Object.entries(managed)) {
|
|
250
|
+
log.dim(` ${k}=${k === "SYNAP_HUB_API_KEY" ? "<key>" : v}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// ── 8. Next steps (the human-only remainder) ─────────────────────────────
|
|
254
|
+
printNextSteps(bridgeDir, {
|
|
255
|
+
hasCredentials: Boolean(protonCredentialsJson),
|
|
256
|
+
vaultRef,
|
|
257
|
+
granted,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
261
|
+
/**
|
|
262
|
+
* Provision a Proton AGENT key linked to the operator, via the shared
|
|
263
|
+
* `provisionAgentKey()` wrapper (same door every target in `lib/targets.ts`
|
|
264
|
+
* uses). The resulting key carries linkedUserId=<operator>, so the backend
|
|
265
|
+
* remaps its reads/redeems to the operator's data floor.
|
|
266
|
+
*
|
|
267
|
+
* idempotent: true — REUSE the existing valid key rather than rotate it. A
|
|
268
|
+
* live bridge holds this key in its .env; minting fresh would revoke it and
|
|
269
|
+
* 401 the bridge until it's redeployed. `requireApproval: false` keeps this a
|
|
270
|
+
* one-shot, non-interactive mint rather than opening a browser approval wait.
|
|
271
|
+
*
|
|
272
|
+
* @param podUrl Pod base URL.
|
|
273
|
+
* @param operatorKey The operator's raw hub key (authorizes the provisioning).
|
|
274
|
+
* @param workspaceId Workspace to enroll the agent into (omit for all).
|
|
275
|
+
* @returns the Proton agent key to write as SYNAP_HUB_API_KEY.
|
|
276
|
+
*/
|
|
277
|
+
async function provisionProtonAgentKey(podUrl, operatorKey, workspaceId) {
|
|
278
|
+
const spinner = ora("Provisioning Proton agent key…").start();
|
|
279
|
+
let hubApiKey;
|
|
280
|
+
let agentUserId;
|
|
281
|
+
try {
|
|
282
|
+
const result = await provisionAgentKey(podUrl, operatorKey, "proton", {
|
|
283
|
+
requireApproval: false,
|
|
284
|
+
idempotent: true,
|
|
285
|
+
});
|
|
286
|
+
hubApiKey = result.hubApiKey;
|
|
287
|
+
agentUserId = result.agentUserId;
|
|
288
|
+
spinner.succeed(result.reused
|
|
289
|
+
? "Proton agent key reused (same key — no rotation, no bridge restart needed)"
|
|
290
|
+
: "Proton agent key minted (new key — redeploy the bridge to pick it up)");
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
spinner.fail("Could not provision the Proton agent key");
|
|
294
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
295
|
+
process.exit(1);
|
|
296
|
+
}
|
|
297
|
+
// Persist so downstream steps (governance lookup, .env write) can read it back.
|
|
298
|
+
setSurfaceAgentKey("proton", { hubApiKey, agentUserId });
|
|
299
|
+
// Enroll the agent user into the operator's workspace(s) using the OPERATOR
|
|
300
|
+
// key (before the bridge ever uses the agent key).
|
|
301
|
+
await enrollAgentIfNeeded(podUrl, operatorKey, agentUserId, workspaceId);
|
|
302
|
+
// Same CONTEXT.md routing file every other provisioned agent gets.
|
|
303
|
+
try {
|
|
304
|
+
await configureAgentContext(podUrl, operatorKey, "proton", agentUserId);
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
log.warn(`Agent context wizard failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
308
|
+
}
|
|
309
|
+
return hubApiKey;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Resolve the OPTIONAL scope the bridge writes into — pod-wide by default.
|
|
313
|
+
*
|
|
314
|
+
* Workspace: an explicit --workspace-id is the only way to pin one (advanced/
|
|
315
|
+
* legacy escape hatch) — never prompted, never required.
|
|
316
|
+
*
|
|
317
|
+
* Project: a peer, independent lens. --project-id skips the prompt; otherwise
|
|
318
|
+
* offer a picker with "Pod-wide (no project)" as the default alongside the
|
|
319
|
+
* operator's existing projects. No projects on the pod → skip the prompt.
|
|
320
|
+
*/
|
|
321
|
+
async function resolveScope(opts, cfg) {
|
|
322
|
+
const workspaceId = opts.workspaceId;
|
|
323
|
+
let projectId = opts.projectId;
|
|
324
|
+
if (!projectId) {
|
|
325
|
+
const projects = await fetchProjects(cfg);
|
|
326
|
+
if (projects.length > 0) {
|
|
327
|
+
const { picked } = await prompts({
|
|
328
|
+
type: "select",
|
|
329
|
+
name: "picked",
|
|
330
|
+
message: "Which project should the bridge write into? (optional — pod-wide by default)",
|
|
331
|
+
initial: 0,
|
|
332
|
+
choices: [
|
|
333
|
+
{ title: "Pod-wide (no project)", value: "" },
|
|
334
|
+
...projects.map((p) => ({ title: p.name, description: p.id, value: p.id })),
|
|
335
|
+
],
|
|
336
|
+
});
|
|
337
|
+
projectId = picked || undefined;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return { workspaceId, projectId };
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Prompt for the Proton ACCOUNT credentials (email/password/optional TOTP
|
|
344
|
+
* seed/optional mailbox password) — the same credentials you sign in to
|
|
345
|
+
* proton.me with. These are NOT a Bridge-generated password: the headless
|
|
346
|
+
* bridge uses them to auto-log-in on boot (implemented in the synap-proton-bridge
|
|
347
|
+
* repo). The password, TOTP seed, and mailbox password are secrets —
|
|
348
|
+
* prompted with `type: "password"` (never echoed) and stored ONLY in the pod
|
|
349
|
+
* vault; the email may be shown/passed as a flag.
|
|
350
|
+
*/
|
|
351
|
+
async function resolveProtonCredentials(opts) {
|
|
352
|
+
let email = opts.protonEmail;
|
|
353
|
+
if (!email) {
|
|
354
|
+
const { value } = await prompts({
|
|
355
|
+
type: "text",
|
|
356
|
+
name: "value",
|
|
357
|
+
message: "Proton account email — Settings → Account and password (proton.me sign-in):",
|
|
358
|
+
});
|
|
359
|
+
email = value || undefined;
|
|
360
|
+
}
|
|
361
|
+
let password = opts.protonPassword;
|
|
362
|
+
if (!password) {
|
|
363
|
+
const { value } = await prompts({
|
|
364
|
+
type: "password",
|
|
365
|
+
name: "value",
|
|
366
|
+
message: "Proton account password — this is your normal proton.me sign-in password, NOT the Organization key/password (leave blank to skip):",
|
|
367
|
+
});
|
|
368
|
+
password = value || undefined;
|
|
369
|
+
}
|
|
370
|
+
if (!email || !password)
|
|
371
|
+
return undefined;
|
|
372
|
+
let totpSeed = opts.protonTotpSeed;
|
|
373
|
+
if (totpSeed === undefined) {
|
|
374
|
+
const { value } = await prompts({
|
|
375
|
+
type: "password",
|
|
376
|
+
name: "value",
|
|
377
|
+
message: "(optional) Proton 2FA/TOTP seed — Settings → Account and password → Two-factor authentication, base32 (leave blank if 2FA is off):",
|
|
378
|
+
});
|
|
379
|
+
totpSeed = value || "";
|
|
380
|
+
}
|
|
381
|
+
let mailboxPassword = opts.protonMailboxPassword;
|
|
382
|
+
if (mailboxPassword === undefined) {
|
|
383
|
+
const { value } = await prompts({
|
|
384
|
+
type: "password",
|
|
385
|
+
name: "value",
|
|
386
|
+
message: "(optional) Proton mailbox password — ONLY if two-password mode is on (Settings → Account and password); leave blank otherwise:",
|
|
387
|
+
});
|
|
388
|
+
mailboxPassword = value || "";
|
|
389
|
+
}
|
|
390
|
+
return { email, password, totpSeed: totpSeed || "", mailboxPassword: mailboxPassword || "" };
|
|
391
|
+
}
|
|
392
|
+
async function applyBridgeCapability(bridgeDir, workspaceId, cfg, protonCredentialsJson) {
|
|
393
|
+
const spinner = ora("Provisioning capability…").start();
|
|
394
|
+
// Read the capability definition from the bridge repo — ONE source of truth.
|
|
395
|
+
// Documented shape (see proton.capability.json): vault ref "proton-account"
|
|
396
|
+
// (JSON-encoded Proton account credentials), tool "proton". Mirrors
|
|
397
|
+
// bridge-setup.ts's discord-bot read from synapCapabilities.js's
|
|
398
|
+
// CAPABILITY_DEFINITION export.
|
|
399
|
+
const capPath = path.join(bridgeDir, "src", "synapCapabilities.js");
|
|
400
|
+
let rawDef;
|
|
401
|
+
try {
|
|
402
|
+
const require = createRequire(import.meta.url);
|
|
403
|
+
const resolved = require.resolve(capPath);
|
|
404
|
+
if (require.cache && require.cache[resolved])
|
|
405
|
+
delete require.cache[resolved];
|
|
406
|
+
const mod = require(capPath);
|
|
407
|
+
rawDef = mod.CAPABILITY_DEFINITION;
|
|
408
|
+
}
|
|
409
|
+
catch (err) {
|
|
410
|
+
spinner.fail("Capability definition not found");
|
|
411
|
+
log.dim(` Looked in: ${capPath}`);
|
|
412
|
+
log.dim(` ${err.message}`);
|
|
413
|
+
log.dim(" NOTE: this reads the fork's own synapCapabilities.js (Wave C, built in " +
|
|
414
|
+
"parallel) — if it doesn't exist yet, the bridge repo isn't ready.");
|
|
415
|
+
return {};
|
|
416
|
+
}
|
|
417
|
+
if (!rawDef) {
|
|
418
|
+
spinner.fail("No CAPABILITY_DEFINITION export in the bridge");
|
|
419
|
+
return {};
|
|
420
|
+
}
|
|
421
|
+
// Deep-clone + inject the Proton account credentials JSON into the vault
|
|
422
|
+
// credential. With none provided, drop the vault + credentialRef so we
|
|
423
|
+
// never store an empty/placeholder secret.
|
|
424
|
+
const def = JSON.parse(JSON.stringify(rawDef));
|
|
425
|
+
if (protonCredentialsJson) {
|
|
426
|
+
for (const v of def.vault ?? []) {
|
|
427
|
+
if (typeof v.value === "string") {
|
|
428
|
+
v.value = v.value.replace("{{protonCredentialsJson}}", protonCredentialsJson);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
// No credentials → drop the vault and any tool credentialRef that
|
|
434
|
+
// referenced it (a bare template-local ref or a vault:// string), so we
|
|
435
|
+
// never store a placeholder secret or leave a dangling reference.
|
|
436
|
+
const vaultRefs = new Set((def.vault ?? []).map((v) => v.ref).filter((r) => Boolean(r)));
|
|
437
|
+
delete def.vault;
|
|
438
|
+
for (const t of def.tools ?? []) {
|
|
439
|
+
if (t.credentialRef &&
|
|
440
|
+
(vaultRefs.has(t.credentialRef) || t.credentialRef.startsWith("vault://"))) {
|
|
441
|
+
delete t.credentialRef;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
spinner.text = "Provisioning capability (no credentials → structure only)…";
|
|
445
|
+
}
|
|
446
|
+
try {
|
|
447
|
+
const res = (await hubPost("/capabilities/apply", { definition: def, workspaceId }, cfg));
|
|
448
|
+
const tools = res.created?.tools?.length ?? 0;
|
|
449
|
+
const skills = res.created?.skills?.length ?? 0;
|
|
450
|
+
const vaultRef = res.created?.vault?.[0]?.vaultRef;
|
|
451
|
+
const secretId = res.created?.vault?.[0]?.secretId;
|
|
452
|
+
spinner.succeed(`Capability provisioned: ${res.capabilityKey ?? "?"} (${vaultRef ? "vault + " : ""}${tools} tool, ${skills} skill)`);
|
|
453
|
+
return { vaultRef, secretId };
|
|
454
|
+
}
|
|
455
|
+
catch (err) {
|
|
456
|
+
const msg = err.message;
|
|
457
|
+
spinner.fail("Capability apply failed");
|
|
458
|
+
log.error(` ${msg}`);
|
|
459
|
+
if (protonCredentialsJson) {
|
|
460
|
+
// The Proton account credentials MUST be vaulted for the bridge to run
|
|
461
|
+
// — continuing to write a .env and printing "Done" would leave a
|
|
462
|
+
// crash-looping bridge (redeem 404). A frequent cause is a missing/
|
|
463
|
+
// empty VAULT_SERVER_KEY on the target pod's backend (the vault can't
|
|
464
|
+
// encrypt). Fail loud here.
|
|
465
|
+
if (/VAULT_SERVER_KEY/i.test(msg)) {
|
|
466
|
+
log.dim(" The target pod's secret vault is not configured.");
|
|
467
|
+
log.dim(" Set a durable VAULT_SERVER_KEY (openssl rand -hex 32) in the pod's");
|
|
468
|
+
log.dim(" deploy/.env, redeploy the backend, then re-run proton-setup.");
|
|
469
|
+
}
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
472
|
+
return {};
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Grant the bridge principal redeem access to the Proton account credentials
|
|
477
|
+
* secret — the headless equivalent of the UI "grant access" flow, using the
|
|
478
|
+
* user's own credentials. After this, the credentials live ONLY in the
|
|
479
|
+
* vault; the bridge redeems them on boot to auto-log-in.
|
|
480
|
+
*/
|
|
481
|
+
async function grantRedeemAccess(secretId, cfg, agentUserId) {
|
|
482
|
+
const spinner = ora("Granting the bridge redeem access…").start();
|
|
483
|
+
try {
|
|
484
|
+
// The bridge redeems AS the agent: the backend binds redemption to the
|
|
485
|
+
// agent key's userId (linkedUserId remap → vault_grants.granted_to must be
|
|
486
|
+
// the AGENT, not the operator). Granting to the operator leaves the bridge
|
|
487
|
+
// with no_grant. Fall back to the operator only if the agent id is unknown.
|
|
488
|
+
const principal = agentUserId || (await resolveUserId(cfg));
|
|
489
|
+
const res = (await hubPost(`/vault/secrets/${secretId}/grant`, { grantedTo: principal, scope: "permanent" }, cfg));
|
|
490
|
+
if (res.status === "proposed") {
|
|
491
|
+
// An agent key cannot grant vault access by itself: the pod filed it for
|
|
492
|
+
// the secret owner's approval. Nothing is granted until it is approved.
|
|
493
|
+
spinner.warn("Redeem access is waiting for your approval");
|
|
494
|
+
if (res.reviewUrl)
|
|
495
|
+
log.dim(` Approve it: ${res.reviewUrl}`);
|
|
496
|
+
return false;
|
|
497
|
+
}
|
|
498
|
+
spinner.succeed(`Redeem access granted${res.reused ? " (existing)" : ""} — password stays in the vault`);
|
|
499
|
+
return Boolean(res.grantId);
|
|
500
|
+
}
|
|
501
|
+
catch (err) {
|
|
502
|
+
const msg = err.message;
|
|
503
|
+
if (msg.includes("404")) {
|
|
504
|
+
spinner.warn("Grant door not deployed yet — deploy the backend, then re-run this command");
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
spinner.warn(`Grant skipped: ${msg}`);
|
|
508
|
+
}
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Upsert KEY=value lines into a dotenv file, preserving comments and any other
|
|
514
|
+
* keys. Existing managed keys are replaced in place; new ones are appended.
|
|
515
|
+
*/
|
|
516
|
+
function upsertEnv(filePath, kv, remove = []) {
|
|
517
|
+
const dir = path.dirname(filePath);
|
|
518
|
+
if (!fs.existsSync(dir)) {
|
|
519
|
+
throw new Error(`bridge dir not found: ${dir}`);
|
|
520
|
+
}
|
|
521
|
+
const existing = fs.existsSync(filePath)
|
|
522
|
+
? fs.readFileSync(filePath, "utf-8")
|
|
523
|
+
: "";
|
|
524
|
+
const lines = existing.length ? existing.split("\n") : [];
|
|
525
|
+
const remaining = new Map(Object.entries(kv));
|
|
526
|
+
const removeSet = new Set(remove);
|
|
527
|
+
const out = [];
|
|
528
|
+
for (const line of lines) {
|
|
529
|
+
const m = line.match(/^([A-Z0-9_]+)=/);
|
|
530
|
+
if (m && removeSet.has(m[1]))
|
|
531
|
+
continue; // drop purged keys entirely
|
|
532
|
+
if (m && remaining.has(m[1])) {
|
|
533
|
+
const key = m[1];
|
|
534
|
+
out.push(`${key}=${remaining.get(key)}`);
|
|
535
|
+
remaining.delete(key);
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
out.push(line);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
if (remaining.size) {
|
|
542
|
+
if (out.length && out[out.length - 1] !== "")
|
|
543
|
+
out.push("");
|
|
544
|
+
out.push("# --- Synap pod (written by `synap proton-setup`) ---");
|
|
545
|
+
for (const [k, v] of remaining)
|
|
546
|
+
out.push(`${k}=${v}`);
|
|
547
|
+
}
|
|
548
|
+
writeSecretFile(filePath, out.join("\n"), { mode: 0o600 });
|
|
549
|
+
}
|
|
550
|
+
function printNextSteps(bridgeDir, state) {
|
|
551
|
+
log.blank();
|
|
552
|
+
log.heading("Done");
|
|
553
|
+
log.blank();
|
|
554
|
+
if (state.vaultRef && state.granted) {
|
|
555
|
+
console.log(` ${chalk.green("✓")} Proton account credentials in the pod vault, bridge granted redeem access — no env password ${chalk.dim(state.vaultRef)}`);
|
|
556
|
+
}
|
|
557
|
+
else if (state.vaultRef && state.hasCredentials) {
|
|
558
|
+
console.log(` ${chalk.yellow("⚠")} Credentials stored in the vault (${chalk.dim(state.vaultRef)}) but the redeem GRANT did not land.`);
|
|
559
|
+
console.log(` Deploy the backend (grant door) and re-run — the bridge can't log in until the grant exists.`);
|
|
560
|
+
}
|
|
561
|
+
console.log(` ${chalk.green("✓")} Bridge .env written (pod creds; account credentials stay in the vault)`);
|
|
562
|
+
log.blank();
|
|
563
|
+
log.heading("Remaining (Proton Bridge — human only, one-time)");
|
|
564
|
+
log.blank();
|
|
565
|
+
console.log(` ${chalk.bold("•")} The bridge auto-logs-in from the vault-stored Proton account credentials on next deploy —`);
|
|
566
|
+
console.log(` no manual ${chalk.bold("protonmail-bridge login")} step needed.`);
|
|
567
|
+
console.log(` ${chalk.bold("•")} If Proton demands a one-time human-verification challenge (more likely on datacenter/VPS IPs),`);
|
|
568
|
+
console.log(` its URL appears in ${chalk.cyan("pm2 logs proton-bridge")} — click it once in a browser; it typically won't ask again.`);
|
|
569
|
+
console.log(` ${chalk.bold("•")} IMAP: ${chalk.dim("127.0.0.1:1143")} · SMTP: ${chalk.dim("127.0.0.1:1025")} (StartTLS, self-signed cert)`);
|
|
570
|
+
if (!state.hasCredentials) {
|
|
571
|
+
console.log(` ${chalk.bold("•")} Proton account credentials not provisioned — re-run with ${chalk.cyan("--proton-email/--proton-password")} (stores them in the vault)`);
|
|
572
|
+
}
|
|
573
|
+
log.blank();
|
|
574
|
+
console.log(` Then: ${chalk.green(`cd ${bridgeDir} && npm start`)}`);
|
|
575
|
+
log.blank();
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=proton-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proton-setup.js","sourceRoot":"","sources":["../../src/commands/proton-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,4 +35,27 @@ export declare function providersPull(opts: {
|
|
|
35
35
|
target?: string;
|
|
36
36
|
podUrl?: string;
|
|
37
37
|
apiKey?: string;
|
|
38
|
+
showKey?: boolean;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Store a per-user API key override for a provider.
|
|
42
|
+
*
|
|
43
|
+
* synap providers set-key <providerId> [--workspace <id>]
|
|
44
|
+
*/
|
|
45
|
+
export declare function providersSetKey(opts: {
|
|
46
|
+
providerId: string;
|
|
47
|
+
workspaceId?: string;
|
|
48
|
+
apiKey?: string;
|
|
49
|
+
podUrl?: string;
|
|
50
|
+
hubApiKey?: string;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* List user/workspace-level key overrides.
|
|
54
|
+
*
|
|
55
|
+
* synap providers list-keys [--workspace <id>]
|
|
56
|
+
*/
|
|
57
|
+
export declare function providersListKeys(opts: {
|
|
58
|
+
workspaceId?: string;
|
|
59
|
+
podUrl?: string;
|
|
60
|
+
hubApiKey?: string;
|
|
38
61
|
}): Promise<void>;
|