@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,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Superwhisper store-first import — pair meta.json + output.wav into pod-wide
|
|
3
|
+
* notes with optional audio provenance. No AI structure on the WAV (IS STT is
|
|
4
|
+
* a stub); transcript comes from Superwhisper's meta.
|
|
5
|
+
*
|
|
6
|
+
* Idempotency: local ledger (~/.synap/import-ledger/superwhisper.json) maps
|
|
7
|
+
* recordingId → entityId so resume/re-run skips completed units. Server-side
|
|
8
|
+
* external_links land in Wave 3; ledger is the v1 resume story.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync, } from "node:fs";
|
|
11
|
+
import { join, basename } from "node:path";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import { log } from "../utils/logger.js";
|
|
15
|
+
import { resolveHubConfig, resolveUserId, hubPost, hubPostMultipartRetryable, } from "./hub-client.js";
|
|
16
|
+
const LEDGER_DIR = join(homedir(), ".synap", "import-ledger");
|
|
17
|
+
const LEDGER_PATH = join(LEDGER_DIR, "superwhisper.json");
|
|
18
|
+
/** Matches backend SOURCE_BLOB_MAX_BYTES. */
|
|
19
|
+
const AUDIO_MAX_BYTES = 32 * 1024 * 1024;
|
|
20
|
+
function loadLedger() {
|
|
21
|
+
try {
|
|
22
|
+
if (!existsSync(LEDGER_PATH))
|
|
23
|
+
return { version: 1, entries: {} };
|
|
24
|
+
const raw = JSON.parse(readFileSync(LEDGER_PATH, "utf8"));
|
|
25
|
+
if (!raw || raw.version !== 1 || typeof raw.entries !== "object") {
|
|
26
|
+
return { version: 1, entries: {} };
|
|
27
|
+
}
|
|
28
|
+
return raw;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return { version: 1, entries: {} };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function saveLedger(ledger) {
|
|
35
|
+
mkdirSync(LEDGER_DIR, { recursive: true });
|
|
36
|
+
writeFileSync(LEDGER_PATH, JSON.stringify(ledger, null, 2), "utf8");
|
|
37
|
+
}
|
|
38
|
+
function transcriptFromMeta(meta) {
|
|
39
|
+
const result = typeof meta.result === "string" ? meta.result.trim() : "";
|
|
40
|
+
if (result)
|
|
41
|
+
return result;
|
|
42
|
+
const segs = Array.isArray(meta.segments) ? meta.segments : [];
|
|
43
|
+
return segs
|
|
44
|
+
.map((s) => s && typeof s === "object" && typeof s.text === "string"
|
|
45
|
+
? s.text
|
|
46
|
+
: "")
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.join(" ")
|
|
49
|
+
.trim();
|
|
50
|
+
}
|
|
51
|
+
function titleFromTranscript(transcript, datetime, id) {
|
|
52
|
+
const line = transcript.split(/\n/).map((l) => l.trim()).find(Boolean) ?? "";
|
|
53
|
+
if (line.length >= 8) {
|
|
54
|
+
return line.length > 80 ? `${line.slice(0, 79)}…` : line;
|
|
55
|
+
}
|
|
56
|
+
if (datetime)
|
|
57
|
+
return `Voice note ${datetime}`;
|
|
58
|
+
return `Superwhisper ${id ?? "recording"}`;
|
|
59
|
+
}
|
|
60
|
+
/** Expand a Superwhisper recordings root (or a single clip dir) into units. */
|
|
61
|
+
export function collectSuperwhisperUnits(root) {
|
|
62
|
+
if (!existsSync(root)) {
|
|
63
|
+
throw new Error(`Path not found: ${root}`);
|
|
64
|
+
}
|
|
65
|
+
const st = statSync(root);
|
|
66
|
+
const dirs = [];
|
|
67
|
+
if (st.isDirectory()) {
|
|
68
|
+
// Single clip dir: has meta.json at root
|
|
69
|
+
if (existsSync(join(root, "meta.json"))) {
|
|
70
|
+
dirs.push(root);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
let entries = [];
|
|
74
|
+
try {
|
|
75
|
+
entries = readdirSync(root, { withFileTypes: true });
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
throw new Error(`Cannot read directory: ${e.message}`);
|
|
79
|
+
}
|
|
80
|
+
for (const e of entries) {
|
|
81
|
+
if (!e.isDirectory() || e.name.startsWith("."))
|
|
82
|
+
continue;
|
|
83
|
+
const full = join(root, e.name);
|
|
84
|
+
if (existsSync(join(full, "meta.json")))
|
|
85
|
+
dirs.push(full);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw new Error(`Expected a Superwhisper recordings folder, got a file: ${root}`);
|
|
91
|
+
}
|
|
92
|
+
const units = [];
|
|
93
|
+
for (const dir of dirs) {
|
|
94
|
+
const recordingId = basename(dir);
|
|
95
|
+
const metaPath = join(dir, "meta.json");
|
|
96
|
+
let meta = {};
|
|
97
|
+
try {
|
|
98
|
+
meta = JSON.parse(readFileSync(metaPath, "utf8"));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const transcript = transcriptFromMeta(meta);
|
|
104
|
+
const wavPath = existsSync(join(dir, "output.wav"))
|
|
105
|
+
? join(dir, "output.wav")
|
|
106
|
+
: null;
|
|
107
|
+
const wavSize = wavPath ? statSync(wavPath).size : 0;
|
|
108
|
+
const datetime = typeof meta.datetime === "string" ? meta.datetime : undefined;
|
|
109
|
+
units.push({
|
|
110
|
+
recordingId,
|
|
111
|
+
dir,
|
|
112
|
+
metaPath,
|
|
113
|
+
wavPath,
|
|
114
|
+
wavSize,
|
|
115
|
+
datetime,
|
|
116
|
+
language: typeof meta.languageSelected === "string"
|
|
117
|
+
? meta.languageSelected
|
|
118
|
+
: undefined,
|
|
119
|
+
duration: typeof meta.duration === "number" ? meta.duration : undefined,
|
|
120
|
+
modeName: typeof meta.modeName === "string" ? meta.modeName : undefined,
|
|
121
|
+
transcript,
|
|
122
|
+
title: titleFromTranscript(transcript, datetime, recordingId),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// Stable order by recording id (unix-ish)
|
|
126
|
+
units.sort((a, b) => a.recordingId.localeCompare(b.recordingId));
|
|
127
|
+
return units;
|
|
128
|
+
}
|
|
129
|
+
function unitProperties(unit) {
|
|
130
|
+
return {
|
|
131
|
+
source: "superwhisper",
|
|
132
|
+
recordingId: unit.recordingId,
|
|
133
|
+
datetime: unit.datetime,
|
|
134
|
+
language: unit.language,
|
|
135
|
+
duration: unit.duration,
|
|
136
|
+
modeName: unit.modeName,
|
|
137
|
+
localPath: unit.dir,
|
|
138
|
+
hasTranscript: Boolean(unit.transcript),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function buildStoreUnitForm(unit, withAudio) {
|
|
142
|
+
const form = new FormData();
|
|
143
|
+
form.append("title", unit.title);
|
|
144
|
+
form.append("profileSlug", "note");
|
|
145
|
+
form.append("source", "cli");
|
|
146
|
+
if (unit.transcript)
|
|
147
|
+
form.append("content", unit.transcript);
|
|
148
|
+
else
|
|
149
|
+
form.append("description", "Empty Superwhisper transcript");
|
|
150
|
+
form.append("properties", JSON.stringify(unitProperties(unit)));
|
|
151
|
+
let audioSkippedReason;
|
|
152
|
+
if (withAudio && unit.wavPath) {
|
|
153
|
+
if (unit.wavSize > AUDIO_MAX_BYTES) {
|
|
154
|
+
audioSkippedReason = `over_limit_${AUDIO_MAX_BYTES}`;
|
|
155
|
+
}
|
|
156
|
+
else if (unit.wavSize === 0) {
|
|
157
|
+
audioSkippedReason = "empty_wav";
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const buf = readFileSync(unit.wavPath);
|
|
161
|
+
form.append("file", new File([buf], "output.wav", { type: "audio/wav" }));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (withAudio && !unit.wavPath) {
|
|
165
|
+
audioSkippedReason = "no_wav";
|
|
166
|
+
}
|
|
167
|
+
return { form, audioSkippedReason };
|
|
168
|
+
}
|
|
169
|
+
/** Prefer 1-request store-unit; fall back to create + source-file if 404. */
|
|
170
|
+
let storeUnitMode = "unknown";
|
|
171
|
+
async function storeUnit(unit, cfg, userId, withAudio) {
|
|
172
|
+
// Combined door: 1 auth hit per unit (entity + optional WAV).
|
|
173
|
+
if (storeUnitMode !== "two-step") {
|
|
174
|
+
try {
|
|
175
|
+
// Rebuild form on each 429 retry (body is one-shot).
|
|
176
|
+
const skipReason = buildStoreUnitForm(unit, withAudio).audioSkippedReason;
|
|
177
|
+
const res = (await hubPostMultipartRetryable("/import/store-unit", () => buildStoreUnitForm(unit, withAudio).form, cfg, 180_000));
|
|
178
|
+
storeUnitMode = "combined";
|
|
179
|
+
const entityId = String(res.id ?? res.entityId ?? "");
|
|
180
|
+
if (!entityId) {
|
|
181
|
+
throw new Error(`store-unit returned no id: ${JSON.stringify(res).slice(0, 200)}`);
|
|
182
|
+
}
|
|
183
|
+
const hasAudio = Boolean(res.audio);
|
|
184
|
+
const audioSkippedReason = skipReason ??
|
|
185
|
+
(typeof res.audioSkippedReason === "string"
|
|
186
|
+
? res.audioSkippedReason
|
|
187
|
+
: undefined);
|
|
188
|
+
return {
|
|
189
|
+
entityId,
|
|
190
|
+
recordingId: unit.recordingId,
|
|
191
|
+
storedAt: new Date().toISOString(),
|
|
192
|
+
hasAudio,
|
|
193
|
+
audioSkippedReason,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
const msg = e.message;
|
|
198
|
+
// Only fall back when the combined door is missing (not yet deployed).
|
|
199
|
+
if (msg.includes("HTTP 404") || msg.includes("HTTP 405")) {
|
|
200
|
+
storeUnitMode = "two-step";
|
|
201
|
+
console.error("[hub] /import/store-unit not available — falling back to 2-step (deploy backend for 1-req/unit)");
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
throw e;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Two-step fallback (pre-deploy pods): POST /entities + POST …/source-file.
|
|
209
|
+
const createRes = (await hubPost("/entities", {
|
|
210
|
+
userId,
|
|
211
|
+
profileSlug: "note",
|
|
212
|
+
title: unit.title,
|
|
213
|
+
content: unit.transcript || undefined,
|
|
214
|
+
description: unit.transcript
|
|
215
|
+
? undefined
|
|
216
|
+
: "Empty Superwhisper transcript",
|
|
217
|
+
properties: unitProperties(unit),
|
|
218
|
+
source: "cli",
|
|
219
|
+
}, cfg, 60_000));
|
|
220
|
+
const entityId = String(createRes.id ??
|
|
221
|
+
createRes.entity?.id ??
|
|
222
|
+
"");
|
|
223
|
+
if (!entityId) {
|
|
224
|
+
throw new Error(`Create entity returned no id: ${JSON.stringify(createRes).slice(0, 200)}`);
|
|
225
|
+
}
|
|
226
|
+
let hasAudio = false;
|
|
227
|
+
let audioSkippedReason;
|
|
228
|
+
if (withAudio && unit.wavPath) {
|
|
229
|
+
if (unit.wavSize > AUDIO_MAX_BYTES) {
|
|
230
|
+
audioSkippedReason = `over_limit_${AUDIO_MAX_BYTES}`;
|
|
231
|
+
}
|
|
232
|
+
else if (unit.wavSize === 0) {
|
|
233
|
+
audioSkippedReason = "empty_wav";
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
const buf = readFileSync(unit.wavPath);
|
|
237
|
+
await hubPostMultipartRetryable(`/entities/${entityId}/source-file`, () => {
|
|
238
|
+
const form = new FormData();
|
|
239
|
+
form.append("file", new File([buf], "output.wav", { type: "audio/wav" }));
|
|
240
|
+
return form;
|
|
241
|
+
}, cfg, 180_000);
|
|
242
|
+
hasAudio = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else if (withAudio && !unit.wavPath) {
|
|
246
|
+
audioSkippedReason = "no_wav";
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
entityId,
|
|
250
|
+
recordingId: unit.recordingId,
|
|
251
|
+
storedAt: new Date().toISOString(),
|
|
252
|
+
hasAudio,
|
|
253
|
+
audioSkippedReason,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/** Run store-first Superwhisper import for one or more roots. */
|
|
257
|
+
export async function importSuperwhisperStoreFirst(roots, opts) {
|
|
258
|
+
const cfg = await resolveHubConfig(opts);
|
|
259
|
+
const userId = await resolveUserId(cfg);
|
|
260
|
+
const withAudio = opts.withAudio !== false; // default true when store-first superwhisper
|
|
261
|
+
// Default concurrency 1 — each unit is 2 Hub auth hits; concurrent workers
|
|
262
|
+
// burn the per-key rate window and cascade 429s. Override with --concurrency 2
|
|
263
|
+
// only after the raised server limit is deployed.
|
|
264
|
+
const concurrency = Math.max(1, Math.min(opts.concurrency ?? 1, 4));
|
|
265
|
+
const resume = opts.resume !== false;
|
|
266
|
+
let units = [];
|
|
267
|
+
for (const root of roots) {
|
|
268
|
+
units = units.concat(collectSuperwhisperUnits(root));
|
|
269
|
+
}
|
|
270
|
+
// Dedupe by recordingId
|
|
271
|
+
const byId = new Map();
|
|
272
|
+
for (const u of units)
|
|
273
|
+
byId.set(u.recordingId, u);
|
|
274
|
+
units = [...byId.values()].sort((a, b) => a.recordingId.localeCompare(b.recordingId));
|
|
275
|
+
if (typeof opts.limit === "number" && opts.limit > 0) {
|
|
276
|
+
units = units.slice(0, opts.limit);
|
|
277
|
+
}
|
|
278
|
+
const ledger = loadLedger();
|
|
279
|
+
const pending = resume
|
|
280
|
+
? units.filter((u) => !ledger.entries[u.recordingId])
|
|
281
|
+
: units;
|
|
282
|
+
const skippedLedger = units.length - pending.length;
|
|
283
|
+
if (opts.json) {
|
|
284
|
+
// dry-run / status style
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
const rpm = process.env.SYNAP_HUB_RPM && parseInt(process.env.SYNAP_HUB_RPM, 10);
|
|
288
|
+
log.info(`Superwhisper store-first: ${units.length} unit(s)` +
|
|
289
|
+
(skippedLedger ? ` · ${skippedLedger} already in ledger` : "") +
|
|
290
|
+
` · ${pending.length} to process` +
|
|
291
|
+
(withAudio ? " · with audio" : " · transcript only") +
|
|
292
|
+
(opts.dryRun ? " · dry-run" : "") +
|
|
293
|
+
` · pace ≤${Number.isFinite(rpm) && rpm > 0 ? rpm : 80} Hub req/min` +
|
|
294
|
+
(process.env.SYNAP_HUB_RPM
|
|
295
|
+
? ""
|
|
296
|
+
: " (set SYNAP_HUB_RPM=1000 after server redeploy)"));
|
|
297
|
+
}
|
|
298
|
+
if (opts.dryRun) {
|
|
299
|
+
const oversize = pending.filter((u) => u.wavSize > AUDIO_MAX_BYTES).length;
|
|
300
|
+
const emptyTx = pending.filter((u) => !u.transcript).length;
|
|
301
|
+
const totalWav = pending.reduce((n, u) => n + u.wavSize, 0);
|
|
302
|
+
if (opts.json) {
|
|
303
|
+
console.log(JSON.stringify({
|
|
304
|
+
mode: "superwhisper-store-first",
|
|
305
|
+
dryRun: true,
|
|
306
|
+
total: units.length,
|
|
307
|
+
pending: pending.length,
|
|
308
|
+
skippedLedger,
|
|
309
|
+
emptyTranscript: emptyTx,
|
|
310
|
+
oversizeAudio: oversize,
|
|
311
|
+
totalWavBytes: totalWav,
|
|
312
|
+
sample: pending.slice(0, 5).map((u) => ({
|
|
313
|
+
recordingId: u.recordingId,
|
|
314
|
+
title: u.title,
|
|
315
|
+
wavSize: u.wavSize,
|
|
316
|
+
transcriptLen: u.transcript.length,
|
|
317
|
+
})),
|
|
318
|
+
}, null, 2));
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
log.heading("Dry run");
|
|
322
|
+
log.info(` pending=${pending.length} emptyTranscript=${emptyTx} oversizeAudio=${oversize} wavTotal=${(totalWav / 1e9).toFixed(2)}GB`);
|
|
323
|
+
for (const u of pending.slice(0, 8)) {
|
|
324
|
+
log.dim(` ${u.recordingId} ${(u.wavSize / 1e6).toFixed(2)}MB tx=${u.transcript.length} ${u.title.slice(0, 50)}`);
|
|
325
|
+
}
|
|
326
|
+
if (pending.length > 8)
|
|
327
|
+
log.dim(` … +${pending.length - 8} more`);
|
|
328
|
+
}
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (!opts.yes && !opts.json) {
|
|
332
|
+
log.warn("This will create pod-wide notes (and optionally upload WAVs). Pass --yes to confirm.");
|
|
333
|
+
process.exit(1);
|
|
334
|
+
}
|
|
335
|
+
let stored = 0;
|
|
336
|
+
let failed = 0;
|
|
337
|
+
let audioOk = 0;
|
|
338
|
+
let audioSkipped = 0;
|
|
339
|
+
const errors = [];
|
|
340
|
+
// Simple concurrency pool
|
|
341
|
+
let idx = 0;
|
|
342
|
+
async function worker() {
|
|
343
|
+
while (idx < pending.length) {
|
|
344
|
+
const i = idx++;
|
|
345
|
+
const unit = pending[i];
|
|
346
|
+
try {
|
|
347
|
+
const entry = await storeUnit(unit, cfg, userId, withAudio);
|
|
348
|
+
ledger.entries[unit.recordingId] = entry;
|
|
349
|
+
saveLedger(ledger);
|
|
350
|
+
stored++;
|
|
351
|
+
if (entry.hasAudio)
|
|
352
|
+
audioOk++;
|
|
353
|
+
if (entry.audioSkippedReason)
|
|
354
|
+
audioSkipped++;
|
|
355
|
+
if (!opts.json) {
|
|
356
|
+
const n = stored + failed;
|
|
357
|
+
process.stdout.write(chalk.dim(`\r ${n}/${pending.length} stored=${stored} failed=${failed} audio=${audioOk}`));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch (e) {
|
|
361
|
+
failed++;
|
|
362
|
+
const msg = e.message;
|
|
363
|
+
errors.push({ id: unit.recordingId, error: msg });
|
|
364
|
+
if (!opts.json) {
|
|
365
|
+
log.error(`\n ${unit.recordingId}: ${msg}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const workers = Array.from({ length: concurrency }, () => worker());
|
|
371
|
+
await Promise.all(workers);
|
|
372
|
+
if (!opts.json)
|
|
373
|
+
process.stdout.write("\n");
|
|
374
|
+
if (opts.json) {
|
|
375
|
+
console.log(JSON.stringify({ stored, failed, audioOk, audioSkipped, skippedLedger, errors }, null, 2));
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
log.blank();
|
|
379
|
+
log.heading("Superwhisper import summary");
|
|
380
|
+
log.success(`${stored} stored · ${failed} failed · audio ok ${audioOk} · audio skipped ${audioSkipped} · ledger skips ${skippedLedger}`);
|
|
381
|
+
log.dim(`Ledger: ${LEDGER_PATH}`);
|
|
382
|
+
for (const e of errors.slice(0, 20)) {
|
|
383
|
+
log.dim(` ✗ ${e.id}: ${e.error}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (failed > 0)
|
|
387
|
+
process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=superwhisper-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superwhisper-import.js","sourceRoot":"","sources":["../../src/lib/superwhisper-import.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/targets.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface TargetConnectionConfig {
|
|
|
13
13
|
podUrl: string;
|
|
14
14
|
apiKey: string;
|
|
15
15
|
workspaceId?: string;
|
|
16
|
+
projectId?: string;
|
|
16
17
|
agentUserId?: string;
|
|
17
18
|
skills?: string[];
|
|
18
19
|
}
|
|
@@ -29,6 +30,14 @@ export interface TargetInfo {
|
|
|
29
30
|
}
|
|
30
31
|
export declare const TARGETS: Record<TargetName, TargetInfo>;
|
|
31
32
|
export declare function isTargetName(value: string): value is TargetName;
|
|
33
|
+
/**
|
|
34
|
+
* Build the pod's /mcp URL with optional scope lenses:
|
|
35
|
+
* ?workspaceId= — workspace lens (an app-lens of a project)
|
|
36
|
+
* ?projectId= — project focus lens (orthogonal; narrows every tool call)
|
|
37
|
+
* Both are opt-in and compose. Omitting both = pod-wide.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildMcpUrl(podUrl: string, workspaceId?: string, projectId?: string): string;
|
|
40
|
+
export declare function configureAgentContext(podUrl: string, apiKey: string, agentType: string, agentUserId: string, info?: TargetInfo): Promise<void>;
|
|
32
41
|
export declare function listTargets(): void;
|
|
33
42
|
/**
|
|
34
43
|
* Run the install flow for a target. Returns true on success.
|
|
@@ -51,9 +60,37 @@ export declare function resolveWorkspaceId(cfg: TargetConnectionConfig): Promise
|
|
|
51
60
|
*
|
|
52
61
|
* @param writeMcp — set false to skip the mcpServers entry (skills-only installs)
|
|
53
62
|
*/
|
|
54
|
-
export declare function writeClaudeCodeEnv(cfg: Pick<TargetConnectionConfig, "podUrl" | "apiKey" | "workspaceId" | "agentUserId">, { writeMcp }?: {
|
|
63
|
+
export declare function writeClaudeCodeEnv(cfg: Pick<TargetConnectionConfig, "podUrl" | "apiKey" | "workspaceId" | "projectId" | "agentUserId">, { writeMcp }?: {
|
|
55
64
|
writeMcp?: boolean;
|
|
56
65
|
}): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Provision an agent-owned API key for the given surface via POST /api/hub/setup/agent.
|
|
68
|
+
* When requireApproval is true the key is created inactive; the user must approve in the
|
|
69
|
+
* browser before this function returns.
|
|
70
|
+
* Throws on failure — callers must not silently fall back to a human key.
|
|
71
|
+
*/
|
|
72
|
+
export declare function provisionAgentKey(podUrl: string, humanApiKey: string, agentType: string, { requireApproval, idempotent, }?: {
|
|
73
|
+
requireApproval?: boolean;
|
|
74
|
+
idempotent?: boolean;
|
|
75
|
+
}): Promise<{
|
|
76
|
+
hubApiKey: string;
|
|
77
|
+
agentUserId: string;
|
|
78
|
+
reused: boolean;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Enroll an agent user into the caller's workspaces via POST /api/hub/workspaces/enroll-agent.
|
|
82
|
+
* Non-fatal — logs on failure so connect flow is never blocked by enrollment errors.
|
|
83
|
+
*
|
|
84
|
+
* @param callerKey The key of the user whose workspaces to enroll into (pod profile key).
|
|
85
|
+
* @param agentUserId The agent user to enroll.
|
|
86
|
+
* @param workspaceId When set, enroll in that one workspace only; omit for all.
|
|
87
|
+
* @param opts.role Workspace role to grant the agent. Defaults to "editor" — the
|
|
88
|
+
* one safe default callers get unless they explicitly ask for another role.
|
|
89
|
+
*/
|
|
90
|
+
export declare function enrollAgentIfNeeded(podUrl: string, callerKey: string, agentUserId: string, workspaceId?: string, opts?: {
|
|
91
|
+
quiet?: boolean;
|
|
92
|
+
role?: string;
|
|
93
|
+
}): Promise<void>;
|
|
57
94
|
interface McpServerConfig {
|
|
58
95
|
url?: string;
|
|
59
96
|
command?: string;
|
|
@@ -75,7 +112,18 @@ export interface ProviderInstallConfig {
|
|
|
75
112
|
}
|
|
76
113
|
export declare function installOpencode(cfg: ProviderInstallConfig & {
|
|
77
114
|
workspaceId?: string;
|
|
115
|
+
projectId?: string;
|
|
78
116
|
}): Promise<boolean>;
|
|
79
117
|
export declare function installAider(cfg: ProviderInstallConfig): Promise<boolean>;
|
|
80
118
|
export declare function writeMcpServerEntry(configPath: string, serverName: string, server: McpServerConfig): void;
|
|
119
|
+
/**
|
|
120
|
+
* Idempotent workspace governance prompt. Checks if the workspace already has
|
|
121
|
+
* aiGovernance configured — skips if set. Otherwise prompts for safe/normal/crazy
|
|
122
|
+
* and applies via PATCH /workspaces/:id/governance.
|
|
123
|
+
*/
|
|
124
|
+
export type GovernancePreset = "safe" | "normal" | "crazy";
|
|
125
|
+
export declare function ensureAgentGovernance(cfg: {
|
|
126
|
+
podUrl: string;
|
|
127
|
+
apiKey: string;
|
|
128
|
+
}, agentUserId: string, presetMode?: GovernancePreset): Promise<void>;
|
|
81
129
|
export {};
|