@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,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap import — "capture, but for files and URLs".
|
|
3
|
+
*
|
|
4
|
+
* Routes EVERY input (local file, folder, or http(s) URL) through the SAME AI
|
|
5
|
+
* capture centerpiece as free-text `capture`:
|
|
6
|
+
* POST /capture/structure (AI entity extraction + workspace/project routing)
|
|
7
|
+
* POST /capture/execute (materialize the chosen proposals + relations)
|
|
8
|
+
*
|
|
9
|
+
* One item per file/url. This inherits AI entity extraction, the relation graph,
|
|
10
|
+
* workspace routing AND project routing for free — no separate /import/* path.
|
|
11
|
+
*
|
|
12
|
+
* Inputs:
|
|
13
|
+
* - http(s) URL → sent as `url`
|
|
14
|
+
* - directory → recursively globbed (skips node_modules/.git/dotfiles)
|
|
15
|
+
* - file → text-like → utf8, everything else → base64
|
|
16
|
+
*
|
|
17
|
+
* Routing: --workspace / --project override the AI's suggestion; otherwise the
|
|
18
|
+
* AI-proposed targetWorkspaceId / targetProjectId from /capture/structure win.
|
|
19
|
+
*/
|
|
20
|
+
import chalk from "chalk";
|
|
21
|
+
import { readFileSync, statSync, readdirSync, existsSync } from "node:fs";
|
|
22
|
+
import { extname, basename, join } from "node:path";
|
|
23
|
+
import * as readline from "node:readline/promises";
|
|
24
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
25
|
+
import { log } from "../utils/logger.js";
|
|
26
|
+
import { resolveHubConfig, resolveUserId, hubGet, hubPost, readActiveSessionId, renderHubError, } from "../lib/hub-client.js";
|
|
27
|
+
import { unwrapList } from "../lib/unwrapList.js";
|
|
28
|
+
import { formatLaneLine, resolveWorkspaceName } from "../lib/capture-lane.js";
|
|
29
|
+
// ─── input classification ─────────────────────────────────────────────────────
|
|
30
|
+
const TEXT_LIKE = new Set([".md", ".markdown", ".txt", ".csv", ".json", ".html", ".htm"]);
|
|
31
|
+
const MIME = {
|
|
32
|
+
".md": "text/markdown",
|
|
33
|
+
".markdown": "text/markdown",
|
|
34
|
+
".txt": "text/plain",
|
|
35
|
+
".csv": "text/csv",
|
|
36
|
+
".json": "application/json",
|
|
37
|
+
".html": "text/html",
|
|
38
|
+
".htm": "text/html",
|
|
39
|
+
".pdf": "application/pdf",
|
|
40
|
+
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
41
|
+
".doc": "application/msword",
|
|
42
|
+
".png": "image/png",
|
|
43
|
+
".jpg": "image/jpeg",
|
|
44
|
+
".jpeg": "image/jpeg",
|
|
45
|
+
".webp": "image/webp",
|
|
46
|
+
".gif": "image/gif",
|
|
47
|
+
".svg": "image/svg+xml",
|
|
48
|
+
".mp3": "audio/mpeg",
|
|
49
|
+
".wav": "audio/wav",
|
|
50
|
+
".m4a": "audio/mp4",
|
|
51
|
+
".ogg": "audio/ogg",
|
|
52
|
+
".mp4": "video/mp4",
|
|
53
|
+
".mov": "video/quicktime",
|
|
54
|
+
};
|
|
55
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
56
|
+
const URL_RE = /^https?:\/\//i;
|
|
57
|
+
/** Cap on files pulled from a single directory — log + truncate, never silently drop. */
|
|
58
|
+
const DIR_FILE_CAP = 200;
|
|
59
|
+
function mimeFor(path) {
|
|
60
|
+
return MIME[extname(path).toLowerCase()] ?? "application/octet-stream";
|
|
61
|
+
}
|
|
62
|
+
/** Read a single file into an ImportItem (utf8 for text-like, base64 otherwise). */
|
|
63
|
+
function fileToItem(path) {
|
|
64
|
+
const ext = extname(path).toLowerCase();
|
|
65
|
+
const filename = basename(path);
|
|
66
|
+
const mimeType = mimeFor(path);
|
|
67
|
+
if (TEXT_LIKE.has(ext)) {
|
|
68
|
+
return {
|
|
69
|
+
kind: "file",
|
|
70
|
+
label: path,
|
|
71
|
+
file: { content: readFileSync(path, "utf8"), mimeType, filename, encoding: "utf8" },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
kind: "file",
|
|
76
|
+
label: path,
|
|
77
|
+
file: { content: readFileSync(path).toString("base64"), mimeType, filename, encoding: "base64" },
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Recursively collect files under a directory, skipping node_modules/.git/dotfiles. */
|
|
81
|
+
function walkDir(dir, acc) {
|
|
82
|
+
if (acc.length >= DIR_FILE_CAP)
|
|
83
|
+
return;
|
|
84
|
+
let entries = [];
|
|
85
|
+
try {
|
|
86
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
for (const e of entries) {
|
|
92
|
+
if (acc.length >= DIR_FILE_CAP)
|
|
93
|
+
return;
|
|
94
|
+
if (e.name.startsWith("."))
|
|
95
|
+
continue; // dotfiles + dot-dirs (.git, .env, …)
|
|
96
|
+
if (e.name === "node_modules")
|
|
97
|
+
continue;
|
|
98
|
+
const full = join(dir, e.name);
|
|
99
|
+
if (e.isDirectory()) {
|
|
100
|
+
walkDir(full, acc);
|
|
101
|
+
}
|
|
102
|
+
else if (e.isFile()) {
|
|
103
|
+
acc.push(full);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Expand the raw CLI inputs into a flat list of import items. Returns the items
|
|
109
|
+
* plus any per-input failures (missing paths) and a `truncated` flag if a
|
|
110
|
+
* directory exceeded DIR_FILE_CAP.
|
|
111
|
+
*/
|
|
112
|
+
function expandInputs(inputs) {
|
|
113
|
+
const items = [];
|
|
114
|
+
const failures = [];
|
|
115
|
+
let truncated = false;
|
|
116
|
+
for (const raw of inputs) {
|
|
117
|
+
if (URL_RE.test(raw)) {
|
|
118
|
+
items.push({ kind: "url", label: raw, url: raw });
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (!existsSync(raw)) {
|
|
122
|
+
failures.push({ label: raw, error: "no such file, directory, or URL" });
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
let st;
|
|
126
|
+
try {
|
|
127
|
+
st = statSync(raw);
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
failures.push({ label: raw, error: e.message });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (st.isDirectory()) {
|
|
134
|
+
const files = [];
|
|
135
|
+
walkDir(raw, files);
|
|
136
|
+
if (files.length >= DIR_FILE_CAP)
|
|
137
|
+
truncated = true;
|
|
138
|
+
for (const f of files) {
|
|
139
|
+
try {
|
|
140
|
+
items.push(fileToItem(f));
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
failures.push({ label: f, error: e.message });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
try {
|
|
149
|
+
items.push(fileToItem(raw));
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
failures.push({ label: raw, error: e.message });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { items, failures, truncated };
|
|
157
|
+
}
|
|
158
|
+
// ─── workspace / project name → id resolution ─────────────────────────────────
|
|
159
|
+
/** Resolve a --workspace value (id or name) to a workspace id. Throws if unknown. */
|
|
160
|
+
async function resolveWorkspaceArg(value, cfg) {
|
|
161
|
+
if (UUID_RE.test(value))
|
|
162
|
+
return value;
|
|
163
|
+
const res = (await hubGet("/workspaces", {}, cfg));
|
|
164
|
+
const list = unwrapList(res, ["workspaces"]);
|
|
165
|
+
const match = list.find((w) => String(w.name ?? "").toLowerCase() === value.toLowerCase());
|
|
166
|
+
if (!match) {
|
|
167
|
+
const names = list.map((w) => String(w.name ?? w.id)).join(", ");
|
|
168
|
+
throw new Error(`Workspace '${value}' not found.${names ? ` Available: ${names}` : ""}`);
|
|
169
|
+
}
|
|
170
|
+
return String(match.id);
|
|
171
|
+
}
|
|
172
|
+
/** Resolve a --project value (id or name) to a project id. Throws if unknown. */
|
|
173
|
+
async function resolveProjectArg(value, cfg) {
|
|
174
|
+
if (UUID_RE.test(value))
|
|
175
|
+
return value;
|
|
176
|
+
// GET /projects returns a raw array (no envelope).
|
|
177
|
+
const res = (await hubGet("/projects", {}, cfg));
|
|
178
|
+
const list = unwrapList(res, ["projects"]);
|
|
179
|
+
const match = list.find((p) => String(p.name ?? "").toLowerCase() === value.toLowerCase());
|
|
180
|
+
if (!match) {
|
|
181
|
+
const names = list.map((p) => String(p.name ?? p.id)).join(", ");
|
|
182
|
+
throw new Error(`Project '${value}' not found.${names ? ` Available: ${names}` : ""}`);
|
|
183
|
+
}
|
|
184
|
+
return String(match.id);
|
|
185
|
+
}
|
|
186
|
+
// ─── rendering ─────────────────────────────────────────────────────────────────
|
|
187
|
+
function renderProposals(result) {
|
|
188
|
+
const proposals = result.proposals ?? [];
|
|
189
|
+
if (result.degraded) {
|
|
190
|
+
log.warn("AI structuring degraded — this source may not be fully extractable server-side.");
|
|
191
|
+
}
|
|
192
|
+
if (proposals.length === 0) {
|
|
193
|
+
log.dim("No entity proposals extracted.");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
log.heading("Proposed entities");
|
|
197
|
+
const typeW = Math.min(18, Math.max(6, ...proposals.map((p) => p.profileSlug.length)));
|
|
198
|
+
const titleW = Math.min(48, Math.max(10, ...proposals.map((p) => p.title.length)));
|
|
199
|
+
console.log(" " +
|
|
200
|
+
[chalk.bold("#".padEnd(3)), chalk.bold("Type".padEnd(typeW)), chalk.bold("Title".padEnd(titleW))].join(" "));
|
|
201
|
+
console.log(" " + chalk.dim("-".repeat(3 + 2 + typeW + 2 + titleW)));
|
|
202
|
+
for (let i = 0; i < proposals.length; i++) {
|
|
203
|
+
const p = proposals[i];
|
|
204
|
+
console.log(" " +
|
|
205
|
+
[
|
|
206
|
+
chalk.dim(String(i + 1).padEnd(3)),
|
|
207
|
+
chalk.cyan(p.profileSlug.slice(0, typeW).padEnd(typeW)),
|
|
208
|
+
p.title.slice(0, titleW).padEnd(titleW),
|
|
209
|
+
].join(" "));
|
|
210
|
+
if (p.description)
|
|
211
|
+
log.dim(` ${p.description.slice(0, 80)}`);
|
|
212
|
+
}
|
|
213
|
+
const rels = result.relations ?? [];
|
|
214
|
+
if (rels.length > 0) {
|
|
215
|
+
log.blank();
|
|
216
|
+
log.dim(` ${rels.length} relation${rels.length !== 1 ? "s" : ""} will be created.`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function pct(c) {
|
|
220
|
+
return typeof c === "number" ? ` (${Math.round(c * 100)}%)` : "";
|
|
221
|
+
}
|
|
222
|
+
/** Print the AI's proposed workspace/project routing for this item. */
|
|
223
|
+
function renderRouting(result, wsOverride, projOverride) {
|
|
224
|
+
const ws = wsOverride ?? result.targetWorkspaceId ?? null;
|
|
225
|
+
const proj = projOverride ?? result.targetProjectId ?? null;
|
|
226
|
+
const wsSrc = wsOverride ? " (override)" : pct(result.targetWorkspaceConfidence);
|
|
227
|
+
const projSrc = projOverride ? " (override)" : pct(result.targetProjectConfidence);
|
|
228
|
+
log.dim(` → workspace: ${ws ?? "pod-wide / unclear"}${wsSrc}`);
|
|
229
|
+
if (result.targetWorkspaceReason && !wsOverride)
|
|
230
|
+
log.dim(` ${result.targetWorkspaceReason.slice(0, 90)}`);
|
|
231
|
+
log.dim(` → project: ${proj ?? "none / unclear"}${projSrc}`);
|
|
232
|
+
if (result.targetProjectReason && !projOverride)
|
|
233
|
+
log.dim(` ${result.targetProjectReason.slice(0, 90)}`);
|
|
234
|
+
}
|
|
235
|
+
async function processItem(item, opts, cfg, userId, wsOverride, projOverride, sessionId, rl) {
|
|
236
|
+
// 1. Structure — workspace hint = override ?? active (the AI may still re-route).
|
|
237
|
+
const structureBody = {
|
|
238
|
+
userId,
|
|
239
|
+
...(wsOverride ?? cfg.workspaceId ? { workspaceId: wsOverride ?? cfg.workspaceId } : {}),
|
|
240
|
+
...(sessionId ? { sessionId } : {}),
|
|
241
|
+
};
|
|
242
|
+
if (item.kind === "url")
|
|
243
|
+
structureBody.url = item.url;
|
|
244
|
+
else
|
|
245
|
+
structureBody.file = item.file;
|
|
246
|
+
// File extraction (PDF/audio/image) runs through the IS extractor and is slow —
|
|
247
|
+
// give structure a generous timeout (capture's free-text path is fast).
|
|
248
|
+
const structureRes = (await hubPost("/capture/structure", structureBody, cfg, 120_000));
|
|
249
|
+
const wsTarget = wsOverride ?? structureRes.targetWorkspaceId ?? cfg.workspaceId ?? null;
|
|
250
|
+
const projTarget = projOverride ?? structureRes.targetProjectId ?? null;
|
|
251
|
+
const proposals = structureRes.proposals ?? [];
|
|
252
|
+
if (!opts.json) {
|
|
253
|
+
log.heading(`▸ ${item.label}`);
|
|
254
|
+
renderProposals(structureRes);
|
|
255
|
+
renderRouting(structureRes, wsOverride, projOverride);
|
|
256
|
+
}
|
|
257
|
+
if (proposals.length === 0) {
|
|
258
|
+
return { label: item.label, status: "empty", workspaceId: wsTarget, projectId: projTarget };
|
|
259
|
+
}
|
|
260
|
+
if (opts.dryRun) {
|
|
261
|
+
return {
|
|
262
|
+
label: item.label,
|
|
263
|
+
status: "dry-run",
|
|
264
|
+
entities: proposals.length,
|
|
265
|
+
relations: (structureRes.relations ?? []).length,
|
|
266
|
+
workspaceId: wsTarget,
|
|
267
|
+
projectId: projTarget,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// 2. Confirm (skipped with --yes or in --json mode).
|
|
271
|
+
let confirmed = Boolean(opts.yes);
|
|
272
|
+
if (!confirmed && !opts.json && rl) {
|
|
273
|
+
const answer = await rl.question(chalk.bold(` Create ${proposals.length} entr${proposals.length !== 1 ? "ies" : "y"} from this item? [y/N] `));
|
|
274
|
+
confirmed = answer.trim().toLowerCase() === "y";
|
|
275
|
+
}
|
|
276
|
+
if (!confirmed) {
|
|
277
|
+
if (!opts.json)
|
|
278
|
+
log.dim(" Skipped.");
|
|
279
|
+
return { label: item.label, status: "skipped", workspaceId: wsTarget, projectId: projTarget };
|
|
280
|
+
}
|
|
281
|
+
// 3. Execute — route to the resolved workspace/project.
|
|
282
|
+
// An explicit --workspace override is a deliberate pin: send it as-is, no
|
|
283
|
+
// AI routing hints. Otherwise stop pre-resolving the target client-side —
|
|
284
|
+
// forward the ambient workspace + the AI's routing signal and let the
|
|
285
|
+
// backend decide (auto = AI target wins over ambient when confidence is
|
|
286
|
+
// high enough AND the user is a member).
|
|
287
|
+
// NOTE: the hub REST /capture/execute door currently forwards only
|
|
288
|
+
// workspaceId (not projectId) to the tRPC caller; projectId is sent for
|
|
289
|
+
// forward-compatibility but is not yet applied server-side via this door.
|
|
290
|
+
const executeBody = {
|
|
291
|
+
userId,
|
|
292
|
+
...(wsOverride
|
|
293
|
+
? { workspaceId: wsOverride }
|
|
294
|
+
: {
|
|
295
|
+
...(cfg.workspaceId ? { workspaceId: cfg.workspaceId } : {}),
|
|
296
|
+
workspaceRouting: "auto",
|
|
297
|
+
aiWorkspaceId: structureRes.targetWorkspaceId,
|
|
298
|
+
aiWorkspaceConfidence: structureRes.targetWorkspaceConfidence,
|
|
299
|
+
aiWorkspaceReason: structureRes.targetWorkspaceReason,
|
|
300
|
+
}),
|
|
301
|
+
...(projTarget ? { projectId: projTarget } : {}),
|
|
302
|
+
...(sessionId ? { sessionId } : {}),
|
|
303
|
+
entities: proposals,
|
|
304
|
+
relations: structureRes.relations ?? [],
|
|
305
|
+
};
|
|
306
|
+
const executeRes = (await hubPost("/capture/execute", executeBody, cfg, 60_000));
|
|
307
|
+
const created = Array.isArray(executeRes.created) ? executeRes.created : [];
|
|
308
|
+
const entityCount = created.filter((c) => !c.linked).length || created.length;
|
|
309
|
+
const relCount = Array.isArray(executeRes.relations) ? executeRes.relations.length : 0;
|
|
310
|
+
// Final resting workspace: the backend may have moved it (auto routing);
|
|
311
|
+
// otherwise fall back to the pre-execute guess.
|
|
312
|
+
const finalWorkspaceId = executeRes.movedToWorkspace ?? wsTarget;
|
|
313
|
+
if (!opts.json) {
|
|
314
|
+
const report = {
|
|
315
|
+
lane: "work",
|
|
316
|
+
workspaceId: finalWorkspaceId ?? undefined,
|
|
317
|
+
workspaceName: finalWorkspaceId ? await resolveWorkspaceName(finalWorkspaceId, cfg) : "pod-wide",
|
|
318
|
+
governance: "auto",
|
|
319
|
+
};
|
|
320
|
+
log.success(` ${entityCount} entit${entityCount !== 1 ? "ies" : "y"} created${relCount ? `, ${relCount} relation${relCount !== 1 ? "s" : ""}` : ""}`);
|
|
321
|
+
console.log(" " + formatLaneLine(report) + (projTarget ? chalk.dim(` [project ${projTarget.slice(0, 8)}]`) : ""));
|
|
322
|
+
if (executeRes.movedToWorkspace) {
|
|
323
|
+
log.dim(` → filed into workspace ${executeRes.movedToWorkspace}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
label: item.label,
|
|
328
|
+
status: "stored",
|
|
329
|
+
entities: entityCount,
|
|
330
|
+
relations: relCount,
|
|
331
|
+
workspaceId: finalWorkspaceId,
|
|
332
|
+
projectId: projTarget,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
// ─── command entrypoint ─────────────────────────────────────────────────────────
|
|
336
|
+
export async function importData(inputs, opts) {
|
|
337
|
+
try {
|
|
338
|
+
if (!inputs || inputs.length === 0) {
|
|
339
|
+
console.error(chalk.red("Nothing to import. Pass one or more files, folders, or URLs."));
|
|
340
|
+
console.error(chalk.dim(" e.g. synap import ./notes.md ./docs/ https://example.com/article"));
|
|
341
|
+
console.error(chalk.dim(" e.g. synap import ~/Documents/superwhisper/recordings --source superwhisper --store-first --yes --limit 10"));
|
|
342
|
+
process.exit(1);
|
|
343
|
+
}
|
|
344
|
+
// Superwhisper store-first: pair meta+wav → pod-wide notes (no AI structure on audio).
|
|
345
|
+
if (opts.source === "superwhisper" ||
|
|
346
|
+
(opts.storeFirst && opts.source === "superwhisper")) {
|
|
347
|
+
const { importSuperwhisperStoreFirst } = await import("../lib/superwhisper-import.js");
|
|
348
|
+
await importSuperwhisperStoreFirst(inputs, {
|
|
349
|
+
dryRun: opts.dryRun,
|
|
350
|
+
yes: opts.yes,
|
|
351
|
+
json: opts.json,
|
|
352
|
+
withAudio: opts.withAudio,
|
|
353
|
+
limit: opts.limit,
|
|
354
|
+
concurrency: opts.concurrency,
|
|
355
|
+
resume: opts.resume,
|
|
356
|
+
podUrl: opts.podUrl,
|
|
357
|
+
apiKey: opts.apiKey,
|
|
358
|
+
});
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
if (opts.storeFirst && opts.source && opts.source !== "superwhisper") {
|
|
362
|
+
console.error(chalk.red(`--store-first is only implemented for --source superwhisper (got ${opts.source})`));
|
|
363
|
+
process.exit(1);
|
|
364
|
+
}
|
|
365
|
+
const cfg = await resolveHubConfig(opts);
|
|
366
|
+
const userId = await resolveUserId(cfg);
|
|
367
|
+
// Resolve routing overrides (id or name) up front so a bad value fails fast.
|
|
368
|
+
const wsOverride = opts.workspace ? await resolveWorkspaceArg(opts.workspace, cfg) : undefined;
|
|
369
|
+
const projOverride = opts.project ? await resolveProjectArg(opts.project, cfg) : undefined;
|
|
370
|
+
const sessionId = opts.session ? readActiveSessionId() : undefined;
|
|
371
|
+
const { items, failures, truncated } = expandInputs(inputs);
|
|
372
|
+
if (truncated && !opts.json) {
|
|
373
|
+
log.warn(`A directory exceeded ${DIR_FILE_CAP} files — only the first ${DIR_FILE_CAP} were taken. Narrow the path or split the import.`);
|
|
374
|
+
}
|
|
375
|
+
if (items.length === 0) {
|
|
376
|
+
if (opts.json) {
|
|
377
|
+
console.log(JSON.stringify({ imported: [], failures, truncated }, null, 2));
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
log.warn("No importable items found.");
|
|
381
|
+
for (const f of failures)
|
|
382
|
+
log.dim(` ✗ ${f.label}: ${f.error}`);
|
|
383
|
+
}
|
|
384
|
+
process.exit(failures.length > 0 ? 1 : 0);
|
|
385
|
+
}
|
|
386
|
+
if (!opts.json) {
|
|
387
|
+
log.info(`Importing ${items.length} item${items.length !== 1 ? "s" : ""}${opts.dryRun ? " (dry run)" : ""}…`);
|
|
388
|
+
}
|
|
389
|
+
const outcomes = [];
|
|
390
|
+
// One shared readline for all interactive confirmations (human, non-json).
|
|
391
|
+
const interactive = !opts.json && !opts.dryRun && !opts.yes;
|
|
392
|
+
const rl = interactive ? readline.createInterface({ input, output }) : undefined;
|
|
393
|
+
try {
|
|
394
|
+
for (const item of items) {
|
|
395
|
+
try {
|
|
396
|
+
outcomes.push(await processItem(item, opts, cfg, userId, wsOverride, projOverride, sessionId, rl));
|
|
397
|
+
}
|
|
398
|
+
catch (e) {
|
|
399
|
+
// Never abort the whole run on one bad item — collect + continue.
|
|
400
|
+
const error = e.message;
|
|
401
|
+
if (!opts.json)
|
|
402
|
+
log.error(` ${item.label}: ${error}`);
|
|
403
|
+
outcomes.push({ label: item.label, status: "failed", error });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
finally {
|
|
408
|
+
rl?.close();
|
|
409
|
+
}
|
|
410
|
+
// Fold read-time failures (missing paths) into the outcome list.
|
|
411
|
+
for (const f of failures)
|
|
412
|
+
outcomes.push({ label: f.label, status: "failed", error: f.error });
|
|
413
|
+
if (opts.json) {
|
|
414
|
+
console.log(JSON.stringify({ imported: outcomes, truncated }, null, 2));
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
const stored = outcomes.filter((o) => o.status === "stored");
|
|
418
|
+
const totalEntities = stored.reduce((n, o) => n + (o.entities ?? 0), 0);
|
|
419
|
+
const failed = outcomes.filter((o) => o.status === "failed");
|
|
420
|
+
log.blank();
|
|
421
|
+
log.heading("Import summary");
|
|
422
|
+
log.info(`${outcomes.length} item${outcomes.length !== 1 ? "s" : ""} · ` +
|
|
423
|
+
`${stored.length} stored (${totalEntities} entit${totalEntities !== 1 ? "ies" : "y"}) · ` +
|
|
424
|
+
`${outcomes.filter((o) => o.status === "dry-run").length} dry-run · ` +
|
|
425
|
+
`${outcomes.filter((o) => o.status === "skipped").length} skipped · ` +
|
|
426
|
+
`${outcomes.filter((o) => o.status === "empty").length} empty · ` +
|
|
427
|
+
`${failed.length} failed`);
|
|
428
|
+
for (const f of failed)
|
|
429
|
+
log.dim(` ✗ ${f.label}: ${f.error ?? "unknown error"}`);
|
|
430
|
+
}
|
|
431
|
+
const anyFailed = outcomes.some((o) => o.status === "failed");
|
|
432
|
+
if (anyFailed)
|
|
433
|
+
process.exit(1);
|
|
434
|
+
}
|
|
435
|
+
catch (e) {
|
|
436
|
+
renderHubError(e);
|
|
437
|
+
process.exit(1);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -13,7 +13,8 @@ import { execSync } from "child_process";
|
|
|
13
13
|
import fs from "fs";
|
|
14
14
|
import { log, banner } from "../utils/logger.js";
|
|
15
15
|
import { detectOpenClaw, readOpenClawConfig, writeOpenClawConfig, setConfigValue, } from "../lib/openclaw.js";
|
|
16
|
-
import { checkPodHealth,
|
|
16
|
+
import { checkPodHealth, setupAgentViaPod, provisionUserOnPod, installSynapSkill, enableOpenClawAddonManaged, saveLocalPodConfig, checkServerResources, startOpenClawOnServer, findSynapDeployDir, getLocalPodConfig, getActiveProjectId, } from "../lib/pod.js";
|
|
17
|
+
import { provisionAgentKey, configureAgentContext } from "../lib/targets.js";
|
|
17
18
|
import { seedAgentEntities } from "../lib/seed.js";
|
|
18
19
|
import { login, isLoggedIn, listPods, getStoredToken, waitForPodCallback } from "../lib/auth.js";
|
|
19
20
|
export async function init(opts) {
|
|
@@ -156,7 +157,7 @@ async function pathBExisting(opts, detectedUrl) {
|
|
|
156
157
|
log.blank();
|
|
157
158
|
let ocStarted = false;
|
|
158
159
|
try {
|
|
159
|
-
startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl);
|
|
160
|
+
startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl, getActiveProjectId());
|
|
160
161
|
ocStarted = true;
|
|
161
162
|
log.success("OpenClaw container started");
|
|
162
163
|
}
|
|
@@ -232,7 +233,7 @@ async function pathB(opts) {
|
|
|
232
233
|
log.blank();
|
|
233
234
|
try {
|
|
234
235
|
const localConfig = getLocalPodConfig();
|
|
235
|
-
startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl);
|
|
236
|
+
startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl, getActiveProjectId());
|
|
236
237
|
log.success("OpenClaw container started");
|
|
237
238
|
}
|
|
238
239
|
catch (err) {
|
|
@@ -585,23 +586,30 @@ async function connectStep(podUrl, opts, openclawFound, podId) {
|
|
|
585
586
|
// The pod trusts the user's session to create agent credentials
|
|
586
587
|
const spinner = ora("Generating API key for OpenClaw agent...").start();
|
|
587
588
|
try {
|
|
588
|
-
// Provision the user on the pod (creates Kratos identity + pod user
|
|
589
|
-
//
|
|
589
|
+
// Provision the user on the pod (creates Kratos identity + pod user
|
|
590
|
+
// account) AND capture the Kratos session the handshake mints. This is
|
|
591
|
+
// idempotent — safe to call on every init.
|
|
592
|
+
let sessionToken = null;
|
|
590
593
|
try {
|
|
591
|
-
await provisionUserOnPod(podUrl, creds.token);
|
|
594
|
+
({ sessionToken } = await provisionUserOnPod(podUrl, creds.token));
|
|
592
595
|
}
|
|
593
596
|
catch (err) {
|
|
594
|
-
// Non-fatal
|
|
597
|
+
// Non-fatal here — the missing-session guard below decides what to do.
|
|
595
598
|
log.warn(`Could not provision user on pod: ${err instanceof Error ? err.message : String(err)}`);
|
|
596
599
|
}
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
600
|
+
if (!sessionToken) {
|
|
601
|
+
throw new Error("Could not establish a pod session to issue an agent key.");
|
|
602
|
+
}
|
|
603
|
+
// Canonical key issuance: mint a scoped Hub Protocol key via the pod's
|
|
604
|
+
// apiKeys.connectIntegration tRPC procedure — the same path the pod-admin
|
|
605
|
+
// /connect page and the browser use (replaces the removed CP relay).
|
|
606
|
+
const result = await setupAgentViaPod(podUrl, sessionToken, "openclaw");
|
|
601
607
|
apiKey = result.hubApiKey;
|
|
602
608
|
opts.apiKey = apiKey;
|
|
603
609
|
spinner.succeed("API key generated");
|
|
604
|
-
|
|
610
|
+
if (result.agentUserId) {
|
|
611
|
+
log.dim(`Agent user: ${result.agentUserId}`);
|
|
612
|
+
}
|
|
605
613
|
log.dim(`Workspace: ${result.workspaceId}`);
|
|
606
614
|
log.blank();
|
|
607
615
|
log.info("This key lets OpenClaw read/write your knowledge graph.");
|
|
@@ -665,16 +673,20 @@ async function connectStep(podUrl, opts, openclawFound, podId) {
|
|
|
665
673
|
if (token) {
|
|
666
674
|
const spinner = ora("Creating agent credentials...").start();
|
|
667
675
|
try {
|
|
668
|
-
|
|
676
|
+
// Agents are pod-wide singletons now — setupAgent() never passed a
|
|
677
|
+
// workspaceId in its request either, so the response's workspaceId
|
|
678
|
+
// was already always null/"" in practice. Provision via the shared
|
|
679
|
+
// wrapper (no enrollAgentIfNeeded: a PROVISIONING_TOKEN can't
|
|
680
|
+
// authorize /workspaces/enroll-agent, same as before).
|
|
681
|
+
const result = await provisionAgentKey(podUrl, token, "openclaw");
|
|
669
682
|
apiKey = result.hubApiKey;
|
|
670
683
|
opts.apiKey = apiKey;
|
|
671
684
|
spinner.succeed("Credentials created");
|
|
672
685
|
log.dim(`Agent: ${result.agentUserId}`);
|
|
673
|
-
log.dim(`Workspace: ${result.workspaceId}`);
|
|
674
686
|
saveLocalPodConfig({
|
|
675
687
|
podUrl,
|
|
676
688
|
podId: podId ?? undefined,
|
|
677
|
-
workspaceId:
|
|
689
|
+
workspaceId: "",
|
|
678
690
|
agentUserId: result.agentUserId,
|
|
679
691
|
hubApiKey: result.hubApiKey,
|
|
680
692
|
savedAt: new Date().toISOString(),
|
|
@@ -682,10 +694,17 @@ async function connectStep(podUrl, opts, openclawFound, podId) {
|
|
|
682
694
|
if (openclawFound) {
|
|
683
695
|
const config = readOpenClawConfig() ?? {};
|
|
684
696
|
setConfigValue(config, "synap.podUrl", podUrl);
|
|
685
|
-
setConfigValue(config, "synap.workspaceId", result.workspaceId);
|
|
686
697
|
setConfigValue(config, "synap.agentUserId", result.agentUserId);
|
|
687
698
|
writeOpenClawConfig(config);
|
|
688
699
|
}
|
|
700
|
+
if (result.agentUserId) {
|
|
701
|
+
try {
|
|
702
|
+
await configureAgentContext(podUrl, apiKey, "openclaw", result.agentUserId);
|
|
703
|
+
}
|
|
704
|
+
catch (err) {
|
|
705
|
+
log.warn(`Agent context wizard failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
689
708
|
}
|
|
690
709
|
catch (err) {
|
|
691
710
|
spinner.fail(err instanceof Error ? err.message : String(err));
|