@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,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key health for one pod: read every copy, ask the pod about each key, print
|
|
3
|
+
* one diagnosis per problem — and, with `--fix`, do the one right thing.
|
|
4
|
+
*
|
|
5
|
+
* The fix never writes a key the pod has not confirmed live (`assertKeyWritable`),
|
|
6
|
+
* and it ends with a real MCP `initialize` against `/mcp` using the key it
|
|
7
|
+
* wrote: a fix is only reported ✓ when that call succeeds AND every copy it had
|
|
8
|
+
* to rewrite was rewritten.
|
|
9
|
+
*
|
|
10
|
+
* A key is sent to this pod only when something ties it to this pod
|
|
11
|
+
* (`keysToProbe`); keys are asked about ONE AT A TIME. The pod resolves a key it
|
|
12
|
+
* does not know with a bcrypt scan of every key sharing its prefix (~12s on a
|
|
13
|
+
* 4-thread pool, measured 2026-10-12); asked all at once, four unknown keys
|
|
14
|
+
* starved each other past the timeout and read "no answer".
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import os from "node:os";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import chalk from "chalk";
|
|
20
|
+
import { writeFileAtomic } from "./atomic-file.js";
|
|
21
|
+
import { collectKeyInventory, keysToProbe } from "./key-locations.js";
|
|
22
|
+
import { diagnoseKeys } from "./key-diagnosis.js";
|
|
23
|
+
import { fetchKeyState, assertKeyWritable } from "./key-state.js";
|
|
24
|
+
import { machineInstanceId, thisComputerInstanceIds } from "./machine-instance.js";
|
|
25
|
+
/** Per-key wait for `/auth/key-state` — an unknown key costs the pod ~12s of bcrypt. */
|
|
26
|
+
export const KEY_STATE_TIMEOUT_MS = 30_000;
|
|
27
|
+
async function targetLabel(surface) {
|
|
28
|
+
try {
|
|
29
|
+
const { TARGETS } = await import("./targets.js");
|
|
30
|
+
return TARGETS[surface]?.label ?? surface;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return surface;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function checkKeyHealth(podUrl, deps = {}) {
|
|
37
|
+
const allClients = deps.clients ?? (await import("./targets.js")).clientKeyFiles();
|
|
38
|
+
const clients = deps.surface ? allClients.filter((c) => c.surface === deps.surface) : allClients;
|
|
39
|
+
const all = collectKeyInventory({
|
|
40
|
+
home: deps.home ?? os.homedir(),
|
|
41
|
+
podUrl,
|
|
42
|
+
envKey: "envKey" in deps ? deps.envKey : process.env.SYNAP_HUB_API_KEY,
|
|
43
|
+
envPodUrl: "envPodUrl" in deps ? deps.envPodUrl : process.env.SYNAP_POD_URL,
|
|
44
|
+
clients,
|
|
45
|
+
});
|
|
46
|
+
const inventory = deps.surface
|
|
47
|
+
? { ...all, locations: all.locations.filter((l) => l.role === "agent" && l.surface === deps.surface) }
|
|
48
|
+
: all;
|
|
49
|
+
const keys = keysToProbe(inventory.locations);
|
|
50
|
+
const probed = new Set(keys);
|
|
51
|
+
const states = new Map();
|
|
52
|
+
// One at a time — see the module doc.
|
|
53
|
+
for (const k of keys)
|
|
54
|
+
states.set(k, await fetchKeyState(podUrl, k, { fetch: deps.fetch, timeoutMs: deps.timeoutMs ?? KEY_STATE_TIMEOUT_MS }));
|
|
55
|
+
const locations = inventory.locations.filter((l) => probed.has(l.key));
|
|
56
|
+
const notSent = inventory.locations.filter((l) => !probed.has(l.key));
|
|
57
|
+
const labels = new Map();
|
|
58
|
+
for (const s of new Set(inventory.locations.map((l) => l.surface).filter((x) => !!x)))
|
|
59
|
+
labels.set(s, deps.labelOf ? deps.labelOf(s) : await targetLabel(s));
|
|
60
|
+
const envKey = locations.find((l) => l.kind === "process-env")?.key;
|
|
61
|
+
const idFor = deps.instanceIdFor ?? ((s) => machineInstanceId(s));
|
|
62
|
+
const answers = [...states.values()];
|
|
63
|
+
return {
|
|
64
|
+
podUrl,
|
|
65
|
+
locations,
|
|
66
|
+
states,
|
|
67
|
+
unchecked: inventory.unchecked,
|
|
68
|
+
notSent,
|
|
69
|
+
podDescribesKeys: answers.some((a) => !a.legacy && a.state !== "unreachable"),
|
|
70
|
+
diagnoses: diagnoseKeys({
|
|
71
|
+
locations,
|
|
72
|
+
states,
|
|
73
|
+
envKey,
|
|
74
|
+
instanceIdFor: idFor,
|
|
75
|
+
instanceIdsForAgentType: (t) => thisComputerInstanceIds(t, idFor),
|
|
76
|
+
labelOf: (s) => labels.get(s) ?? s,
|
|
77
|
+
}),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** The problems only — `ok` diagnoses are summarised, not listed. */
|
|
81
|
+
export function keyProblems(report) {
|
|
82
|
+
return report.diagnoses.filter((d) => d.code !== "ok");
|
|
83
|
+
}
|
|
84
|
+
/** A problem `--fix` can act on (not merely tell you a command). */
|
|
85
|
+
export function isFixable(d) {
|
|
86
|
+
return d.action !== "none" && d.action !== "login" && d.action !== "edit_shell_rc";
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The check behind every "<Agent> connected" line: read back what setup WROTE
|
|
90
|
+
* for `surface` — the same copies `synap doctor` reads — ask the pod about each
|
|
91
|
+
* key, and pass only when the doctor would say "key works". The 2026-10-15
|
|
92
|
+
* devbox printed "✓ Claude Code connected" over a key the pod held as
|
|
93
|
+
* awaiting approval; a success line now comes from this read, never from
|
|
94
|
+
* having written the file.
|
|
95
|
+
*/
|
|
96
|
+
export async function confirmSurfaceKey(podUrl, surface, deps = {}) {
|
|
97
|
+
let report;
|
|
98
|
+
try {
|
|
99
|
+
report = await checkKeyHealth(podUrl, { ...deps, surface });
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return { verdict: "unconfirmed", reason: `its key could not be read back (${err instanceof Error ? err.message : String(err)})` };
|
|
103
|
+
}
|
|
104
|
+
const unread = report.unchecked?.[0];
|
|
105
|
+
if (unread)
|
|
106
|
+
return { verdict: "unconfirmed", reason: `${unread.tool} — ${unread.file} ${unread.reason}` };
|
|
107
|
+
const d = report.diagnoses.find((x) => x.surface === surface);
|
|
108
|
+
if (d?.code === "ok")
|
|
109
|
+
return { verdict: "active" };
|
|
110
|
+
if (d?.code === "unverifiable")
|
|
111
|
+
return { verdict: "unconfirmed", reason: (d.key && report.states.get(d.key)?.error) || "the pod did not answer" };
|
|
112
|
+
if (d)
|
|
113
|
+
return { verdict: "not-active", title: d.title, command: d.command };
|
|
114
|
+
const { TARGETS, isTargetName } = await import("./targets.js");
|
|
115
|
+
const target = isTargetName(surface) ? TARGETS[surface] : undefined;
|
|
116
|
+
if (target && "none" in target.keyStore)
|
|
117
|
+
return { verdict: "unchecked", reason: target.keyStore.none };
|
|
118
|
+
return { verdict: "not-active", title: `${target?.label ?? surface}: no key for this pod was found where setup writes it`, command: "synap doctor" };
|
|
119
|
+
}
|
|
120
|
+
const plural = (n, one, many = one + "s") => `${n} ${n === 1 ? one : many}`;
|
|
121
|
+
/**
|
|
122
|
+
* Print what is wrong, and what could not be checked. Working keys are one
|
|
123
|
+
* line (listed with `verbose`); an unverifiable key is "?", never ✓ or ✗.
|
|
124
|
+
*/
|
|
125
|
+
export function printKeyHealth(report, opts = {}) {
|
|
126
|
+
const ind = opts.indent ?? " ";
|
|
127
|
+
const dim = (t) => console.log(chalk.dim(`${ind}${t}`));
|
|
128
|
+
const problems = keyProblems(report);
|
|
129
|
+
const ok = report.diagnoses.filter((d) => d.code === "ok");
|
|
130
|
+
const unverifiable = problems.filter((d) => d.code === "unverifiable");
|
|
131
|
+
const broken = problems.filter((d) => d.code !== "unverifiable");
|
|
132
|
+
if (opts.showOk !== false && ok.length) {
|
|
133
|
+
if (opts.verbose)
|
|
134
|
+
for (const d of ok)
|
|
135
|
+
console.log(`${ind}${chalk.green("✓")} ${d.title}`);
|
|
136
|
+
else
|
|
137
|
+
console.log(`${ind}${chalk.green("✓")} ${plural(ok.length, "agent key")} work${ok.length === 1 ? "s" : ""}: ${ok.map((d) => d.label ?? d.surface).join(", ")}`);
|
|
138
|
+
}
|
|
139
|
+
for (const d of broken) {
|
|
140
|
+
const mark = d.severity === "error" ? chalk.red("✗") : chalk.yellow("!");
|
|
141
|
+
console.log(`${ind}${mark} ${chalk.bold(d.title)}`);
|
|
142
|
+
for (const line of d.lines)
|
|
143
|
+
dim(` ${line}`);
|
|
144
|
+
if (d.command)
|
|
145
|
+
dim(` → ${d.command}`);
|
|
146
|
+
}
|
|
147
|
+
// Group the unverifiable by why — "no answer in 30s" four times is one line.
|
|
148
|
+
const byWhy = new Map();
|
|
149
|
+
for (const d of unverifiable) {
|
|
150
|
+
const why = (d.key && report.states.get(d.key)?.error) || "the pod did not answer";
|
|
151
|
+
byWhy.set(why, [...(byWhy.get(why) ?? []), d]);
|
|
152
|
+
}
|
|
153
|
+
for (const [why, ds] of byWhy) {
|
|
154
|
+
console.log(`${ind}${chalk.yellow("?")} ${plural(ds.length, "key")} not checked — ${why}: ${ds.map((d) => d.label ?? d.surface).join(", ")}`);
|
|
155
|
+
dim(" → run synap doctor again; if it repeats: synap agents list");
|
|
156
|
+
}
|
|
157
|
+
const notSent = report.notSent ?? [];
|
|
158
|
+
if (notSent.length) {
|
|
159
|
+
const keys = new Set(notSent.map((l) => l.key)).size;
|
|
160
|
+
console.log(`${ind}${chalk.yellow("?")} ${plural(keys, "key")} not checked — ${keys === 1 ? "it belongs" : "they belong"} to another pod or nothing says which${opts.verbose ? "" : " (details with -v)"}`);
|
|
161
|
+
if (opts.verbose)
|
|
162
|
+
for (const l of notSent)
|
|
163
|
+
dim(` ${l.label}`);
|
|
164
|
+
}
|
|
165
|
+
for (const u of report.unchecked ?? [])
|
|
166
|
+
console.log(`${ind}${chalk.yellow("?")} not checked: ${u.tool} — ${u.file} ${u.reason}`);
|
|
167
|
+
if (report.locations.length === 0 && notSent.length === 0)
|
|
168
|
+
dim("No Synap key is configured for this pod on this computer.");
|
|
169
|
+
if (!report.podDescribesKeys && report.locations.length > 0)
|
|
170
|
+
dim("(This pod predates the key-state door: it can say a key fails, not why. Update the pod for precise reasons.)");
|
|
171
|
+
if (opts.fixHint && problems.some(isFixable))
|
|
172
|
+
dim(`Fix it: ${chalk.cyan("synap doctor --fix")}`);
|
|
173
|
+
}
|
|
174
|
+
// ─── --fix ────────────────────────────────────────────────────────────────
|
|
175
|
+
/**
|
|
176
|
+
* Replace `oldKey` with `newKey` in one file, atomically, mode kept. Works for
|
|
177
|
+
* every client format (JSON, JSONC with its comments, TOML, YAML) because a key
|
|
178
|
+
* is a unique opaque token: the edit touches exactly the copies of that key and
|
|
179
|
+
* nothing else. Throws when the file no longer holds the old key.
|
|
180
|
+
*/
|
|
181
|
+
function replaceKeyInFile(file, oldKey, newKey) {
|
|
182
|
+
const text = fs.readFileSync(file, "utf8");
|
|
183
|
+
if (!text.includes(oldKey))
|
|
184
|
+
throw new Error("the old key is no longer in the file");
|
|
185
|
+
writeFileAtomic(file, text.split(oldKey).join(newKey));
|
|
186
|
+
}
|
|
187
|
+
/** The agent a key belongs to, from the pod's own status door. Throws when the pod does not say. */
|
|
188
|
+
async function agentOfKey(podUrl, key, f) {
|
|
189
|
+
const res = await f(`${podUrl.replace(/\/+$/, "")}/api/hub/auth/status`, {
|
|
190
|
+
headers: { Authorization: `Bearer ${key}` },
|
|
191
|
+
signal: AbortSignal.timeout(15_000),
|
|
192
|
+
}).catch((err) => {
|
|
193
|
+
throw new Error(`could not ask the pod whose key this is (${err.message})`);
|
|
194
|
+
});
|
|
195
|
+
const userId = res.ok ? (await res.json().catch(() => ({}))).userId : undefined;
|
|
196
|
+
if (!userId)
|
|
197
|
+
throw new Error(`could not ask the pod whose key this is (HTTP ${res.status} from /auth/status)`);
|
|
198
|
+
return userId;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Write `key` into every rewritable copy of `surface` for this pod — ONLY after
|
|
202
|
+
* the pod confirms it is live. A copy that cannot be rewritten is reported in
|
|
203
|
+
* `failed`, never dropped.
|
|
204
|
+
*/
|
|
205
|
+
export async function rewriteSurfaceKey(report, surface, key, agentUserId, deps = {}) {
|
|
206
|
+
await assertKeyWritable(report.podUrl, key, deps);
|
|
207
|
+
const pod = await import("./pod.js");
|
|
208
|
+
// A blank agent id saved next to a key breaks every later lookup — ask, or stop.
|
|
209
|
+
const agentId = agentUserId || (await agentOfKey(report.podUrl, key, deps.fetch ?? fetch));
|
|
210
|
+
const configFile = path.join(deps.home ?? os.homedir(), ".synap", "config.json");
|
|
211
|
+
const mine = report.locations.filter((l) => l.surface === surface);
|
|
212
|
+
const done = mine.filter((l) => l.key === key && l.kind !== "pending").map((l) => l.label);
|
|
213
|
+
const failed = [];
|
|
214
|
+
pod.setSurfaceAgentKey(surface, { hubApiKey: key, agentUserId: agentId, podUrl: report.podUrl });
|
|
215
|
+
pod.clearPendingAgentKey(surface, report.podUrl);
|
|
216
|
+
if (!mine.some((l) => l.file === configFile && l.key === key && l.kind !== "pending"))
|
|
217
|
+
done.push(`~/.synap/config.json → agentKeysByPod.${surface}`);
|
|
218
|
+
// The CLI config is handled above; every other file gets a precise text edit.
|
|
219
|
+
for (const loc of mine.filter((l) => l.rewritable && l.key !== key && l.file && l.file !== configFile)) {
|
|
220
|
+
try {
|
|
221
|
+
replaceKeyInFile(loc.file, loc.key, key);
|
|
222
|
+
done.push(loc.label);
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
failed.push(`${loc.label}: ${err instanceof Error ? err.message : String(err)}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return { done: [...new Set(done)], failed };
|
|
229
|
+
}
|
|
230
|
+
/** Perform each diagnosis's one action, then verify with a real MCP initialize. */
|
|
231
|
+
export async function fixKeyHealth(report, deps = {}) {
|
|
232
|
+
const outcomes = [];
|
|
233
|
+
const openUrl = deps.openUrl ?? (await import("./targets.js")).openBrowserUrl;
|
|
234
|
+
const verify = deps.verify ??
|
|
235
|
+
(async (podUrl, key) => (await import("./targets.js")).verifyMcpConnection(podUrl, key, { timeoutMs: 20_000 }));
|
|
236
|
+
const wait = deps.wait ??
|
|
237
|
+
(async (a) => (await import("./key-approval.js")).waitForKeyLive({ ...a, fetch: deps.fetch }));
|
|
238
|
+
const provision = deps.provision ??
|
|
239
|
+
(async (podUrl, mintingKey, agentType, surface) => (await import("./targets.js")).provisionAgentKey(podUrl, mintingKey, agentType, { surfaceName: surface }));
|
|
240
|
+
const mintingKey = report.locations.find((l) => l.kind === "profile" && report.states.get(l.key)?.state === "active")?.key;
|
|
241
|
+
const finish = async (d, surface, key, agentUserId) => {
|
|
242
|
+
const { done: rewritten, failed } = await rewriteSurfaceKey(report, surface, key, agentUserId, { fetch: deps.fetch });
|
|
243
|
+
const name = d.label ?? surface;
|
|
244
|
+
if (failed.length)
|
|
245
|
+
return { diagnosis: d, ok: false, message: `${name}: live key written to ${rewritten.join(", ")}, but NOT to: ${failed.join("; ")}` };
|
|
246
|
+
const v = await verify(report.podUrl, key);
|
|
247
|
+
return v.ok
|
|
248
|
+
? { diagnosis: d, ok: true, message: `${name}: live key in ${rewritten.join(", ")} — MCP initialize OK${v.toolCount !== undefined ? ` (${v.toolCount} tools)` : ""}${rewritten.some((l) => l.includes(".claude")) ? ". Restart Claude Code to pick it up." : ""}` }
|
|
249
|
+
: { diagnosis: d, ok: false, message: `${name}: key written, but MCP verification failed: ${v.error ?? "unknown error"}` };
|
|
250
|
+
};
|
|
251
|
+
for (const d of keyProblems(report)) {
|
|
252
|
+
try {
|
|
253
|
+
if (d.action === "approve_and_wait" && d.surface && d.key) {
|
|
254
|
+
const { openAndWait } = await import("./key-approval.js");
|
|
255
|
+
const outcome = d.approvalUrl
|
|
256
|
+
? await openAndWait(d.label ?? d.surface, d.approvalUrl, report.podUrl, () => wait({ podUrl: report.podUrl, pendingKey: d.key }), openUrl)
|
|
257
|
+
: await wait({ podUrl: report.podUrl, pendingKey: d.key });
|
|
258
|
+
if (outcome === "approved")
|
|
259
|
+
outcomes.push(await finish(d, d.surface, d.key, d.agentUserId));
|
|
260
|
+
else if (outcome === "rejected")
|
|
261
|
+
outcomes.push({ diagnosis: d, ok: false, message: `${d.label ?? d.surface}: the request was declined on the pod. Run \`synap doctor --fix\` again to ask anew.` });
|
|
262
|
+
else
|
|
263
|
+
outcomes.push({ diagnosis: d, ok: false, message: `${d.label ?? d.surface}: still waiting for approval — nothing was changed. Approve ${d.approvalUrl ?? "it on your pod"}, then run \`synap doctor --fix\` again.` });
|
|
264
|
+
}
|
|
265
|
+
else if (d.action === "reprovision" && d.surface) {
|
|
266
|
+
if (!mintingKey) {
|
|
267
|
+
outcomes.push({ diagnosis: d, ok: false, message: `${d.label ?? d.surface}: your CLI key for this pod does not work either — run \`synap login --reconnect\` first, then \`synap doctor --fix\`.` });
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const fresh = await provision(report.podUrl, mintingKey, d.agentType ?? d.surface, d.surface);
|
|
271
|
+
outcomes.push(await finish(d, d.surface, fresh.hubApiKey, fresh.agentUserId));
|
|
272
|
+
}
|
|
273
|
+
else if (d.action === "rewrite" && d.surface && d.key) {
|
|
274
|
+
outcomes.push(await finish(d, d.surface, d.key, d.agentUserId));
|
|
275
|
+
}
|
|
276
|
+
else if (d.action === "login" || d.action === "edit_shell_rc") {
|
|
277
|
+
outcomes.push({ diagnosis: d, ok: false, message: `${d.title}. Not something --fix can do for you — run: ${d.command}` });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
outcomes.push({ diagnosis: d, ok: false, message: `${d.surface ?? "key"}: ${err instanceof Error ? err.message : String(err)}` });
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return outcomes;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=key-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-doctor.js","sourceRoot":"","sources":["../../src/lib/key-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every place on this computer that holds a Synap key for one pod.
|
|
3
|
+
*
|
|
4
|
+
* A key is not "configured" in one place. `synap connect claude-code` alone
|
|
5
|
+
* writes three copies (the CLI config, Claude Code's env, Claude Code's MCP
|
|
6
|
+
* registry); every other client `synap connect` supports keeps its own copy in
|
|
7
|
+
* its own file and format (Cursor, Codex, Windsurf, Zed, Goose, VS Code…); a
|
|
8
|
+
* shell rc may export another, and the ambient `SYNAP_HUB_API_KEY` silently
|
|
9
|
+
* beats the CLI profile. When the copies disagree, the one that wins is the one
|
|
10
|
+
* nobody looked at — so the doctor reads all of them, and says which FILE each
|
|
11
|
+
* one lives in.
|
|
12
|
+
*
|
|
13
|
+
* Two honesty rules:
|
|
14
|
+
* - A file it cannot read or parse is reported `unchecked` ("not checked:
|
|
15
|
+
* Zed — settings.json is not valid JSON"), never silently skipped — an
|
|
16
|
+
* unread file is not a file with no key in it.
|
|
17
|
+
* - `podKnown`: a key is sent to this pod (`/auth/key-state`) only when
|
|
18
|
+
* something ties it to THIS pod — a profile / agent key recorded for this
|
|
19
|
+
* pod URL, a client entry whose MCP URL is this pod, a shell rc / process env
|
|
20
|
+
* that also names this pod. A key with no recorded pod (an old `agentKeys`
|
|
21
|
+
* entry, a bare `export SYNAP_HUB_API_KEY`) may be another pod's secret, so it
|
|
22
|
+
* is listed but never sent.
|
|
23
|
+
*
|
|
24
|
+
* Read-only. The client files to read come in as `clients` (derived from
|
|
25
|
+
* `TARGETS` by the caller); everything else is derived from `home`, so tests
|
|
26
|
+
* run on a temp HOME and never see the person's real files.
|
|
27
|
+
*/
|
|
28
|
+
export type KeyRole = "person" | "agent";
|
|
29
|
+
export type KeyLocationKind = "profile" | "agent-key-by-pod" | "agent-key" | "pending" | "claude-settings-env" | "claude-mcp-header"
|
|
30
|
+
/** An MCP entry in another client's own config file (Cursor, Codex, Zed…). */
|
|
31
|
+
| "client-config" | "shell-rc" | "process-env";
|
|
32
|
+
/** How a client's config file stores its MCP servers (one parser each). */
|
|
33
|
+
export type KeyFileFormat = "claude-code" | "json" | "jsonc" | "toml" | "yaml-goose";
|
|
34
|
+
/** One client config file to read, for one agent surface. */
|
|
35
|
+
export interface ClientKeyFile {
|
|
36
|
+
surface: string;
|
|
37
|
+
/** The tool's name, for "not checked: <tool>". */
|
|
38
|
+
tool: string;
|
|
39
|
+
file: string;
|
|
40
|
+
format: KeyFileFormat;
|
|
41
|
+
}
|
|
42
|
+
export interface KeyLocation {
|
|
43
|
+
kind: KeyLocationKind;
|
|
44
|
+
/** Human, ready to print: file + field. */
|
|
45
|
+
label: string;
|
|
46
|
+
/** The file it lives in (absent for the process environment). */
|
|
47
|
+
file?: string;
|
|
48
|
+
role: KeyRole;
|
|
49
|
+
/** Agent surface the key belongs to (claude-code, codex, …). */
|
|
50
|
+
surface?: string;
|
|
51
|
+
key: string;
|
|
52
|
+
/** Stored agent id, when the location records one. */
|
|
53
|
+
agentUserId?: string;
|
|
54
|
+
/** The doctor may rewrite this copy itself (shell rc files it never edits). */
|
|
55
|
+
rewritable: boolean;
|
|
56
|
+
/** Profile name, MCP server name, or line number — whatever names it inside the file. */
|
|
57
|
+
ref?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Something ties this copy to THIS pod. Default true; false = the key may be
|
|
60
|
+
* another pod's, so it is never sent to this one (see the module doc).
|
|
61
|
+
*/
|
|
62
|
+
podKnown?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** A place the doctor looked at and could NOT read — reported, never silently ✓. */
|
|
65
|
+
export interface UncheckedLocation {
|
|
66
|
+
/** The tool or store: "Zed", "~/.synap/config.json". */
|
|
67
|
+
tool: string;
|
|
68
|
+
file: string;
|
|
69
|
+
reason: string;
|
|
70
|
+
}
|
|
71
|
+
export interface KeyInventory {
|
|
72
|
+
locations: KeyLocation[];
|
|
73
|
+
unchecked: UncheckedLocation[];
|
|
74
|
+
}
|
|
75
|
+
/** Strip // and /* *\/ comments and trailing commas OUTSIDE strings (JSONC). */
|
|
76
|
+
export declare function stripJsonc(text: string): string;
|
|
77
|
+
/** `~/…` for display. */
|
|
78
|
+
export declare function tildify(file: string, home: string): string;
|
|
79
|
+
export declare const SHELL_RC_FILES: string[];
|
|
80
|
+
/**
|
|
81
|
+
* `SYNAP_HUB_API_KEY=…` assignments in shell rc files (export / set -x /
|
|
82
|
+
* plain), each with the `SYNAP_POD_URL` the same file sets, if any.
|
|
83
|
+
*/
|
|
84
|
+
export declare function shellRcAssignments(home: string): Array<{
|
|
85
|
+
file: string;
|
|
86
|
+
line: number;
|
|
87
|
+
key: string;
|
|
88
|
+
podUrl?: string;
|
|
89
|
+
}>;
|
|
90
|
+
/** One MCP entry found in a client file: its name, MCP URL and Bearer key. */
|
|
91
|
+
interface McpEntry {
|
|
92
|
+
name: string;
|
|
93
|
+
url?: string;
|
|
94
|
+
key?: string;
|
|
95
|
+
}
|
|
96
|
+
/** `[mcp_servers.<name>]` tables (Codex, Grok): `url = "…"` + a `Bearer …` header line. */
|
|
97
|
+
export declare function tomlEntries(text: string): McpEntry[];
|
|
98
|
+
export interface CollectInput {
|
|
99
|
+
home: string;
|
|
100
|
+
podUrl: string;
|
|
101
|
+
/** `process.env.SYNAP_HUB_API_KEY` as this process sees it. */
|
|
102
|
+
envKey?: string;
|
|
103
|
+
envPodUrl?: string;
|
|
104
|
+
/** Client config files to read (derived from `TARGETS` — `clientKeyFiles()`). */
|
|
105
|
+
clients?: ClientKeyFile[];
|
|
106
|
+
}
|
|
107
|
+
export declare function collectKeyInventory(input: CollectInput): KeyInventory;
|
|
108
|
+
/** The locations only (see {@link collectKeyInventory}). */
|
|
109
|
+
export declare function collectKeyLocations(input: CollectInput): KeyLocation[];
|
|
110
|
+
/**
|
|
111
|
+
* The keys this pod may be asked about: those with at least one copy tied to
|
|
112
|
+
* this pod. Every other key stays on this computer.
|
|
113
|
+
*/
|
|
114
|
+
export declare function keysToProbe(locations: KeyLocation[]): string[];
|
|
115
|
+
/**
|
|
116
|
+
* Which file(s) put the process env key there — the settings env Claude Code
|
|
117
|
+
* injects, or a shell rc. Empty = set by something the doctor cannot see.
|
|
118
|
+
*/
|
|
119
|
+
export declare function envKeySetBy(locations: KeyLocation[], envKey: string): KeyLocation[];
|
|
120
|
+
export {};
|