@synap-core/cli 1.10.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 +297 -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 +3 -14
- 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 +9 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +198 -25
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +307 -24
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +66 -4
- package/dist/commands/diagnose.js +329 -29
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/digest.js +2 -1
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/doc.d.ts +25 -4
- package/dist/commands/doc.js +100 -18
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +130 -0
- package/dist/commands/doctor.js +814 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.js +3 -1
- package/dist/commands/events.js.map +1 -1
- package/dist/commands/explain.js +5 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/graph.js +5 -3
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import.d.ts +368 -13
- package/dist/commands/import.js +1096 -55
- 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 +28 -6
- package/dist/commands/knowledge.js +358 -73
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.js +2 -2
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +193 -72
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +72 -0
- package/dist/commands/market-authoring.js +566 -0
- package/dist/commands/market-authoring.js.map +1 -0
- 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 +419 -20
- package/dist/commands/market.js +2124 -193
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +70 -13
- package/dist/commands/mcp.js +308 -40
- 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 +19 -0
- package/dist/commands/pods.js +220 -85
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +62 -0
- package/dist/commands/proposals-actions.js +146 -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 +479 -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 +19 -1
- 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 +68 -0
- package/dist/commands/upload.js +257 -0
- package/dist/commands/upload.js.map +1 -0
- 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 +1009 -171
- 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 +11 -8
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +342 -0
- package/dist/lib/capture-structure.js +295 -0
- package/dist/lib/capture-structure.js.map +1 -0
- 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 +216 -4
- package/dist/lib/cp-packages.js +414 -11
- 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 +43 -9
- package/dist/lib/hub-client.js +429 -65
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/id.d.ts +23 -0
- package/dist/lib/id.js +35 -0
- package/dist/lib/id.js.map +1 -0
- 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 +119 -115
- package/dist/lib/pod.js +206 -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 +78 -0
- package/dist/lib/template-file.js +140 -0
- package/dist/lib/template-file.js.map +1 -0
- 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 +25 -18
- package/skills/README.md +12 -10
- package/skills/agent-os/SKILL.md +220 -99
- package/skills/manifest.json +2 -2
- package/skills/onboard/SKILL.md +61 -25
- package/skills/synap/README.md +5 -8
- package/skills/synap/SKILL.md +1185 -301
- 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 +54 -151
- package/skills/synap/cli-operations.md +24 -18
- package/skills/synap/common-mistakes.md +1 -0
- package/skills/synap/concepts.md +28 -0
- package/skills/synap/content-os.md +92 -0
- package/skills/synap/creative-loop.md +15 -10
- package/skills/synap/crm.md +21 -52
- package/skills/synap/digesting-a-channel.md +25 -0
- 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 +24 -22
- package/skills/synap/multi-entity-capture.md +6 -4
- 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 +21 -1
- package/skills/synap/workspace-design.md +14 -10
- package/skills/synap/writes.md +165 -35
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +319 -0
- package/skills/synap-app/_order.txt +5 -0
- package/skills/synap-app/_skill.yaml +20 -0
- package/skills/synap-app/creating-the-base-app.md +64 -0
- package/skills/synap-app/governance.md +42 -0
- package/skills/synap-app/install-commands.md +55 -0
- package/skills/synap-app/overview.md +50 -0
- package/skills/synap-app/using-the-sdk.md +73 -0
- 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 +625 -0
- package/skills/synap-market/_order.txt +5 -0
- package/skills/synap-market/_skill.yaml +24 -0
- package/skills/synap-market/author-and-publish.md +212 -0
- package/skills/synap-market/discover-and-fetch.md +59 -0
- package/skills/synap-market/governance-and-catalog.md +63 -0
- package/skills/synap-market/install.md +133 -0
- package/skills/synap-market/overview.md +119 -0
- 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/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
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-click approval for the agent keys `synap init` mints (V1 D5).
|
|
3
|
+
*
|
|
4
|
+
* Codex and Cursor each mint their agent key with `requireApproval`, and
|
|
5
|
+
* `provisionAgentKey` used to open one review page per key and block on it.
|
|
6
|
+
* Connecting both meant two pages and two clicks, one after the other.
|
|
7
|
+
*
|
|
8
|
+
* Now `init` mints every key that needs approval FIRST (deferred), opens ONE
|
|
9
|
+
* page (`/approve-agents?keys=…` on the pod admin, backed by
|
|
10
|
+
* `POST /api/hub/setup/agent/pending/approve-batch`), and polls every key
|
|
11
|
+
* until the person approves them together. The approved keys are then handed
|
|
12
|
+
* to the installers through `takePreApprovedKey`, so each installer's own
|
|
13
|
+
* `provisionAgentKey` call returns the key the person already approved instead
|
|
14
|
+
* of minting a second one.
|
|
15
|
+
*
|
|
16
|
+
* A pod older than the batch door has no `/approve-agents` page: `init`
|
|
17
|
+
* probes the batch lookup door first and, when it is missing, opens each
|
|
18
|
+
* key's own review page instead (every pod version serves those).
|
|
19
|
+
*/
|
|
20
|
+
import chalk from "chalk";
|
|
21
|
+
import { log } from "../utils/logger.js";
|
|
22
|
+
import { openPodPage } from "./safe-open.js";
|
|
23
|
+
/**
|
|
24
|
+
* The targets whose installer mints an agent key that needs the person's
|
|
25
|
+
* approval. Claude Code mints without approval, so it is not here. The installers read their spec from this table
|
|
26
|
+
* (`installCodex` / `installCursor`), so the pre-mint cannot ask for a key the
|
|
27
|
+
* installer would not have asked for.
|
|
28
|
+
*/
|
|
29
|
+
export const TARGET_KEY_MINT = {
|
|
30
|
+
codex: { agentType: "codex", idempotent: true },
|
|
31
|
+
cursor: { agentType: "cursor", idempotent: true },
|
|
32
|
+
};
|
|
33
|
+
const ready = new Map();
|
|
34
|
+
/** Take (once) the key already minted — and approved — for `agentType`. */
|
|
35
|
+
export function takePreApprovedKey(agentType) {
|
|
36
|
+
const key = ready.get(agentType);
|
|
37
|
+
ready.delete(agentType);
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hand an installer a key that is already approved — the device flow returns
|
|
42
|
+
* one per agent the person approved with the computer (`device-connect.ts`).
|
|
43
|
+
* The installer's own `provisionAgentKey` call then takes it instead of minting,
|
|
44
|
+
* and `approveAgentKeysAtOnce` asks for nothing more for that agent.
|
|
45
|
+
*/
|
|
46
|
+
export function presetApprovedKey(agentType, key) {
|
|
47
|
+
ready.set(agentType, key);
|
|
48
|
+
}
|
|
49
|
+
/** The ONE review page for several pending keys, on the same origin as a single key's review URL. */
|
|
50
|
+
export function batchReviewUrl(reviewUrl, keyIds) {
|
|
51
|
+
const origin = new URL(reviewUrl).origin;
|
|
52
|
+
return `${origin}/approve-agents?keys=${keyIds.map(encodeURIComponent).join(",")}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Does this pod serve the batch approval page? Its lookup door answers 401/400
|
|
56
|
+
* without a signed-in session; a pod older than it answers 404. Unreachable
|
|
57
|
+
* reads as "no": the per-key pages work on every pod.
|
|
58
|
+
*/
|
|
59
|
+
export async function podSupportsBatchApproval(podUrl) {
|
|
60
|
+
const res = await fetch(`${podUrl.replace(/\/$/, "")}/api/hub/setup/agent/pending/lookup`, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: { "Content-Type": "application/json" },
|
|
63
|
+
body: JSON.stringify({ keyIds: [] }),
|
|
64
|
+
signal: AbortSignal.timeout(10_000),
|
|
65
|
+
}).catch(() => null);
|
|
66
|
+
return res !== null && res.status !== 404;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Mint every approval-gated key for `targets`, open one page, wait for all.
|
|
70
|
+
* Returns the targets the person did NOT approve (rejected, timed out, or
|
|
71
|
+
* failed to mint): `init` skips those instead of asking again, and prints
|
|
72
|
+
* one line for each.
|
|
73
|
+
*/
|
|
74
|
+
export async function approveAgentKeysAtOnce(podUrl, humanApiKey, targets, deps = {}) {
|
|
75
|
+
const provision = deps.provision ?? (await import("./targets.js")).provisionAgentKey;
|
|
76
|
+
const wait = deps.wait ?? (await import("./key-approval.js")).waitForKeyLive;
|
|
77
|
+
const openUrl = deps.openUrl ?? (await import("./targets.js")).openBrowserUrl;
|
|
78
|
+
const supportsBatch = deps.supportsBatch ?? podSupportsBatchApproval;
|
|
79
|
+
const podBase = podUrl.replace(/\/$/, "");
|
|
80
|
+
const pending = [];
|
|
81
|
+
const notApproved = [];
|
|
82
|
+
const reasons = {};
|
|
83
|
+
for (const target of targets) {
|
|
84
|
+
const spec = TARGET_KEY_MINT[target];
|
|
85
|
+
if (!spec)
|
|
86
|
+
continue;
|
|
87
|
+
// Approved already (with the computer, in the device flow): nothing to ask.
|
|
88
|
+
if (ready.has(spec.agentType))
|
|
89
|
+
continue;
|
|
90
|
+
try {
|
|
91
|
+
const r = await provision(podUrl, humanApiKey, spec.agentType, {
|
|
92
|
+
idempotent: spec.idempotent,
|
|
93
|
+
deferApproval: true,
|
|
94
|
+
});
|
|
95
|
+
if (r.pending) {
|
|
96
|
+
pending.push({
|
|
97
|
+
target,
|
|
98
|
+
agentType: spec.agentType,
|
|
99
|
+
hubApiKey: r.hubApiKey,
|
|
100
|
+
agentUserId: r.agentUserId,
|
|
101
|
+
...r.pending,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Already valid (reused) or active on mint: nothing to approve.
|
|
106
|
+
ready.set(spec.agentType, { hubApiKey: r.hubApiKey, agentUserId: r.agentUserId });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
notApproved.push(target);
|
|
111
|
+
reasons[target] = err instanceof Error ? err.message : String(err);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (pending.length === 0)
|
|
115
|
+
return { notApproved, reasons };
|
|
116
|
+
// One key keeps its own review page (which every pod version serves); so do
|
|
117
|
+
// several on a pod that predates the batch page.
|
|
118
|
+
const batch = pending.length > 1 && (await supportsBatch(podUrl));
|
|
119
|
+
const urls = batch
|
|
120
|
+
? [batchReviewUrl(pending[0].reviewUrl, pending.map((p) => p.pendingToken))]
|
|
121
|
+
: pending.map((p) => p.reviewUrl);
|
|
122
|
+
log.blank();
|
|
123
|
+
log.info(batch
|
|
124
|
+
? `Approve your ${pending.length} agents in one step:`
|
|
125
|
+
: pending.length > 1
|
|
126
|
+
? `Approve each of your ${pending.length} agents:`
|
|
127
|
+
: "Approve your agent:");
|
|
128
|
+
for (const url of urls) {
|
|
129
|
+
log.dim(url);
|
|
130
|
+
// A pod-supplied link: opened only on this pod's own / pod-admin origin.
|
|
131
|
+
openPodPage(url, podUrl, openUrl);
|
|
132
|
+
}
|
|
133
|
+
process.stdout.write(chalk.dim(" Waiting for approval"));
|
|
134
|
+
const ticker = setInterval(() => process.stdout.write(chalk.dim(".")), 2000);
|
|
135
|
+
try {
|
|
136
|
+
const outcomes = await Promise.allSettled(pending.map((p) => wait({ podUrl: podBase, pendingKey: p.hubApiKey, pendingToken: p.pendingToken, humanApiKey })));
|
|
137
|
+
process.stdout.write("\n");
|
|
138
|
+
const { clearPendingAgentKey } = await import("./pod.js");
|
|
139
|
+
outcomes.forEach((o, i) => {
|
|
140
|
+
const p = pending[i];
|
|
141
|
+
const outcome = o.status === "fulfilled" ? o.value : null;
|
|
142
|
+
if (outcome === "approved") {
|
|
143
|
+
// Live now: the recorded request is done; the installer writes the key.
|
|
144
|
+
clearPendingAgentKey(p.agentType, podUrl);
|
|
145
|
+
ready.set(p.agentType, { hubApiKey: p.hubApiKey, agentUserId: p.agentUserId });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
notApproved.push(p.target);
|
|
149
|
+
if (outcome === "rejected") {
|
|
150
|
+
clearPendingAgentKey(p.agentType, podUrl);
|
|
151
|
+
reasons[p.target] = "It was declined on the pod.";
|
|
152
|
+
}
|
|
153
|
+
else if (outcome === "timeout") {
|
|
154
|
+
// Still filed and recorded: the next connect resumes this request.
|
|
155
|
+
reasons[p.target] = `Nobody approved it in time — approve it at ${p.reviewUrl}, then run: synap doctor --fix`;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
reasons[p.target] = o.status === "rejected" && o.reason instanceof Error ? o.reason.message : String(o.status === "rejected" ? o.reason : "unknown");
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
clearInterval(ticker);
|
|
164
|
+
}
|
|
165
|
+
const approved = pending.length - pending.filter((p) => notApproved.includes(p.target)).length;
|
|
166
|
+
if (approved > 0)
|
|
167
|
+
log.success(`Approved ${approved} agent${approved > 1 ? "s" : ""}.`);
|
|
168
|
+
return { notApproved, reasons };
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=batch-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-approval.js","sourceRoot":"","sources":["../../src/lib/batch-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,12 +31,13 @@ export interface LaneReport {
|
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Derive the lane from the workspace-routing `source` returned by
|
|
34
|
-
* `resolveKnowledgeWorkspace`.
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* `resolveKnowledgeWorkspace`. Domain capture is the Work lane (even when
|
|
35
|
+
* workspaceId is omitted for server-derived / pod-wide preferred placement).
|
|
36
|
+
* (The backend routing endpoint P7b is the SSoT for resolving user/global
|
|
37
|
+
* lanes; the CLI's lane detection is a best-effort hint.)
|
|
37
38
|
*
|
|
38
|
-
* source
|
|
39
|
-
* "explicit" / "team" / "
|
|
39
|
+
* source → lane
|
|
40
|
+
* "explicit" / "team" / "server-derived …" → work
|
|
40
41
|
*/
|
|
41
42
|
export declare function laneFromSource(_source: string): CaptureLane;
|
|
42
43
|
/** Best-effort resolve a workspace name from the pod. Never throws. */
|
package/dist/lib/capture-lane.js
CHANGED
|
@@ -22,12 +22,13 @@ import { hubGet } from "./hub-client.js";
|
|
|
22
22
|
import { unwrapList } from "./unwrapList.js";
|
|
23
23
|
/**
|
|
24
24
|
* Derive the lane from the workspace-routing `source` returned by
|
|
25
|
-
* `resolveKnowledgeWorkspace`.
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* `resolveKnowledgeWorkspace`. Domain capture is the Work lane (even when
|
|
26
|
+
* workspaceId is omitted for server-derived / pod-wide preferred placement).
|
|
27
|
+
* (The backend routing endpoint P7b is the SSoT for resolving user/global
|
|
28
|
+
* lanes; the CLI's lane detection is a best-effort hint.)
|
|
28
29
|
*
|
|
29
|
-
* source
|
|
30
|
-
* "explicit" / "team" / "
|
|
30
|
+
* source → lane
|
|
31
|
+
* "explicit" / "team" / "server-derived …" → work
|
|
31
32
|
*/
|
|
32
33
|
export function laneFromSource(_source) {
|
|
33
34
|
return "work";
|
|
@@ -120,16 +121,18 @@ export async function reportWrite(res, o) {
|
|
|
120
121
|
// A proposal is normal (a PR under review), NOT a failure — neutral tone,
|
|
121
122
|
// never an alarm. The agent keeps composing; it just goes live on approval.
|
|
122
123
|
log.info(`${o.label} — proposed (under review)`);
|
|
124
|
+
// Full ids — feed straight into `synap proposals approve <id>` /
|
|
125
|
+
// a follow-up create-relation call referencing the proposed entity.
|
|
123
126
|
if (proposalId)
|
|
124
|
-
log.dim(` proposal: ${proposalId
|
|
127
|
+
log.dim(` proposal: ${proposalId}`);
|
|
125
128
|
// Expose the stable proposed entity ID so the AI can reference this entity
|
|
126
129
|
// in cross-write proposal graphs (e.g. create entity B linked to entity A).
|
|
127
130
|
const proposedEntityId = String(res.proposedEntityId ?? "");
|
|
128
131
|
if (proposedEntityId)
|
|
129
|
-
log.dim(` entity: ${proposedEntityId
|
|
132
|
+
log.dim(` entity: ${proposedEntityId}`);
|
|
130
133
|
}
|
|
131
134
|
else {
|
|
132
|
-
log.success(`${o.label}${id ? " " + chalk.dim(id
|
|
135
|
+
log.success(`${o.label}${id ? " " + chalk.dim(id) : ""}`);
|
|
133
136
|
}
|
|
134
137
|
console.log(" " + formatLaneLine(report));
|
|
135
138
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-lane.js","sourceRoot":"","sources":["../../src/lib/capture-lane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAkB,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAmB7C
|
|
1
|
+
{"version":3,"file":"capture-lane.js","sourceRoot":"","sources":["../../src/lib/capture-lane.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared shapes + honest reporting for the smart-capture pipeline
|
|
3
|
+
* (POST /capture/structure → POST /capture/execute).
|
|
4
|
+
*
|
|
5
|
+
* ONE declaration of the structure/execute wire shapes and ONE degraded/execute
|
|
6
|
+
* interpreter, imported by BOTH surfaces that drive this pipeline:
|
|
7
|
+
* • `synap capture "<free text>"` (commands/knowledge.ts)
|
|
8
|
+
* • `synap import <files|urls>` (commands/import.ts)
|
|
9
|
+
*
|
|
10
|
+
* These two used to keep independent `StructureResult` copies that had already
|
|
11
|
+
* drifted (import dropped fields knowledge kept). Consolidating here removes the
|
|
12
|
+
* drift AND the false-success reporting: the CLI now reports what /capture/execute
|
|
13
|
+
* ACTUALLY returned (applied vs proposed vs nothing-created) instead of guessing
|
|
14
|
+
* off the planned proposal count.
|
|
15
|
+
*
|
|
16
|
+
* Kept local to the CLI (not imported from @synap-core/hub-rest-client) because the
|
|
17
|
+
* CLI resolves the SDK via its built dist — the same reason the previous local
|
|
18
|
+
* mirrors existed. This is now the ONE mirror instead of two.
|
|
19
|
+
*/
|
|
20
|
+
export interface StructureProposal {
|
|
21
|
+
tempId: string;
|
|
22
|
+
profileSlug: string;
|
|
23
|
+
title: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
properties?: Record<string, unknown>;
|
|
26
|
+
content?: string;
|
|
27
|
+
existingEntityId?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface StructureRelation {
|
|
30
|
+
sourceTempId: string;
|
|
31
|
+
targetTempId: string;
|
|
32
|
+
relationType: string;
|
|
33
|
+
}
|
|
34
|
+
export interface FollowUpChip {
|
|
35
|
+
label: string;
|
|
36
|
+
value: string;
|
|
37
|
+
action?: "link_entity" | "set_property" | "add_relation" | "confirm" | "dismiss";
|
|
38
|
+
entityId?: string;
|
|
39
|
+
propertyKey?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface FollowUp {
|
|
42
|
+
question: string;
|
|
43
|
+
suggestions?: FollowUpChip[];
|
|
44
|
+
}
|
|
45
|
+
/** The distribution behind an AI workspace pick (see the shared type). */
|
|
46
|
+
export interface WorkspaceDecisionRecord {
|
|
47
|
+
decider: "jev" | "llm";
|
|
48
|
+
model?: string;
|
|
49
|
+
probabilities?: Record<string, number>;
|
|
50
|
+
candidates?: Array<{
|
|
51
|
+
id: string;
|
|
52
|
+
name: string;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
/** The placement advice a `capture.structure` result carries (a subset). */
|
|
56
|
+
export interface CaptureStructureRouting {
|
|
57
|
+
targetWorkspaceId?: string | null;
|
|
58
|
+
targetWorkspaceReason?: string | null;
|
|
59
|
+
targetWorkspaceConfidence?: number | null;
|
|
60
|
+
targetWorkspaceDecision?: WorkspaceDecisionRecord | null;
|
|
61
|
+
targetProjectId?: string | null;
|
|
62
|
+
targetProjectReason?: string | null;
|
|
63
|
+
targetProjectConfidence?: number | null;
|
|
64
|
+
}
|
|
65
|
+
/** The advisory routing fields `capture.execute` accepts. */
|
|
66
|
+
export interface CaptureExecuteRoutingHints {
|
|
67
|
+
aiWorkspaceId?: string | null;
|
|
68
|
+
aiWorkspaceConfidence?: number | null;
|
|
69
|
+
aiWorkspaceReason?: string | null;
|
|
70
|
+
aiWorkspaceDecision?: WorkspaceDecisionRecord | null;
|
|
71
|
+
aiProjectId?: string | null;
|
|
72
|
+
aiProjectConfidence?: number | null;
|
|
73
|
+
aiProjectReason?: string | null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* ADVISORY hints only — an AI pick proposes, it never places data. A user's
|
|
77
|
+
* deliberate choice (`--workspace` / `--project`) is NOT a hint.
|
|
78
|
+
*/
|
|
79
|
+
export declare function captureExecuteRoutingHints(structured: CaptureStructureRouting): CaptureExecuteRoutingHints;
|
|
80
|
+
/** The AI's workspace-side hints only (drop them when the user pinned a workspace). */
|
|
81
|
+
export declare function workspaceRoutingHints(structured: CaptureStructureRouting): {
|
|
82
|
+
aiWorkspaceId: string | null | undefined;
|
|
83
|
+
aiWorkspaceConfidence: number | null | undefined;
|
|
84
|
+
aiWorkspaceReason: string | null | undefined;
|
|
85
|
+
aiWorkspaceDecision: WorkspaceDecisionRecord | null | undefined;
|
|
86
|
+
};
|
|
87
|
+
/** The AI's project-side hints only (drop them when the user pinned a project). */
|
|
88
|
+
export declare function projectRoutingHints(structured: CaptureStructureRouting): {
|
|
89
|
+
aiProjectId: string | null | undefined;
|
|
90
|
+
aiProjectConfidence: number | null | undefined;
|
|
91
|
+
aiProjectReason: string | null | undefined;
|
|
92
|
+
};
|
|
93
|
+
/** Where a capture will land, as `capture.structure` resolved it. */
|
|
94
|
+
export interface CapturePlacement {
|
|
95
|
+
workspaceId: string | null;
|
|
96
|
+
workspaceName: string | null;
|
|
97
|
+
/** A deterministic rung placed it — never an AI guess. */
|
|
98
|
+
deterministic: boolean;
|
|
99
|
+
suggestion?: {
|
|
100
|
+
workspaceId: string;
|
|
101
|
+
workspaceName: string;
|
|
102
|
+
reason: string | null;
|
|
103
|
+
alternatives: Array<{
|
|
104
|
+
workspaceId: string;
|
|
105
|
+
workspaceName: string;
|
|
106
|
+
weight: number;
|
|
107
|
+
}>;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/** What the person did with the destination field before saving. */
|
|
111
|
+
export type WorkspaceSelection = {
|
|
112
|
+
kind: "default";
|
|
113
|
+
} | {
|
|
114
|
+
kind: "chosen";
|
|
115
|
+
workspaceId: string;
|
|
116
|
+
workspaceName: string;
|
|
117
|
+
} | {
|
|
118
|
+
kind: "removed";
|
|
119
|
+
};
|
|
120
|
+
export type WorkspaceChoice = "accepted" | "changed" | "removed" | "ignored";
|
|
121
|
+
export interface WorkspacePlacementView {
|
|
122
|
+
destination: {
|
|
123
|
+
workspaceId: string | null;
|
|
124
|
+
workspaceName: string | null;
|
|
125
|
+
};
|
|
126
|
+
aiSuggested: boolean;
|
|
127
|
+
alternatives: NonNullable<CapturePlacement["suggestion"]>["alternatives"];
|
|
128
|
+
canRemove: boolean;
|
|
129
|
+
execute: {
|
|
130
|
+
targetWorkspaceId?: string;
|
|
131
|
+
workspaceChoice?: WorkspaceChoice;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** THE destination rule — see the shared type's docblock. */
|
|
135
|
+
export declare function deriveWorkspacePlacementView(placement: CapturePlacement | null | undefined, selection: WorkspaceSelection, opts: {
|
|
136
|
+
interactive: boolean;
|
|
137
|
+
}): WorkspacePlacementView;
|
|
138
|
+
/**
|
|
139
|
+
* The headless placement fields the CLI sends to `/capture/execute` — the ONE
|
|
140
|
+
* door, so the CLI can never hand-roll a destination. Headless ⇒ an AI
|
|
141
|
+
* suggestion stays a proposal; a deterministic placement is pinned explicitly.
|
|
142
|
+
*/
|
|
143
|
+
export declare function headlessPlacementFields(structured: Pick<StructureResult, "placement">): {
|
|
144
|
+
targetWorkspaceId?: string;
|
|
145
|
+
workspaceChoice?: WorkspaceChoice;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* The workspace line for a structure result: the NAME the pod resolved (never
|
|
149
|
+
* a raw id when a name is known) and the confidence percent, once.
|
|
150
|
+
*/
|
|
151
|
+
export declare function formatWorkspaceRouting(result: {
|
|
152
|
+
targetWorkspaceId?: string | null;
|
|
153
|
+
targetWorkspaceName?: string | null;
|
|
154
|
+
targetWorkspaceConfidence?: number | null;
|
|
155
|
+
}): string | null;
|
|
156
|
+
/** Response of POST /capture/structure (the AI plan — writes NOTHING). */
|
|
157
|
+
export interface StructureResult {
|
|
158
|
+
proposals?: StructureProposal[];
|
|
159
|
+
relations?: StructureRelation[];
|
|
160
|
+
followUp?: string | FollowUp | null;
|
|
161
|
+
targetWorkspaceId?: string | null;
|
|
162
|
+
/** The pod's display name for `targetWorkspaceId` — what the CLI prints. */
|
|
163
|
+
targetWorkspaceName?: string | null;
|
|
164
|
+
targetWorkspaceConfidence?: number | null;
|
|
165
|
+
targetWorkspaceReason?: string | null;
|
|
166
|
+
targetWorkspaceDecision?: WorkspaceDecisionRecord | null;
|
|
167
|
+
targetProjectId?: string | null;
|
|
168
|
+
targetProjectConfidence?: number | null;
|
|
169
|
+
targetProjectReason?: string | null;
|
|
170
|
+
/**
|
|
171
|
+
* The honest destination block — where the capture lands and, separately,
|
|
172
|
+
* what the AI would SUGGEST. Read it through `headlessPlacementFields` /
|
|
173
|
+
* `deriveWorkspacePlacementView`, never by digging at `targetWorkspaceId`
|
|
174
|
+
* (which mixes a deterministic placement and an AI guess into one field).
|
|
175
|
+
* Absent on an older pod.
|
|
176
|
+
*/
|
|
177
|
+
placement?: CapturePlacement | null;
|
|
178
|
+
/** True when the IS structurer is down and the server returned a raw fallback. */
|
|
179
|
+
degraded?: boolean;
|
|
180
|
+
degradedReason?: DegradedReason;
|
|
181
|
+
/**
|
|
182
|
+
* Summary of the extraction pass, present when a `file` input was normalized
|
|
183
|
+
* to text before structuring. `text` is what the pod needs echoed back on
|
|
184
|
+
* execute (as `file.extractedText`) so a kept original lands with a real
|
|
185
|
+
* document body instead of an empty one — the pod cannot re-derive it,
|
|
186
|
+
* because extraction runs in the Intelligence Service.
|
|
187
|
+
*/
|
|
188
|
+
extraction?: {
|
|
189
|
+
kind: string;
|
|
190
|
+
extractor: string;
|
|
191
|
+
metadata?: Record<string, unknown>;
|
|
192
|
+
warnings?: string[];
|
|
193
|
+
text?: string;
|
|
194
|
+
textTruncated?: boolean;
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/** One materialized entity row in a /capture/execute response. */
|
|
198
|
+
export interface ExecuteCreated {
|
|
199
|
+
tempId?: string;
|
|
200
|
+
entityId?: string;
|
|
201
|
+
id?: string;
|
|
202
|
+
profileSlug?: string;
|
|
203
|
+
/** true = linked/deduped onto an EXISTING entity (nothing new was created). */
|
|
204
|
+
linked?: boolean;
|
|
205
|
+
degradedFrom?: string;
|
|
206
|
+
propertiesDropped?: boolean;
|
|
207
|
+
deduplicated?: boolean;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Response of POST /capture/execute — either a governed proposal (nothing
|
|
211
|
+
* written) or a materialized graph. The CLI authenticates as an agent, so it
|
|
212
|
+
* usually materializes, but a workspace policy can still queue a proposal; the
|
|
213
|
+
* reporter below reflects whichever actually happened.
|
|
214
|
+
*
|
|
215
|
+
* NOTE: there is no top-level `entitiesCreated`/`relationsCreated` on this
|
|
216
|
+
* response — those live only in the server's log line. Counts MUST be derived
|
|
217
|
+
* from `created`/`relations` (see `readCaptureExecute`).
|
|
218
|
+
*/
|
|
219
|
+
export interface ExecuteResult {
|
|
220
|
+
/** "proposed" when governance queued the write instead of applying it. */
|
|
221
|
+
status?: string;
|
|
222
|
+
created?: ExecuteCreated[];
|
|
223
|
+
relations?: unknown[];
|
|
224
|
+
proposalId?: string;
|
|
225
|
+
reviewUrl?: string;
|
|
226
|
+
reviewPath?: string;
|
|
227
|
+
/**
|
|
228
|
+
* The AI's outstanding "move to X?" suggestion. NOTHING was moved — the
|
|
229
|
+
* capture landed where it would have without the AI; re-file with an
|
|
230
|
+
* explicit workspace to accept it. (This replaced `movedToWorkspace`, which
|
|
231
|
+
* claimed a move the ladder never performs.)
|
|
232
|
+
*/
|
|
233
|
+
pendingWorkspaceSwitch?: {
|
|
234
|
+
suggestedWorkspaceId: string;
|
|
235
|
+
suggestedWorkspaceName: string | null;
|
|
236
|
+
reason: string | null;
|
|
237
|
+
confidence: number | null;
|
|
238
|
+
} | null;
|
|
239
|
+
message?: string;
|
|
240
|
+
/**
|
|
241
|
+
* Disposition of the ORIGINAL file, present only when the caller sent
|
|
242
|
+
* `keepRaw: true` + `file`. Four honest outcomes — the blob can be stored,
|
|
243
|
+
* parked behind governance, denied by policy, or fail on storage — and a
|
|
244
|
+
* caller that prints "kept" for all four is back to false success.
|
|
245
|
+
*/
|
|
246
|
+
sourceFile?: {
|
|
247
|
+
status: "stored" | "proposed" | "denied" | "failed";
|
|
248
|
+
entityId?: string;
|
|
249
|
+
documentId?: string;
|
|
250
|
+
proposalId?: string;
|
|
251
|
+
reviewUrl?: string;
|
|
252
|
+
reason?: string;
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/** The honest outcome of a /capture/execute call, derived from the response. */
|
|
256
|
+
export interface CaptureExecuteOutcome {
|
|
257
|
+
/** true when the write was queued for review, NOT applied. */
|
|
258
|
+
proposed: boolean;
|
|
259
|
+
/** entities newly created (excludes rows linked/deduped onto existing ones). */
|
|
260
|
+
entitiesCreated: number;
|
|
261
|
+
/** entities linked/deduped onto existing entities (nothing new stored). */
|
|
262
|
+
entitiesLinked: number;
|
|
263
|
+
relationsCreated: number;
|
|
264
|
+
proposalId?: string;
|
|
265
|
+
reviewUrl?: string;
|
|
266
|
+
/**
|
|
267
|
+
* The AI suggested another workspace and the pod did NOT move anything —
|
|
268
|
+
* a proposal for the caller to confirm, never a receipt of a move.
|
|
269
|
+
*/
|
|
270
|
+
pendingWorkspaceSwitch?: {
|
|
271
|
+
suggestedWorkspaceId: string;
|
|
272
|
+
suggestedWorkspaceName: string | null;
|
|
273
|
+
reason: string | null;
|
|
274
|
+
confidence: number | null;
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Interpret a /capture/execute response HONESTLY. Distinguishes applied vs
|
|
279
|
+
* proposed vs nothing-created and surfaces the real proposal/review handle so
|
|
280
|
+
* the CLI never claims "created" for a write that was proposed or a plan that
|
|
281
|
+
* only linked existing entities.
|
|
282
|
+
*/
|
|
283
|
+
export declare function readCaptureExecute(res: ExecuteResult): CaptureExecuteOutcome;
|
|
284
|
+
/**
|
|
285
|
+
* The one line every CLI surface prints for an outstanding workspace
|
|
286
|
+
* suggestion. It says what to DO (re-file with `--workspace`), because the pod
|
|
287
|
+
* moved nothing — the old "→ filed into workspace X" line reported a move that
|
|
288
|
+
* never happened.
|
|
289
|
+
*/
|
|
290
|
+
export declare function formatPendingWorkspaceSwitch(outcome: Pick<CaptureExecuteOutcome, "pendingWorkspaceSwitch">): string | null;
|
|
291
|
+
/** True when the structure step degraded (nothing usable came back). */
|
|
292
|
+
export declare function isDegraded(res: StructureResult): boolean;
|
|
293
|
+
/**
|
|
294
|
+
* WHY a capture degraded. Two families, and the difference is the whole point:
|
|
295
|
+
*
|
|
296
|
+
* • pod plumbing (`is_*`) — the structurer itself failed. Retrying is sensible.
|
|
297
|
+
* • Intelligence Service extraction honesty (everything else) — the INPUT
|
|
298
|
+
* could not be read. Several of these are PERMANENT CONFIGURATION states
|
|
299
|
+
* (`vision_provider_not_configured`, `transcription_provider_not_configured`)
|
|
300
|
+
* where "retry when it's back" is simply a lie: nothing is coming back.
|
|
301
|
+
*
|
|
302
|
+
* Open-ended (`string & {}`) because the IS owns this vocabulary and may add to
|
|
303
|
+
* it. An unknown value must humanize, never leak, never crash.
|
|
304
|
+
*/
|
|
305
|
+
export type DegradedReason = "is_auth_error" | "is_invalid_response" | "is_empty_result" | "llm_budget_exceeded" | "pdf_scanned_needs_ocr" | "pdf_missing_binary" | "vision_provider_not_configured" | "vision_provider_failed" | "image_missing_binary" | "transcription_provider_not_configured" | "audio_missing_binary" | "docx_missing_binary" | "docx_empty" | "html_empty" | "unsupported_type" | (string & {});
|
|
306
|
+
/**
|
|
307
|
+
* One line of honest copy for a degraded reason: WHAT happened, and WHAT TO DO.
|
|
308
|
+
*
|
|
309
|
+
* ── Why this is a second table, deliberately ────────────────────────────────
|
|
310
|
+
* `@synap-core/capture-pipeline`'s `describeDegradedReason` is the existing
|
|
311
|
+
* one-door for this copy, and it is the RIGHT door — but the CLI is a separate
|
|
312
|
+
* pnpm workspace whose only Synap runtime dependencies are
|
|
313
|
+
* `@synap-core/hub-rest-client` (a file: link into synap-backend) and
|
|
314
|
+
* `@synap-core/workspace-templates`. It cannot reach a `synap-app` package
|
|
315
|
+
* without a package.json/lockfile change. Same reason the `StructureResult`
|
|
316
|
+
* mirror above is local.
|
|
317
|
+
*
|
|
318
|
+
* So: the `title` half is COPIED VERBATIM from `describeDegradedReason` and
|
|
319
|
+
* pinned by a parity test (`test/degraded-message-honesty.test.ts`) that reads
|
|
320
|
+
* the sibling repo's source, so the two can never drift on WHAT happened.
|
|
321
|
+
* The `detail` half is deliberately DIFFERENT, because the app's
|
|
322
|
+
* details end in "saved as a note in the meantime" and the CLI creates nothing
|
|
323
|
+
* at all — repeating the app's sentence here would be a new lie in place of the
|
|
324
|
+
* old one.
|
|
325
|
+
*/
|
|
326
|
+
export declare function describeDegradedReason(reason: DegradedReason | undefined): {
|
|
327
|
+
title: string;
|
|
328
|
+
detail: string;
|
|
329
|
+
};
|
|
330
|
+
/**
|
|
331
|
+
* The ONE degraded message. The CLI does NOT materialize the server's generic
|
|
332
|
+
* `item` stand-in (the browser does the same via `offlineFallback:false`), so a
|
|
333
|
+
* captured note is never silently downgraded to an unstructured blob behind a
|
|
334
|
+
* "success" line.
|
|
335
|
+
*
|
|
336
|
+
* It used to print a single sentence for every cause — "AI structuring
|
|
337
|
+
* unavailable (is_empty_result) — nothing was created. Retry when it's back."
|
|
338
|
+
* — which leaked a raw machine token AND told users to retry states that never
|
|
339
|
+
* change (a pod with no vision provider is not going to come back). Now each
|
|
340
|
+
* reason says what actually happened and what to do about it.
|
|
341
|
+
*/
|
|
342
|
+
export declare function degradedMessage(res: StructureResult): string;
|