@synap-core/cli 1.11.0 → 1.13.0
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/LICENSE +21 -0
- package/README.md +40 -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 +32 -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 +524 -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 +116 -66
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/box.d.ts +42 -0
- package/dist/commands/box.js +89 -0
- package/dist/commands/box.js.map +1 -0
- package/dist/commands/bridge-setup.d.ts +14 -1
- package/dist/commands/bridge-setup.js +395 -129
- 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 +3 -1
- package/dist/commands/capability.js +249 -176
- 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/close-questions.d.ts +27 -0
- package/dist/commands/close-questions.js +49 -0
- package/dist/commands/close-questions.js.map +1 -0
- package/dist/commands/close-questions.test.d.ts +1 -0
- package/dist/commands/close-questions.test.js +52 -0
- package/dist/commands/close-questions.test.js.map +1 -0
- package/dist/commands/connect.d.ts +36 -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 +79 -44
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +203 -25
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +295 -21
- 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 +133 -3
- package/dist/commands/doctor.js +761 -41
- 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/hooks.d.ts +19 -0
- package/dist/commands/hooks.js +70 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/import.d.ts +393 -13
- package/dist/commands/import.js +1150 -54
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +34 -9
- package/dist/commands/init.js +481 -981
- 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 +121 -57
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +194 -72
- 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/observe.category.test.d.ts +1 -0
- package/dist/commands/observe.category.test.js +59 -0
- package/dist/commands/observe.category.test.js.map +1 -0
- package/dist/commands/observe.d.ts +3 -0
- package/dist/commands/observe.js +7 -5
- package/dist/commands/observe.js.map +1 -1
- package/dist/commands/observe.title.test.d.ts +1 -0
- package/dist/commands/observe.title.test.js +37 -0
- package/dist/commands/observe.title.test.js.map +1 -0
- 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 +171 -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 +11 -1
- package/dist/commands/pods.js +129 -131
- 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 +579 -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-feed-wait.d.ts +48 -0
- package/dist/commands/session-feed-wait.js +261 -0
- package/dist/commands/session-feed-wait.js.map +1 -0
- package/dist/commands/session-post.d.ts +40 -0
- package/dist/commands/session-post.js +96 -0
- package/dist/commands/session-post.js.map +1 -0
- package/dist/commands/session-wait.d.ts +116 -0
- package/dist/commands/session-wait.js +224 -0
- package/dist/commands/session-wait.js.map +1 -0
- package/dist/commands/sessions.d.ts +54 -0
- package/dist/commands/sessions.js +501 -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-commands.d.ts +2 -0
- package/dist/commands/skills-commands.js +9 -1
- package/dist/commands/skills-commands.js.map +1 -1
- package/dist/commands/skills-commands.test.d.ts +1 -0
- package/dist/commands/skills-commands.test.js +57 -0
- package/dist/commands/skills-commands.test.js.map +1 -0
- 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 +6 -35
- 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 +112 -0
- package/dist/commands/tracks.js +543 -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 +30 -3
- package/dist/commands/whoami.js +186 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker-accounts.d.ts +149 -0
- package/dist/commands/worker-accounts.js +339 -0
- package/dist/commands/worker-accounts.js.map +1 -0
- package/dist/commands/worker-accounts.test.d.ts +1 -0
- package/dist/commands/worker-accounts.test.js +224 -0
- package/dist/commands/worker-accounts.test.js.map +1 -0
- package/dist/commands/worker.d.ts +331 -0
- package/dist/commands/worker.js +1067 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/commands/worker.test.d.ts +1 -0
- package/dist/commands/worker.test.js +427 -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 +1043 -186
- 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 +136 -0
- package/dist/lib/agent-door.js +429 -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 +17 -11
- package/dist/lib/auth.js +47 -64
- 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/box/egress.d.ts +82 -0
- package/dist/lib/box/egress.js +264 -0
- package/dist/lib/box/egress.js.map +1 -0
- package/dist/lib/box/evidence.d.ts +86 -0
- package/dist/lib/box/evidence.js +121 -0
- package/dist/lib/box/evidence.js.map +1 -0
- package/dist/lib/box/job-server.d.ts +72 -0
- package/dist/lib/box/job-server.js +246 -0
- package/dist/lib/box/job-server.js.map +1 -0
- package/dist/lib/box/provisioner.d.ts +83 -0
- package/dist/lib/box/provisioner.js +312 -0
- package/dist/lib/box/provisioner.js.map +1 -0
- package/dist/lib/box/proxmox.d.ts +112 -0
- package/dist/lib/box/proxmox.js +211 -0
- package/dist/lib/box/proxmox.js.map +1 -0
- package/dist/lib/box/wire.d.ts +98 -0
- package/dist/lib/box/wire.js +70 -0
- package/dist/lib/box/wire.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/client-header.test.d.ts +1 -0
- package/dist/lib/client-header.test.js +85 -0
- package/dist/lib/client-header.test.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +33 -0
- package/dist/lib/conversation-headers.js +69 -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 +144 -0
- package/dist/lib/credential-class.js +138 -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/goal-words.d.ts +38 -0
- package/dist/lib/goal-words.js +112 -0
- package/dist/lib/goal-words.js.map +1 -0
- package/dist/lib/hub-client.d.ts +57 -15
- package/dist/lib/hub-client.js +396 -82
- 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 +24 -0
- package/dist/lib/init-handoff.js +26 -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 +68 -0
- package/dist/lib/key-source.js +109 -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 +25 -0
- package/dist/lib/knowledge-title.js +47 -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 +49 -0
- package/dist/lib/mcp-bridge.js +180 -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 +118 -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/openclaw.js +3 -2
- package/dist/lib/openclaw.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-moved.d.ts +70 -0
- package/dist/lib/pod-moved.js +146 -0
- package/dist/lib/pod-moved.js.map +1 -0
- package/dist/lib/pod-reach.d.ts +39 -0
- package/dist/lib/pod-reach.js +117 -0
- package/dist/lib/pod-reach.js.map +1 -0
- package/dist/lib/pod-reach.test.d.ts +1 -0
- package/dist/lib/pod-reach.test.js +67 -0
- package/dist/lib/pod-reach.test.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 +74 -112
- package/dist/lib/pod.js +146 -415
- 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/register-claude-code-mcp.test.d.ts +1 -0
- package/dist/lib/register-claude-code-mcp.test.js +78 -0
- package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
- package/dist/lib/review-credential.d.ts +119 -0
- package/dist/lib/review-credential.js +149 -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-feed.d.ts +185 -0
- package/dist/lib/session-feed.js +257 -0
- package/dist/lib/session-feed.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 +152 -10
- package/dist/lib/targets.js +974 -325
- 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/lib/wake-hook-settings.d.ts +57 -0
- package/dist/lib/wake-hook-settings.js +153 -0
- package/dist/lib/wake-hook-settings.js.map +1 -0
- package/dist/lib/wake-state.d.ts +65 -0
- package/dist/lib/wake-state.js +122 -0
- package/dist/lib/wake-state.js.map +1 -0
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +26 -17
- package/skills/README.md +13 -11
- 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 +1149 -289
- 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/code-skills.md +70 -0
- package/skills/synap/concepts.md +36 -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 +143 -47
- package/skills/synap/escalation-ladder.md +20 -10
- package/skills/synap/focus-sessions.md +56 -21
- package/skills/synap/from-intent.md +158 -0
- package/skills/synap/governance-rules.md +5 -5
- 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 +34 -16
- package/skills/synap/linking.md +42 -41
- package/skills/synap/mcp-remote-servers.md +64 -0
- package/skills/synap/mental-model.md +17 -15
- package/skills/synap/operating-mode-rules.md +2 -2
- package/skills/synap/processes.md +118 -0
- package/skills/synap/quick-reference.md +7 -2
- 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 +110 -0
- package/skills/synap/worked-examples.md +4 -5
- package/skills/synap/workspace-design.md +15 -11
- package/skills/synap/writes.md +105 -25
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +149 -67
- package/skills/synap-app/_skill.yaml +1 -1
- package/skills/synap-app/creating-the-base-app.md +12 -7
- package/skills/synap-app/governance.md +27 -16
- package/skills/synap-app/install-commands.md +18 -9
- package/skills/synap-app/overview.md +16 -9
- package/skills/synap-app/using-the-sdk.md +75 -25
- 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/box/runner.py +206 -0
- 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/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
|
@@ -13,10 +13,126 @@
|
|
|
13
13
|
* ACTUALLY returned (applied vs proposed vs nothing-created) instead of guessing
|
|
14
14
|
* off the planned proposal count.
|
|
15
15
|
*
|
|
16
|
-
* Kept local to the CLI (not imported from @synap/hub-rest-client) because the
|
|
16
|
+
* Kept local to the CLI (not imported from @synap-core/hub-rest-client) because the
|
|
17
17
|
* CLI resolves the SDK via its built dist — the same reason the previous local
|
|
18
18
|
* mirrors existed. This is now the ONE mirror instead of two.
|
|
19
19
|
*/
|
|
20
|
+
/**
|
|
21
|
+
* ADVISORY hints only — an AI pick proposes, it never places data. A user's
|
|
22
|
+
* deliberate choice (`--workspace` / `--project`) is NOT a hint.
|
|
23
|
+
*/
|
|
24
|
+
export function captureExecuteRoutingHints(structured) {
|
|
25
|
+
return {
|
|
26
|
+
aiWorkspaceId: structured.targetWorkspaceId,
|
|
27
|
+
aiWorkspaceConfidence: structured.targetWorkspaceConfidence,
|
|
28
|
+
aiWorkspaceReason: structured.targetWorkspaceReason,
|
|
29
|
+
aiWorkspaceDecision: structured.targetWorkspaceDecision,
|
|
30
|
+
aiProjectId: structured.targetProjectId,
|
|
31
|
+
aiProjectConfidence: structured.targetProjectConfidence,
|
|
32
|
+
aiProjectReason: structured.targetProjectReason,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** The AI's workspace-side hints only (drop them when the user pinned a workspace). */
|
|
36
|
+
export function workspaceRoutingHints(structured) {
|
|
37
|
+
const { aiWorkspaceId, aiWorkspaceConfidence, aiWorkspaceReason, aiWorkspaceDecision } = captureExecuteRoutingHints(structured);
|
|
38
|
+
return { aiWorkspaceId, aiWorkspaceConfidence, aiWorkspaceReason, aiWorkspaceDecision };
|
|
39
|
+
}
|
|
40
|
+
/** The AI's project-side hints only (drop them when the user pinned a project). */
|
|
41
|
+
export function projectRoutingHints(structured) {
|
|
42
|
+
const { aiProjectId, aiProjectConfidence, aiProjectReason } = captureExecuteRoutingHints(structured);
|
|
43
|
+
return { aiProjectId, aiProjectConfidence, aiProjectReason };
|
|
44
|
+
}
|
|
45
|
+
/** THE destination rule — see the shared type's docblock. */
|
|
46
|
+
export function deriveWorkspacePlacementView(placement, selection, opts) {
|
|
47
|
+
if (!placement) {
|
|
48
|
+
return {
|
|
49
|
+
destination: { workspaceId: null, workspaceName: null },
|
|
50
|
+
aiSuggested: false,
|
|
51
|
+
alternatives: [],
|
|
52
|
+
canRemove: false,
|
|
53
|
+
execute: {},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const suggestion = placement.suggestion;
|
|
57
|
+
const base = {
|
|
58
|
+
workspaceId: placement.workspaceId,
|
|
59
|
+
workspaceName: placement.workspaceName,
|
|
60
|
+
};
|
|
61
|
+
const pinBase = () => placement.deterministic && placement.workspaceId
|
|
62
|
+
? { targetWorkspaceId: placement.workspaceId }
|
|
63
|
+
: {};
|
|
64
|
+
if (selection.kind === "chosen") {
|
|
65
|
+
return {
|
|
66
|
+
destination: {
|
|
67
|
+
workspaceId: selection.workspaceId,
|
|
68
|
+
workspaceName: selection.workspaceName,
|
|
69
|
+
},
|
|
70
|
+
aiSuggested: false,
|
|
71
|
+
alternatives: suggestion?.alternatives ?? [],
|
|
72
|
+
canRemove: false,
|
|
73
|
+
execute: {
|
|
74
|
+
targetWorkspaceId: selection.workspaceId,
|
|
75
|
+
...(suggestion
|
|
76
|
+
? {
|
|
77
|
+
workspaceChoice: selection.workspaceId === suggestion.workspaceId ? "accepted" : "changed",
|
|
78
|
+
}
|
|
79
|
+
: {}),
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (selection.kind === "removed" || !suggestion || !opts.interactive) {
|
|
84
|
+
const choice = !suggestion
|
|
85
|
+
? undefined
|
|
86
|
+
: selection.kind === "removed"
|
|
87
|
+
? "removed"
|
|
88
|
+
: "ignored";
|
|
89
|
+
return {
|
|
90
|
+
destination: base,
|
|
91
|
+
aiSuggested: false,
|
|
92
|
+
alternatives: suggestion?.alternatives ?? [],
|
|
93
|
+
canRemove: false,
|
|
94
|
+
execute: {
|
|
95
|
+
...(choice === "removed" && placement.workspaceId
|
|
96
|
+
? { targetWorkspaceId: placement.workspaceId }
|
|
97
|
+
: pinBase()),
|
|
98
|
+
...(choice ? { workspaceChoice: choice } : {}),
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
destination: {
|
|
104
|
+
workspaceId: suggestion.workspaceId,
|
|
105
|
+
workspaceName: suggestion.workspaceName,
|
|
106
|
+
},
|
|
107
|
+
aiSuggested: true,
|
|
108
|
+
alternatives: suggestion.alternatives,
|
|
109
|
+
canRemove: true,
|
|
110
|
+
execute: { targetWorkspaceId: suggestion.workspaceId, workspaceChoice: "accepted" },
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The headless placement fields the CLI sends to `/capture/execute` — the ONE
|
|
115
|
+
* door, so the CLI can never hand-roll a destination. Headless ⇒ an AI
|
|
116
|
+
* suggestion stays a proposal; a deterministic placement is pinned explicitly.
|
|
117
|
+
*/
|
|
118
|
+
export function headlessPlacementFields(structured) {
|
|
119
|
+
return deriveWorkspacePlacementView(structured.placement, { kind: "default" }, {
|
|
120
|
+
interactive: false,
|
|
121
|
+
}).execute;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The workspace line for a structure result: the NAME the pod resolved (never
|
|
125
|
+
* a raw id when a name is known) and the confidence percent, once.
|
|
126
|
+
*/
|
|
127
|
+
export function formatWorkspaceRouting(result) {
|
|
128
|
+
const label = result.targetWorkspaceName || result.targetWorkspaceId;
|
|
129
|
+
if (!label)
|
|
130
|
+
return null;
|
|
131
|
+
const conf = typeof result.targetWorkspaceConfidence === "number"
|
|
132
|
+
? ` (${Math.round(result.targetWorkspaceConfidence * 100)}%)`
|
|
133
|
+
: "";
|
|
134
|
+
return `${label}${conf}`;
|
|
135
|
+
}
|
|
20
136
|
/**
|
|
21
137
|
* Interpret a /capture/execute response HONESTLY. Distinguishes applied vs
|
|
22
138
|
* proposed vs nothing-created and surfaces the real proposal/review handle so
|
|
@@ -33,25 +149,147 @@ export function readCaptureExecute(res) {
|
|
|
33
149
|
relationsCreated: Array.isArray(res.relations) ? res.relations.length : 0,
|
|
34
150
|
proposalId: res.proposalId ? String(res.proposalId) : undefined,
|
|
35
151
|
reviewUrl: res.reviewUrl ? String(res.reviewUrl) : undefined,
|
|
36
|
-
|
|
37
|
-
?
|
|
38
|
-
:
|
|
152
|
+
...(res.pendingWorkspaceSwitch?.suggestedWorkspaceId
|
|
153
|
+
? { pendingWorkspaceSwitch: res.pendingWorkspaceSwitch }
|
|
154
|
+
: {}),
|
|
39
155
|
};
|
|
40
156
|
}
|
|
41
|
-
/**
|
|
157
|
+
/**
|
|
158
|
+
* The one line every CLI surface prints for an outstanding workspace
|
|
159
|
+
* suggestion. It says what to DO (re-file with `--workspace`), because the pod
|
|
160
|
+
* moved nothing — the old "→ filed into workspace X" line reported a move that
|
|
161
|
+
* never happened.
|
|
162
|
+
*/
|
|
163
|
+
export function formatPendingWorkspaceSwitch(outcome) {
|
|
164
|
+
const s = outcome.pendingWorkspaceSwitch;
|
|
165
|
+
if (!s)
|
|
166
|
+
return null;
|
|
167
|
+
const label = s.suggestedWorkspaceName || s.suggestedWorkspaceId;
|
|
168
|
+
const conf = typeof s.confidence === "number" ? ` (${Math.round(s.confidence * 100)}%)` : "";
|
|
169
|
+
return `AI suggests workspace ${label}${conf} — nothing was moved. Re-file with --workspace ${s.suggestedWorkspaceId} to accept.`;
|
|
170
|
+
}
|
|
171
|
+
/** True when the structure step degraded (nothing usable came back). */
|
|
42
172
|
export function isDegraded(res) {
|
|
43
173
|
return res.degraded === true;
|
|
44
174
|
}
|
|
45
175
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
176
|
+
* One line of honest copy for a degraded reason: WHAT happened, and WHAT TO DO.
|
|
177
|
+
*
|
|
178
|
+
* ── Why this is a second table, deliberately ────────────────────────────────
|
|
179
|
+
* `@synap-core/capture-pipeline`'s `describeDegradedReason` is the existing
|
|
180
|
+
* one-door for this copy, and it is the RIGHT door — but the CLI is a separate
|
|
181
|
+
* pnpm workspace whose only Synap runtime dependencies are
|
|
182
|
+
* `@synap-core/hub-rest-client` (a file: link into synap-backend) and
|
|
183
|
+
* `@synap-core/workspace-templates`. It cannot reach a `synap-app` package
|
|
184
|
+
* without a package.json/lockfile change. Same reason the `StructureResult`
|
|
185
|
+
* mirror above is local.
|
|
186
|
+
*
|
|
187
|
+
* So: the `title` half is COPIED VERBATIM from `describeDegradedReason` and
|
|
188
|
+
* pinned by a parity test (`test/degraded-message-honesty.test.ts`) that reads
|
|
189
|
+
* the sibling repo's source, so the two can never drift on WHAT happened.
|
|
190
|
+
* The `detail` half is deliberately DIFFERENT, because the app's
|
|
191
|
+
* details end in "saved as a note in the meantime" and the CLI creates nothing
|
|
192
|
+
* at all — repeating the app's sentence here would be a new lie in place of the
|
|
193
|
+
* old one.
|
|
194
|
+
*/
|
|
195
|
+
export function describeDegradedReason(reason) {
|
|
196
|
+
switch (reason) {
|
|
197
|
+
case "is_auth_error":
|
|
198
|
+
return {
|
|
199
|
+
title: "AI intelligence isn't connected",
|
|
200
|
+
detail: "This pod's Intelligence Service rejected its credentials. Check them with `synap doctor`, then re-run this import.",
|
|
201
|
+
};
|
|
202
|
+
case "llm_budget_exceeded":
|
|
203
|
+
return {
|
|
204
|
+
title: "The monthly AI budget is used up",
|
|
205
|
+
detail: "The Intelligence Service's monthly token budget is spent, so nothing was created. Re-run this import once the budget resets next month or an operator raises it.",
|
|
206
|
+
};
|
|
207
|
+
case "pdf_scanned_needs_ocr":
|
|
208
|
+
return {
|
|
209
|
+
title: "This PDF has no text layer",
|
|
210
|
+
detail: "It's a scan, not typed text, so there is nothing to read yet. OCR it first, or keep the original with `synap import --keep-raw <file>`.",
|
|
211
|
+
};
|
|
212
|
+
case "pdf_missing_binary":
|
|
213
|
+
return {
|
|
214
|
+
title: "The PDF file wasn't available to read",
|
|
215
|
+
detail: "The bytes never reached the pod. Re-run the import for this file.",
|
|
216
|
+
};
|
|
217
|
+
case "vision_provider_not_configured":
|
|
218
|
+
return {
|
|
219
|
+
title: "Image reading isn't set up on this pod",
|
|
220
|
+
detail: "No vision-capable model is configured, so images can't be described. Configure one in Settings → Intelligence; until then keep the original with `synap import --keep-raw <file>`.",
|
|
221
|
+
};
|
|
222
|
+
case "vision_provider_failed":
|
|
223
|
+
return {
|
|
224
|
+
title: "Couldn't reach the AI that reads images",
|
|
225
|
+
detail: "A vision model is configured but the call failed (an outage, an unfunded key or an unknown model). Re-run this import later; `synap doctor` checks the pod.",
|
|
226
|
+
};
|
|
227
|
+
case "image_missing_binary":
|
|
228
|
+
return {
|
|
229
|
+
title: "The image file wasn't available to read",
|
|
230
|
+
detail: "The bytes never reached the pod. Re-run the import for this file.",
|
|
231
|
+
};
|
|
232
|
+
case "transcription_provider_not_configured":
|
|
233
|
+
return {
|
|
234
|
+
title: "Audio transcription isn't set up on this pod",
|
|
235
|
+
detail: "No transcription model is configured, so speech can't be turned into text. Configure one in Settings → Intelligence; until then keep the original with `synap import --keep-raw <file>`.",
|
|
236
|
+
};
|
|
237
|
+
case "audio_missing_binary":
|
|
238
|
+
return {
|
|
239
|
+
title: "The audio file wasn't available to read",
|
|
240
|
+
detail: "The bytes never reached the pod. Re-run the import for this file.",
|
|
241
|
+
};
|
|
242
|
+
case "docx_missing_binary":
|
|
243
|
+
return {
|
|
244
|
+
title: "The document file wasn't available to read",
|
|
245
|
+
detail: "The bytes never reached the pod. Re-run the import for this file.",
|
|
246
|
+
};
|
|
247
|
+
case "docx_empty":
|
|
248
|
+
return {
|
|
249
|
+
title: "This document has no extractable text",
|
|
250
|
+
detail: "It parsed cleanly but came back empty. Keep the original with `synap import --keep-raw <file>` if you still want it stored.",
|
|
251
|
+
};
|
|
252
|
+
case "html_empty":
|
|
253
|
+
return {
|
|
254
|
+
title: "This page has no extractable text",
|
|
255
|
+
detail: "It parsed cleanly but came back empty — often a JavaScript-rendered page. Save the readable text yourself and pass it to `synap capture`.",
|
|
256
|
+
};
|
|
257
|
+
case "unsupported_type":
|
|
258
|
+
return {
|
|
259
|
+
title: "This file type isn't supported yet",
|
|
260
|
+
detail: "Nothing can be extracted from it. Keep the bytes anyway with `synap import --keep-raw <file>`, or `synap upload <file>` to store it as a file entity.",
|
|
261
|
+
};
|
|
262
|
+
case "is_invalid_response":
|
|
263
|
+
case "is_empty_result":
|
|
264
|
+
case undefined:
|
|
265
|
+
return {
|
|
266
|
+
title: "AI structuring is unavailable right now",
|
|
267
|
+
detail: "Nothing was created. Re-run this import when the structurer is back.",
|
|
268
|
+
};
|
|
269
|
+
default:
|
|
270
|
+
// A reason this list hasn't been taught yet (the IS added one, and the
|
|
271
|
+
// wire type is an open string). Degrade gracefully — never print the raw
|
|
272
|
+
// token at a user, and never crash on it.
|
|
273
|
+
return {
|
|
274
|
+
title: "This input couldn't be read",
|
|
275
|
+
detail: "Nothing was created. Run `synap doctor` to check what this pod can extract.",
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* The ONE degraded message. The CLI does NOT materialize the server's generic
|
|
281
|
+
* `item` stand-in (the browser does the same via `offlineFallback:false`), so a
|
|
282
|
+
* captured note is never silently downgraded to an unstructured blob behind a
|
|
283
|
+
* "success" line.
|
|
284
|
+
*
|
|
285
|
+
* It used to print a single sentence for every cause — "AI structuring
|
|
286
|
+
* unavailable (is_empty_result) — nothing was created. Retry when it's back."
|
|
287
|
+
* — which leaked a raw machine token AND told users to retry states that never
|
|
288
|
+
* change (a pod with no vision provider is not going to come back). Now each
|
|
289
|
+
* reason says what actually happened and what to do about it.
|
|
52
290
|
*/
|
|
53
291
|
export function degradedMessage(res) {
|
|
54
|
-
const
|
|
55
|
-
return
|
|
292
|
+
const { title, detail } = describeDegradedReason(res.degradedReason);
|
|
293
|
+
return `${title} — nothing was created. ${detail}`;
|
|
56
294
|
}
|
|
57
295
|
//# sourceMappingURL=capture-structure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-structure.js","sourceRoot":"","sources":["../../src/lib/capture-structure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"capture-structure.js","sourceRoot":"","sources":["../../src/lib/capture-structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where `synap bridge setup` reads the agency skills and the bridge automations.
|
|
3
|
+
*
|
|
4
|
+
* Their home is the catalog package (`@synap-core/catalog`, or
|
|
5
|
+
* `@synap-core/workspace-templates` before the rename): `skills/<name>/SKILL.md`
|
|
6
|
+
* and `automations/*.automation.json`. The CLI keeps copies under `templates/`
|
|
7
|
+
* for installs whose catalog package does not ship them yet. Resolution is per
|
|
8
|
+
* item: the INSTALLED package wins when it ships the item, the CLI copy is the
|
|
9
|
+
* fallback. The runtime skills (`authoring-*`, `coordinating-*`) have no catalog
|
|
10
|
+
* copy and always come from the CLI.
|
|
11
|
+
*
|
|
12
|
+
* Retirement: once the installed package ships an item, its CLI copy is dead
|
|
13
|
+
* weight that can silently fork. `catalogRetirementViolations` names those
|
|
14
|
+
* copies; `test/catalog-templates.test.ts` fails on any, so the pin bump that
|
|
15
|
+
* brings them in also deletes the CLI copies.
|
|
16
|
+
*/
|
|
17
|
+
/** Package names the catalog may be installed under (new name first). */
|
|
18
|
+
export declare const CATALOG_TEMPLATE_PACKAGES: readonly ["@synap-core/catalog", "@synap-core/workspace-templates"];
|
|
19
|
+
/**
|
|
20
|
+
* The agency/domain skills whose home is the catalog. Every other bundled skill
|
|
21
|
+
* is a CLI runtime skill. Pinned (not derived from the catalog) so the set
|
|
22
|
+
* bridge-setup seeds does not grow because the catalog gained a skill.
|
|
23
|
+
*/
|
|
24
|
+
export declare const AGENCY_SKILLS: readonly ["bookmark-enrichment", "mapping-the-server", "reading-client-progress", "routing-to-channels", "stellar-scf-grants-advisor"];
|
|
25
|
+
/** `<cli package root>/templates` (same depth from `src/lib` and `dist/lib`). */
|
|
26
|
+
export declare const CLI_TEMPLATES_DIR: string;
|
|
27
|
+
/**
|
|
28
|
+
* Root directory of the installed catalog package, or null when none resolves.
|
|
29
|
+
* Resolves the package's entry point and walks up to its package.json, because
|
|
30
|
+
* older versions do not export `./package.json`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveInstalledCatalogRoot(resolve?: (id: string) => string): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* The SKILL.md directories bridge-setup seeds: each agency skill from the
|
|
35
|
+
* installed catalog when it ships it, else from the CLI; plus every CLI runtime
|
|
36
|
+
* skill. `fromCatalog` names the skills read from the catalog.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveAgencySkillDirs(opts: {
|
|
39
|
+
cliSkillsDir: string | null;
|
|
40
|
+
catalogRoot: string | null;
|
|
41
|
+
}): {
|
|
42
|
+
dirs: string[];
|
|
43
|
+
fromCatalog: string[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* The automation templates directory: the `override` (AUTOMATION_TEMPLATES_DIR)
|
|
47
|
+
* when set (null if it does not exist), else the installed catalog's
|
|
48
|
+
* `automations/` when it ships any `*.automation.json`, else the CLI copy.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveAutomationTemplatesDir(opts: {
|
|
51
|
+
override?: string;
|
|
52
|
+
catalogRoot: string | null;
|
|
53
|
+
cliDir: string;
|
|
54
|
+
}): string | null;
|
|
55
|
+
/**
|
|
56
|
+
* CLI copies the installed catalog makes redundant, as paths relative to the CLI
|
|
57
|
+
* package root (`templates/skills/<name>`, `templates/automations/<file>`).
|
|
58
|
+
*/
|
|
59
|
+
export declare function catalogRetirementViolations(catalogRoot: string | null, cliTemplatesDir: string): string[];
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where `synap bridge setup` reads the agency skills and the bridge automations.
|
|
3
|
+
*
|
|
4
|
+
* Their home is the catalog package (`@synap-core/catalog`, or
|
|
5
|
+
* `@synap-core/workspace-templates` before the rename): `skills/<name>/SKILL.md`
|
|
6
|
+
* and `automations/*.automation.json`. The CLI keeps copies under `templates/`
|
|
7
|
+
* for installs whose catalog package does not ship them yet. Resolution is per
|
|
8
|
+
* item: the INSTALLED package wins when it ships the item, the CLI copy is the
|
|
9
|
+
* fallback. The runtime skills (`authoring-*`, `coordinating-*`) have no catalog
|
|
10
|
+
* copy and always come from the CLI.
|
|
11
|
+
*
|
|
12
|
+
* Retirement: once the installed package ships an item, its CLI copy is dead
|
|
13
|
+
* weight that can silently fork. `catalogRetirementViolations` names those
|
|
14
|
+
* copies; `test/catalog-templates.test.ts` fails on any, so the pin bump that
|
|
15
|
+
* brings them in also deletes the CLI copies.
|
|
16
|
+
*/
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import { createRequire } from "node:module";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
import { discoverSkillDirs } from "./skill-import.js";
|
|
22
|
+
/** Package names the catalog may be installed under (new name first). */
|
|
23
|
+
export const CATALOG_TEMPLATE_PACKAGES = ["@synap-core/catalog", "@synap-core/workspace-templates"];
|
|
24
|
+
/**
|
|
25
|
+
* The agency/domain skills whose home is the catalog. Every other bundled skill
|
|
26
|
+
* is a CLI runtime skill. Pinned (not derived from the catalog) so the set
|
|
27
|
+
* bridge-setup seeds does not grow because the catalog gained a skill.
|
|
28
|
+
*/
|
|
29
|
+
export const AGENCY_SKILLS = [
|
|
30
|
+
"bookmark-enrichment",
|
|
31
|
+
"mapping-the-server",
|
|
32
|
+
"reading-client-progress",
|
|
33
|
+
"routing-to-channels",
|
|
34
|
+
"stellar-scf-grants-advisor",
|
|
35
|
+
];
|
|
36
|
+
/** `<cli package root>/templates` (same depth from `src/lib` and `dist/lib`). */
|
|
37
|
+
export const CLI_TEMPLATES_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "templates");
|
|
38
|
+
/**
|
|
39
|
+
* Root directory of the installed catalog package, or null when none resolves.
|
|
40
|
+
* Resolves the package's entry point and walks up to its package.json, because
|
|
41
|
+
* older versions do not export `./package.json`.
|
|
42
|
+
*/
|
|
43
|
+
export function resolveInstalledCatalogRoot(resolve = createRequire(import.meta.url).resolve) {
|
|
44
|
+
for (const name of CATALOG_TEMPLATE_PACKAGES) {
|
|
45
|
+
let entry;
|
|
46
|
+
try {
|
|
47
|
+
entry = resolve(name);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue; // not installed under this name
|
|
51
|
+
}
|
|
52
|
+
for (let dir = path.dirname(entry); dir !== path.dirname(dir); dir = path.dirname(dir)) {
|
|
53
|
+
const pj = path.join(dir, "package.json");
|
|
54
|
+
if (!fs.existsSync(pj))
|
|
55
|
+
continue;
|
|
56
|
+
if (JSON.parse(fs.readFileSync(pj, "utf8")).name === name)
|
|
57
|
+
return dir;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
function catalogSkillDir(catalogRoot, name) {
|
|
63
|
+
if (!catalogRoot)
|
|
64
|
+
return null;
|
|
65
|
+
const dir = path.join(catalogRoot, "skills", name);
|
|
66
|
+
return fs.existsSync(path.join(dir, "SKILL.md")) ? dir : null;
|
|
67
|
+
}
|
|
68
|
+
function catalogAutomationFiles(catalogRoot) {
|
|
69
|
+
const dir = catalogRoot ? path.join(catalogRoot, "automations") : null;
|
|
70
|
+
if (!dir || !fs.existsSync(dir))
|
|
71
|
+
return [];
|
|
72
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith(".automation.json"));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The SKILL.md directories bridge-setup seeds: each agency skill from the
|
|
76
|
+
* installed catalog when it ships it, else from the CLI; plus every CLI runtime
|
|
77
|
+
* skill. `fromCatalog` names the skills read from the catalog.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveAgencySkillDirs(opts) {
|
|
80
|
+
const agency = new Set(AGENCY_SKILLS);
|
|
81
|
+
const dirs = [];
|
|
82
|
+
const fromCatalog = [];
|
|
83
|
+
const cliDirs = opts.cliSkillsDir ? discoverSkillDirs(opts.cliSkillsDir) : [];
|
|
84
|
+
for (const cliDir of cliDirs)
|
|
85
|
+
if (!agency.has(path.basename(cliDir)))
|
|
86
|
+
dirs.push(cliDir);
|
|
87
|
+
for (const name of AGENCY_SKILLS) {
|
|
88
|
+
const fromPkg = catalogSkillDir(opts.catalogRoot, name);
|
|
89
|
+
if (fromPkg) {
|
|
90
|
+
dirs.push(fromPkg);
|
|
91
|
+
fromCatalog.push(name);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const cliDir = cliDirs.find((d) => path.basename(d) === name);
|
|
95
|
+
if (cliDir)
|
|
96
|
+
dirs.push(cliDir);
|
|
97
|
+
}
|
|
98
|
+
return { dirs, fromCatalog };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The automation templates directory: the `override` (AUTOMATION_TEMPLATES_DIR)
|
|
102
|
+
* when set (null if it does not exist), else the installed catalog's
|
|
103
|
+
* `automations/` when it ships any `*.automation.json`, else the CLI copy.
|
|
104
|
+
*/
|
|
105
|
+
export function resolveAutomationTemplatesDir(opts) {
|
|
106
|
+
if (opts.override)
|
|
107
|
+
return fs.existsSync(opts.override) ? opts.override : null;
|
|
108
|
+
if (opts.catalogRoot && catalogAutomationFiles(opts.catalogRoot).length > 0)
|
|
109
|
+
return path.join(opts.catalogRoot, "automations");
|
|
110
|
+
return fs.existsSync(opts.cliDir) ? opts.cliDir : null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* CLI copies the installed catalog makes redundant, as paths relative to the CLI
|
|
114
|
+
* package root (`templates/skills/<name>`, `templates/automations/<file>`).
|
|
115
|
+
*/
|
|
116
|
+
export function catalogRetirementViolations(catalogRoot, cliTemplatesDir) {
|
|
117
|
+
const out = [];
|
|
118
|
+
for (const name of AGENCY_SKILLS)
|
|
119
|
+
if (catalogSkillDir(catalogRoot, name) && fs.existsSync(path.join(cliTemplatesDir, "skills", name)))
|
|
120
|
+
out.push(`templates/skills/${name}`);
|
|
121
|
+
for (const file of catalogAutomationFiles(catalogRoot))
|
|
122
|
+
if (fs.existsSync(path.join(cliTemplatesDir, "automations", file)))
|
|
123
|
+
out.push(`templates/automations/${file}`);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=catalog-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-templates.js","sourceRoot":"","sources":["../../src/lib/catalog-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which CLI is running: its version AND the commit it was built from.
|
|
3
|
+
*
|
|
4
|
+
* The version alone could not tell an Oct-11 test-branch build from current
|
|
5
|
+
* main (2026-10-15 devbox incident: same version, old code, wrong success
|
|
6
|
+
* line). `build` stamps `dist/build-info.json` (`scripts/write-build-info.mjs`);
|
|
7
|
+
* running from source (`tsx`) there is no stamp, and that is said, not hidden.
|
|
8
|
+
*/
|
|
9
|
+
export interface CliBuild {
|
|
10
|
+
version: string;
|
|
11
|
+
sha?: string;
|
|
12
|
+
branch?: string;
|
|
13
|
+
/** Built with uncommitted changes under src/. */
|
|
14
|
+
dirty?: boolean;
|
|
15
|
+
builtAt?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function cliBuild(dir?: string): CliBuild;
|
|
18
|
+
/** "1.12.0 (a750d09 main, built 2026-10-15)" — the version stays the first word. */
|
|
19
|
+
export declare function formatCliBuild(b: CliBuild): string;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which CLI is running: its version AND the commit it was built from.
|
|
3
|
+
*
|
|
4
|
+
* The version alone could not tell an Oct-11 test-branch build from current
|
|
5
|
+
* main (2026-10-15 devbox incident: same version, old code, wrong success
|
|
6
|
+
* line). `build` stamps `dist/build-info.json` (`scripts/write-build-info.mjs`);
|
|
7
|
+
* running from source (`tsx`) there is no stamp, and that is said, not hidden.
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
// dist/lib/cli-build.js → dist/build-info.json, package.json at the package
|
|
13
|
+
// root; the same two hops from src/lib when running from source.
|
|
14
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
function readJson(file) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(fs.readFileSync(file, "utf8"));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function cliBuild(dir = here) {
|
|
24
|
+
const pkg = readJson(path.join(dir, "..", "..", "package.json"));
|
|
25
|
+
const stamp = readJson(path.join(dir, "..", "build-info.json"));
|
|
26
|
+
return { version: pkg?.version ?? "unknown", ...(stamp ?? {}) };
|
|
27
|
+
}
|
|
28
|
+
/** "1.12.0 (a750d09 main, built 2026-10-15)" — the version stays the first word. */
|
|
29
|
+
export function formatCliBuild(b) {
|
|
30
|
+
if (!b.builtAt)
|
|
31
|
+
return `${b.version} (no build stamp: running from source or an unstamped build)`;
|
|
32
|
+
const day = b.builtAt.slice(0, 10);
|
|
33
|
+
if (!b.sha)
|
|
34
|
+
return `${b.version} (built ${day}, commit unknown)`;
|
|
35
|
+
return `${b.version} (${b.sha}${b.dirty ? "+changes" : ""}${b.branch ? ` ${b.branch}` : ""}, built ${day})`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cli-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-build.js","sourceRoot":"","sources":["../../src/lib/cli-build.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAWzC,4EAA4E;AAC5E,iEAAiE;AACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,QAAQ,CAAI,IAAY;IAC/B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAG,GAAG,IAAI;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAuB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,QAAQ,CAA4B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3F,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,CAAW;IACxC,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC,CAAC,OAAO,8DAA8D,CAAC;IAClG,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC,CAAC,OAAO,WAAW,GAAG,mBAAmB,CAAC;IACjE,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,GAAG,CAAC;AAC9G,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every call names its client program (`X-Synap-Client: <name>/<version>`), so
|
|
3
|
+
* the pod's usage telemetry can tell the CLI, its stdio MCP bridge and the
|
|
4
|
+
* synap-bridge mod apart on one key and one conversation.
|
|
5
|
+
*
|
|
6
|
+
* Driven through the real doors: `hubGet` (every Hub call goes through
|
|
7
|
+
* `sessionHeaders`), the real bridge pump, and the `synap mcp bridge` command.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { PassThrough } from "node:stream";
|
|
11
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
12
|
+
const captured = vi.hoisted(() => ({ opts: undefined }));
|
|
13
|
+
vi.mock("./mcp-bridge.js", async (orig) => {
|
|
14
|
+
const real = await orig();
|
|
15
|
+
return {
|
|
16
|
+
...real,
|
|
17
|
+
runMcpBridge: vi.fn(async (opts) => {
|
|
18
|
+
captured.opts = opts;
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
import { hubGet } from "./hub-client.js";
|
|
23
|
+
import { mcpBridgeHeaders, CLIENT_HEADER, clientHeader } from "./conversation-headers.js";
|
|
24
|
+
import { mcpBridge } from "../commands/mcp.js";
|
|
25
|
+
const VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
vi.unstubAllGlobals();
|
|
28
|
+
vi.unstubAllEnvs();
|
|
29
|
+
});
|
|
30
|
+
describe("X-Synap-Client", () => {
|
|
31
|
+
it("names the package version; an unusable version says unknown", () => {
|
|
32
|
+
expect(VERSION).toMatch(/^\d+\.\d+\.\d+/);
|
|
33
|
+
expect(clientHeader("synap-cli")).toEqual({ [CLIENT_HEADER]: `synap-cli/${VERSION}` });
|
|
34
|
+
expect(clientHeader("synap-cli", "1 2")).toEqual({ [CLIENT_HEADER]: "synap-cli/unknown" });
|
|
35
|
+
});
|
|
36
|
+
it("every Hub call sends synap-cli/<version>", async () => {
|
|
37
|
+
const seen = [];
|
|
38
|
+
vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
|
|
39
|
+
seen.push(init.headers);
|
|
40
|
+
return new Response(JSON.stringify({ ok: true }), {
|
|
41
|
+
status: 200,
|
|
42
|
+
headers: { "content-type": "application/json" },
|
|
43
|
+
});
|
|
44
|
+
}));
|
|
45
|
+
await hubGet("/workspaces", {}, { podUrl: "https://pod.example", apiKey: "k" });
|
|
46
|
+
expect(seen).toHaveLength(1);
|
|
47
|
+
expect(seen[0][CLIENT_HEADER]).toBe(`synap-cli/${VERSION}`);
|
|
48
|
+
});
|
|
49
|
+
it("the stdio MCP bridge sends synap-cli-mcp/<version> on every request", async () => {
|
|
50
|
+
const { runMcpBridge } = await vi.importActual("./mcp-bridge.js");
|
|
51
|
+
const input = new PassThrough();
|
|
52
|
+
const output = new PassThrough();
|
|
53
|
+
const sent = [];
|
|
54
|
+
const fetchImpl = (async (_u, init) => {
|
|
55
|
+
sent.push(init.headers);
|
|
56
|
+
return new Response(JSON.stringify({ jsonrpc: "2.0", id: sent.length, result: {} }), {
|
|
57
|
+
status: 200,
|
|
58
|
+
headers: { "content-type": "application/json" },
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
const done = runMcpBridge({
|
|
62
|
+
url: "https://pod/mcp",
|
|
63
|
+
apiKey: "k",
|
|
64
|
+
headers: mcpBridgeHeaders(undefined, "/x"),
|
|
65
|
+
input,
|
|
66
|
+
output,
|
|
67
|
+
fetchImpl,
|
|
68
|
+
log: () => { },
|
|
69
|
+
});
|
|
70
|
+
input.write(JSON.stringify({ jsonrpc: "2.0", id: 1, method: "initialize", params: {} }) + "\n");
|
|
71
|
+
input.write(JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/list" }) + "\n");
|
|
72
|
+
input.end();
|
|
73
|
+
await done;
|
|
74
|
+
expect(sent.length).toBe(2);
|
|
75
|
+
for (const h of sent)
|
|
76
|
+
expect(h[CLIENT_HEADER]).toBe(`synap-cli-mcp/${VERSION}`);
|
|
77
|
+
});
|
|
78
|
+
it("`synap mcp bridge` hands the bridge those headers", async () => {
|
|
79
|
+
vi.stubEnv("SYNAP_HUB_API_KEY", "k");
|
|
80
|
+
await mcpBridge({ url: "https://pod/mcp" });
|
|
81
|
+
expect(captured.opts?.headers?.[CLIENT_HEADER]).toBe(`synap-cli-mcp/${VERSION}`);
|
|
82
|
+
expect(captured.opts?.headers?.["X-Synap-Conversation"]).toBeTruthy();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=client-header.test.js.map
|