@synap-core/cli 1.6.1 → 1.8.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-run.d.ts +47 -0
- package/dist/commands/agent-run.js +302 -0
- package/dist/commands/agent-run.js.map +1 -0
- package/dist/commands/artifact.d.ts +26 -0
- package/dist/commands/artifact.js +76 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/automation.d.ts +47 -0
- package/dist/commands/automation.js +600 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/cell.d.ts +55 -0
- package/dist/commands/cell.js +277 -0
- package/dist/commands/cell.js.map +1 -0
- package/dist/commands/connect.js +41 -7
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.js +0 -16
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/connectors.d.ts +31 -0
- package/dist/commands/connectors.js +276 -0
- package/dist/commands/connectors.js.map +1 -0
- package/dist/commands/context.d.ts +22 -0
- package/dist/commands/context.js +151 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/data-extra.d.ts +13 -0
- package/dist/commands/data-extra.js +161 -0
- package/dist/commands/data-extra.js.map +1 -0
- package/dist/commands/data.d.ts +13 -9
- package/dist/commands/data.js +220 -109
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/discover.d.ts +18 -0
- package/dist/commands/discover.js +71 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doc.d.ts +39 -0
- package/dist/commands/doc.js +130 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/events.d.ts +26 -0
- package/dist/commands/events.js +68 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/explain.d.ts +21 -0
- package/dist/commands/explain.js +248 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/graph.d.ts +18 -0
- package/dist/commands/graph.js +73 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/home.d.ts +12 -0
- package/dist/commands/home.js +54 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js +62 -102
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +9 -0
- package/dist/commands/keys.js +79 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/knowledge.d.ts +32 -18
- package/dist/commands/knowledge.js +303 -53
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.js +90 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/open.d.ts +15 -0
- package/dist/commands/open.js +44 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/pods.d.ts +5 -0
- package/dist/commands/pods.js +85 -37
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +7 -0
- package/dist/commands/proposals-actions.js +40 -0
- package/dist/commands/proposals-actions.js.map +1 -0
- package/dist/commands/providers.d.ts +38 -0
- package/dist/commands/providers.js +170 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/sessions.d.ts +31 -0
- package/dist/commands/sessions.js +224 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/skills-commands.d.ts +26 -0
- package/dist/commands/skills-commands.js +186 -0
- package/dist/commands/skills-commands.js.map +1 -0
- package/dist/commands/skills.d.ts +26 -0
- package/dist/commands/skills.js +195 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.js +68 -30
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/subscribe.d.ts +19 -0
- package/dist/commands/subscribe.js +91 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/view.d.ts +57 -0
- package/dist/commands/view.js +194 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.js +823 -206
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-templates.d.ts +25 -0
- package/dist/lib/agent-templates.js +148 -0
- package/dist/lib/agent-templates.js.map +1 -0
- package/dist/lib/agents-config.d.ts +4 -1
- package/dist/lib/agents-config.js +19 -2
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/capture-lane.d.ts +49 -0
- package/dist/lib/capture-lane.js +79 -0
- package/dist/lib/capture-lane.js.map +1 -0
- package/dist/lib/hub-client.d.ts +14 -0
- package/dist/lib/hub-client.js +45 -3
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/pod.d.ts +22 -1
- package/dist/lib/pod.js +32 -2
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/skills-installer.d.ts +1 -1
- package/dist/lib/skills-installer.js +1 -1
- package/dist/lib/skills-installer.js.map +1 -1
- package/dist/lib/targets.d.ts +17 -1
- package/dist/lib/targets.js +744 -70
- package/dist/lib/targets.js.map +1 -1
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +881 -0
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +907 -0
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +907 -0
- package/node_modules/@synap/hub-rest-client/dist/index.js +851 -0
- package/node_modules/@synap/hub-rest-client/package.json +45 -0
- package/node_modules/@synap/hub-rest-client/src/client.ts +1143 -0
- package/node_modules/@synap/hub-rest-client/src/errors.ts +30 -0
- package/node_modules/@synap/hub-rest-client/src/index.ts +111 -0
- package/node_modules/@synap/hub-rest-client/src/setup.ts +77 -0
- package/node_modules/@synap/hub-rest-client/src/types.ts +639 -0
- package/package.json +9 -2
- package/skills/synap/SKILL.md +374 -100
- package/skills/synap-ui/SKILL.md +12 -9
- package/dist/lib/templates.d.ts +0 -11
- package/dist/lib/templates.js +0 -13
- package/dist/lib/templates.js.map +0 -1
- package/dist/templates/agent-os.json +0 -3090
|
@@ -1,33 +1,292 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* synap capture
|
|
2
|
+
* synap capture — the one canonical structured-WRITE verb.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* SMART MODE (no --type): `synap capture "free text"`
|
|
5
|
+
* → POST /capture/structure (AI pipeline: proposals + relations + followUp)
|
|
6
|
+
* → renders a proposal table, prompts y/N, then POST /capture/execute.
|
|
7
|
+
*
|
|
8
|
+
* TYPED MODE (--type): `synap capture --type gotcha --claim "…" [--why] [--evidence] [--tags]`
|
|
9
|
+
* → POST /entities as a typed `knowledge` entity; `ek_type` (gotcha|lesson|decision|
|
|
10
|
+
* reference) discriminates the kind — ONE store, type tags (the canonical pattern,
|
|
11
|
+
* NOT a residual dump). The workspace lens supplies the domain (no
|
|
12
|
+
* `engineering_knowledge`). A formal decision RECORD (rationale/alternatives/status
|
|
13
|
+
* lifecycle) comes from smart `capture "<text>"` or `create entity --profile=decision`.
|
|
14
|
+
*
|
|
15
|
+
* Workspace routing: --workspace > --team (first product ws) > memory ws (default,
|
|
16
|
+
* auto-approved, agent-private) > active ws.
|
|
7
17
|
*/
|
|
8
18
|
import chalk from "chalk";
|
|
19
|
+
import * as readline from "node:readline/promises";
|
|
20
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
9
21
|
import { log } from "../utils/logger.js";
|
|
10
|
-
import { resolveHubConfig, resolveUserId, hubPost,
|
|
22
|
+
import { resolveHubConfig, resolveUserId, hubPost, } from "../lib/hub-client.js";
|
|
23
|
+
import { getAgentWorkspaceRouting } from "../lib/pod.js";
|
|
24
|
+
import { laneFromSource, resolveWorkspaceName, formatLaneLine, laneJsonFields, } from "../lib/capture-lane.js";
|
|
25
|
+
/**
|
|
26
|
+
* Resolve the workspace for a DOMAIN capture (the `knowledge` entity, the Work
|
|
27
|
+
* lane). Knowledge is workspace-scoped, so the destination IS the separation:
|
|
28
|
+
* a Builder lesson stays in Builder, a marketing one in marketing.
|
|
29
|
+
*
|
|
30
|
+
* Priority: --workspace > --team (first product ws) > active ws.
|
|
31
|
+
*
|
|
32
|
+
* NOTE: the agent-memory ("AI-self") lane was removed — the AI no longer dumps
|
|
33
|
+
* captures into a private agent workspace. Everything it learns routes to a real
|
|
34
|
+
* lane: Work (here), Global (`--global` → knowledge_keys), or User
|
|
35
|
+
* (`record_observation` → user_observation). The per-adjunct memory workspace is
|
|
36
|
+
* being decommissioned.
|
|
37
|
+
*/
|
|
38
|
+
async function resolveKnowledgeWorkspace(opts, _cfg, activeWorkspaceId) {
|
|
39
|
+
if (opts.workspace) {
|
|
40
|
+
return { workspaceId: opts.workspace, source: "explicit" };
|
|
41
|
+
}
|
|
42
|
+
if (opts.team) {
|
|
43
|
+
const routing = getAgentWorkspaceRouting();
|
|
44
|
+
const teamWs = routing?.productWorkspaceIds?.[0];
|
|
45
|
+
return { workspaceId: teamWs ?? activeWorkspaceId, source: teamWs ? "team" : "active (no team workspace configured)" };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
workspaceId: activeWorkspaceId,
|
|
49
|
+
source: activeWorkspaceId ? "active" : "active (run `synap use <id>` to set a workspace)",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Slugify free text into a knowledge_keys slug fragment. */
|
|
53
|
+
function slugify(text) {
|
|
54
|
+
return text
|
|
55
|
+
.toLowerCase()
|
|
56
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
57
|
+
.replace(/^-+|-+$/g, "")
|
|
58
|
+
.slice(0, 80) || "entry";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* GLOBAL lane: write a pod-wide procedural runbook to `knowledge_keys`.
|
|
62
|
+
* Cross-cutting best-practice/how-to, addressed by a stable `namespace:slug` key
|
|
63
|
+
* and visible in every workspace (pod-wide). The kind (gotcha/lesson/decision/
|
|
64
|
+
* reference) becomes the namespace; the claim derives the slug unless --key given.
|
|
65
|
+
*/
|
|
66
|
+
async function captureGlobalRunbook(opts, cfg, authorUserId) {
|
|
67
|
+
const type = opts.type ?? "reference";
|
|
68
|
+
const claim = opts.claim ?? opts.text ?? "";
|
|
69
|
+
const key = opts.key ?? `${type}:${slugify(claim)}`;
|
|
70
|
+
const [namespace, ...slugParts] = key.split(":");
|
|
71
|
+
const slug = slugParts.join(":") || slugify(claim);
|
|
72
|
+
const valueParts = [claim];
|
|
73
|
+
if (opts.why)
|
|
74
|
+
valueParts.push(`\n**Why:** ${opts.why}`);
|
|
75
|
+
if (opts.evidence)
|
|
76
|
+
valueParts.push(`\n**Evidence:** ${opts.evidence}`);
|
|
77
|
+
if (opts.tags)
|
|
78
|
+
valueParts.push(`\n_tags: ${opts.tags}_`);
|
|
79
|
+
const res = await hubPost("/knowledge", {
|
|
80
|
+
key,
|
|
81
|
+
namespace,
|
|
82
|
+
slug,
|
|
83
|
+
value: valueParts.join("\n"),
|
|
84
|
+
author: authorUserId,
|
|
85
|
+
// workspaceId omitted → pod-wide (null). The Global lane is, by definition,
|
|
86
|
+
// cross-workspace. (Workspace-scoped knowledge_keys await a backend fix —
|
|
87
|
+
// POST /knowledge currently drops workspaceId; domain knowledge uses the
|
|
88
|
+
// `knowledge` entity instead, which IS workspace-scoped.)
|
|
89
|
+
}, cfg);
|
|
90
|
+
const report = {
|
|
91
|
+
lane: "global",
|
|
92
|
+
workspaceId: undefined,
|
|
93
|
+
workspaceName: "pod-wide",
|
|
94
|
+
governance: "auto",
|
|
95
|
+
};
|
|
96
|
+
if (opts.json) {
|
|
97
|
+
console.log(JSON.stringify({ key, id: res.id, stored: true, ...laneJsonFields(report) }, null, 2));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
log.success(`[${type}] ${claim.slice(0, 80)}`);
|
|
101
|
+
log.dim(` key: ${key}`);
|
|
102
|
+
console.log(" " + formatLaneLine(report));
|
|
103
|
+
}
|
|
104
|
+
/** Render the /capture/structure result as a compact human-readable summary. */
|
|
105
|
+
function renderStructureResult(result) {
|
|
106
|
+
const { proposals, relations, followUp, degraded } = result;
|
|
107
|
+
if (degraded) {
|
|
108
|
+
log.warn("AI structuring unavailable — degraded fallback.");
|
|
109
|
+
}
|
|
110
|
+
if (proposals.length === 0) {
|
|
111
|
+
log.dim("No entity proposals extracted.");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
log.heading("Proposed entities");
|
|
115
|
+
// Column widths
|
|
116
|
+
const typeW = Math.min(18, Math.max(6, ...proposals.map((p) => p.profileSlug.length)));
|
|
117
|
+
const titleW = Math.min(48, Math.max(10, ...proposals.map((p) => p.title.length)));
|
|
118
|
+
const header = [
|
|
119
|
+
chalk.bold("#".padEnd(3)),
|
|
120
|
+
chalk.bold("Type".padEnd(typeW)),
|
|
121
|
+
chalk.bold("Title".padEnd(titleW)),
|
|
122
|
+
].join(" ");
|
|
123
|
+
console.log(" " + header);
|
|
124
|
+
console.log(" " + chalk.dim("-".repeat(3 + 2 + typeW + 2 + titleW)));
|
|
125
|
+
for (let i = 0; i < proposals.length; i++) {
|
|
126
|
+
const p = proposals[i];
|
|
127
|
+
const row = [
|
|
128
|
+
chalk.dim(String(i + 1).padEnd(3)),
|
|
129
|
+
chalk.cyan(p.profileSlug.slice(0, typeW).padEnd(typeW)),
|
|
130
|
+
p.title.slice(0, titleW).padEnd(titleW),
|
|
131
|
+
].join(" ");
|
|
132
|
+
console.log(" " + row);
|
|
133
|
+
if (p.description) {
|
|
134
|
+
log.dim(` ${p.description.slice(0, 80)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (relations.length > 0) {
|
|
138
|
+
log.blank();
|
|
139
|
+
log.dim(` ${relations.length} relation${relations.length !== 1 ? "s" : ""} will be created.`);
|
|
140
|
+
}
|
|
141
|
+
if (followUp?.question) {
|
|
142
|
+
log.blank();
|
|
143
|
+
log.info(`Follow-up: ${followUp.question}`);
|
|
144
|
+
if (followUp.suggestions && followUp.suggestions.length > 0) {
|
|
145
|
+
for (const s of followUp.suggestions) {
|
|
146
|
+
log.dim(` · ${s}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function runSmartCapture(text, opts) {
|
|
152
|
+
const cfg = await resolveHubConfig();
|
|
153
|
+
const userId = await resolveUserId(cfg);
|
|
154
|
+
const { workspaceId, source } = await resolveKnowledgeWorkspace(opts, cfg, cfg.workspaceId);
|
|
155
|
+
if (!workspaceId) {
|
|
156
|
+
console.error(chalk.red("No workspace set. Run:\n" +
|
|
157
|
+
" synap connect (sets up memory + team workspace routing)\n" +
|
|
158
|
+
" synap use <workspace-id> (manual override)"));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
// 1. Structure
|
|
162
|
+
const structureBody = { userId, text, workspaceId };
|
|
163
|
+
const structureRes = await hubPost("/capture/structure", structureBody, cfg);
|
|
164
|
+
if (opts.json) {
|
|
165
|
+
// --json without --yes: print structure result and exit
|
|
166
|
+
if (!opts.yes) {
|
|
167
|
+
console.log(JSON.stringify(structureRes, null, 2));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// --json + --yes: also execute and print combined result
|
|
171
|
+
const executeRes = await hubPost("/capture/execute", {
|
|
172
|
+
userId,
|
|
173
|
+
workspaceId,
|
|
174
|
+
entities: structureRes.proposals,
|
|
175
|
+
relations: structureRes.relations ?? [],
|
|
176
|
+
}, cfg);
|
|
177
|
+
const report = await buildSmartLaneReport(executeRes, workspaceId, source, cfg);
|
|
178
|
+
console.log(JSON.stringify({ structure: structureRes, execute: executeRes, ...laneJsonFields(report) }, null, 2));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// 2. Render proposals
|
|
182
|
+
renderStructureResult(structureRes);
|
|
183
|
+
const count = structureRes.proposals?.length ?? 0;
|
|
184
|
+
if (count === 0)
|
|
185
|
+
return;
|
|
186
|
+
// 3. Confirm
|
|
187
|
+
let confirmed = opts.yes ?? false;
|
|
188
|
+
if (!confirmed) {
|
|
189
|
+
log.blank();
|
|
190
|
+
const rl = readline.createInterface({ input, output });
|
|
191
|
+
try {
|
|
192
|
+
const answer = await rl.question(chalk.bold(` Create ${count} entr${count !== 1 ? "ies" : "y"}? [y/N] `));
|
|
193
|
+
confirmed = answer.trim().toLowerCase() === "y";
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
rl.close();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!confirmed) {
|
|
200
|
+
log.dim("Aborted.");
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// 4. Execute
|
|
204
|
+
const executeRes = await hubPost("/capture/execute", {
|
|
205
|
+
userId,
|
|
206
|
+
workspaceId,
|
|
207
|
+
entities: structureRes.proposals,
|
|
208
|
+
relations: structureRes.relations ?? [],
|
|
209
|
+
}, cfg);
|
|
210
|
+
const created = executeRes.entitiesCreated
|
|
211
|
+
?? executeRes.created
|
|
212
|
+
?? count;
|
|
213
|
+
log.success(`${created} entr${created !== 1 ? "ies" : "y"} created.`);
|
|
214
|
+
if (executeRes.relationsCreated) {
|
|
215
|
+
log.dim(` ${executeRes.relationsCreated} relation${Number(executeRes.relationsCreated) !== 1 ? "s" : ""} created.`);
|
|
216
|
+
}
|
|
217
|
+
const report = await buildSmartLaneReport(executeRes, workspaceId, source, cfg);
|
|
218
|
+
console.log(" " + formatLaneLine(report));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Build the lane report for a smart-capture execute response. Smart capture may
|
|
222
|
+
* land directly or be queued as proposals — detect the latter from the execute
|
|
223
|
+
* payload (proposed/proposalsCreated/status) and fall back to auto otherwise.
|
|
224
|
+
*/
|
|
225
|
+
async function buildSmartLaneReport(executeRes, workspaceId, source, cfg) {
|
|
226
|
+
const isProposed = executeRes.status === "proposed" ||
|
|
227
|
+
Boolean(executeRes.proposalId) ||
|
|
228
|
+
Number(executeRes.proposalsCreated ?? 0) > 0;
|
|
229
|
+
return {
|
|
230
|
+
lane: laneFromSource(source),
|
|
231
|
+
workspaceId,
|
|
232
|
+
workspaceName: await resolveWorkspaceName(workspaceId, cfg),
|
|
233
|
+
governance: isProposed ? "proposed" : "auto",
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
// ─── Legacy engineering-memory capture ────────────────────────────────────────
|
|
11
237
|
export async function captureKnowledge(opts) {
|
|
12
238
|
try {
|
|
239
|
+
// Mutual exclusion: smart mode (positional text) and typed mode (--type/--claim)
|
|
240
|
+
// are two distinct flows. Mixing them silently drops one — fail loud instead.
|
|
241
|
+
if (opts.text !== undefined && opts.type !== undefined) {
|
|
242
|
+
console.error(chalk.red("Cannot mix smart mode (positional text) with typed mode (--type/--claim)."));
|
|
243
|
+
console.error(chalk.dim(" Use one: `synap capture \"free text\"` OR `synap capture --type gotcha --claim \"…\"`"));
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
// Smart mode: positional text with no --type
|
|
247
|
+
if (opts.text !== undefined && opts.type === undefined) {
|
|
248
|
+
await runSmartCapture(opts.text, opts);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
// Legacy mode: --type is required
|
|
252
|
+
if (!opts.type) {
|
|
253
|
+
console.error(chalk.red("Missing required option: --type <gotcha|lesson|decision|reference>"));
|
|
254
|
+
console.error(chalk.dim(" Or pass free text as a positional arg for smart capture: synap capture \"your text\""));
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
if (!opts.claim) {
|
|
258
|
+
console.error(chalk.red("Missing required option: --claim <text>"));
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
13
261
|
const cfg = await resolveHubConfig();
|
|
14
262
|
const userId = await resolveUserId(cfg);
|
|
15
|
-
|
|
263
|
+
// GLOBAL lane: pod-wide procedural runbook → knowledge_keys.
|
|
264
|
+
if (opts.global) {
|
|
265
|
+
await captureGlobalRunbook(opts, cfg, userId);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const { workspaceId, source } = await resolveKnowledgeWorkspace(opts, cfg, cfg.workspaceId);
|
|
16
269
|
if (!workspaceId) {
|
|
17
270
|
console.error(chalk.red("No workspace set. Run:\n" +
|
|
18
|
-
" synap
|
|
19
|
-
" synap use <workspace-id>
|
|
271
|
+
" synap connect (sets up memory + team workspace routing)\n" +
|
|
272
|
+
" synap use <workspace-id> (manual override)"));
|
|
20
273
|
process.exit(1);
|
|
21
274
|
}
|
|
22
275
|
const tags = opts.tags
|
|
23
276
|
? opts.tags.split(",").map((t) => t.trim()).filter(Boolean)
|
|
24
277
|
: [];
|
|
25
|
-
const
|
|
278
|
+
const title = opts.claim.slice(0, 120);
|
|
279
|
+
// Every --type entry is a typed `knowledge` entity; ek_type discriminates the
|
|
280
|
+
// kind. This is "one store, type tags" (the research-canonical pattern) — NOT a
|
|
281
|
+
// residual catch-all: each row is typed by ek_type and lives in the workspace
|
|
282
|
+
// lens that supplies its domain (so no `engineering_knowledge`). A structured
|
|
283
|
+
// decision RECORD (rationale/alternatives/status) is a different artifact, reached
|
|
284
|
+
// via smart `capture "<text>"` or `create entity --profile=decision`.
|
|
26
285
|
const res = await hubPost("/entities", {
|
|
27
286
|
userId,
|
|
28
287
|
workspaceId,
|
|
29
|
-
profileSlug: "
|
|
30
|
-
|
|
288
|
+
profileSlug: "knowledge",
|
|
289
|
+
title,
|
|
31
290
|
properties: {
|
|
32
291
|
ek_type: opts.type,
|
|
33
292
|
ek_claim: opts.claim,
|
|
@@ -36,53 +295,44 @@ export async function captureKnowledge(opts) {
|
|
|
36
295
|
...(tags.length > 0 ? { ek_tags: tags } : {}),
|
|
37
296
|
},
|
|
38
297
|
}, cfg);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
console.error(chalk.red("Error: " + e.message));
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export async function recallStructured(query, opts) {
|
|
53
|
-
try {
|
|
54
|
-
const cfg = await resolveHubConfig(opts);
|
|
55
|
-
const limit = parseInt(opts.limit ?? "10", 10);
|
|
56
|
-
const params = {
|
|
57
|
-
profileSlug: "engineering_knowledge",
|
|
58
|
-
q: query,
|
|
59
|
-
limit,
|
|
298
|
+
// Governance may queue the write as a proposal rather than creating directly
|
|
299
|
+
const isProposed = res.status === "proposed" || Boolean(res.proposalId);
|
|
300
|
+
// Declare which lane + workspace + governance this capture took, so the
|
|
301
|
+
// caller always knows where its knowledge landed.
|
|
302
|
+
const report = {
|
|
303
|
+
lane: laneFromSource(source),
|
|
304
|
+
workspaceId,
|
|
305
|
+
workspaceName: await resolveWorkspaceName(workspaceId, cfg),
|
|
306
|
+
governance: isProposed ? "proposed" : "auto",
|
|
60
307
|
};
|
|
61
|
-
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
62
|
-
if (workspaceId)
|
|
63
|
-
params.workspaceId = workspaceId;
|
|
64
|
-
if (opts.type)
|
|
65
|
-
params.type = opts.type;
|
|
66
|
-
const res = await hubGet("/entities", params, cfg);
|
|
67
|
-
const entities = (res.entities ?? res.items ?? res);
|
|
68
|
-
const list = Array.isArray(entities) ? entities : [];
|
|
69
308
|
if (opts.json) {
|
|
70
|
-
|
|
309
|
+
if (isProposed) {
|
|
310
|
+
console.log(JSON.stringify({
|
|
311
|
+
proposed: true,
|
|
312
|
+
proposalId: res.proposalId ?? res.id,
|
|
313
|
+
reviewUrl: res.reviewUrl ?? null,
|
|
314
|
+
message: "Write queued for approval — not yet stored.",
|
|
315
|
+
...laneJsonFields(report),
|
|
316
|
+
}, null, 2));
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
console.log(JSON.stringify({ id: res.id, stored: true, workspace: source, ...laneJsonFields(report) }, null, 2));
|
|
320
|
+
}
|
|
71
321
|
return;
|
|
72
322
|
}
|
|
73
|
-
if (
|
|
74
|
-
log.
|
|
75
|
-
|
|
323
|
+
if (isProposed) {
|
|
324
|
+
log.warn(`Queued for approval — not yet stored.`);
|
|
325
|
+
log.dim(` The target workspace requires human review for agent writes.`);
|
|
326
|
+
if (res.reviewUrl)
|
|
327
|
+
log.dim(` Review: ${String(res.reviewUrl)}`);
|
|
328
|
+
else
|
|
329
|
+
log.dim(` Open Synap and approve the pending proposal to persist this entry.`);
|
|
330
|
+
console.log(" " + formatLaneLine(report));
|
|
76
331
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const why = props.ek_why ? `\n why: ${props.ek_why}` : "";
|
|
82
|
-
const tags = Array.isArray(props.ek_tags) && props.ek_tags.length > 0
|
|
83
|
-
? chalk.dim(` [${props.ek_tags.join(", ")}]`)
|
|
84
|
-
: "";
|
|
85
|
-
console.log(` ${chalk.cyan(type.padEnd(10))} ${claim}${tags}${chalk.dim(why)}`);
|
|
332
|
+
else {
|
|
333
|
+
log.success(`[${opts.type}] ${opts.claim.slice(0, 80)}`);
|
|
334
|
+
log.dim(` workspace: ${source} id: ${String(res.id ?? "")}`);
|
|
335
|
+
console.log(" " + formatLaneLine(report));
|
|
86
336
|
}
|
|
87
337
|
}
|
|
88
338
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type BaseOpts } from "./data.js";
|
|
2
|
+
export declare function observeWrite(text: string, opts: BaseOpts & {
|
|
3
|
+
category?: string;
|
|
4
|
+
confidence?: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
export declare function observeRecall(query: string, opts: BaseOpts & {
|
|
7
|
+
category?: string;
|
|
8
|
+
limit?: string;
|
|
9
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { log } from "../utils/logger.js";
|
|
3
|
+
import { resolveHubConfig, hubGet, hubPost } from "../lib/hub-client.js";
|
|
4
|
+
import { parseLimit } from "./data.js";
|
|
5
|
+
const VALID_CATEGORIES = [
|
|
6
|
+
"working_style",
|
|
7
|
+
"communication",
|
|
8
|
+
"focus",
|
|
9
|
+
"technical",
|
|
10
|
+
"preference",
|
|
11
|
+
];
|
|
12
|
+
// ─── observeWrite ─────────────────────────────────────────────────────────────
|
|
13
|
+
export async function observeWrite(text, opts) {
|
|
14
|
+
try {
|
|
15
|
+
const cfg = await resolveHubConfig(opts);
|
|
16
|
+
const category = (opts.category ?? "preference");
|
|
17
|
+
if (!VALID_CATEGORIES.includes(category)) {
|
|
18
|
+
console.error(chalk.red(`Invalid category: ${category}. Must be one of: ${VALID_CATEGORIES.join(" | ")}`));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const confidence = parseFloat(opts.confidence ?? "0.5");
|
|
22
|
+
if (isNaN(confidence) || confidence < 0 || confidence > 1) {
|
|
23
|
+
console.error(chalk.red("Confidence must be a number between 0 and 1"));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const res = await hubPost("/entities", {
|
|
27
|
+
profileSlug: "user_observation",
|
|
28
|
+
title: text.slice(0, 80),
|
|
29
|
+
properties: {
|
|
30
|
+
uo_observation: text,
|
|
31
|
+
uo_category: category,
|
|
32
|
+
uo_confidence: confidence,
|
|
33
|
+
uo_validated: false,
|
|
34
|
+
},
|
|
35
|
+
}, cfg);
|
|
36
|
+
if (opts.json) {
|
|
37
|
+
console.log(JSON.stringify(res, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const id = String(res.id ?? res.entityId ?? "");
|
|
41
|
+
log.success(`Observation recorded ${chalk.dim(id.slice(0, 8))}`);
|
|
42
|
+
log.dim(` category: ${category} confidence: ${confidence}`);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.error(chalk.red("Error: " + e.message));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ─── observeRecall ────────────────────────────────────────────────────────────
|
|
50
|
+
export async function observeRecall(query, opts) {
|
|
51
|
+
try {
|
|
52
|
+
const cfg = await resolveHubConfig(opts);
|
|
53
|
+
const limit = parseLimit(opts.limit, 10);
|
|
54
|
+
const params = {
|
|
55
|
+
profileSlug: "user_observation",
|
|
56
|
+
q: query,
|
|
57
|
+
limit,
|
|
58
|
+
};
|
|
59
|
+
const res = await hubGet("/entities", params, cfg);
|
|
60
|
+
let entities = (res.entities ?? res.items ?? (Array.isArray(res) ? res : []));
|
|
61
|
+
if (opts.category) {
|
|
62
|
+
entities = entities.filter((e) => {
|
|
63
|
+
const props = e.properties;
|
|
64
|
+
return props?.uo_category === opts.category;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
console.log(JSON.stringify({ entities }, null, 2));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (entities.length === 0) {
|
|
72
|
+
log.dim("No observations found.");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
log.heading(`${entities.length} observation${entities.length !== 1 ? "s" : ""}`);
|
|
76
|
+
log.blank();
|
|
77
|
+
for (const e of entities) {
|
|
78
|
+
const props = (e.properties ?? {});
|
|
79
|
+
const category = chalk.cyan(String(props.uo_category ?? "preference"));
|
|
80
|
+
const observation = String(props.uo_observation ?? e.title ?? "");
|
|
81
|
+
const confidence = Number(props.uo_confidence ?? 0.5).toFixed(2);
|
|
82
|
+
log.info(`${category} ${chalk.dim(`conf:${confidence}`)} ${observation}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
console.error(chalk.red("Error: " + e.message));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap open entity <id>
|
|
3
|
+
* synap open view <id>
|
|
4
|
+
*
|
|
5
|
+
* Sends a synap:// deep link to the Electron browser app, which opens the
|
|
6
|
+
* entity or view in the UI. Works from any terminal — the OS routes the URL
|
|
7
|
+
* to the registered synap:// protocol handler.
|
|
8
|
+
*
|
|
9
|
+
* Requires the Synap desktop app to be running.
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenOpts {
|
|
12
|
+
kind: "entity" | "view" | "cell" | "document";
|
|
13
|
+
id: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function openInBrowser(opts: OpenOpts): Promise<void>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap open entity <id>
|
|
3
|
+
* synap open view <id>
|
|
4
|
+
*
|
|
5
|
+
* Sends a synap:// deep link to the Electron browser app, which opens the
|
|
6
|
+
* entity or view in the UI. Works from any terminal — the OS routes the URL
|
|
7
|
+
* to the registered synap:// protocol handler.
|
|
8
|
+
*
|
|
9
|
+
* Requires the Synap desktop app to be running.
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from "child_process";
|
|
12
|
+
import { log } from "../utils/logger.js";
|
|
13
|
+
function buildDeepLink(kind, id) {
|
|
14
|
+
return `synap://open/${kind}/${encodeURIComponent(id)}`;
|
|
15
|
+
}
|
|
16
|
+
function openUrl(url) {
|
|
17
|
+
const platform = process.platform;
|
|
18
|
+
if (platform === "darwin") {
|
|
19
|
+
execSync(`open "${url}"`);
|
|
20
|
+
}
|
|
21
|
+
else if (platform === "linux") {
|
|
22
|
+
execSync(`xdg-open "${url}"`);
|
|
23
|
+
}
|
|
24
|
+
else if (platform === "win32") {
|
|
25
|
+
execSync(`start "" "${url}"`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function openInBrowser(opts) {
|
|
32
|
+
try {
|
|
33
|
+
const url = buildDeepLink(opts.kind, opts.id);
|
|
34
|
+
openUrl(url);
|
|
35
|
+
log.success(`Opened ${opts.kind} in browser: ${opts.id.slice(0, 8)}…`);
|
|
36
|
+
log.dim(` (${url})`);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
log.error(`Could not open browser: ${e.message}\n` +
|
|
40
|
+
` Make sure the Synap desktop app is running.`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAOzC,SAAS,aAAa,CAAC,IAA6C,EAAE,EAAU;IAC9E,OAAO,gBAAgB,IAAI,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CACP,2BAA4B,CAAW,CAAC,OAAO,IAAI;YACjD,+CAA+C,CAClD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/commands/pods.d.ts
CHANGED
|
@@ -15,3 +15,8 @@ export declare function podsUse(name: string, opts?: {
|
|
|
15
15
|
}): Promise<void>;
|
|
16
16
|
export declare function podsSwitch(name?: string): Promise<void>;
|
|
17
17
|
export declare function podsRemove(name: string): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Re-run the browser auth flow against an already-saved pod URL.
|
|
20
|
+
* Lets users refresh a broken/expired API key without re-entering the pod URL.
|
|
21
|
+
*/
|
|
22
|
+
export declare function podsReconnect(name?: string): Promise<void>;
|