@synap-core/cli 1.8.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agent-chat.d.ts +47 -0
- package/dist/commands/agent-chat.js +250 -0
- package/dist/commands/agent-chat.js.map +1 -0
- package/dist/commands/agent-run.js +3 -4
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/agents.js +85 -46
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/automation.js +2 -1
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/bridge-setup.d.ts +66 -0
- package/dist/commands/bridge-setup.js +1112 -0
- package/dist/commands/bridge-setup.js.map +1 -0
- package/dist/commands/cap-connections.d.ts +28 -0
- package/dist/commands/cap-connections.js +224 -0
- package/dist/commands/cap-connections.js.map +1 -0
- package/dist/commands/capability.d.ts +89 -0
- package/dist/commands/capability.js +1523 -0
- package/dist/commands/capability.js.map +1 -0
- package/dist/commands/centrality.d.ts +20 -0
- package/dist/commands/centrality.js +94 -0
- package/dist/commands/centrality.js.map +1 -0
- package/dist/commands/connect.d.ts +2 -0
- package/dist/commands/connect.js +16 -35
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/context.js +4 -6
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +1 -0
- package/dist/commands/data-extra.js +34 -10
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +4 -4
- package/dist/commands/data.js +241 -184
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +20 -0
- package/dist/commands/diagnose.js +143 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/digest.d.ts +17 -0
- package/dist/commands/digest.js +121 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/discover.d.ts +2 -0
- package/dist/commands/discover.js +25 -8
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/events.js +2 -1
- package/dist/commands/events.js.map +1 -1
- package/dist/commands/explain.d.ts +1 -1
- package/dist/commands/explain.js +18 -15
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/facet.d.ts +29 -0
- package/dist/commands/facet.js +113 -0
- package/dist/commands/facet.js.map +1 -0
- package/dist/commands/graph.js +2 -1
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import.d.ts +38 -0
- package/dist/commands/import.js +440 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.js +35 -16
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.js +3 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/knowledge.d.ts +2 -0
- package/dist/commands/knowledge.js +61 -9
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.d.ts +50 -0
- package/dist/commands/launch.js +790 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/lens.d.ts +45 -0
- package/dist/commands/lens.js +386 -0
- package/dist/commands/lens.js.map +1 -0
- package/dist/commands/market.d.ts +209 -0
- package/dist/commands/market.js +1368 -0
- package/dist/commands/market.js.map +1 -0
- package/dist/commands/mcp.d.ts +42 -0
- package/dist/commands/mcp.js +184 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/observe.js +14 -11
- package/dist/commands/observe.js.map +1 -1
- package/dist/commands/open.d.ts +21 -4
- package/dist/commands/open.js +45 -4
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/pod.d.ts +100 -0
- package/dist/commands/pod.js +359 -0
- package/dist/commands/pod.js.map +1 -0
- package/dist/commands/pods.d.ts +1 -0
- package/dist/commands/pods.js +77 -15
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.js +40 -3
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/purge.d.ts +23 -0
- package/dist/commands/purge.js +148 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/raycast.d.ts +15 -0
- package/dist/commands/raycast.js +153 -0
- package/dist/commands/raycast.js.map +1 -0
- package/dist/commands/sessions.js +45 -21
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +195 -0
- package/dist/commands/skill-manage.js.map +1 -0
- package/dist/commands/skills-commands.js +2 -1
- package/dist/commands/skills-commands.js.map +1 -1
- package/dist/commands/skills.js +4 -3
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +3 -1
- package/dist/commands/status.js +166 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.d.ts +24 -0
- package/dist/commands/statusline.js +450 -0
- package/dist/commands/statusline.js.map +1 -0
- package/dist/commands/subscribe.js +2 -2
- package/dist/commands/subscribe.js.map +1 -1
- package/dist/commands/tools.d.ts +30 -0
- package/dist/commands/tools.js +315 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/versions.d.ts +27 -0
- package/dist/commands/versions.js +277 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/commands/view.js +3 -2
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/whoami.d.ts +21 -0
- package/dist/commands/whoami.js +129 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +776 -60
- package/dist/index.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +42 -0
- package/dist/lib/approval-poll.js +52 -0
- package/dist/lib/approval-poll.js.map +1 -0
- package/dist/lib/auth.d.ts +29 -6
- package/dist/lib/auth.js +105 -94
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/bundle-version.d.ts +11 -0
- package/dist/lib/bundle-version.js +33 -0
- package/dist/lib/bundle-version.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +30 -12
- package/dist/lib/capture-lane.js +71 -14
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/cp-packages.d.ts +121 -0
- package/dist/lib/cp-packages.js +218 -0
- package/dist/lib/cp-packages.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +46 -0
- package/dist/lib/describe-lens.js +33 -0
- package/dist/lib/describe-lens.js.map +1 -0
- package/dist/lib/hub-client.d.ts +78 -1
- package/dist/lib/hub-client.js +474 -22
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/installed.d.ts +51 -0
- package/dist/lib/installed.js +70 -0
- package/dist/lib/installed.js.map +1 -0
- package/dist/lib/next-steps.d.ts +61 -0
- package/dist/lib/next-steps.js +146 -0
- package/dist/lib/next-steps.js.map +1 -0
- package/dist/lib/pod.d.ts +91 -19
- package/dist/lib/pod.js +222 -56
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +95 -0
- package/dist/lib/project-ref.js +144 -0
- package/dist/lib/project-ref.js.map +1 -0
- package/dist/lib/project.d.ts +35 -0
- package/dist/lib/project.js +39 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/session-lens.d.ts +33 -0
- package/dist/lib/session-lens.js +76 -0
- package/dist/lib/session-lens.js.map +1 -0
- package/dist/lib/skill-import.d.ts +40 -0
- package/dist/lib/skill-import.js +203 -0
- package/dist/lib/skill-import.js.map +1 -0
- package/dist/lib/skills-installer.d.ts +17 -6
- package/dist/lib/skills-installer.js +133 -19
- package/dist/lib/skills-installer.js.map +1 -1
- package/dist/lib/suite.d.ts +28 -0
- package/dist/lib/suite.js +29 -0
- package/dist/lib/suite.js.map +1 -0
- package/dist/lib/superwhisper-import.d.ts +40 -0
- package/dist/lib/superwhisper-import.js +389 -0
- package/dist/lib/superwhisper-import.js.map +1 -0
- package/dist/lib/targets.d.ts +49 -1
- package/dist/lib/targets.js +420 -288
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/unwrapList.d.ts +1 -0
- package/dist/lib/unwrapList.js +20 -0
- package/dist/lib/unwrapList.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +10 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +9 -4
- package/skills/agent-os/SKILL.md +212 -0
- package/skills/manifest.json +5 -0
- package/skills/onboard/SKILL.md +186 -0
- package/skills/synap/SKILL.md +1182 -37
- package/skills/synap/_order.txt +37 -0
- package/skills/synap/_skill.yaml +24 -0
- package/skills/synap/authentication.md +10 -0
- package/skills/synap/automations.md +264 -0
- package/skills/synap/capabilities.md +107 -0
- package/skills/synap/capture.md +10 -0
- package/skills/synap/cli-operations.md +107 -0
- package/skills/synap/common-mistakes.md +12 -0
- package/skills/synap/creative-loop.md +43 -0
- package/skills/synap/crm.md +117 -0
- package/skills/synap/diagnostics.md +35 -0
- package/skills/synap/digesting-a-channel.md +38 -0
- package/skills/synap/document-embeds.md +123 -0
- package/skills/synap/escalation-ladder.md +71 -0
- package/skills/synap/focus-sessions.md +47 -0
- package/skills/synap/governance-rules.md +64 -0
- package/skills/synap/governance.md +6 -6
- package/skills/synap/graph-gardening.md +21 -0
- package/skills/synap/inline-patterns.md +38 -0
- package/skills/synap/lenses.md +38 -0
- package/skills/synap/linking-principle.md +39 -0
- package/skills/synap/linking.md +1 -0
- package/skills/synap/mental-model.md +45 -0
- package/skills/synap/more.md +7 -0
- package/skills/synap/multi-entity-capture.md +10 -0
- package/skills/synap/next-action.md +37 -0
- package/skills/synap/north-star.md +17 -0
- package/skills/synap/operating-mode-rules.md +45 -0
- package/skills/synap/operating-mode.md +9 -0
- package/skills/synap/quick-reference.md +67 -0
- package/skills/synap/reading.md +43 -0
- package/skills/synap/recap.md +21 -0
- package/skills/synap/reflexes.md +46 -0
- package/skills/synap/response-style.md +21 -0
- package/skills/synap/scope.md +13 -0
- package/skills/synap/showing.md +17 -0
- package/skills/synap/user-model.md +25 -0
- package/skills/synap/viewframe-cells.md +290 -0
- package/skills/synap/work-flow.md +113 -0
- package/skills/synap/worked-examples.md +53 -0
- package/skills/synap/workspace-design.md +45 -0
- package/skills/synap/workspace-edges.md +49 -0
- package/skills/synap/writes.md +156 -0
- package/skills/synap-schema/SKILL.md +97 -6
- package/skills/synap-schema/_order.txt +13 -0
- package/skills/synap-schema/_skill.yaml +22 -0
- package/skills/synap-schema/before-you-touch.md +14 -0
- package/skills/synap-schema/common-mistakes.md +9 -0
- package/skills/synap-schema/creating-profiles.md +17 -0
- package/skills/synap-schema/discover-profiles.md +24 -0
- package/skills/synap-schema/entity-scope.md +8 -0
- package/skills/synap-schema/extend-vs-create.md +31 -0
- package/skills/synap-schema/more.md +6 -0
- package/skills/synap-schema/overlay-properties.md +22 -0
- package/skills/synap-schema/profiles.md +3 -0
- package/skills/synap-schema/property-defs.md +29 -0
- package/skills/synap-schema/read-before-write.md +50 -0
- package/skills/synap-schema/relations.md +18 -0
- package/skills/synap-schema/worked-example.md +30 -0
- package/skills/synap-ui/SKILL.md +26 -2
- package/skills/synap-ui/_order.txt +13 -0
- package/skills/synap-ui/_skill.yaml +23 -0
- package/skills/synap-ui/ai-companion.md +27 -0
- package/skills/synap-ui/arranging-bento.md +8 -0
- package/skills/synap-ui/before-you-build.md +20 -0
- package/skills/synap-ui/bento-layouts.md +35 -0
- package/skills/synap-ui/common-mistakes.md +10 -0
- package/skills/synap-ui/creating-views.md +26 -0
- package/skills/synap-ui/four-builds.md +24 -0
- package/skills/synap-ui/more.md +7 -0
- package/skills/synap-ui/proposing-vs-extending.md +11 -0
- package/skills/synap-ui/view-list.md +24 -0
- package/skills/synap-ui/views.md +3 -0
- package/skills/synap-ui/worked-example.md +18 -0
- package/skills/synap-ui/workspaces.md +47 -0
- package/templates/automations/bookmark-enrichment.automation.json +44 -0
- package/templates/automations/mail-feed.automation.json +86 -0
- package/templates/automations/url-bookmark-capture.automation.json +70 -0
- package/templates/skills/README.md +21 -0
- package/templates/skills/authoring-automations/SKILL.md +95 -0
- package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
- package/templates/skills/authoring-capabilities/SKILL.md +93 -0
- package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
- package/templates/skills/authoring-playbooks/SKILL.md +102 -0
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
- package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
- package/templates/skills/coordinating-agents/SKILL.md +32 -0
- package/templates/skills/coordinating-branches/SKILL.md +27 -0
- package/templates/skills/mapping-the-server/SKILL.md +54 -0
- package/templates/skills/reading-client-progress/SKILL.md +65 -0
- package/templates/skills/routing-to-channels/SKILL.md +54 -0
- package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
- package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
- package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
- package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
- package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
- package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
- package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
- package/dist/commands/connectors.d.ts +0 -31
- package/dist/commands/connectors.js +0 -276
- package/dist/commands/connectors.js.map +0 -1
- package/dist/commands/finish.d.ts +0 -25
- package/dist/commands/finish.js +0 -274
- package/dist/commands/finish.js.map +0 -1
- package/dist/commands/openclaw.d.ts +0 -40
- package/dist/commands/openclaw.js +0 -1148
- package/dist/commands/openclaw.js.map +0 -1
- package/dist/commands/security-audit.d.ts +0 -12
- package/dist/commands/security-audit.js +0 -100
- package/dist/commands/security-audit.js.map +0 -1
- package/dist/lib/hardening.d.ts +0 -18
- package/dist/lib/hardening.js +0 -214
- package/dist/lib/hardening.js.map +0 -1
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
- package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
- package/node_modules/@synap/hub-rest-client/package.json +0 -45
- package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
- package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
- package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
- package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
- package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap pod` — the unified pod-configuration view.
|
|
3
|
+
* ===================================================
|
|
4
|
+
*
|
|
5
|
+
* `market installed` shows what packages are installed; `synap pod` answers
|
|
6
|
+
* the bigger question — "what does my WHOLE pod look like right now?" — one
|
|
7
|
+
* scannable graph over workspaces (with provenance), pod-wide vs per-workspace
|
|
8
|
+
* capabilities/automations/playbooks, and the give/need feed links between
|
|
9
|
+
* workspaces. It is the read surface for `GET /api/hub/pod/config`
|
|
10
|
+
* (`hub-protocol/rest/pod.ts` on the backend side).
|
|
11
|
+
*
|
|
12
|
+
* `synap pod adopt <workspaceId> --template <slug>` links an orphan/ad-hoc
|
|
13
|
+
* workspace to a matching template so it becomes version-tracked, via
|
|
14
|
+
* `POST /api/hub/pod/adopt`.
|
|
15
|
+
*
|
|
16
|
+
* READ-first, ONE write door (`adopt`). Reuses rather than re-derives:
|
|
17
|
+
* - the composition-tree engine (`buildCompositionTrees`/`printCompositionTree`
|
|
18
|
+
* + `buildMarketCatalog`/`computeUpdates`) from `market.ts`, for the
|
|
19
|
+
* marketplace-provenance workspaces' package → template deps → workspaces
|
|
20
|
+
* overlay.
|
|
21
|
+
* - the honest-outcome verdict helpers (`classifyApplyResult`/
|
|
22
|
+
* `printApplyVerdict`) from `market.ts`, for `pod adopt`'s outcome.
|
|
23
|
+
*/
|
|
24
|
+
export type WorkspaceProvenance = {
|
|
25
|
+
kind: "marketplace";
|
|
26
|
+
packageSlug: string;
|
|
27
|
+
packageVersion: string | null;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "composed";
|
|
30
|
+
composedFrom: unknown[];
|
|
31
|
+
} | {
|
|
32
|
+
kind: "ad-hoc";
|
|
33
|
+
createdBy: string | null;
|
|
34
|
+
templateMatch?: {
|
|
35
|
+
slug: string;
|
|
36
|
+
name: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export interface PodConfigWorkspace {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
subtype: string | null;
|
|
43
|
+
entityCount: number;
|
|
44
|
+
provenance: WorkspaceProvenance;
|
|
45
|
+
}
|
|
46
|
+
export type CapabilityProvenance = {
|
|
47
|
+
kind: "marketplace";
|
|
48
|
+
templateKey: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: "manual";
|
|
51
|
+
};
|
|
52
|
+
export interface PodConfigCapability {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
workspaceId: string | null;
|
|
56
|
+
provenance: CapabilityProvenance;
|
|
57
|
+
}
|
|
58
|
+
export type AutomationProvenance = {
|
|
59
|
+
kind: "ai" | "manual" | "template";
|
|
60
|
+
};
|
|
61
|
+
export interface PodConfigAutomation {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
workspaceId: string | null;
|
|
65
|
+
provenance: AutomationProvenance;
|
|
66
|
+
}
|
|
67
|
+
export type PlaybookProvenance = {
|
|
68
|
+
kind: "manual";
|
|
69
|
+
};
|
|
70
|
+
export interface PodConfigPlaybook {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
workspaceId: string | null;
|
|
74
|
+
provenance: PlaybookProvenance;
|
|
75
|
+
}
|
|
76
|
+
export interface PodConfigFeedsLink {
|
|
77
|
+
from: string;
|
|
78
|
+
to: string;
|
|
79
|
+
domain: string | null;
|
|
80
|
+
profileSlug: string | null;
|
|
81
|
+
}
|
|
82
|
+
export interface PodConfig {
|
|
83
|
+
workspaces: PodConfigWorkspace[];
|
|
84
|
+
capabilities: PodConfigCapability[];
|
|
85
|
+
automations: PodConfigAutomation[];
|
|
86
|
+
playbooks: PodConfigPlaybook[];
|
|
87
|
+
feedsLinks: PodConfigFeedsLink[];
|
|
88
|
+
}
|
|
89
|
+
export declare function pod(opts: {
|
|
90
|
+
json?: boolean;
|
|
91
|
+
orphans?: boolean;
|
|
92
|
+
podUrl?: string;
|
|
93
|
+
apiKey?: string;
|
|
94
|
+
}): Promise<void>;
|
|
95
|
+
export declare function podAdopt(workspaceNameOrId: string, opts: {
|
|
96
|
+
template?: string;
|
|
97
|
+
json?: boolean;
|
|
98
|
+
podUrl?: string;
|
|
99
|
+
apiKey?: string;
|
|
100
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap pod` — the unified pod-configuration view.
|
|
3
|
+
* ===================================================
|
|
4
|
+
*
|
|
5
|
+
* `market installed` shows what packages are installed; `synap pod` answers
|
|
6
|
+
* the bigger question — "what does my WHOLE pod look like right now?" — one
|
|
7
|
+
* scannable graph over workspaces (with provenance), pod-wide vs per-workspace
|
|
8
|
+
* capabilities/automations/playbooks, and the give/need feed links between
|
|
9
|
+
* workspaces. It is the read surface for `GET /api/hub/pod/config`
|
|
10
|
+
* (`hub-protocol/rest/pod.ts` on the backend side).
|
|
11
|
+
*
|
|
12
|
+
* `synap pod adopt <workspaceId> --template <slug>` links an orphan/ad-hoc
|
|
13
|
+
* workspace to a matching template so it becomes version-tracked, via
|
|
14
|
+
* `POST /api/hub/pod/adopt`.
|
|
15
|
+
*
|
|
16
|
+
* READ-first, ONE write door (`adopt`). Reuses rather than re-derives:
|
|
17
|
+
* - the composition-tree engine (`buildCompositionTrees`/`printCompositionTree`
|
|
18
|
+
* + `buildMarketCatalog`/`computeUpdates`) from `market.ts`, for the
|
|
19
|
+
* marketplace-provenance workspaces' package → template deps → workspaces
|
|
20
|
+
* overlay.
|
|
21
|
+
* - the honest-outcome verdict helpers (`classifyApplyResult`/
|
|
22
|
+
* `printApplyVerdict`) from `market.ts`, for `pod adopt`'s outcome.
|
|
23
|
+
*/
|
|
24
|
+
import chalk from "chalk";
|
|
25
|
+
import { log } from "../utils/logger.js";
|
|
26
|
+
import { resolveHubConfig, hubGet, hubPost, renderHubError, HubError, } from "../lib/hub-client.js";
|
|
27
|
+
import { writeGovernance } from "../lib/capture-lane.js";
|
|
28
|
+
import { fetchInstalledTemplates } from "../lib/installed.js";
|
|
29
|
+
import { buildMarketCatalog, computeUpdates, buildCompositionTrees, printCompositionTree, } from "./market.js";
|
|
30
|
+
/** Coerce whatever shape a field arrives in into an array — tolerates minor DTO drift. */
|
|
31
|
+
function arr(v) {
|
|
32
|
+
return Array.isArray(v) ? v : [];
|
|
33
|
+
}
|
|
34
|
+
/** Defensive parse of the raw `/pod/config` JSON into `PodConfig` — never throws on a shifted field name, just degrades that section to empty. */
|
|
35
|
+
function parsePodConfig(raw) {
|
|
36
|
+
const r = (raw ?? {});
|
|
37
|
+
return {
|
|
38
|
+
workspaces: arr(r.workspaces),
|
|
39
|
+
capabilities: arr(r.capabilities),
|
|
40
|
+
automations: arr(r.automations),
|
|
41
|
+
playbooks: arr(r.playbooks),
|
|
42
|
+
feedsLinks: arr(r.feedsLinks),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `GET /pod/config`. Returns `null` (never throws) on a 404 — the endpoint
|
|
47
|
+
* not being deployed yet on this pod build is an expected, non-fatal state
|
|
48
|
+
* during parallel backend/CLI development; callers render an honest "not
|
|
49
|
+
* live on this pod yet" message instead of a stack trace.
|
|
50
|
+
*/
|
|
51
|
+
async function fetchPodConfig(cfg) {
|
|
52
|
+
try {
|
|
53
|
+
const raw = await hubGet("/pod/config", {}, cfg);
|
|
54
|
+
return parsePodConfig(raw);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
if (e instanceof HubError && e.status === 404)
|
|
58
|
+
return null;
|
|
59
|
+
throw e;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** An orphan is an ad-hoc workspace the backend matched to a known template. */
|
|
63
|
+
function isOrphan(ws) {
|
|
64
|
+
return ws.provenance.kind === "ad-hoc" && !!ws.provenance.templateMatch;
|
|
65
|
+
}
|
|
66
|
+
// ── Rendering helpers ────────────────────────────────────────────────────────
|
|
67
|
+
/** Tag for the small provenance shapes shared by capabilities/automations/playbooks. */
|
|
68
|
+
function provenanceTag(p) {
|
|
69
|
+
if (p.kind === "marketplace" && p.templateKey)
|
|
70
|
+
return chalk.green(`marketplace: ${p.templateKey}`);
|
|
71
|
+
switch (p.kind) {
|
|
72
|
+
case "marketplace":
|
|
73
|
+
return chalk.green("marketplace");
|
|
74
|
+
case "ai":
|
|
75
|
+
return chalk.magenta("ai");
|
|
76
|
+
case "template":
|
|
77
|
+
return chalk.cyan("template");
|
|
78
|
+
case "manual":
|
|
79
|
+
default:
|
|
80
|
+
return chalk.dim(p.kind);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** One workspace row — `nameW` right-pads the name so provenance tags line up in a column. */
|
|
84
|
+
function workspaceLine(ws, nameW = 0) {
|
|
85
|
+
const name = chalk.bold(ws.name.padEnd(nameW));
|
|
86
|
+
const count = chalk.dim(`(${ws.entityCount} entities)`.padEnd(16));
|
|
87
|
+
const p = ws.provenance;
|
|
88
|
+
switch (p.kind) {
|
|
89
|
+
case "marketplace":
|
|
90
|
+
return `${name} ${count} ${chalk.green(`marketplace: ${p.packageSlug}${p.packageVersion ? "@" + p.packageVersion : ""}`)}`;
|
|
91
|
+
case "composed": {
|
|
92
|
+
const from = p.composedFrom.length ? p.composedFrom.map(String).join(", ") : "?";
|
|
93
|
+
return `${name} ${count} ${chalk.cyan(`composed from ${from}`)}`;
|
|
94
|
+
}
|
|
95
|
+
case "ad-hoc":
|
|
96
|
+
if (p.templateMatch) {
|
|
97
|
+
return (`${name} ${count} ` +
|
|
98
|
+
chalk.yellow(`⚠ orphan — matches template ${p.templateMatch.slug}`) +
|
|
99
|
+
"\n" +
|
|
100
|
+
" ".repeat(nameW + count.length + 4) +
|
|
101
|
+
chalk.dim(`run: synap pod adopt ${ws.id} --template ${p.templateMatch.slug}`));
|
|
102
|
+
}
|
|
103
|
+
return `${name} ${count} ${chalk.dim("ad-hoc")}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Group `{workspaceId|null}`-carrying rows into pod-wide vs per-workspace. */
|
|
107
|
+
function splitPodWide(rows) {
|
|
108
|
+
const podWide = [];
|
|
109
|
+
const perWorkspace = new Map();
|
|
110
|
+
for (const r of rows) {
|
|
111
|
+
if (r.workspaceId) {
|
|
112
|
+
(perWorkspace.get(r.workspaceId) ?? perWorkspace.set(r.workspaceId, []).get(r.workspaceId)).push(r);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
podWide.push(r);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { podWide, perWorkspace };
|
|
119
|
+
}
|
|
120
|
+
function printGroupedSection(title, rows, nameById) {
|
|
121
|
+
log.heading(` ${title}`);
|
|
122
|
+
log.blank();
|
|
123
|
+
if (rows.length === 0) {
|
|
124
|
+
console.log(" " + chalk.dim("(none)"));
|
|
125
|
+
log.blank();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const nameW = Math.max(4, ...rows.map((r) => r.name.length)) + 2;
|
|
129
|
+
const { podWide, perWorkspace } = splitPodWide(rows);
|
|
130
|
+
if (podWide.length > 0) {
|
|
131
|
+
console.log(" " + chalk.dim("Pod-wide"));
|
|
132
|
+
for (const r of podWide) {
|
|
133
|
+
console.log(" " + r.name.padEnd(nameW) + provenanceTag(r.provenance));
|
|
134
|
+
}
|
|
135
|
+
log.blank();
|
|
136
|
+
}
|
|
137
|
+
for (const [wsId, wsRows] of perWorkspace) {
|
|
138
|
+
console.log(" " + chalk.bold(nameById.get(wsId) ?? wsId));
|
|
139
|
+
for (const r of wsRows) {
|
|
140
|
+
console.log(" " + r.name.padEnd(nameW) + provenanceTag(r.provenance));
|
|
141
|
+
}
|
|
142
|
+
log.blank();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Render `feedsLinks` as `Foundation → provides → CRM` edges. */
|
|
146
|
+
function printFeedsLinks(links, nameById) {
|
|
147
|
+
log.heading(" Give / need links");
|
|
148
|
+
log.blank();
|
|
149
|
+
if (links.length === 0) {
|
|
150
|
+
console.log(" " + chalk.dim("(none)"));
|
|
151
|
+
log.blank();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
for (const l of links) {
|
|
155
|
+
const from = nameById.get(l.from) ?? l.from;
|
|
156
|
+
const to = nameById.get(l.to) ?? l.to;
|
|
157
|
+
const detail = l.domain ? ` (${l.domain})` : l.profileSlug ? ` (${l.profileSlug})` : "";
|
|
158
|
+
console.log(" " + chalk.bold(from) + chalk.dim(" → provides → ") + chalk.bold(to) + chalk.dim(detail));
|
|
159
|
+
}
|
|
160
|
+
log.blank();
|
|
161
|
+
}
|
|
162
|
+
// ── `synap pod` ──────────────────────────────────────────────────────────────
|
|
163
|
+
export async function pod(opts) {
|
|
164
|
+
let cfg;
|
|
165
|
+
try {
|
|
166
|
+
cfg = await resolveHubConfig(opts);
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
renderHubError(e);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
const config = await fetchPodConfig(cfg);
|
|
173
|
+
if (!config) {
|
|
174
|
+
if (opts.json) {
|
|
175
|
+
console.log(JSON.stringify({ error: "not-deployed", message: "GET /api/hub/pod/config returned 404" }, null, 2));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
log.warn("The unified pod-config endpoint isn't live on this pod yet (404).");
|
|
179
|
+
log.hint("The backend half of this feature hasn't been deployed — this command is wired and will work once it is.");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const nameById = new Map(config.workspaces.map((w) => [w.id, w.name]));
|
|
183
|
+
const adHocWorkspaces = config.workspaces.filter((w) => w.provenance.kind === "ad-hoc");
|
|
184
|
+
if (opts.orphans) {
|
|
185
|
+
if (opts.json) {
|
|
186
|
+
console.log(JSON.stringify({ workspaces: adHocWorkspaces }, null, 2));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (adHocWorkspaces.length === 0) {
|
|
190
|
+
log.success("No orphan or ad-hoc workspaces — everything is either marketplace-linked or composed.");
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
log.heading(" Orphan / ad-hoc workspaces");
|
|
194
|
+
log.blank();
|
|
195
|
+
const nameW = Math.max(4, ...adHocWorkspaces.map((w) => w.name.length)) + 2;
|
|
196
|
+
for (const ws of adHocWorkspaces) {
|
|
197
|
+
console.log(" " + workspaceLine(ws, nameW));
|
|
198
|
+
}
|
|
199
|
+
log.blank();
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (opts.json) {
|
|
203
|
+
console.log(JSON.stringify(config, null, 2));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// ── Workspaces ─────────────────────────────────────────────────────────
|
|
207
|
+
log.heading(" Workspaces");
|
|
208
|
+
log.blank();
|
|
209
|
+
if (config.workspaces.length === 0) {
|
|
210
|
+
console.log(" " + chalk.dim("(none)"));
|
|
211
|
+
log.blank();
|
|
212
|
+
}
|
|
213
|
+
const marketplaceWorkspaces = config.workspaces.filter((w) => w.provenance.kind === "marketplace");
|
|
214
|
+
const otherWorkspaces = config.workspaces.filter((w) => w.provenance.kind !== "marketplace");
|
|
215
|
+
// Composition-tree overlay for marketplace workspaces — reuses market.ts's
|
|
216
|
+
// `--tree` engine (buildMarketCatalog + computeUpdates + buildCompositionTrees)
|
|
217
|
+
// rather than re-deriving a second package→workspace walk.
|
|
218
|
+
if (marketplaceWorkspaces.length > 0) {
|
|
219
|
+
const nameW = Math.max(4, ...marketplaceWorkspaces.map((w) => w.name.length)) + 2;
|
|
220
|
+
const printFlat = () => {
|
|
221
|
+
marketplaceWorkspaces.forEach((ws) => console.log(" " + workspaceLine(ws, nameW)));
|
|
222
|
+
log.blank();
|
|
223
|
+
};
|
|
224
|
+
try {
|
|
225
|
+
const [installedTemplates, cat] = await Promise.all([fetchInstalledTemplates(), buildMarketCatalog()]);
|
|
226
|
+
if (installedTemplates.length > 0) {
|
|
227
|
+
const checks = computeUpdates(installedTemplates, cat);
|
|
228
|
+
const workspaceCountBySlug = new Map();
|
|
229
|
+
for (const t of installedTemplates) {
|
|
230
|
+
workspaceCountBySlug.set(t.slug, (workspaceCountBySlug.get(t.slug) ?? 0) + 1);
|
|
231
|
+
}
|
|
232
|
+
const seen = new Set();
|
|
233
|
+
const rows = checks.filter((c) => (seen.has(c.slug) ? false : (seen.add(c.slug), true)));
|
|
234
|
+
const { packages } = await buildCompositionTrees(rows, cat, installedTemplates, workspaceCountBySlug);
|
|
235
|
+
if (packages.length > 0)
|
|
236
|
+
packages.forEach(printCompositionTree);
|
|
237
|
+
else
|
|
238
|
+
printFlat();
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
printFlat();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Composition-tree overlay is best-effort — fall back to the flat list.
|
|
246
|
+
printFlat();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (otherWorkspaces.length > 0) {
|
|
250
|
+
console.log(" " + chalk.dim("Composed / ad-hoc"));
|
|
251
|
+
const nameW = Math.max(4, ...otherWorkspaces.map((w) => w.name.length)) + 2;
|
|
252
|
+
for (const ws of otherWorkspaces) {
|
|
253
|
+
console.log(" " + workspaceLine(ws, nameW));
|
|
254
|
+
}
|
|
255
|
+
log.blank();
|
|
256
|
+
}
|
|
257
|
+
// ── Capabilities / Automations / Playbooks ────────────────────────────
|
|
258
|
+
printGroupedSection("Capabilities", config.capabilities, nameById);
|
|
259
|
+
printGroupedSection("Automations", config.automations, nameById);
|
|
260
|
+
printGroupedSection("Playbooks", config.playbooks, nameById);
|
|
261
|
+
// ── Give / need links ──────────────────────────────────────────────────
|
|
262
|
+
printFeedsLinks(config.feedsLinks, nameById);
|
|
263
|
+
const orphanCount = adHocWorkspaces.filter(isOrphan).length;
|
|
264
|
+
const adHocCount = adHocWorkspaces.length - orphanCount;
|
|
265
|
+
if (orphanCount > 0 || adHocCount > 0) {
|
|
266
|
+
log.dim(`${orphanCount} orphan, ${adHocCount} ad-hoc workspace${orphanCount + adHocCount === 1 ? "" : "s"} — run 'synap pod --orphans' to focus on them.`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// ── `synap pod adopt <nameOrId> --template <slug>` ───────────────────────────
|
|
270
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
271
|
+
/**
|
|
272
|
+
* Resolve a user-supplied `<workspace>` arg to a workspace id.
|
|
273
|
+
*
|
|
274
|
+
* `adopt` is FOR orphans, so the source must include unstamped/ad-hoc
|
|
275
|
+
* workspaces — `fetchInstalledTemplates` (template-installed only) is the
|
|
276
|
+
* wrong list here. `GET /orient` already returns every workspace on the pod
|
|
277
|
+
* (incl. orphans) and is deployed today, so it's the resolution source; the
|
|
278
|
+
* newer `/pod/config` read (this file's `fetchPodConfig`) would also work
|
|
279
|
+
* once live but isn't guaranteed deployed yet.
|
|
280
|
+
*
|
|
281
|
+
* A UUID is passed straight through unchanged (fast path — no network call).
|
|
282
|
+
* Anything else is matched case-insensitively by exact name against `/orient`.
|
|
283
|
+
*/
|
|
284
|
+
async function resolveWorkspaceRef(nameOrId, cfg) {
|
|
285
|
+
if (UUID_RE.test(nameOrId))
|
|
286
|
+
return nameOrId;
|
|
287
|
+
const res = (await hubGet("/orient", { detail: "full" }, cfg));
|
|
288
|
+
const workspaces = res.workspaces ?? [];
|
|
289
|
+
const needle = nameOrId.trim().toLowerCase();
|
|
290
|
+
const matches = workspaces.filter((w) => (w.name ?? "").trim().toLowerCase() === needle);
|
|
291
|
+
if (matches.length === 0) {
|
|
292
|
+
log.error(`No workspace named "${nameOrId}" on this pod. Run 'synap pod' to see them.`);
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
if (matches.length > 1) {
|
|
296
|
+
const candidates = matches.map((w) => `${w.id} (${w.name})`).join(", ");
|
|
297
|
+
log.error(`Multiple workspaces named "${nameOrId}" — use the id: ${candidates}`);
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
const match = matches[0];
|
|
301
|
+
log.dim(`Resolved "${nameOrId}" → ${match.id}`);
|
|
302
|
+
return match.id;
|
|
303
|
+
}
|
|
304
|
+
export async function podAdopt(workspaceNameOrId, opts) {
|
|
305
|
+
if (!opts.template) {
|
|
306
|
+
log.error("Missing --template <slug>.");
|
|
307
|
+
log.hint("List template matches: synap pod --orphans");
|
|
308
|
+
process.exit(1);
|
|
309
|
+
}
|
|
310
|
+
let cfg;
|
|
311
|
+
try {
|
|
312
|
+
cfg = await resolveHubConfig(opts);
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
renderHubError(e);
|
|
316
|
+
process.exit(1);
|
|
317
|
+
}
|
|
318
|
+
const workspaceId = await resolveWorkspaceRef(workspaceNameOrId, cfg);
|
|
319
|
+
try {
|
|
320
|
+
const res = (await hubPost("/pod/adopt", { workspaceId, templateSlug: opts.template }, cfg));
|
|
321
|
+
if (writeGovernance(res) === "proposed") {
|
|
322
|
+
const proposalId = res.proposalId ? String(res.proposalId) : undefined;
|
|
323
|
+
if (opts.json) {
|
|
324
|
+
console.log(JSON.stringify({ outcome: "proposed", proposalId }, null, 2));
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
log.info(`Adopting into ${opts.template} — proposed (under review, not live yet).`);
|
|
328
|
+
if (proposalId)
|
|
329
|
+
log.hint(`Approve: synap proposals approve ${proposalId.slice(0, 8)}`);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const result = res;
|
|
333
|
+
if (opts.json) {
|
|
334
|
+
console.log(JSON.stringify(result, null, 2));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const wsName = result.workspace?.name ?? workspaceId;
|
|
338
|
+
if (result.outcome === "already-linked") {
|
|
339
|
+
log.info(`${wsName} is already linked to ${opts.template}.`);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
log.success(`Linked ${wsName} to ${opts.template} — now version-tracked.`);
|
|
343
|
+
if (result.workspace?.packageVersion) {
|
|
344
|
+
log.dim(`Stamped version ${result.workspace.packageVersion}.`);
|
|
345
|
+
}
|
|
346
|
+
log.hint(`Check for drift going forward: synap market update ${opts.template}`);
|
|
347
|
+
}
|
|
348
|
+
catch (e) {
|
|
349
|
+
if (e instanceof HubError && e.status === 404) {
|
|
350
|
+
log.warn("The pod-adopt endpoint isn't live on this pod yet (404).");
|
|
351
|
+
log.hint("The backend half of this feature hasn't been deployed — this command is wired and will work once it is.");
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
log.error(`Adopting ${workspaceId} into ${opts.template} failed`);
|
|
355
|
+
renderHubError(e);
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=pod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod.js","sourceRoot":"","sources":["../../src/commands/pod.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pods.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare function podsAdd(name?: string, podUrlArg?: string): Promise<void
|
|
|
12
12
|
export type { SurfaceName };
|
|
13
13
|
export declare function podsUse(name: string, opts?: {
|
|
14
14
|
surface?: SurfaceName;
|
|
15
|
+
json?: boolean;
|
|
15
16
|
}): Promise<void>;
|
|
16
17
|
export declare function podsSwitch(name?: string): Promise<void>;
|
|
17
18
|
export declare function podsRemove(name: string): Promise<void>;
|
package/dist/commands/pods.js
CHANGED
|
@@ -13,9 +13,10 @@ import fs from "node:fs";
|
|
|
13
13
|
import path from "node:path";
|
|
14
14
|
import os from "node:os";
|
|
15
15
|
import { log } from "../utils/logger.js";
|
|
16
|
-
import { checkPodHealth,
|
|
17
|
-
import { TARGETS, writeMcpServerEntry, writeClaudeCodeEnv, } from "../lib/targets.js";
|
|
16
|
+
import { checkPodHealth, addPodProfile, setActivePod, setSurfacePod, removePodProfile, listPodProfiles, podNotFoundMessage, SURFACE_NAMES, } from "../lib/pod.js";
|
|
17
|
+
import { TARGETS, writeMcpServerEntry, writeClaudeCodeEnv, provisionAgentKey, configureAgentContext, } from "../lib/targets.js";
|
|
18
18
|
import { runBrowserAuth } from "../lib/browser-auth.js";
|
|
19
|
+
import { renderNextSteps, FLOW } from "../lib/next-steps.js";
|
|
19
20
|
// ─── list ─────────────────────────────────────────────────────────────────────
|
|
20
21
|
export async function podsList() {
|
|
21
22
|
const profiles = listPodProfiles();
|
|
@@ -126,9 +127,14 @@ export async function podsAdd(name, podUrlArg) {
|
|
|
126
127
|
return;
|
|
127
128
|
const genSpinner = ora("Creating agent credentials...").start();
|
|
128
129
|
try {
|
|
129
|
-
|
|
130
|
+
// Agents are pod-wide singletons now — no per-agent workspaceId comes back
|
|
131
|
+
// from setup (the old setupAgent() never passed one either, so this was
|
|
132
|
+
// already always null/"" in practice). Provision via the shared wrapper.
|
|
133
|
+
// No enrollAgentIfNeeded here: a PROVISIONING_TOKEN isn't a Hub Protocol
|
|
134
|
+
// API key, so it can't authorize /workspaces/enroll-agent (hub-protocol.write
|
|
135
|
+
// scope) — same as before this consolidation.
|
|
136
|
+
const result = await provisionAgentKey(podUrl, token, "cli");
|
|
130
137
|
apiKey = result.hubApiKey;
|
|
131
|
-
workspaceId = result.workspaceId;
|
|
132
138
|
agentUserId = result.agentUserId;
|
|
133
139
|
genSpinner.succeed("Credentials created");
|
|
134
140
|
}
|
|
@@ -147,6 +153,14 @@ export async function podsAdd(name, podUrlArg) {
|
|
|
147
153
|
label: label || undefined,
|
|
148
154
|
savedAt: new Date().toISOString(),
|
|
149
155
|
});
|
|
156
|
+
if (agentUserId) {
|
|
157
|
+
try {
|
|
158
|
+
await configureAgentContext(podUrl, apiKey, "cli", agentUserId);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
log.warn(`Agent context wizard failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
150
164
|
log.blank();
|
|
151
165
|
log.success(`Pod '${profileName}' saved.`);
|
|
152
166
|
log.dim(`Run: synap pods use ${profileName} — to make it active`);
|
|
@@ -159,17 +173,40 @@ const SURFACE_LABELS = {
|
|
|
159
173
|
opencode: "opencode",
|
|
160
174
|
goose: "Goose",
|
|
161
175
|
};
|
|
176
|
+
/**
|
|
177
|
+
* The surfaces `applySurfaceConfig` can actually write. SURFACE_NAMES is much
|
|
178
|
+
* wider (it is the SSOT for every connect/agent identity), and `pods use
|
|
179
|
+
* --surface <one of the others>` used to print success and do nothing.
|
|
180
|
+
*
|
|
181
|
+
* Typing applySurfaceConfig to this narrow union makes its switch exhaustive, so
|
|
182
|
+
* adding a surface here without a writer is a COMPILE error, not a silent no-op.
|
|
183
|
+
*/
|
|
184
|
+
const SUPPORTED_USE_SURFACES = ["claude-desktop", "cursor", "claude-code", "raycast"];
|
|
185
|
+
function isSupportedUseSurface(s) {
|
|
186
|
+
return SUPPORTED_USE_SURFACES.includes(s);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Raycast's support dir — its presence is our "is Raycast installed" gate.
|
|
190
|
+
* Mirrors `raycastSupportDir()` in lib/targets.ts, which is private to that file.
|
|
191
|
+
*/
|
|
192
|
+
function raycastSupportDir() {
|
|
193
|
+
return path.join(os.homedir(), "Library", "Application Support", "com.raycast.macos");
|
|
194
|
+
}
|
|
162
195
|
export async function podsUse(name, opts = {}) {
|
|
163
196
|
const profiles = listPodProfiles();
|
|
164
197
|
const profile = profiles.find((p) => p.name === name);
|
|
165
198
|
if (!profile) {
|
|
166
|
-
log.error(
|
|
167
|
-
if (profiles.length > 0)
|
|
168
|
-
log.dim("Available: " + profiles.map((p) => p.name).join(", "));
|
|
199
|
+
log.error(podNotFoundMessage(name));
|
|
169
200
|
return;
|
|
170
201
|
}
|
|
171
202
|
const podConfig = profile.config;
|
|
172
203
|
if (opts.surface) {
|
|
204
|
+
if (!isSupportedUseSurface(opts.surface)) {
|
|
205
|
+
log.error(`'${opts.surface}' is not a surface \`pods use\` can configure.`);
|
|
206
|
+
log.dim(`Supported: ${SUPPORTED_USE_SURFACES.join(", ")}`);
|
|
207
|
+
log.dim(`Other surfaces (${SURFACE_NAMES.filter((s) => !isSupportedUseSurface(s)).join(", ")}) are configured via: synap connect --target=<surface>`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
173
210
|
// Per-surface switch — only update that surface's config
|
|
174
211
|
try {
|
|
175
212
|
setSurfacePod(opts.surface, name);
|
|
@@ -210,15 +247,34 @@ export async function podsUse(name, opts = {}) {
|
|
|
210
247
|
// Claude Code
|
|
211
248
|
const claudeSettings = path.join(os.homedir(), ".claude", "settings.json");
|
|
212
249
|
if (fs.existsSync(claudeSettings)) {
|
|
213
|
-
|
|
250
|
+
// Pod-wide: a workspace is a lens, not a container — don't weld the profile's
|
|
251
|
+
// workspace into the MCP URL (matches the Desktop/Cursor entries above and
|
|
252
|
+
// the `synap connect` default). Pins are set only via `synap connect --pin-*`.
|
|
253
|
+
await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, agentUserId: podConfig.agentUserId });
|
|
214
254
|
updated.push("Claude Code");
|
|
215
255
|
}
|
|
216
|
-
// Raycast reads ~/.synap/config.json directly — activePod update is
|
|
217
|
-
|
|
256
|
+
// Raycast reads ~/.synap/config.json directly — the activePod update above is
|
|
257
|
+
// sufficient. Still gate on Raycast being installed: claiming we updated it on
|
|
258
|
+
// a machine that has never run Raycast is a lie (same existsSync gate as above).
|
|
259
|
+
if (fs.existsSync(raycastSupportDir())) {
|
|
260
|
+
updated.push("Raycast");
|
|
261
|
+
}
|
|
262
|
+
const steps = FLOW.afterPodUse(name);
|
|
263
|
+
if (opts.json) {
|
|
264
|
+
console.log(JSON.stringify({ pod: name, podUrl: podConfig.podUrl, surfaces: updated, nextSteps: steps }, null, 2));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (updated.length === 0) {
|
|
268
|
+
log.warn("Active pod switched, but no agent surface is configured on this machine.");
|
|
269
|
+
log.dim("Connect one with: synap connect --target=<surface>");
|
|
270
|
+
renderNextSteps(steps);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
218
273
|
log.success(`Updated: ${updated.join(", ")}`);
|
|
219
274
|
log.dim("Restart any open agents to apply the new pod.");
|
|
220
275
|
log.blank();
|
|
221
276
|
log.dim("Tip: synap pods use <name> --surface <surface> — switch only one surface");
|
|
277
|
+
renderNextSteps(steps);
|
|
222
278
|
}
|
|
223
279
|
/** Apply a pod config to a single surface's external config file. */
|
|
224
280
|
async function applySurfaceConfig(surface, podConfig) {
|
|
@@ -255,7 +311,9 @@ async function applySurfaceConfig(surface, podConfig) {
|
|
|
255
311
|
case "claude-code": {
|
|
256
312
|
const p = path.join(os.homedir(), ".claude", "settings.json");
|
|
257
313
|
if (fs.existsSync(p)) {
|
|
258
|
-
|
|
314
|
+
// Pod-wide: don't weld the profile's workspace into the MCP URL (see note
|
|
315
|
+
// in `podsUse` above and the `synap connect` default).
|
|
316
|
+
await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, agentUserId: podConfig.agentUserId });
|
|
259
317
|
log.success("Claude Code env updated (~/.claude/settings.json).");
|
|
260
318
|
}
|
|
261
319
|
else {
|
|
@@ -267,6 +325,12 @@ async function applySurfaceConfig(surface, podConfig) {
|
|
|
267
325
|
// Raycast reads ~/.synap/config.json directly — surfaces entry is enough.
|
|
268
326
|
log.success("Raycast surface preference saved.");
|
|
269
327
|
break;
|
|
328
|
+
default: {
|
|
329
|
+
// Exhaustiveness guard: widening SUPPORTED_USE_SURFACES without adding a
|
|
330
|
+
// writer above fails to compile here, instead of silently doing nothing.
|
|
331
|
+
const _exhaustive = surface;
|
|
332
|
+
return _exhaustive;
|
|
333
|
+
}
|
|
270
334
|
}
|
|
271
335
|
}
|
|
272
336
|
// ─── switch (interactive) ─────────────────────────────────────────────────────
|
|
@@ -306,9 +370,7 @@ export async function podsRemove(name) {
|
|
|
306
370
|
const profiles = listPodProfiles();
|
|
307
371
|
const profile = profiles.find((p) => p.name === name);
|
|
308
372
|
if (!profile) {
|
|
309
|
-
log.error(
|
|
310
|
-
if (profiles.length > 0)
|
|
311
|
-
log.dim("Available: " + profiles.map((p) => p.name).join(", "));
|
|
373
|
+
log.error(podNotFoundMessage(name));
|
|
312
374
|
return;
|
|
313
375
|
}
|
|
314
376
|
if (profile.active) {
|
|
@@ -368,7 +430,7 @@ export async function podsReconnect(name) {
|
|
|
368
430
|
}
|
|
369
431
|
const profile = profiles.find((p) => p.name === targetName);
|
|
370
432
|
if (!profile) {
|
|
371
|
-
log.error(
|
|
433
|
+
log.error(podNotFoundMessage(targetName));
|
|
372
434
|
return;
|
|
373
435
|
}
|
|
374
436
|
const podUrl = profile.config.podUrl;
|