@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,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap tools — Add and manage external service tools (credentials + connections)
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: list, connect, disconnect, sync, schema
|
|
5
|
+
*/
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import ora from "ora";
|
|
8
|
+
import { exec } from "child_process";
|
|
9
|
+
import { mkdirSync, writeFileSync, existsSync } from "fs";
|
|
10
|
+
import { resolveHubConfig, hubGet, hubPost, renderHubError } from "../lib/hub-client.js";
|
|
11
|
+
import { capabilityList, capabilityConnect, capabilityDisconnect } from "./capability.js";
|
|
12
|
+
import { log } from "../utils/logger.js";
|
|
13
|
+
/**
|
|
14
|
+
* The one deprecation line every `tools` subcommand prints. `synap capability`
|
|
15
|
+
* (alias `cap`) is the single capability root; `tools` survives only as an alias
|
|
16
|
+
* so existing scripts keep working.
|
|
17
|
+
*/
|
|
18
|
+
const TOOLS_DEPRECATED = "`synap tools` is deprecated — use `synap cap`";
|
|
19
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
20
|
+
/** Render the verbs a connection installed, e.g. after OAuth completes. */
|
|
21
|
+
function printUnlocked(unlocked) {
|
|
22
|
+
const skills = (unlocked ?? []).flatMap((u) => u.skills);
|
|
23
|
+
if (skills.length === 0)
|
|
24
|
+
return;
|
|
25
|
+
console.log();
|
|
26
|
+
log.heading("Capabilities installed");
|
|
27
|
+
for (const s of skills) {
|
|
28
|
+
const label = s.name.replace(/_/g, " ");
|
|
29
|
+
console.log(` ${chalk.green("✓")} ${chalk.bold(label)}${s.description ? chalk.dim(` — ${s.description}`) : ""}`);
|
|
30
|
+
}
|
|
31
|
+
console.log();
|
|
32
|
+
// Code skills are seeded as DRAFT (a deliberate gate — code runs unreviewed
|
|
33
|
+
// only after an explicit enable). Be honest about the one-time step.
|
|
34
|
+
log.dim("Enable these in Synap → Settings → Capabilities to let your agent use them.");
|
|
35
|
+
log.dim("Once enabled, each action still asks for your approval before it runs.");
|
|
36
|
+
}
|
|
37
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
38
|
+
/**
|
|
39
|
+
* Poll the connect door until the provider flips to `connected` (the user
|
|
40
|
+
* finished OAuth in the browser). The door is self-completing: on `connected`
|
|
41
|
+
* it materializes the tool + family template server-side and returns `unlocked`.
|
|
42
|
+
* Bounded so the CLI never hangs forever.
|
|
43
|
+
*/
|
|
44
|
+
async function pollUntilConnected(cfg, provider, workspaceId, timeoutMs = 180_000, intervalMs = 3_000) {
|
|
45
|
+
const deadline = Date.now() + timeoutMs;
|
|
46
|
+
while (Date.now() < deadline) {
|
|
47
|
+
await sleep(intervalMs);
|
|
48
|
+
try {
|
|
49
|
+
const body = { provider };
|
|
50
|
+
if (workspaceId)
|
|
51
|
+
body.workspaceId = workspaceId;
|
|
52
|
+
const res = (await hubPost("/connectors/connect", body, cfg));
|
|
53
|
+
if (String(res.status) === "connected")
|
|
54
|
+
return res;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// transient — keep polling until the deadline
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
function openBrowser(url) {
|
|
63
|
+
const platform = process.platform;
|
|
64
|
+
let cmd;
|
|
65
|
+
if (platform === "darwin") {
|
|
66
|
+
cmd = `open "${url}"`;
|
|
67
|
+
}
|
|
68
|
+
else if (platform === "win32") {
|
|
69
|
+
cmd = `start "" "${url}"`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
cmd = `xdg-open "${url}"`;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
exec(cmd);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// silently ignore — caller already prints the URL
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function fetchProviders(cfg, workspaceId) {
|
|
82
|
+
const params = {};
|
|
83
|
+
if (workspaceId)
|
|
84
|
+
params.workspaceId = workspaceId;
|
|
85
|
+
const res = await hubGet("/connectors/providers", params, cfg);
|
|
86
|
+
const r = res;
|
|
87
|
+
return (r.providers ?? []);
|
|
88
|
+
}
|
|
89
|
+
export async function toolsConnect(service, opts) {
|
|
90
|
+
log.dim(TOOLS_DEPRECATED);
|
|
91
|
+
// Capabilities are the one root now — forward the named-service connect to
|
|
92
|
+
// `cap connect` (the capability-first equivalent).
|
|
93
|
+
if (service) {
|
|
94
|
+
await capabilityConnect(service, { workspace: opts.workspace });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
let cfg;
|
|
98
|
+
try {
|
|
99
|
+
cfg = await resolveHubConfig({ podUrl: opts.podUrl, apiKey: opts.apiKey });
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
log.error(err.message);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
106
|
+
const spinner = ora({ text: "Resolving connection…", color: "cyan" }).start();
|
|
107
|
+
// The unified door: resolves the provider, checks for an existing connection,
|
|
108
|
+
// and returns connected / setup_required / provider_required in one call.
|
|
109
|
+
// Connects as the operator (the CLI's key owner) — no per-user binding here.
|
|
110
|
+
let res;
|
|
111
|
+
try {
|
|
112
|
+
const body = {};
|
|
113
|
+
if (service)
|
|
114
|
+
body.provider = service;
|
|
115
|
+
if (workspaceId)
|
|
116
|
+
body.workspaceId = workspaceId;
|
|
117
|
+
res = (await hubPost("/connectors/connect", body, cfg));
|
|
118
|
+
spinner.stop();
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
spinner.fail(chalk.red("Failed to resolve connection"));
|
|
122
|
+
log.error(err.message);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
const status = String(res.status);
|
|
126
|
+
if (status === "connected") {
|
|
127
|
+
log.heading(`${res.displayName ?? res.provider} is already connected`);
|
|
128
|
+
printUnlocked(res.unlocked);
|
|
129
|
+
log.dim(`Run \`synap tools list\` to see all tools and their credentials.`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (status === "provider_required") {
|
|
133
|
+
// The door only returns `provider_required` when Nango ANSWERED and declares
|
|
134
|
+
// at least one integration — "nothing declared" is `provider_unavailable`
|
|
135
|
+
// now, so this list is never empty. (The old fallback here opened a Connect
|
|
136
|
+
// session "for all services" against a Nango that declared none: it could
|
|
137
|
+
// only ever dead-end.)
|
|
138
|
+
const providers = (res.providers ?? []);
|
|
139
|
+
log.heading("Which service do you want to connect?");
|
|
140
|
+
console.log();
|
|
141
|
+
for (const p of providers) {
|
|
142
|
+
console.log(` ${chalk.cyan(p.provider)}${p.displayName ? chalk.dim(` (${p.displayName})`) : ""}`);
|
|
143
|
+
}
|
|
144
|
+
console.log();
|
|
145
|
+
log.dim(`Run \`synap cap connect <name>\` with one of the above.`);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (status === "provider_unavailable") {
|
|
149
|
+
// The pod can't offer this provider (not declared / unreachable / malformed).
|
|
150
|
+
// The server message already names the real cause + remedy — print it as-is.
|
|
151
|
+
// No browser, and no "re-run connect": re-running cannot fix a server-side gap.
|
|
152
|
+
log.warn(`${res.displayName ?? res.provider ?? service ?? "That service"} is unavailable on this pod.`);
|
|
153
|
+
if (res.message)
|
|
154
|
+
log.dim(String(res.message));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// setup_required (or any status this CLI doesn't know) → only ever open a
|
|
158
|
+
// browser when the server actually handed us a URL. An older/newer pod that
|
|
159
|
+
// returns a status we don't handle must NOT send the user to "undefined".
|
|
160
|
+
const redirectUrl = typeof res.redirectUrl === "string" && res.redirectUrl.length > 0 ? res.redirectUrl : null;
|
|
161
|
+
if (!redirectUrl) {
|
|
162
|
+
log.warn(`Couldn't start a connection for ${res.displayName ?? res.provider ?? service ?? "that service"}.`);
|
|
163
|
+
if (res.message)
|
|
164
|
+
log.dim(String(res.message));
|
|
165
|
+
else
|
|
166
|
+
log.dim(`The pod returned status "${status}" with no connect URL. Check the pod's connector configuration.`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const matchedProvider = res.provider ? String(res.provider) : service;
|
|
170
|
+
log.heading(`Connect to ${res.displayName ?? res.provider ?? service ?? "external service"}`);
|
|
171
|
+
console.log();
|
|
172
|
+
console.log(` Opening OAuth flow in your browser…`);
|
|
173
|
+
console.log(` ${chalk.dim("If it didn't open, paste this URL in your browser:")}`);
|
|
174
|
+
console.log();
|
|
175
|
+
console.log(` ${chalk.underline(chalk.cyan(redirectUrl))}`);
|
|
176
|
+
console.log();
|
|
177
|
+
openBrowser(redirectUrl);
|
|
178
|
+
// Wait for the user to finish OAuth, then confirm + show what unlocked. The
|
|
179
|
+
// connect door materializes the capability server-side on `connected`, so by
|
|
180
|
+
// the time this resolves the agent can already use the new verbs.
|
|
181
|
+
if (matchedProvider) {
|
|
182
|
+
const waitSpinner = ora({ text: "Waiting for you to finish in the browser…", color: "cyan" }).start();
|
|
183
|
+
const connected = await pollUntilConnected(cfg, matchedProvider, workspaceId);
|
|
184
|
+
if (connected) {
|
|
185
|
+
waitSpinner.succeed(chalk.green(`Connected ${chalk.bold(String(connected.displayName ?? matchedProvider))}!`));
|
|
186
|
+
printUnlocked(connected.unlocked);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
waitSpinner.stop();
|
|
190
|
+
log.dim(`Didn't detect a connection yet — finish the browser flow, then run \`synap tools list\` to check status.`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
log.dim(`Once connected, records will import automatically. Run \`synap tools list\` to check status.`);
|
|
194
|
+
}
|
|
195
|
+
export async function toolsList(opts) {
|
|
196
|
+
// `cap list` is the one capability-first view.
|
|
197
|
+
log.dim(TOOLS_DEPRECATED);
|
|
198
|
+
await capabilityList({ json: opts.json, workspace: opts.workspace });
|
|
199
|
+
}
|
|
200
|
+
export async function toolsSync(provider, opts) {
|
|
201
|
+
log.dim(TOOLS_DEPRECATED);
|
|
202
|
+
let cfg;
|
|
203
|
+
try {
|
|
204
|
+
cfg = await resolveHubConfig();
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
log.error(err.message);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
211
|
+
try {
|
|
212
|
+
const providers = await fetchProviders(cfg, workspaceId);
|
|
213
|
+
const match = providers.find((p) => p.provider === provider || p.id === provider || p.displayName.toLowerCase() === provider.toLowerCase());
|
|
214
|
+
if (!match || !match.connected) {
|
|
215
|
+
log.error(`Provider ${chalk.bold(provider)} is not connected. Run: ${chalk.cyan(`synap cap connect ${provider}`)}`);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
renderHubError(err);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
// The old background-import "sync" (POST /connectors/actions, a Nango named
|
|
224
|
+
// action) was retired — self-hosted Nango doesn't run Actions, and the model
|
|
225
|
+
// moved to ON-DEMAND access: a connected service is reached live via its
|
|
226
|
+
// capability skills (e.g. gmail_search), not pre-imported on a schedule. There
|
|
227
|
+
// is nothing to trigger, so this command does nothing and must not claim
|
|
228
|
+
// otherwise.
|
|
229
|
+
log.warn(`\`synap tools sync\` does nothing and will be removed.`);
|
|
230
|
+
log.dim(`${provider} is connected. Connected services are queried on demand by your ` +
|
|
231
|
+
"agent's capabilities (e.g. search, list, send), not imported on a schedule — " +
|
|
232
|
+
"so there is no sync to trigger.");
|
|
233
|
+
log.dim(`See connection status: synap cap list`);
|
|
234
|
+
}
|
|
235
|
+
export async function toolsDisconnect(provider, opts) {
|
|
236
|
+
log.dim(TOOLS_DEPRECATED);
|
|
237
|
+
// `cap disconnect` resolves a capability name OR a raw provider id, so the
|
|
238
|
+
// provider ids this command has always taken keep resolving.
|
|
239
|
+
await capabilityDisconnect(provider, { workspace: opts.workspace, force: opts.force });
|
|
240
|
+
}
|
|
241
|
+
export async function toolsSchema(opts) {
|
|
242
|
+
let cfg;
|
|
243
|
+
try {
|
|
244
|
+
cfg = await resolveHubConfig();
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
log.error(err.message);
|
|
248
|
+
process.exit(1);
|
|
249
|
+
}
|
|
250
|
+
const spinner = opts.json ? null : ora({ text: "Fetching tool schema…", color: "cyan" }).start();
|
|
251
|
+
// The dedicated /connectors/schema route was retired; the provider catalog +
|
|
252
|
+
// connection status now comes from /connectors/providers (the same source the
|
|
253
|
+
// list command uses). Shape it into the { providers } envelope the markdown
|
|
254
|
+
// builder expects.
|
|
255
|
+
let schema;
|
|
256
|
+
try {
|
|
257
|
+
const providers = await fetchProviders(cfg);
|
|
258
|
+
schema = { providers };
|
|
259
|
+
spinner?.stop();
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
spinner?.fail(chalk.red("Failed to fetch tool schema"));
|
|
263
|
+
log.error(err.message);
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
if (opts.json) {
|
|
267
|
+
console.log(JSON.stringify(schema, null, 2));
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const s = schema;
|
|
271
|
+
const md = buildToolSchemaMarkdown(s, cfg.podUrl);
|
|
272
|
+
if (opts.writeContext !== undefined && opts.writeContext !== false) {
|
|
273
|
+
const outputPath = typeof opts.writeContext === "string" && opts.writeContext.length > 0
|
|
274
|
+
? opts.writeContext
|
|
275
|
+
: ".claude/TOOLS_CONTEXT.md";
|
|
276
|
+
const dir = outputPath.includes("/") ? outputPath.split("/").slice(0, -1).join("/") : ".";
|
|
277
|
+
if (dir && dir !== "." && !existsSync(dir)) {
|
|
278
|
+
mkdirSync(dir, { recursive: true });
|
|
279
|
+
}
|
|
280
|
+
writeFileSync(outputPath, md, "utf-8");
|
|
281
|
+
log.success(`Context written to ${chalk.underline(outputPath)} — Claude Code will auto-load this in all sessions from this directory`);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.log(md);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function buildToolSchemaMarkdown(schema, podUrl) {
|
|
288
|
+
const lines = [
|
|
289
|
+
`# Synap Tool Reference`,
|
|
290
|
+
``,
|
|
291
|
+
`> Fetched from pod: ${podUrl} — use this context to connect, manage, and query external service integrations.`,
|
|
292
|
+
``,
|
|
293
|
+
`## Supported Providers`,
|
|
294
|
+
];
|
|
295
|
+
const providers = (schema.providers ?? schema.supported ?? []);
|
|
296
|
+
if (providers.length > 0) {
|
|
297
|
+
for (const p of providers) {
|
|
298
|
+
lines.push(``, `### ${p.displayName ?? p.provider ?? p.id}`);
|
|
299
|
+
if (p.description)
|
|
300
|
+
lines.push(``, String(p.description));
|
|
301
|
+
if (p.actions) {
|
|
302
|
+
lines.push(``, `**Available actions:**`);
|
|
303
|
+
for (const action of p.actions) {
|
|
304
|
+
lines.push(`- \`${action}\``);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
lines.push(``, `Providers are configured in Nango. Common integrations include:`, `- Google Workspace (gmail, google-calendar, google-drive)`, `- GitHub (github)`, `- Notion (notion)`, `- Linear (linear)`, `- Slack (slack)`, `- HubSpot (hubspot)`);
|
|
311
|
+
}
|
|
312
|
+
lines.push(``, `## CLI Commands`, ``, `\`\`\`bash`, `# Connect a service (opens OAuth flow in browser)`, `synap cap connect [name]`, `synap cap connect "Nango — Google Workspace"`, ``, `# List all capabilities and connection status`, `synap tools list`, `synap tools list --json`, `synap cap list`, ``, `# Show one capability's detail (status, connection, verbs, next action)`, `synap cap show <name>`, ``, `# Turn on a capability (ensures its connection, then picks verbs)`, `synap cap enable [name]`, ``, `# Run a verb`, `synap cap run <verb>`, ``, `# Disconnect a provider`, `synap tools disconnect <provider>`, `synap tools disconnect google --force`, ``, `# Fetch this schema`, `synap tools schema`, `synap tools schema --write-context # writes to .claude/TOOLS_CONTEXT.md`, `\`\`\``, ``, `## Hub REST Endpoints`, ``, `| Method | Path | Description |`, `|--------|------|-------------|`, `| POST | /api/hub/connectors/connect | Resolve-or-start a connection (unified door) |`, `| GET | /api/hub/connectors/providers | List providers and connection status |`, `| POST | /api/hub/connectors/session | Start OAuth session, get redirectUrl |`, `| POST | /api/hub/connectors/disconnect | Disconnect a provider |`, `| POST | /api/hub/connectors/tool-execute | Run a provider call (proxied, governed) |`, ``, `## AI Usage Flow`, ``, `1. Check connected services: \`synap cap list\``, `2. Connect a new service: \`synap cap connect <name>\` — opens OAuth in browser`, `3. Connecting installs the service's capability skills (e.g. gmail_send, gmail_search)`, `4. The agent reaches the service ON DEMAND through those skills (no scheduled import)`, `5. Ask naturally: \`synap ask "any emails from Acme this week?"\``);
|
|
313
|
+
return lines.join("\n");
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap versions
|
|
3
|
+
* ===============
|
|
4
|
+
*
|
|
5
|
+
* Answers "what version of each Synap artifact is LOCAL vs NPM vs
|
|
6
|
+
* CONTROL-PLANE vs POD" in one glance — the question `market update` can't
|
|
7
|
+
* answer because it only looks at what's already installed on the active pod,
|
|
8
|
+
* not whether the CP itself is seeded from a stale npm version. That gap is
|
|
9
|
+
* exactly how a publish can silently fail to propagate (e.g. templates
|
|
10
|
+
* published to npm 0.6.4 while the CP is still seeded from 0.5.0).
|
|
11
|
+
*
|
|
12
|
+
* READ-ONLY: every network call here is a GET (or `npm view`, which never
|
|
13
|
+
* mutates the registry). No pod/CP mutation, no writes anywhere.
|
|
14
|
+
*
|
|
15
|
+
* Reuses rather than re-derives:
|
|
16
|
+
* - `bundledTemplatesVersion()` (lib/bundle-version.ts) for the LOCAL
|
|
17
|
+
* workspace-templates version.
|
|
18
|
+
* - `fetchInstalledTemplates()` (lib/installed.ts) for the POD stamp summary.
|
|
19
|
+
* - `computeTemplateUpdates`/`isHashVersion` (@synap-core/workspace-templates)
|
|
20
|
+
* for the actual semver comparison — the same comparator `market update`
|
|
21
|
+
* already uses. Comparing two bare version strings is done by feeding them
|
|
22
|
+
* through that door via `compareVersions()` below rather than
|
|
23
|
+
* hand-rolling a second semver parser.
|
|
24
|
+
*/
|
|
25
|
+
export declare function versions(opts?: {
|
|
26
|
+
json?: boolean;
|
|
27
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap versions
|
|
3
|
+
* ===============
|
|
4
|
+
*
|
|
5
|
+
* Answers "what version of each Synap artifact is LOCAL vs NPM vs
|
|
6
|
+
* CONTROL-PLANE vs POD" in one glance — the question `market update` can't
|
|
7
|
+
* answer because it only looks at what's already installed on the active pod,
|
|
8
|
+
* not whether the CP itself is seeded from a stale npm version. That gap is
|
|
9
|
+
* exactly how a publish can silently fail to propagate (e.g. templates
|
|
10
|
+
* published to npm 0.6.4 while the CP is still seeded from 0.5.0).
|
|
11
|
+
*
|
|
12
|
+
* READ-ONLY: every network call here is a GET (or `npm view`, which never
|
|
13
|
+
* mutates the registry). No pod/CP mutation, no writes anywhere.
|
|
14
|
+
*
|
|
15
|
+
* Reuses rather than re-derives:
|
|
16
|
+
* - `bundledTemplatesVersion()` (lib/bundle-version.ts) for the LOCAL
|
|
17
|
+
* workspace-templates version.
|
|
18
|
+
* - `fetchInstalledTemplates()` (lib/installed.ts) for the POD stamp summary.
|
|
19
|
+
* - `computeTemplateUpdates`/`isHashVersion` (@synap-core/workspace-templates)
|
|
20
|
+
* for the actual semver comparison — the same comparator `market update`
|
|
21
|
+
* already uses. Comparing two bare version strings is done by feeding them
|
|
22
|
+
* through that door via `compareVersions()` below rather than
|
|
23
|
+
* hand-rolling a second semver parser.
|
|
24
|
+
*/
|
|
25
|
+
import { execSync } from "node:child_process";
|
|
26
|
+
import { createRequire } from "node:module";
|
|
27
|
+
import path from "node:path";
|
|
28
|
+
import fs from "node:fs";
|
|
29
|
+
import chalk from "chalk";
|
|
30
|
+
import { computeTemplateUpdates, isHashVersion, } from "@synap-core/workspace-templates";
|
|
31
|
+
import { log, banner } from "../utils/logger.js";
|
|
32
|
+
import { bundledTemplatesVersion } from "../lib/bundle-version.js";
|
|
33
|
+
import { fetchInstalledTemplates } from "../lib/installed.js";
|
|
34
|
+
import { getCpUrl } from "../lib/auth.js";
|
|
35
|
+
import { getActivePodConfig } from "../lib/pod.js";
|
|
36
|
+
const FETCH_TIMEOUT_MS = 8000;
|
|
37
|
+
// ── version lookups ─────────────────────────────────────────────────────────
|
|
38
|
+
/** `npm view <pkg> version` — spawned, tolerant of being offline/unpublished. */
|
|
39
|
+
function npmViewVersion(pkgName) {
|
|
40
|
+
try {
|
|
41
|
+
const out = execSync(`npm view ${pkgName} version`, {
|
|
42
|
+
encoding: "utf-8",
|
|
43
|
+
timeout: 10_000,
|
|
44
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
45
|
+
}).trim();
|
|
46
|
+
return out || undefined;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Best-effort resolve of an installed package's own version, mirroring `bundledTemplatesVersion()`'s walk-up-to-package.json approach for any package name. */
|
|
53
|
+
function resolvedLocalVersion(pkgName) {
|
|
54
|
+
try {
|
|
55
|
+
const req = createRequire(import.meta.url);
|
|
56
|
+
let dir = path.dirname(req.resolve(pkgName));
|
|
57
|
+
for (let i = 0; i < 6; i++) {
|
|
58
|
+
const pj = path.join(dir, "package.json");
|
|
59
|
+
if (fs.existsSync(pj)) {
|
|
60
|
+
const parsed = JSON.parse(fs.readFileSync(pj, "utf8"));
|
|
61
|
+
if (parsed.name === pkgName)
|
|
62
|
+
return parsed.version ?? undefined;
|
|
63
|
+
}
|
|
64
|
+
const parent = path.dirname(dir);
|
|
65
|
+
if (parent === dir)
|
|
66
|
+
break;
|
|
67
|
+
dir = parent;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
/* not resolvable from this CLI — expected for packages the CLI doesn't depend on */
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* GET {CP}/api/packages/:slug — the CP's own copy of a published package,
|
|
77
|
+
* whose `definition.sourcePackage.version` is the npm version the CP last
|
|
78
|
+
* seeded from (see `packages.ts` publish flow). Tries a short list of known
|
|
79
|
+
* bundled slugs so a CP with one renamed/missing package doesn't blank the
|
|
80
|
+
* whole row.
|
|
81
|
+
*/
|
|
82
|
+
async function fetchCpSeededVersion() {
|
|
83
|
+
const candidates = ["foundation", "ecosystem", "operations", "crm"];
|
|
84
|
+
for (const slug of candidates) {
|
|
85
|
+
try {
|
|
86
|
+
const res = await fetch(`${getCpUrl()}/api/packages/${encodeURIComponent(slug)}`, {
|
|
87
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
88
|
+
});
|
|
89
|
+
if (!res.ok)
|
|
90
|
+
continue;
|
|
91
|
+
const data = (await res.json());
|
|
92
|
+
const version = data.package?.definition?.sourcePackage?.version;
|
|
93
|
+
if (version)
|
|
94
|
+
return { slug, version };
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
/* try next candidate */
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
/** GET {pod}/health — non-fatal on any failure (pod unreachable, older build). */
|
|
103
|
+
async function fetchPodHealth(podUrl) {
|
|
104
|
+
try {
|
|
105
|
+
const res = await fetch(`${podUrl}/health`, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
|
|
106
|
+
if (!res.ok)
|
|
107
|
+
return undefined;
|
|
108
|
+
return (await res.json());
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** GET {CP}/api/marketplace/capabilities — public, no auth. */
|
|
115
|
+
async function fetchCapabilitiesCatalog() {
|
|
116
|
+
try {
|
|
117
|
+
const res = await fetch(`${getCpUrl()}/api/marketplace/capabilities`, {
|
|
118
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
119
|
+
});
|
|
120
|
+
if (!res.ok)
|
|
121
|
+
return undefined;
|
|
122
|
+
const data = (await res.json());
|
|
123
|
+
const rows = data.capabilities ?? [];
|
|
124
|
+
const hashVersioned = rows.filter((r) => isHashVersion(r.version)).length;
|
|
125
|
+
return { total: rows.length, hashVersioned, semverVersioned: rows.length - hashVersioned };
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── comparison (reused, not re-derived) ─────────────────────────────────────
|
|
132
|
+
/**
|
|
133
|
+
* Is `to` strictly newer than `from`? Routed through the shared
|
|
134
|
+
* `computeTemplateUpdates` comparator (`@synap-core/workspace-templates`) —
|
|
135
|
+
* the same one `market update` uses — instead of a second semver parser.
|
|
136
|
+
* Returns `undefined` when either side is unknown (nothing to compare).
|
|
137
|
+
*/
|
|
138
|
+
function isNewer(from, to) {
|
|
139
|
+
if (!from || !to)
|
|
140
|
+
return undefined;
|
|
141
|
+
const entry = {
|
|
142
|
+
slug: "__cmp__",
|
|
143
|
+
name: "cmp",
|
|
144
|
+
tags: [],
|
|
145
|
+
isPrivate: false,
|
|
146
|
+
source: "remote",
|
|
147
|
+
remote: { slug: "__cmp__", name: "cmp", definition: { sourcePackage: { version: to } } },
|
|
148
|
+
};
|
|
149
|
+
const [check] = computeTemplateUpdates([{ slug: "__cmp__", version: from }], [entry]);
|
|
150
|
+
return check.updateAvailable;
|
|
151
|
+
}
|
|
152
|
+
// ── row rendering ───────────────────────────────────────────────────────────
|
|
153
|
+
const DASH = chalk.dim("—");
|
|
154
|
+
function fmt(v) {
|
|
155
|
+
return v ? v : DASH;
|
|
156
|
+
}
|
|
157
|
+
function printRow(label, value) {
|
|
158
|
+
console.log(` ${chalk.dim(label.padEnd(16))} ${value}`);
|
|
159
|
+
}
|
|
160
|
+
function printVerdict(d) {
|
|
161
|
+
if (d.inSync) {
|
|
162
|
+
log.success(d.message);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
log.warn(d.message);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function checkWorkspaceTemplates() {
|
|
169
|
+
const local = bundledTemplatesVersion() || undefined;
|
|
170
|
+
const npm = npmViewVersion("@synap-core/workspace-templates");
|
|
171
|
+
const [cpInfo, installed] = await Promise.all([
|
|
172
|
+
fetchCpSeededVersion(),
|
|
173
|
+
fetchInstalledTemplates(),
|
|
174
|
+
]);
|
|
175
|
+
const stamped = installed.filter((t) => t.version);
|
|
176
|
+
const pod = installed.length > 0
|
|
177
|
+
? `${stamped.length}/${installed.length} stamped`
|
|
178
|
+
: undefined;
|
|
179
|
+
const cpBehindNpm = isNewer(cpInfo?.version, npm);
|
|
180
|
+
const localBehindNpm = isNewer(local, npm);
|
|
181
|
+
let drift;
|
|
182
|
+
if (!npm) {
|
|
183
|
+
drift = { inSync: false, message: "? npm unreachable — cannot verify drift" };
|
|
184
|
+
}
|
|
185
|
+
else if (cpBehindNpm) {
|
|
186
|
+
drift = {
|
|
187
|
+
inSync: false,
|
|
188
|
+
message: `CP is behind npm (seeded ${cpInfo?.version}, latest ${npm}) — redeploy CP to propagate`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
else if (cpInfo === undefined) {
|
|
192
|
+
drift = { inSync: false, message: "? CP has no known template package — cannot verify CP drift" };
|
|
193
|
+
}
|
|
194
|
+
else if (localBehindNpm) {
|
|
195
|
+
drift = {
|
|
196
|
+
inSync: false,
|
|
197
|
+
message: `Local CLI bundle is behind npm (local ${local}, latest ${npm}) — update @synap-core/workspace-templates`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
drift = { inSync: true, message: "in sync" };
|
|
202
|
+
}
|
|
203
|
+
return { name: "workspace-templates", local, npm, cp: cpInfo?.version, cpSlug: cpInfo?.slug, pod, drift };
|
|
204
|
+
}
|
|
205
|
+
async function checkApiTypes(podUrl) {
|
|
206
|
+
const local = resolvedLocalVersion("@synap-core/api-types");
|
|
207
|
+
const npm = npmViewVersion("@synap-core/api-types");
|
|
208
|
+
const health = podUrl ? await fetchPodHealth(podUrl) : undefined;
|
|
209
|
+
const pod = health?.apiTypesVersion;
|
|
210
|
+
const podBehindNpm = isNewer(pod, npm);
|
|
211
|
+
let drift;
|
|
212
|
+
if (!npm) {
|
|
213
|
+
drift = { inSync: false, message: "? npm unreachable — cannot verify drift" };
|
|
214
|
+
}
|
|
215
|
+
else if (!pod) {
|
|
216
|
+
drift = { inSync: false, message: podUrl ? "? pod unreachable/older build — no apiTypesVersion reported" : "? no pod connected" };
|
|
217
|
+
}
|
|
218
|
+
else if (podBehindNpm) {
|
|
219
|
+
drift = {
|
|
220
|
+
inSync: false,
|
|
221
|
+
message: `Pod is behind npm (pod reports ${pod}, latest ${npm}) — bump the apiTypesVersion literal in synap-backend and redeploy`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
drift = { inSync: true, message: "in sync" };
|
|
226
|
+
}
|
|
227
|
+
return { name: "api-types", local, npm, pod, drift };
|
|
228
|
+
}
|
|
229
|
+
async function checkCapabilities() {
|
|
230
|
+
const cat = await fetchCapabilitiesCatalog();
|
|
231
|
+
const cp = cat
|
|
232
|
+
? `${cat.total} published${cat.hashVersioned > 0 ? ` (${cat.hashVersioned} hash-versioned, ${cat.semverVersioned} semver)` : ""}`
|
|
233
|
+
: undefined;
|
|
234
|
+
const pod = "n/a, see synap status";
|
|
235
|
+
const drift = cat
|
|
236
|
+
? { inSync: true, message: cat.total > 0 ? `${cat.total} capabilities published to CP` : "no capabilities published" }
|
|
237
|
+
: { inSync: false, message: "? CP capability catalog unreachable" };
|
|
238
|
+
return { name: "capabilities", cp, pod, drift };
|
|
239
|
+
}
|
|
240
|
+
// ── entrypoint ───────────────────────────────────────────────────────────────
|
|
241
|
+
export async function versions(opts = {}) {
|
|
242
|
+
const localConfig = getActivePodConfig();
|
|
243
|
+
const podUrl = localConfig?.podUrl ?? process.env.SYNAP_POD_URL;
|
|
244
|
+
const [wt, at, cap] = await Promise.all([
|
|
245
|
+
checkWorkspaceTemplates(),
|
|
246
|
+
checkApiTypes(podUrl),
|
|
247
|
+
checkCapabilities(),
|
|
248
|
+
]);
|
|
249
|
+
if (opts.json) {
|
|
250
|
+
const artifacts = [
|
|
251
|
+
{ name: wt.name, local: wt.local ?? null, npm: wt.npm ?? null, cp: wt.cp ?? null, pod: wt.pod ?? null, drift: wt.drift },
|
|
252
|
+
{ name: at.name, local: at.local ?? null, npm: at.npm ?? null, cp: null, pod: at.pod ?? null, drift: at.drift },
|
|
253
|
+
{ name: cap.name, local: null, npm: null, cp: cap.cp ?? null, pod: cap.pod ?? null, drift: cap.drift },
|
|
254
|
+
];
|
|
255
|
+
process.stdout.write(JSON.stringify({ artifacts }, null, 2) + "\n");
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
banner();
|
|
259
|
+
log.dim("Version status across LOCAL / NPM / CONTROL-PLANE / POD for each Synap artifact.");
|
|
260
|
+
log.heading("workspace-templates");
|
|
261
|
+
printRow("LOCAL", fmt(wt.local));
|
|
262
|
+
printRow("NPM", fmt(wt.npm));
|
|
263
|
+
printRow("CP", wt.cp ? `${wt.cp}${wt.cpSlug ? chalk.dim(` (seeded via "${wt.cpSlug}")`) : ""}` : DASH);
|
|
264
|
+
printRow("POD", fmt(wt.pod));
|
|
265
|
+
printVerdict(wt.drift);
|
|
266
|
+
log.heading("api-types");
|
|
267
|
+
printRow("LOCAL", at.local ? at.local : chalk.dim("not installed in this CLI"));
|
|
268
|
+
printRow("NPM", fmt(at.npm));
|
|
269
|
+
printRow("POD", fmt(at.pod));
|
|
270
|
+
printVerdict(at.drift);
|
|
271
|
+
log.heading("capabilities");
|
|
272
|
+
printRow("CP", fmt(cap.cp));
|
|
273
|
+
printRow("POD", chalk.dim(cap.pod ?? ""));
|
|
274
|
+
printVerdict(cap.drift);
|
|
275
|
+
log.blank();
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"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"}
|