@synap-core/cli 1.11.0 → 1.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -198
- package/dist/build-info.json +6 -0
- package/dist/commands/agent-run.js +3 -2
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/agents.d.ts +33 -17
- package/dist/commands/agents.js +203 -237
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/app.d.ts +143 -0
- package/dist/commands/app.js +523 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/automate.d.ts +21 -0
- package/dist/commands/automate.js +42 -0
- package/dist/commands/automate.js.map +1 -0
- package/dist/commands/automation-schema.test.d.ts +16 -0
- package/dist/commands/automation-schema.test.js +77 -0
- package/dist/commands/automation-schema.test.js.map +1 -0
- package/dist/commands/automation.d.ts +12 -0
- package/dist/commands/automation.js +80 -35
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/bridge-setup.d.ts +14 -1
- package/dist/commands/bridge-setup.js +392 -128
- package/dist/commands/bridge-setup.js.map +1 -1
- package/dist/commands/cap-connections.d.ts +4 -4
- package/dist/commands/cap-connections.js +14 -14
- package/dist/commands/cap-connections.js.map +1 -1
- package/dist/commands/capability.d.ts +2 -0
- package/dist/commands/capability.js +218 -168
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/catalog.d.ts +275 -0
- package/dist/commands/catalog.js +481 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/cell.d.ts +155 -8
- package/dist/commands/cell.js +416 -40
- package/dist/commands/cell.js.map +1 -1
- package/dist/commands/centrality.js +1 -13
- package/dist/commands/centrality.js.map +1 -1
- package/dist/commands/connect.d.ts +38 -13
- package/dist/commands/connect.js +68 -167
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.d.ts +3 -2
- package/dist/commands/connections.js +95 -25
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/context.js +7 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +193 -23
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +293 -20
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +66 -4
- package/dist/commands/diagnose.js +285 -28
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/doc.d.ts +11 -4
- package/dist/commands/doc.js +39 -14
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +112 -3
- package/dist/commands/doctor.js +657 -32
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.js +5 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/import.d.ts +368 -13
- package/dist/commands/import.js +1064 -54
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +20 -9
- package/dist/commands/init.js +433 -973
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +1 -0
- package/dist/commands/keys.js +15 -2
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/knowledge.d.ts +22 -6
- package/dist/commands/knowledge.js +117 -55
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +192 -71
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +29 -2
- package/dist/commands/market-authoring.js +348 -7
- package/dist/commands/market-authoring.js.map +1 -1
- package/dist/commands/market-official.d.ts +58 -0
- package/dist/commands/market-official.js +84 -0
- package/dist/commands/market-official.js.map +1 -0
- package/dist/commands/market.d.ts +400 -16
- package/dist/commands/market.js +1802 -146
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +60 -25
- package/dist/commands/mcp.js +251 -64
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/open.d.ts +39 -9
- package/dist/commands/open.js +80 -25
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/playbook.d.ts +42 -0
- package/dist/commands/playbook.js +162 -0
- package/dist/commands/playbook.js.map +1 -0
- package/dist/commands/pod.js +1 -1
- package/dist/commands/pod.js.map +1 -1
- package/dist/commands/pods.d.ts +5 -0
- package/dist/commands/pods.js +97 -116
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +62 -0
- package/dist/commands/proposals-actions.js +143 -8
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/proposals-await.d.ts +68 -0
- package/dist/commands/proposals-await.js +248 -0
- package/dist/commands/proposals-await.js.map +1 -0
- package/dist/commands/proton-setup.d.ts +73 -0
- package/dist/commands/proton-setup.js +577 -0
- package/dist/commands/proton-setup.js.map +1 -0
- package/dist/commands/providers.d.ts +23 -0
- package/dist/commands/providers.js +126 -1
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/raycast.js +6 -2
- package/dist/commands/raycast.js.map +1 -1
- package/dist/commands/rule.d.ts +150 -0
- package/dist/commands/rule.js +447 -0
- package/dist/commands/rule.js.map +1 -0
- package/dist/commands/session-wait.d.ts +111 -0
- package/dist/commands/session-wait.js +209 -0
- package/dist/commands/session-wait.js.map +1 -0
- package/dist/commands/sessions.d.ts +52 -0
- package/dist/commands/sessions.js +478 -58
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +136 -19
- package/dist/commands/skill-manage.js.map +1 -1
- package/dist/commands/skills.js +16 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +1 -4
- package/dist/commands/status.js +5 -34
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.backoff.test.d.ts +13 -0
- package/dist/commands/statusline.backoff.test.js +100 -0
- package/dist/commands/statusline.backoff.test.js.map +1 -0
- package/dist/commands/statusline.js +16 -9
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/sync-status.d.ts +12 -0
- package/dist/commands/sync-status.js +125 -0
- package/dist/commands/sync-status.js.map +1 -0
- package/dist/commands/templates-retire.d.ts +34 -0
- package/dist/commands/templates-retire.js +192 -0
- package/dist/commands/templates-retire.js.map +1 -0
- package/dist/commands/tools.js +6 -21
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/tracks.d.ts +51 -0
- package/dist/commands/tracks.js +291 -0
- package/dist/commands/tracks.js.map +1 -0
- package/dist/commands/update.d.ts +3 -11
- package/dist/commands/update.js +5 -134
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upload.d.ts +41 -3
- package/dist/commands/upload.js +120 -18
- package/dist/commands/upload.js.map +1 -1
- package/dist/commands/vendor.d.ts +28 -0
- package/dist/commands/vendor.js +110 -0
- package/dist/commands/vendor.js.map +1 -0
- package/dist/commands/versions.js +6 -0
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/view.js +10 -5
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/whoami.d.ts +23 -3
- package/dist/commands/whoami.js +169 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker.d.ts +122 -0
- package/dist/commands/worker.js +435 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/commands/worker.test.d.ts +1 -0
- package/dist/commands/worker.test.js +116 -0
- package/dist/commands/worker.test.js.map +1 -0
- package/dist/commands/workspace-ops.d.ts +35 -0
- package/dist/commands/workspace-ops.js +153 -0
- package/dist/commands/workspace-ops.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +900 -180
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-connections.d.ts +31 -0
- package/dist/lib/agent-connections.js +33 -0
- package/dist/lib/agent-connections.js.map +1 -0
- package/dist/lib/agent-detect.d.ts +27 -0
- package/dist/lib/agent-detect.js +71 -0
- package/dist/lib/agent-detect.js.map +1 -0
- package/dist/lib/agent-door.d.ts +138 -0
- package/dist/lib/agent-door.js +426 -0
- package/dist/lib/agent-door.js.map +1 -0
- package/dist/lib/agents-config.d.ts +2 -0
- package/dist/lib/agents-config.js +4 -9
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +31 -2
- package/dist/lib/approval-poll.js +20 -7
- package/dist/lib/approval-poll.js.map +1 -1
- package/dist/lib/atomic-file.d.ts +48 -0
- package/dist/lib/atomic-file.js +129 -0
- package/dist/lib/atomic-file.js.map +1 -0
- package/dist/lib/auth.d.ts +14 -9
- package/dist/lib/auth.js +44 -61
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/batch-approval.d.ts +85 -0
- package/dist/lib/batch-approval.js +170 -0
- package/dist/lib/batch-approval.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +6 -5
- package/dist/lib/capture-lane.js +6 -5
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +230 -11
- package/dist/lib/capture-structure.js +251 -13
- package/dist/lib/capture-structure.js.map +1 -1
- package/dist/lib/catalog-templates.d.ts +59 -0
- package/dist/lib/catalog-templates.js +126 -0
- package/dist/lib/catalog-templates.js.map +1 -0
- package/dist/lib/cli-build.d.ts +19 -0
- package/dist/lib/cli-build.js +37 -0
- package/dist/lib/cli-build.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +18 -0
- package/dist/lib/conversation-headers.js +32 -0
- package/dist/lib/conversation-headers.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +167 -11
- package/dist/lib/cp-packages.js +253 -21
- package/dist/lib/cp-packages.js.map +1 -1
- package/dist/lib/credential-class.d.ts +117 -0
- package/dist/lib/credential-class.js +116 -0
- package/dist/lib/credential-class.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +35 -0
- package/dist/lib/describe-lens.js +40 -0
- package/dist/lib/describe-lens.js.map +1 -1
- package/dist/lib/device-connect.d.ts +125 -0
- package/dist/lib/device-connect.js +256 -0
- package/dist/lib/device-connect.js.map +1 -0
- package/dist/lib/directory-lens.d.ts +99 -0
- package/dist/lib/directory-lens.js +187 -0
- package/dist/lib/directory-lens.js.map +1 -0
- package/dist/lib/exporter-coverage.d.ts +71 -0
- package/dist/lib/exporter-coverage.js +97 -0
- package/dist/lib/exporter-coverage.js.map +1 -0
- package/dist/lib/hub-client.d.ts +29 -8
- package/dist/lib/hub-client.js +328 -55
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/init-connect.d.ts +41 -0
- package/dist/lib/init-connect.js +75 -0
- package/dist/lib/init-connect.js.map +1 -0
- package/dist/lib/init-exit.d.ts +24 -0
- package/dist/lib/init-exit.js +41 -0
- package/dist/lib/init-exit.js.map +1 -0
- package/dist/lib/init-flow.d.ts +25 -0
- package/dist/lib/init-flow.js +40 -0
- package/dist/lib/init-flow.js.map +1 -0
- package/dist/lib/init-handoff.d.ts +16 -0
- package/dist/lib/init-handoff.js +19 -0
- package/dist/lib/init-handoff.js.map +1 -0
- package/dist/lib/init-output.d.ts +18 -0
- package/dist/lib/init-output.js +43 -0
- package/dist/lib/init-output.js.map +1 -0
- package/dist/lib/init-pod.d.ts +45 -0
- package/dist/lib/init-pod.js +36 -0
- package/dist/lib/init-pod.js.map +1 -0
- package/dist/lib/installed.d.ts +210 -11
- package/dist/lib/installed.js +234 -36
- package/dist/lib/installed.js.map +1 -1
- package/dist/lib/key-approval.d.ts +57 -0
- package/dist/lib/key-approval.js +117 -0
- package/dist/lib/key-approval.js.map +1 -0
- package/dist/lib/key-diagnosis.d.ts +56 -0
- package/dist/lib/key-diagnosis.js +227 -0
- package/dist/lib/key-diagnosis.js.map +1 -0
- package/dist/lib/key-doctor.d.ts +136 -0
- package/dist/lib/key-doctor.js +286 -0
- package/dist/lib/key-doctor.js.map +1 -0
- package/dist/lib/key-locations.d.ts +120 -0
- package/dist/lib/key-locations.js +326 -0
- package/dist/lib/key-locations.js.map +1 -0
- package/dist/lib/key-source.d.ts +66 -0
- package/dist/lib/key-source.js +106 -0
- package/dist/lib/key-source.js.map +1 -0
- package/dist/lib/key-state.d.ts +70 -0
- package/dist/lib/key-state.js +115 -0
- package/dist/lib/key-state.js.map +1 -0
- package/dist/lib/kind-package.d.ts +181 -0
- package/dist/lib/kind-package.js +679 -0
- package/dist/lib/kind-package.js.map +1 -0
- package/dist/lib/knowledge-title.d.ts +24 -0
- package/dist/lib/knowledge-title.js +46 -0
- package/dist/lib/knowledge-title.js.map +1 -0
- package/dist/lib/knowledge-title.test.d.ts +1 -0
- package/dist/lib/knowledge-title.test.js +34 -0
- package/dist/lib/knowledge-title.test.js.map +1 -0
- package/dist/lib/machine-instance.d.ts +64 -0
- package/dist/lib/machine-instance.js +142 -0
- package/dist/lib/machine-instance.js.map +1 -0
- package/dist/lib/mcp-bridge.d.ts +42 -0
- package/dist/lib/mcp-bridge.js +147 -0
- package/dist/lib/mcp-bridge.js.map +1 -0
- package/dist/lib/mcp-bridge.test.d.ts +1 -0
- package/dist/lib/mcp-bridge.test.js +90 -0
- package/dist/lib/mcp-bridge.test.js.map +1 -0
- package/dist/lib/mcp-call.d.ts +30 -0
- package/dist/lib/mcp-call.js +107 -0
- package/dist/lib/mcp-call.js.map +1 -0
- package/dist/lib/mcp-snippets.d.ts +53 -0
- package/dist/lib/mcp-snippets.js +82 -0
- package/dist/lib/mcp-snippets.js.map +1 -0
- package/dist/lib/next-steps.d.ts +8 -0
- package/dist/lib/next-steps.js +31 -1
- package/dist/lib/next-steps.js.map +1 -1
- package/dist/lib/package-wire.d.ts +179 -0
- package/dist/lib/package-wire.js +68 -0
- package/dist/lib/package-wire.js.map +1 -0
- package/dist/lib/pair-link.d.ts +38 -0
- package/dist/lib/pair-link.js +68 -0
- package/dist/lib/pair-link.js.map +1 -0
- package/dist/lib/pod-wide.d.ts +40 -0
- package/dist/lib/pod-wide.js +46 -0
- package/dist/lib/pod-wide.js.map +1 -0
- package/dist/lib/pod.d.ts +66 -112
- package/dist/lib/pod.js +134 -412
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +9 -3
- package/dist/lib/project-ref.js +10 -4
- package/dist/lib/project-ref.js.map +1 -1
- package/dist/lib/review-credential.d.ts +119 -0
- package/dist/lib/review-credential.js +147 -0
- package/dist/lib/review-credential.js.map +1 -0
- package/dist/lib/safe-open.d.ts +49 -0
- package/dist/lib/safe-open.js +119 -0
- package/dist/lib/safe-open.js.map +1 -0
- package/dist/lib/session-lens.d.ts +40 -1
- package/dist/lib/session-lens.js +54 -4
- package/dist/lib/session-lens.js.map +1 -1
- package/dist/lib/superwhisper-import.d.ts +8 -0
- package/dist/lib/superwhisper-import.js +14 -7
- package/dist/lib/superwhisper-import.js.map +1 -1
- package/dist/lib/superwhisper-title.test.d.ts +1 -0
- package/dist/lib/superwhisper-title.test.js +18 -0
- package/dist/lib/superwhisper-title.test.js.map +1 -0
- package/dist/lib/targets.d.ts +134 -10
- package/dist/lib/targets.js +962 -258
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-file.d.ts +4 -0
- package/dist/lib/template-file.js.map +1 -1
- package/dist/lib/template-lifecycle.d.ts +217 -0
- package/dist/lib/template-lifecycle.js +433 -0
- package/dist/lib/template-lifecycle.js.map +1 -0
- package/dist/lib/template-steps.d.ts +88 -0
- package/dist/lib/template-steps.js +118 -0
- package/dist/lib/template-steps.js.map +1 -0
- package/dist/lib/time-ago.d.ts +2 -0
- package/dist/lib/time-ago.js +15 -0
- package/dist/lib/time-ago.js.map +1 -0
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +23 -17
- package/skills/README.md +12 -10
- package/skills/agent-os/SKILL.md +214 -99
- package/skills/manifest.json +1 -1
- package/skills/onboard/SKILL.md +55 -26
- package/skills/synap/README.md +5 -8
- package/skills/synap/SKILL.md +1086 -283
- package/skills/synap/_order.txt +7 -0
- package/skills/synap/_skill.yaml +1 -1
- package/skills/synap/automations.md +15 -0
- package/skills/synap/capture.md +5 -0
- package/skills/synap/cli-operations.md +24 -18
- package/skills/synap/concepts.md +28 -0
- package/skills/synap/content-os.md +10 -1
- package/skills/synap/creative-loop.md +15 -10
- package/skills/synap/crm.md +21 -52
- package/skills/synap/document-embeds.md +141 -47
- package/skills/synap/escalation-ladder.md +20 -10
- package/skills/synap/focus-sessions.md +47 -21
- package/skills/synap/from-intent.md +142 -0
- package/skills/synap/governance-rules.md +4 -4
- package/skills/synap/governance.md +10 -7
- package/skills/synap/hand-off.md +33 -0
- package/skills/synap/inline-patterns.md +15 -7
- package/skills/synap/lenses.md +33 -15
- package/skills/synap/linking.md +41 -40
- package/skills/synap/mcp-remote-servers.md +64 -0
- package/skills/synap/mental-model.md +17 -15
- package/skills/synap/operating-mode-rules.md +1 -1
- package/skills/synap/processes.md +118 -0
- package/skills/synap/quick-reference.md +5 -1
- package/skills/synap/reading.md +3 -1
- package/skills/synap/reflexes.md +12 -42
- package/skills/synap/viewframe-cells.md +38 -5
- package/skills/synap/work-flow.md +1 -1
- package/skills/synap/work-model.md +96 -0
- package/skills/synap/worked-examples.md +4 -5
- package/skills/synap/workspace-design.md +14 -10
- package/skills/synap/writes.md +97 -24
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +2 -2
- package/skills/synap-app/_skill.yaml +1 -1
- package/skills/synap-app/install-commands.md +1 -1
- package/skills/synap-design/SKILL.md +474 -0
- package/skills/synap-design/_order.txt +4 -0
- package/skills/synap-design/_skill.yaml +21 -0
- package/skills/synap-design/loop.md +134 -0
- package/skills/synap-design/overview.md +44 -0
- package/skills/synap-design/principles.md +130 -0
- package/skills/synap-design/system.md +133 -0
- package/skills/synap-market/SKILL.md +306 -16
- package/skills/synap-market/_skill.yaml +1 -1
- package/skills/synap-market/author-and-publish.md +145 -8
- package/skills/synap-market/governance-and-catalog.md +7 -0
- package/skills/synap-market/install.md +79 -1
- package/skills/synap-market/overview.md +74 -6
- package/skills/synap-schema/SKILL.md +172 -10
- package/skills/synap-schema/_order.txt +2 -0
- package/skills/synap-schema/_skill.yaml +4 -2
- package/skills/synap-schema/common-mistakes.md +4 -2
- package/skills/synap-schema/discover-profiles.md +1 -1
- package/skills/synap-schema/entity-scope.md +15 -3
- package/skills/synap-schema/extend-first.md +29 -0
- package/skills/synap-schema/extend-vs-create.md +1 -1
- package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
- package/skills/synap-schema/property-types.md +1 -1
- package/skills/synap-schema/relations.md +1 -1
- package/skills/synap-ui/SKILL.md +19 -12
- package/skills/synap-ui/_skill.yaml +1 -1
- package/skills/synap-ui/ai-companion.md +1 -1
- package/skills/synap-ui/arranging-bento.md +2 -0
- package/skills/synap-ui/bento-layouts.md +10 -10
- package/skills/synap-ui/bento-recipes.md +313 -543
- package/skills/synap-ui/four-builds.md +5 -0
- package/skills/synap-ui/view-types.md +2 -2
- package/skills/synap-ui/widget-catalog.md +22 -278
- package/templates/automations/bookmark-enrichment.automation.json +290 -13
- package/templates/automations/url-bookmark-capture.automation.json +73 -11
- package/templates/skills/authoring-playbooks/SKILL.md +6 -3
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
- package/dist/commands/infra.d.ts +0 -21
- package/dist/commands/infra.js +0 -262
- package/dist/commands/infra.js.map +0 -1
- package/dist/commands/template.d.ts +0 -42
- package/dist/commands/template.js +0 -191
- package/dist/commands/template.js.map +0 -1
- package/dist/lib/browser-auth.d.ts +0 -35
- package/dist/lib/browser-auth.js +0 -170
- package/dist/lib/browser-auth.js.map +0 -1
- package/dist/lib/openclaw.d.ts +0 -32
- package/dist/lib/openclaw.js +0 -164
- package/dist/lib/openclaw.js.map +0 -1
- package/dist/lib/seed.d.ts +0 -13
- package/dist/lib/seed.js +0 -135
- package/dist/lib/seed.js.map +0 -1
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -1261
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -1647
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -1647
- package/node_modules/@synap/hub-rest-client/dist/index.js +0 -1231
- package/node_modules/@synap/hub-rest-client/package.json +0 -45
- package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1631
- package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
- package/node_modules/@synap/hub-rest-client/src/index.ts +0 -153
- package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -133
- package/node_modules/@synap/hub-rest-client/src/types.ts +0 -1299
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template lifecycle on the CLI side — two pod answers rendered in plain words.
|
|
3
|
+
*
|
|
4
|
+
* 1. DATA CHANGES that ride a template update (contract C). The pod's update
|
|
5
|
+
* preview lists conversion ops still owed to this pod's data
|
|
6
|
+
* (`dataChanges: [{ opKey, description, affected, destructive }]`); a real
|
|
7
|
+
* apply that does not consent to every one of them is refused with 409
|
|
8
|
+
* `DATA_CHANGES_NEED_CONSENT` and writes nothing. This module turns that
|
|
9
|
+
* wire into lines a person reads, and decides which opKeys the person has
|
|
10
|
+
* ACTUALLY agreed to — never more.
|
|
11
|
+
* 2. RETIRED TEMPLATES (contract A). The pod's template health says, per
|
|
12
|
+
* workspace, whether its template is `current`, `retired` (replaced by X),
|
|
13
|
+
* `unlisted` (gone from a COMPLETE catalog read) or `unknown` (the catalog
|
|
14
|
+
* read was not provably complete — never claimed gone).
|
|
15
|
+
*
|
|
16
|
+
* Every parser here distinguishes "the pod did not send this field" (an older
|
|
17
|
+
* pod: behave exactly as before) from "the pod sent it and it is empty"
|
|
18
|
+
* (nothing to agree to). The two are different facts and are never folded.
|
|
19
|
+
*/
|
|
20
|
+
import chalk from "chalk";
|
|
21
|
+
import { HubError } from "./hub-client.js";
|
|
22
|
+
export const DATA_CHANGES_CONSENT_CODE = "DATA_CHANGES_NEED_CONSENT";
|
|
23
|
+
/**
|
|
24
|
+
* Read `dataChanges` off a pod response.
|
|
25
|
+
* - `undefined`: the pod sent no such field (an older pod) — behave as before.
|
|
26
|
+
* - `[]`: the pod checked and nothing is owed.
|
|
27
|
+
* Entries without an `opKey` are dropped: a change with no key cannot be
|
|
28
|
+
* consented to, so it cannot be sent back either.
|
|
29
|
+
*/
|
|
30
|
+
export function parseDataChanges(raw) {
|
|
31
|
+
if (!raw || typeof raw !== "object")
|
|
32
|
+
return undefined;
|
|
33
|
+
const field = raw.dataChanges;
|
|
34
|
+
if (!Array.isArray(field))
|
|
35
|
+
return undefined;
|
|
36
|
+
const out = [];
|
|
37
|
+
for (const item of field) {
|
|
38
|
+
if (!item || typeof item !== "object")
|
|
39
|
+
continue;
|
|
40
|
+
const r = item;
|
|
41
|
+
const opKey = typeof r.opKey === "string" ? r.opKey.trim() : "";
|
|
42
|
+
if (!opKey)
|
|
43
|
+
continue;
|
|
44
|
+
const affected = typeof r.affected === "number" && Number.isFinite(r.affected) ? r.affected : null;
|
|
45
|
+
out.push({
|
|
46
|
+
opKey,
|
|
47
|
+
description: typeof r.description === "string" && r.description.trim()
|
|
48
|
+
? r.description.trim()
|
|
49
|
+
: opKey,
|
|
50
|
+
affected,
|
|
51
|
+
destructive: r.destructive === true,
|
|
52
|
+
...(typeof r.error === "string" && r.error.trim() ? { error: r.error.trim() } : {}),
|
|
53
|
+
...(typeof r.operatorCommand === "string" && r.operatorCommand.trim()
|
|
54
|
+
? { operatorCommand: r.operatorCommand.trim() }
|
|
55
|
+
: {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read `pendingDataChanges` off a health row.
|
|
62
|
+
* - `undefined`: the pod sent no such field (an older pod) — draw nothing new.
|
|
63
|
+
* - `null`: the pod checked and nothing is held.
|
|
64
|
+
* A malformed value reads as `undefined` (unknown), never as "nothing held".
|
|
65
|
+
*/
|
|
66
|
+
export function parsePendingDataChanges(row) {
|
|
67
|
+
if (!("pendingDataChanges" in row))
|
|
68
|
+
return undefined;
|
|
69
|
+
const raw = row.pendingDataChanges;
|
|
70
|
+
if (raw === null)
|
|
71
|
+
return null;
|
|
72
|
+
if (!raw || typeof raw !== "object")
|
|
73
|
+
return undefined;
|
|
74
|
+
const r = raw;
|
|
75
|
+
const sentences = Array.isArray(r.sentences)
|
|
76
|
+
? r.sentences.filter((s) => typeof s === "string" && s.trim() !== "").map((s) => s.trim())
|
|
77
|
+
: [];
|
|
78
|
+
const count = typeof r.count === "number" && Number.isFinite(r.count) ? r.count : sentences.length;
|
|
79
|
+
return {
|
|
80
|
+
count,
|
|
81
|
+
sentences,
|
|
82
|
+
unreadable: r.unreadable === true,
|
|
83
|
+
// Unknown reads as "you may not be able to agree": the pod's own default.
|
|
84
|
+
needsPodAdmin: r.needsPodAdmin !== false,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** An agent's pending "update this space" proposal (`updateProposal`), or null. */
|
|
88
|
+
export function parseUpdateProposal(row) {
|
|
89
|
+
const raw = row.updateProposal;
|
|
90
|
+
return raw && typeof raw.id === "string" && raw.id ? { id: raw.id } : null;
|
|
91
|
+
}
|
|
92
|
+
/** The data changes a 409 consent refusal carries, or null when the error is something else. */
|
|
93
|
+
export function dataChangesFromRefusal(err) {
|
|
94
|
+
if (!(err instanceof HubError))
|
|
95
|
+
return null;
|
|
96
|
+
const body = err.body;
|
|
97
|
+
const code = err.code ?? (typeof body?.code === "string" ? body.code : undefined);
|
|
98
|
+
if (err.status !== 409 || code !== DATA_CHANGES_CONSENT_CODE)
|
|
99
|
+
return null;
|
|
100
|
+
return parseDataChanges(body) ?? [];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* True when a 409 consent refusal is about WHO asked, not what was agreed: the
|
|
104
|
+
* caller is an agent, and only a person can agree to a data change. The pod
|
|
105
|
+
* says so with `needsPerson`; an older pod is read from its shape — it refuses
|
|
106
|
+
* a person only for a missing agreement, so an empty `missing` beside an owed
|
|
107
|
+
* agreeable change can only be an agent's refusal.
|
|
108
|
+
*/
|
|
109
|
+
export function consentNeedsPerson(err) {
|
|
110
|
+
if (dataChangesFromRefusal(err) === null)
|
|
111
|
+
return false;
|
|
112
|
+
const body = err.body;
|
|
113
|
+
if (typeof body?.needsPerson === "boolean")
|
|
114
|
+
return body.needsPerson;
|
|
115
|
+
const owed = parseDataChanges(body) ?? [];
|
|
116
|
+
return Array.isArray(body?.missing) && body.missing.length === 0 && owed.some((d) => !d.destructive);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The pod's two other data-change refusals, in plain words. `null` for any
|
|
120
|
+
* other error (the caller's generic failure path renders those).
|
|
121
|
+
* - 403 `DATA_CHANGES_NEED_POD_ADMIN`: you agreed, but a data change rewrites
|
|
122
|
+
* its kind pod-wide, so only a pod owner or admin may run it.
|
|
123
|
+
* - 409 `DATA_CHANGES_FAILED`: a change failed mid-run; the template was NOT
|
|
124
|
+
* applied. Changes that ran stay applied, so a re-run lists only the rest.
|
|
125
|
+
*/
|
|
126
|
+
export function dataChangeRefusalMessage(err) {
|
|
127
|
+
if (!(err instanceof HubError))
|
|
128
|
+
return null;
|
|
129
|
+
const body = err.body;
|
|
130
|
+
const code = err.code ?? (typeof body?.code === "string" ? body.code : undefined);
|
|
131
|
+
if (err.status === 403 && code === "DATA_CHANGES_NEED_POD_ADMIN") {
|
|
132
|
+
return "Its data changes rewrite records across the whole pod, so only a pod owner or admin can run them. Nothing was written.";
|
|
133
|
+
}
|
|
134
|
+
if (err.status === 409 && code === "DATA_CHANGES_FAILED") {
|
|
135
|
+
const detail = typeof body?.error === "string" && body.error.trim() ? ` ${body.error.trim()}` : "";
|
|
136
|
+
return `A data change failed, so the template was not applied.${detail} The changes that ran stay done; run the update again to finish.`;
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
function countPhrase(n) {
|
|
141
|
+
if (n === null)
|
|
142
|
+
return "count not reported";
|
|
143
|
+
return `${n} ${n === 1 ? "record" : "records"}`;
|
|
144
|
+
}
|
|
145
|
+
/** One line per data change: the pod's own sentence, then its count. */
|
|
146
|
+
export function formatDataChange(dc) {
|
|
147
|
+
let line = `${dc.description} ${chalk.dim(`(${countPhrase(dc.affected)} · ${dc.opKey})`)}`;
|
|
148
|
+
if (dc.affected === null && dc.error) {
|
|
149
|
+
line += "\n " + chalk.yellow(`The pod couldn't count it: ${dc.error}`);
|
|
150
|
+
}
|
|
151
|
+
if (dc.destructive) {
|
|
152
|
+
line += "\n " + chalk.dim("It retires old data, so it never runs with an update. An operator runs it:");
|
|
153
|
+
if (dc.operatorCommand)
|
|
154
|
+
line += "\n " + chalk.dim(dc.operatorCommand);
|
|
155
|
+
}
|
|
156
|
+
return line;
|
|
157
|
+
}
|
|
158
|
+
/** Print the "Data changes" block for one template. Prints nothing for an empty list. */
|
|
159
|
+
export function printDataChanges(slug, changes) {
|
|
160
|
+
if (changes.length === 0)
|
|
161
|
+
return;
|
|
162
|
+
console.log(" " + chalk.bold(`Data changes for ${slug}`) + chalk.dim(" (they run with the update, once you agree)"));
|
|
163
|
+
for (const dc of changes.filter((d) => !d.destructive))
|
|
164
|
+
console.log(" • " + formatDataChange(dc));
|
|
165
|
+
const operator = changes.filter((d) => d.destructive);
|
|
166
|
+
if (operator.length > 0) {
|
|
167
|
+
console.log(" " + chalk.bold(`Operator steps for ${slug}`) + chalk.dim(" (never run by an update)"));
|
|
168
|
+
for (const dc of operator)
|
|
169
|
+
console.log(" • " + formatDataChange(dc));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** `--accept-data-changes a,b c` → ["a","b","c"]. Commander hands a string (or undefined). */
|
|
173
|
+
export function parseAcceptList(raw) {
|
|
174
|
+
if (!raw)
|
|
175
|
+
return [];
|
|
176
|
+
const parts = Array.isArray(raw) ? raw : [raw];
|
|
177
|
+
return parts
|
|
178
|
+
.flatMap((p) => p.split(/[,\s]+/))
|
|
179
|
+
.map((s) => s.trim())
|
|
180
|
+
.filter(Boolean);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Decide consent WITHOUT prompting. Only NON-destructive changes can be agreed
|
|
184
|
+
* to here; a destructive one is an operator step, never sent (the pod refuses
|
|
185
|
+
* an accepted destructive key). `yes` agrees to every agreeable change (the
|
|
186
|
+
* person typed `--yes` on a command that has just printed them); otherwise only
|
|
187
|
+
* the opKeys named in `acceptList` count. A name that is not pending is simply
|
|
188
|
+
* not sent — agreeing to a change the pod did not list means nothing.
|
|
189
|
+
*/
|
|
190
|
+
export function decideConsent(pending, input) {
|
|
191
|
+
const named = new Set(input.acceptList ?? []);
|
|
192
|
+
const accepted = [];
|
|
193
|
+
const missing = [];
|
|
194
|
+
const refusedOperatorSteps = [];
|
|
195
|
+
for (const d of pending) {
|
|
196
|
+
if (d.destructive) {
|
|
197
|
+
if (named.has(d.opKey))
|
|
198
|
+
refusedOperatorSteps.push(d.opKey);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (input.yes || named.has(d.opKey))
|
|
202
|
+
accepted.push(d.opKey);
|
|
203
|
+
else
|
|
204
|
+
missing.push(d);
|
|
205
|
+
}
|
|
206
|
+
return { accepted, missing, refusedOperatorSteps };
|
|
207
|
+
}
|
|
208
|
+
/** The exact command that re-runs an update with consent to these changes. */
|
|
209
|
+
export function consentRerunCommand(slug, changes) {
|
|
210
|
+
const keys = changes.filter((d) => !d.destructive).map((d) => d.opKey);
|
|
211
|
+
return `synap templates update ${slug} --accept-data-changes ${keys.join(",")}`;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* What the CLI says when the pod refuses an update for its data changes (409
|
|
215
|
+
* `DATA_CHANGES_NEED_CONSENT`). `person` = `consentNeedsPerson`: the refusal is
|
|
216
|
+
* about WHO ran it. The person may well be at this terminal with an agent key
|
|
217
|
+
* configured, so the hint says how to tell: `synap whoami` must say
|
|
218
|
+
* "Is agent: no" for the agreement to count.
|
|
219
|
+
*/
|
|
220
|
+
export function consentRefusalLines(name, slug, owed, person) {
|
|
221
|
+
const warn = person
|
|
222
|
+
? `${name} was not updated: only a person can agree to its data changes, and this ran with an agent's key. Nothing was written.`
|
|
223
|
+
: `${name} was not updated: it carries data changes you have not agreed to. Nothing was written.`;
|
|
224
|
+
if (!owed.some((d) => !d.destructive))
|
|
225
|
+
return { warn, hints: [] };
|
|
226
|
+
const rerun = consentRerunCommand(slug, owed);
|
|
227
|
+
return {
|
|
228
|
+
warn,
|
|
229
|
+
hints: person
|
|
230
|
+
? [
|
|
231
|
+
`A person runs, in their own terminal: ${rerun}`,
|
|
232
|
+
"Check the key first: `synap whoami` must say Is agent: no.",
|
|
233
|
+
]
|
|
234
|
+
: [`To agree and update: ${rerun}`],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const LIFECYCLES = new Set(["current", "retired", "unlisted", "unknown"]);
|
|
238
|
+
/**
|
|
239
|
+
* Read lifecycle off a Hub `/workspaces` row. `undefined` = the pod sent no
|
|
240
|
+
* lifecycle (older pod): the caller shows exactly what it showed before. A
|
|
241
|
+
* value this CLI does not know reads as `unknown` — never as `current`.
|
|
242
|
+
*/
|
|
243
|
+
export function parseLifecycle(row) {
|
|
244
|
+
const raw = row.lifecycle;
|
|
245
|
+
if (raw === undefined || raw === null)
|
|
246
|
+
return undefined;
|
|
247
|
+
const lifecycle = typeof raw === "string" && LIFECYCLES.has(raw) ? raw : "unknown";
|
|
248
|
+
const str = (v) => (typeof v === "string" && v.trim() ? v.trim() : null);
|
|
249
|
+
return {
|
|
250
|
+
lifecycle,
|
|
251
|
+
replacedBy: str(row.replacedBy),
|
|
252
|
+
retiredReason: str(row.retiredReason),
|
|
253
|
+
warning: str(row.lifecycleWarning),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The plain sentence for a template that is not `current`, with the command
|
|
258
|
+
* that acts on it. Null for `current` (nothing to say).
|
|
259
|
+
*/
|
|
260
|
+
export function lifecycleNotice(slug, info) {
|
|
261
|
+
switch (info.lifecycle) {
|
|
262
|
+
case "current":
|
|
263
|
+
return null;
|
|
264
|
+
case "retired":
|
|
265
|
+
return {
|
|
266
|
+
label: info.warning ??
|
|
267
|
+
(info.replacedBy
|
|
268
|
+
? `Retired: ${slug} is replaced by ${info.replacedBy}`
|
|
269
|
+
: `Retired: ${slug} has no replacement`),
|
|
270
|
+
// Retire-into needs a target; with none there is nothing to move into.
|
|
271
|
+
action: info.replacedBy ? `synap templates retire ${slug}` : null,
|
|
272
|
+
};
|
|
273
|
+
case "unlisted":
|
|
274
|
+
return { label: info.warning ?? `No longer in the catalog: ${slug}`, action: null };
|
|
275
|
+
case "unknown":
|
|
276
|
+
return {
|
|
277
|
+
label: `Catalog not fully synced: the pod can't say yet whether ${slug} is still offered`,
|
|
278
|
+
action: null,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Read `overlays` off a Hub `/workspaces` row. `undefined` = the pod sent no
|
|
284
|
+
* such field (an older pod): show exactly what was shown before. `[]` = the
|
|
285
|
+
* space has no overlays. An entry with no lifecycle reads as `unknown`.
|
|
286
|
+
*/
|
|
287
|
+
export function parseOverlays(row) {
|
|
288
|
+
const raw = row.overlays;
|
|
289
|
+
if (!Array.isArray(raw))
|
|
290
|
+
return undefined;
|
|
291
|
+
const out = [];
|
|
292
|
+
for (const item of raw) {
|
|
293
|
+
const o = asObj(item);
|
|
294
|
+
const slug = o ? asStr(o.slug) : null;
|
|
295
|
+
if (!o || !slug)
|
|
296
|
+
continue;
|
|
297
|
+
out.push({
|
|
298
|
+
slug,
|
|
299
|
+
info: parseLifecycle(o) ?? { lifecycle: "unknown", replacedBy: null, retiredReason: null, warning: null },
|
|
300
|
+
replacementHere: o.replacementHere === true,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* The notice for an overlay: the SAME label `lifecycleNotice` gives a space
|
|
307
|
+
* (the pod's own sentence first), but never an action — an overlay is not a
|
|
308
|
+
* space, so `synap templates retire` has nothing to move for it.
|
|
309
|
+
*/
|
|
310
|
+
export function overlayNotice(o) {
|
|
311
|
+
const n = lifecycleNotice(o.slug, o.info);
|
|
312
|
+
return n ? { label: n.label, action: null } : null;
|
|
313
|
+
}
|
|
314
|
+
/** An overlay that needs the person: retired, and its replacement is not on the space. */
|
|
315
|
+
export function overlayNeedsAttention(o) {
|
|
316
|
+
return o.info.lifecycle === "retired" && !o.replacementHere;
|
|
317
|
+
}
|
|
318
|
+
const pick = (o, ...keys) => {
|
|
319
|
+
if (!o)
|
|
320
|
+
return undefined;
|
|
321
|
+
for (const k of keys)
|
|
322
|
+
if (o[k] !== undefined)
|
|
323
|
+
return o[k];
|
|
324
|
+
return undefined;
|
|
325
|
+
};
|
|
326
|
+
const asObj = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : undefined;
|
|
327
|
+
const asStr = (v) => (typeof v === "string" && v.trim() ? v.trim() : null);
|
|
328
|
+
const asNum = (v) => (typeof v === "number" && Number.isFinite(v) ? v : null);
|
|
329
|
+
function parseGroups(raw, map) {
|
|
330
|
+
if (!Array.isArray(raw))
|
|
331
|
+
return [];
|
|
332
|
+
return raw.map((r) => (asObj(r) ? map(asObj(r)) : null)).filter((x) => x !== null);
|
|
333
|
+
}
|
|
334
|
+
function kindOf(r) {
|
|
335
|
+
return asStr(pick(r, "kind", "profileSlug", "profile", "slug"));
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Parse the retire-into response defensively. Returns null when the body has
|
|
339
|
+
* no recognisable plan AND no proposal — a caller must then say "the pod's
|
|
340
|
+
* answer couldn't be read", never "nothing to move".
|
|
341
|
+
*/
|
|
342
|
+
export function parseRetireResponse(raw) {
|
|
343
|
+
const body = asObj(raw);
|
|
344
|
+
if (!body)
|
|
345
|
+
return null;
|
|
346
|
+
const planObj = asObj(body.plan) ?? (body.moves !== undefined ? body : undefined);
|
|
347
|
+
let plan = null;
|
|
348
|
+
if (planObj) {
|
|
349
|
+
const source = asObj(planObj.source);
|
|
350
|
+
const target = asObj(planObj.target);
|
|
351
|
+
plan = {
|
|
352
|
+
sourceName: asStr(pick(source, "name", "workspaceName")),
|
|
353
|
+
sourceSlug: asStr(pick(source, "slug", "packageSlug")),
|
|
354
|
+
targetSlug: asStr(pick(target, "slug", "replacedBy")) ?? asStr(planObj.replacedBy),
|
|
355
|
+
targetWorkspaceId: asStr(pick(target, "workspaceId", "id")),
|
|
356
|
+
targetName: asStr(pick(target, "name", "workspaceName")),
|
|
357
|
+
willInstall: pick(target, "willInstall", "install") === true,
|
|
358
|
+
moves: parseGroups(planObj.moves, (r) => {
|
|
359
|
+
const kind = kindOf(r);
|
|
360
|
+
return kind ? { kind, count: asNum(pick(r, "count", "affected")) } : null;
|
|
361
|
+
}),
|
|
362
|
+
stays: parseGroups(planObj.stays, (r) => {
|
|
363
|
+
const kind = kindOf(r);
|
|
364
|
+
return kind
|
|
365
|
+
? { kind, count: asNum(pick(r, "count", "affected")), reason: asStr(r.reason) ?? "no reason given" }
|
|
366
|
+
: null;
|
|
367
|
+
}),
|
|
368
|
+
willArchive: typeof pick(planObj, "willArchive", "archiveSource") === "boolean"
|
|
369
|
+
? pick(planObj, "willArchive", "archiveSource")
|
|
370
|
+
: null,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
const status = asStr(body.status);
|
|
374
|
+
if (status === "proposed" || body.proposalId !== undefined) {
|
|
375
|
+
return {
|
|
376
|
+
kind: "proposed",
|
|
377
|
+
plan,
|
|
378
|
+
proposalId: asStr(body.proposalId),
|
|
379
|
+
reviewUrl: asStr(body.reviewUrl),
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
if (!plan)
|
|
383
|
+
return null;
|
|
384
|
+
if (status === "applied" || status === "done" || status === "completed") {
|
|
385
|
+
const archived = typeof body.archived === "boolean" ? body.archived : null;
|
|
386
|
+
const remaining = parseGroups(body.remaining, (r) => {
|
|
387
|
+
const kind = kindOf(r);
|
|
388
|
+
return kind
|
|
389
|
+
? { kind, count: asNum(pick(r, "count", "affected")), reason: asStr(r.reason) ?? "no reason given" }
|
|
390
|
+
: null;
|
|
391
|
+
});
|
|
392
|
+
return { kind: "applied", plan, archived, remaining: remaining.length ? remaining : plan.stays };
|
|
393
|
+
}
|
|
394
|
+
return { kind: "plan", plan };
|
|
395
|
+
}
|
|
396
|
+
function countOf(n) {
|
|
397
|
+
return n === null ? "some" : String(n);
|
|
398
|
+
}
|
|
399
|
+
/** The plan in plain lines (no trailing hints). */
|
|
400
|
+
export function formatRetirePlan(plan) {
|
|
401
|
+
const lines = [];
|
|
402
|
+
const target = plan.targetSlug ?? "(no replacement named)";
|
|
403
|
+
if (plan.targetWorkspaceId) {
|
|
404
|
+
lines.push(`Target: ${target}, already installed${plan.targetName ? ` as "${plan.targetName}"` : ""} (${plan.targetWorkspaceId})`);
|
|
405
|
+
}
|
|
406
|
+
else if (plan.willInstall) {
|
|
407
|
+
lines.push(`Target: ${target}, not installed yet. It will be installed first.`);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
lines.push(`Target: ${target}`);
|
|
411
|
+
}
|
|
412
|
+
if (plan.moves.length === 0) {
|
|
413
|
+
lines.push("Moves: nothing to move.");
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
lines.push("Moves:");
|
|
417
|
+
for (const m of plan.moves)
|
|
418
|
+
lines.push(` • ${countOf(m.count)} ${m.kind}`);
|
|
419
|
+
}
|
|
420
|
+
if (plan.stays.length > 0) {
|
|
421
|
+
lines.push("Stays in the old space:");
|
|
422
|
+
for (const s of plan.stays)
|
|
423
|
+
lines.push(` • ${countOf(s.count)} ${s.kind}: ${s.reason}`);
|
|
424
|
+
}
|
|
425
|
+
if (plan.willArchive === true)
|
|
426
|
+
lines.push("The old space will be archived once it is empty. Nothing is deleted.");
|
|
427
|
+
else if (plan.willArchive === false)
|
|
428
|
+
lines.push("The old space stays (something remains in it). Nothing is deleted.");
|
|
429
|
+
else
|
|
430
|
+
lines.push("Nothing is deleted.");
|
|
431
|
+
return lines;
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=template-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-lifecycle.js","sourceRoot":"","sources":["../../src/lib/template-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a space stands with its template, in the words every surface uses.
|
|
3
|
+
*
|
|
4
|
+
* The product's ONE table for these words is `TEMPLATE_STEP_LABELS` in
|
|
5
|
+
* `@synap-core/types/vocabulary`, and the ONE rule that sorts a pod health row
|
|
6
|
+
* into a step is `classifyTemplateHealth` in `@synap-core/web/marketplace`.
|
|
7
|
+
* This package cannot import either (it links only `@synap-core/hub-rest-client`
|
|
8
|
+
* and `@synap-core/workspace-templates`), so both are MIRRORED here, and
|
|
9
|
+
* `test/template-step-vocabulary-parity.test.ts` reads the two sources across
|
|
10
|
+
* the repo boundary and fails when either side moves. Edit both sides.
|
|
11
|
+
*/
|
|
12
|
+
/** Mirror of `TEMPLATE_STEP_LABELS` (synap-backend `packages/types/src/vocabulary/index.ts`). */
|
|
13
|
+
export declare const TEMPLATE_STEP_LABELS: {
|
|
14
|
+
readonly update: "Update available";
|
|
15
|
+
readonly unfinished: "Not finished";
|
|
16
|
+
readonly "awaiting-approval": "Waiting for approval";
|
|
17
|
+
readonly "needs-consent": "Needs your OK";
|
|
18
|
+
readonly "agent-asked": "Asked by an agent";
|
|
19
|
+
readonly current: "Up to date";
|
|
20
|
+
};
|
|
21
|
+
export type TemplateStep = keyof typeof TEMPLATE_STEP_LABELS;
|
|
22
|
+
/** A step a space can be on — every step but `current`. */
|
|
23
|
+
export type TemplateUpdateStep = Exclude<TemplateStep, "current">;
|
|
24
|
+
/**
|
|
25
|
+
* A step's words inside a CLI line, where the CLI writes them mid-sentence:
|
|
26
|
+
* the same words with the first letter lowered ("needs your OK", never
|
|
27
|
+
* "needs your ok" — an acronym keeps its case).
|
|
28
|
+
*/
|
|
29
|
+
export declare function templateStepPhrase(step: TemplateStep): string;
|
|
30
|
+
/**
|
|
31
|
+
* Mirror of `TEMPLATE_STEP_PRECEDENCE` (synap-app `template-step.ts`): when
|
|
32
|
+
* several steps hold, the first one listed is the space's mark and door. A
|
|
33
|
+
* broken space outranks a decision; data changes outrank an agent's ask (it
|
|
34
|
+
* would be held on them too); an agent's ask outranks a second plain update.
|
|
35
|
+
*/
|
|
36
|
+
export declare const TEMPLATE_STEP_PRECEDENCE: readonly ["unfinished", "needs-consent", "agent-asked", "awaiting-approval", "update"];
|
|
37
|
+
/**
|
|
38
|
+
* Mirror of `STEP_FOR_STATE` (synap-app `packages/web/src/marketplace/utils/template-step.ts`):
|
|
39
|
+
* every apply state the pod reports, sorted into a step. `null` = no step of
|
|
40
|
+
* its own (a build in flight, or a finished apply).
|
|
41
|
+
*/
|
|
42
|
+
export declare const STEP_FOR_STATE: {
|
|
43
|
+
readonly building: null;
|
|
44
|
+
readonly active: null;
|
|
45
|
+
readonly "awaiting-approval": "awaiting-approval";
|
|
46
|
+
readonly partial: "unfinished";
|
|
47
|
+
readonly "layer-2-not-run": "unfinished";
|
|
48
|
+
readonly failed: "unfinished";
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* The step the pod's apply `state` puts a space on, by the same rule as
|
|
52
|
+
* `classifyTemplateHealth`: a state this CLI does not know reads as unfinished
|
|
53
|
+
* (never current), and waiting on nothing is not waiting — once every proposal
|
|
54
|
+
* is decided, the update finishes the apply (review2 UX-M4). `null` = the state
|
|
55
|
+
* says nothing (absent on an older pod, `active`, or `building`); the caller
|
|
56
|
+
* falls back to drift.
|
|
57
|
+
*/
|
|
58
|
+
export declare function stepFromApplyState(state: string | null | undefined, awaitingApproval: readonly string[]): TemplateUpdateStep | null;
|
|
59
|
+
/** The health-row fields the step is decided from (Hub `GET /workspaces`). */
|
|
60
|
+
export interface TemplateStepFields {
|
|
61
|
+
drifted?: boolean;
|
|
62
|
+
state?: string | null;
|
|
63
|
+
awaitingApproval?: readonly string[];
|
|
64
|
+
pendingDataChanges?: unknown;
|
|
65
|
+
updateProposal?: {
|
|
66
|
+
id: string;
|
|
67
|
+
} | null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The space's step by the shared rule (`classifyTemplateHealth`): each step
|
|
71
|
+
* that holds, then the first by `TEMPLATE_STEP_PRECEDENCE`. `null` = current.
|
|
72
|
+
* An older pod sends no `state` / `pendingDataChanges` / `updateProposal`, so
|
|
73
|
+
* only `update` (from `drifted`) can hold there.
|
|
74
|
+
*/
|
|
75
|
+
export declare function classifyTemplateStep(row: TemplateStepFields): TemplateUpdateStep | null;
|
|
76
|
+
/**
|
|
77
|
+
* The glyph in front of a step. ⏳ says "wait", so it is kept for the one step
|
|
78
|
+
* where the space waits on decisions already filed; a step the reader acts on
|
|
79
|
+
* (not finished, data changes to agree to) is ⚠ (review2 UX §1 #6: ⏳ was
|
|
80
|
+
* printed on a failed apply); an agent's ask to decide is →, the CLI's mark
|
|
81
|
+
* for "proposed, awaiting review".
|
|
82
|
+
*/
|
|
83
|
+
export declare function templateStepGlyph(step: TemplateStep): "⚠" | "⏳" | "→" | null;
|
|
84
|
+
/**
|
|
85
|
+
* The one door to the proposals a template apply waits on: the proposal itself
|
|
86
|
+
* when there is one, the review queue when there are several. `null` = none.
|
|
87
|
+
*/
|
|
88
|
+
export declare function proposalsDoor(ids: readonly string[]): string | null;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a space stands with its template, in the words every surface uses.
|
|
3
|
+
*
|
|
4
|
+
* The product's ONE table for these words is `TEMPLATE_STEP_LABELS` in
|
|
5
|
+
* `@synap-core/types/vocabulary`, and the ONE rule that sorts a pod health row
|
|
6
|
+
* into a step is `classifyTemplateHealth` in `@synap-core/web/marketplace`.
|
|
7
|
+
* This package cannot import either (it links only `@synap-core/hub-rest-client`
|
|
8
|
+
* and `@synap-core/workspace-templates`), so both are MIRRORED here, and
|
|
9
|
+
* `test/template-step-vocabulary-parity.test.ts` reads the two sources across
|
|
10
|
+
* the repo boundary and fails when either side moves. Edit both sides.
|
|
11
|
+
*/
|
|
12
|
+
/** Mirror of `TEMPLATE_STEP_LABELS` (synap-backend `packages/types/src/vocabulary/index.ts`). */
|
|
13
|
+
export const TEMPLATE_STEP_LABELS = {
|
|
14
|
+
update: "Update available",
|
|
15
|
+
unfinished: "Not finished",
|
|
16
|
+
"awaiting-approval": "Waiting for approval",
|
|
17
|
+
"needs-consent": "Needs your OK",
|
|
18
|
+
"agent-asked": "Asked by an agent",
|
|
19
|
+
current: "Up to date",
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A step's words inside a CLI line, where the CLI writes them mid-sentence:
|
|
23
|
+
* the same words with the first letter lowered ("needs your OK", never
|
|
24
|
+
* "needs your ok" — an acronym keeps its case).
|
|
25
|
+
*/
|
|
26
|
+
export function templateStepPhrase(step) {
|
|
27
|
+
const label = TEMPLATE_STEP_LABELS[step];
|
|
28
|
+
return label.charAt(0).toLowerCase() + label.slice(1);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Mirror of `TEMPLATE_STEP_PRECEDENCE` (synap-app `template-step.ts`): when
|
|
32
|
+
* several steps hold, the first one listed is the space's mark and door. A
|
|
33
|
+
* broken space outranks a decision; data changes outrank an agent's ask (it
|
|
34
|
+
* would be held on them too); an agent's ask outranks a second plain update.
|
|
35
|
+
*/
|
|
36
|
+
export const TEMPLATE_STEP_PRECEDENCE = [
|
|
37
|
+
"unfinished",
|
|
38
|
+
"needs-consent",
|
|
39
|
+
"agent-asked",
|
|
40
|
+
"awaiting-approval",
|
|
41
|
+
"update",
|
|
42
|
+
];
|
|
43
|
+
const _everyStepRanked = true;
|
|
44
|
+
void _everyStepRanked;
|
|
45
|
+
/**
|
|
46
|
+
* Mirror of `STEP_FOR_STATE` (synap-app `packages/web/src/marketplace/utils/template-step.ts`):
|
|
47
|
+
* every apply state the pod reports, sorted into a step. `null` = no step of
|
|
48
|
+
* its own (a build in flight, or a finished apply).
|
|
49
|
+
*/
|
|
50
|
+
export const STEP_FOR_STATE = {
|
|
51
|
+
building: null,
|
|
52
|
+
active: null,
|
|
53
|
+
"awaiting-approval": "awaiting-approval",
|
|
54
|
+
partial: "unfinished",
|
|
55
|
+
"layer-2-not-run": "unfinished",
|
|
56
|
+
failed: "unfinished",
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* The step the pod's apply `state` puts a space on, by the same rule as
|
|
60
|
+
* `classifyTemplateHealth`: a state this CLI does not know reads as unfinished
|
|
61
|
+
* (never current), and waiting on nothing is not waiting — once every proposal
|
|
62
|
+
* is decided, the update finishes the apply (review2 UX-M4). `null` = the state
|
|
63
|
+
* says nothing (absent on an older pod, `active`, or `building`); the caller
|
|
64
|
+
* falls back to drift.
|
|
65
|
+
*/
|
|
66
|
+
export function stepFromApplyState(state, awaitingApproval) {
|
|
67
|
+
if (!state)
|
|
68
|
+
return null;
|
|
69
|
+
const step = state in STEP_FOR_STATE
|
|
70
|
+
? STEP_FOR_STATE[state]
|
|
71
|
+
: "unfinished";
|
|
72
|
+
if (step === "awaiting-approval" && awaitingApproval.length === 0)
|
|
73
|
+
return "unfinished";
|
|
74
|
+
return step;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The space's step by the shared rule (`classifyTemplateHealth`): each step
|
|
78
|
+
* that holds, then the first by `TEMPLATE_STEP_PRECEDENCE`. `null` = current.
|
|
79
|
+
* An older pod sends no `state` / `pendingDataChanges` / `updateProposal`, so
|
|
80
|
+
* only `update` (from `drifted`) can hold there.
|
|
81
|
+
*/
|
|
82
|
+
export function classifyTemplateStep(row) {
|
|
83
|
+
const fromState = stepFromApplyState(row.state, row.awaitingApproval ?? []);
|
|
84
|
+
const holds = {
|
|
85
|
+
unfinished: fromState === "unfinished",
|
|
86
|
+
"needs-consent": row.pendingDataChanges != null,
|
|
87
|
+
"agent-asked": row.updateProposal != null,
|
|
88
|
+
"awaiting-approval": fromState === "awaiting-approval",
|
|
89
|
+
update: row.drifted === true,
|
|
90
|
+
};
|
|
91
|
+
return TEMPLATE_STEP_PRECEDENCE.find((step) => holds[step]) ?? null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The glyph in front of a step. ⏳ says "wait", so it is kept for the one step
|
|
95
|
+
* where the space waits on decisions already filed; a step the reader acts on
|
|
96
|
+
* (not finished, data changes to agree to) is ⚠ (review2 UX §1 #6: ⏳ was
|
|
97
|
+
* printed on a failed apply); an agent's ask to decide is →, the CLI's mark
|
|
98
|
+
* for "proposed, awaiting review".
|
|
99
|
+
*/
|
|
100
|
+
export function templateStepGlyph(step) {
|
|
101
|
+
if (step === "awaiting-approval")
|
|
102
|
+
return "⏳";
|
|
103
|
+
if (step === "unfinished" || step === "needs-consent")
|
|
104
|
+
return "⚠";
|
|
105
|
+
if (step === "agent-asked")
|
|
106
|
+
return "→";
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The one door to the proposals a template apply waits on: the proposal itself
|
|
111
|
+
* when there is one, the review queue when there are several. `null` = none.
|
|
112
|
+
*/
|
|
113
|
+
export function proposalsDoor(ids) {
|
|
114
|
+
if (ids.length === 0)
|
|
115
|
+
return null;
|
|
116
|
+
return ids.length === 1 ? `synap open proposal ${ids[0]}` : "synap proposals";
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=template-steps.js.map
|