@synap-core/cli 1.7.0 → 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.
Files changed (115) hide show
  1. package/dist/commands/agent-run.d.ts +47 -0
  2. package/dist/commands/agent-run.js +302 -0
  3. package/dist/commands/agent-run.js.map +1 -0
  4. package/dist/commands/artifact.d.ts +26 -0
  5. package/dist/commands/artifact.js +76 -0
  6. package/dist/commands/artifact.js.map +1 -0
  7. package/dist/commands/automation.d.ts +47 -0
  8. package/dist/commands/automation.js +600 -0
  9. package/dist/commands/automation.js.map +1 -0
  10. package/dist/commands/cell.d.ts +55 -0
  11. package/dist/commands/cell.js +277 -0
  12. package/dist/commands/cell.js.map +1 -0
  13. package/dist/commands/connect.js +41 -7
  14. package/dist/commands/connect.js.map +1 -1
  15. package/dist/commands/connections.js +0 -16
  16. package/dist/commands/connections.js.map +1 -1
  17. package/dist/commands/connectors.d.ts +31 -0
  18. package/dist/commands/connectors.js +276 -0
  19. package/dist/commands/connectors.js.map +1 -0
  20. package/dist/commands/context.d.ts +22 -0
  21. package/dist/commands/context.js +151 -0
  22. package/dist/commands/context.js.map +1 -0
  23. package/dist/commands/data-extra.d.ts +13 -0
  24. package/dist/commands/data-extra.js +161 -0
  25. package/dist/commands/data-extra.js.map +1 -0
  26. package/dist/commands/data.d.ts +13 -9
  27. package/dist/commands/data.js +213 -109
  28. package/dist/commands/data.js.map +1 -1
  29. package/dist/commands/doc.d.ts +39 -0
  30. package/dist/commands/doc.js +130 -0
  31. package/dist/commands/doc.js.map +1 -0
  32. package/dist/commands/events.d.ts +26 -0
  33. package/dist/commands/events.js +68 -0
  34. package/dist/commands/events.js.map +1 -0
  35. package/dist/commands/explain.d.ts +21 -0
  36. package/dist/commands/explain.js +248 -0
  37. package/dist/commands/explain.js.map +1 -0
  38. package/dist/commands/graph.d.ts +18 -0
  39. package/dist/commands/graph.js +73 -0
  40. package/dist/commands/graph.js.map +1 -0
  41. package/dist/commands/home.d.ts +12 -0
  42. package/dist/commands/home.js +54 -0
  43. package/dist/commands/home.js.map +1 -0
  44. package/dist/commands/init.d.ts +0 -2
  45. package/dist/commands/init.js +62 -102
  46. package/dist/commands/init.js.map +1 -1
  47. package/dist/commands/keys.d.ts +9 -0
  48. package/dist/commands/keys.js +79 -0
  49. package/dist/commands/keys.js.map +1 -0
  50. package/dist/commands/knowledge.d.ts +32 -18
  51. package/dist/commands/knowledge.js +301 -55
  52. package/dist/commands/knowledge.js.map +1 -1
  53. package/dist/commands/observe.d.ts +9 -0
  54. package/dist/commands/observe.js +90 -0
  55. package/dist/commands/observe.js.map +1 -0
  56. package/dist/commands/open.d.ts +15 -0
  57. package/dist/commands/open.js +44 -0
  58. package/dist/commands/open.js.map +1 -0
  59. package/dist/commands/pods.d.ts +5 -0
  60. package/dist/commands/pods.js +85 -37
  61. package/dist/commands/pods.js.map +1 -1
  62. package/dist/commands/proposals-actions.d.ts +7 -0
  63. package/dist/commands/proposals-actions.js +40 -0
  64. package/dist/commands/proposals-actions.js.map +1 -0
  65. package/dist/commands/providers.d.ts +38 -0
  66. package/dist/commands/providers.js +170 -0
  67. package/dist/commands/providers.js.map +1 -0
  68. package/dist/commands/sessions.d.ts +31 -0
  69. package/dist/commands/sessions.js +224 -0
  70. package/dist/commands/sessions.js.map +1 -0
  71. package/dist/commands/skills-commands.d.ts +26 -0
  72. package/dist/commands/skills-commands.js +186 -0
  73. package/dist/commands/skills-commands.js.map +1 -0
  74. package/dist/commands/skills.d.ts +26 -0
  75. package/dist/commands/skills.js +195 -0
  76. package/dist/commands/skills.js.map +1 -0
  77. package/dist/commands/status.js +68 -30
  78. package/dist/commands/status.js.map +1 -1
  79. package/dist/commands/subscribe.d.ts +19 -0
  80. package/dist/commands/subscribe.js +91 -0
  81. package/dist/commands/subscribe.js.map +1 -0
  82. package/dist/commands/view.d.ts +57 -0
  83. package/dist/commands/view.js +194 -0
  84. package/dist/commands/view.js.map +1 -0
  85. package/dist/index.d.ts +3 -4
  86. package/dist/index.js +812 -206
  87. package/dist/index.js.map +1 -1
  88. package/dist/lib/agent-templates.d.ts +25 -0
  89. package/dist/lib/agent-templates.js +148 -0
  90. package/dist/lib/agent-templates.js.map +1 -0
  91. package/dist/lib/agents-config.d.ts +4 -1
  92. package/dist/lib/agents-config.js +19 -2
  93. package/dist/lib/agents-config.js.map +1 -1
  94. package/dist/lib/capture-lane.d.ts +49 -0
  95. package/dist/lib/capture-lane.js +79 -0
  96. package/dist/lib/capture-lane.js.map +1 -0
  97. package/dist/lib/hub-client.d.ts +6 -0
  98. package/dist/lib/hub-client.js +31 -3
  99. package/dist/lib/hub-client.js.map +1 -1
  100. package/dist/lib/pod.d.ts +14 -1
  101. package/dist/lib/pod.js +24 -2
  102. package/dist/lib/pod.js.map +1 -1
  103. package/dist/lib/skills-installer.d.ts +1 -1
  104. package/dist/lib/skills-installer.js +1 -1
  105. package/dist/lib/skills-installer.js.map +1 -1
  106. package/dist/lib/targets.d.ts +17 -1
  107. package/dist/lib/targets.js +713 -63
  108. package/dist/lib/targets.js.map +1 -1
  109. package/package.json +2 -1
  110. package/skills/synap/SKILL.md +357 -82
  111. package/skills/synap-ui/SKILL.md +12 -9
  112. package/dist/lib/templates.d.ts +0 -11
  113. package/dist/lib/templates.js +0 -13
  114. package/dist/lib/templates.js.map +0 -1
  115. package/dist/templates/agent-os.json +0 -3090
@@ -0,0 +1,276 @@
1
+ /**
2
+ * synap connectors — Manage pod connector integrations (Nango-powered)
3
+ *
4
+ * Subcommands: list, sync, disconnect, schema
5
+ * Top-level alias: synap connect [service]
6
+ */
7
+ import chalk from "chalk";
8
+ import ora from "ora";
9
+ import prompts from "prompts";
10
+ import { exec } from "child_process";
11
+ import { mkdirSync, writeFileSync, existsSync } from "fs";
12
+ import { resolveHubConfig, hubGet, hubPost } from "../lib/hub-client.js";
13
+ import { log } from "../utils/logger.js";
14
+ // ── Helpers ───────────────────────────────────────────────────────────────────
15
+ function openBrowser(url) {
16
+ const platform = process.platform;
17
+ let cmd;
18
+ if (platform === "darwin") {
19
+ cmd = `open "${url}"`;
20
+ }
21
+ else if (platform === "win32") {
22
+ cmd = `start "" "${url}"`;
23
+ }
24
+ else {
25
+ cmd = `xdg-open "${url}"`;
26
+ }
27
+ try {
28
+ exec(cmd);
29
+ }
30
+ catch {
31
+ // silently ignore — caller already prints the URL
32
+ }
33
+ }
34
+ async function fetchProviders(cfg, workspaceId) {
35
+ const params = {};
36
+ if (workspaceId)
37
+ params.workspaceId = workspaceId;
38
+ const res = await hubGet("/connectors/providers", params, cfg);
39
+ const r = res;
40
+ return (r.providers ?? []);
41
+ }
42
+ export async function connectorsConnect(service, opts) {
43
+ let cfg;
44
+ try {
45
+ cfg = await resolveHubConfig({ podUrl: opts.podUrl, apiKey: opts.apiKey });
46
+ }
47
+ catch (err) {
48
+ log.error(err.message);
49
+ process.exit(1);
50
+ }
51
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
52
+ const spinner = ora({ text: "Starting OAuth session…", color: "cyan" }).start();
53
+ let redirectUrl;
54
+ try {
55
+ const body = {};
56
+ if (service)
57
+ body.providerId = service;
58
+ if (workspaceId)
59
+ body.workspaceId = workspaceId;
60
+ const res = await hubPost("/connectors/session", body, cfg);
61
+ const r = res;
62
+ redirectUrl = String(r.redirectUrl);
63
+ spinner.stop();
64
+ }
65
+ catch (err) {
66
+ spinner.fail(chalk.red("Failed to start connector session"));
67
+ log.error(err.message);
68
+ process.exit(1);
69
+ }
70
+ log.heading(`Connect to ${service ?? "external services"}`);
71
+ console.log();
72
+ console.log(` Opening OAuth flow in your browser…`);
73
+ console.log(` ${chalk.dim("If it didn't open, paste this URL in your browser:")}`);
74
+ console.log();
75
+ console.log(` ${chalk.underline(chalk.cyan(redirectUrl))}`);
76
+ console.log();
77
+ openBrowser(redirectUrl);
78
+ log.dim(`Once connected, records will import automatically. Run \`synap connectors list\` to check status.`);
79
+ }
80
+ export async function connectorsList(opts) {
81
+ let cfg;
82
+ try {
83
+ cfg = await resolveHubConfig();
84
+ }
85
+ catch (err) {
86
+ log.error(err.message);
87
+ process.exit(1);
88
+ }
89
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
90
+ const spinner = opts.json ? null : ora({ text: "Fetching connectors…", color: "cyan" }).start();
91
+ let providers;
92
+ try {
93
+ providers = await fetchProviders(cfg, workspaceId);
94
+ spinner?.stop();
95
+ }
96
+ catch (err) {
97
+ spinner?.fail(chalk.red("Failed to fetch connectors"));
98
+ log.error(err.message);
99
+ process.exit(1);
100
+ }
101
+ if (opts.json) {
102
+ console.log(JSON.stringify({ providers }, null, 2));
103
+ return;
104
+ }
105
+ if (providers.length === 0) {
106
+ log.warn("No connectors configured on this pod.");
107
+ log.dim(`Set up Nango at ${cfg.podUrl}/admin/settings.`);
108
+ return;
109
+ }
110
+ const connected = providers.filter((p) => p.connected);
111
+ log.heading(`Connected Services (${connected.length} connected / ${providers.length} total)`);
112
+ console.log();
113
+ for (const p of providers) {
114
+ const dot = p.connected ? chalk.green("●") : chalk.dim("○");
115
+ const name = p.connected ? chalk.bold(p.displayName) : chalk.dim(p.displayName);
116
+ const id = chalk.dim(`(${p.provider})`);
117
+ const connLine = p.connected && p.connectionId ? ` ${chalk.dim(p.connectionId)}` : "";
118
+ console.log(` ${dot} ${name} ${id}${connLine}`);
119
+ }
120
+ console.log();
121
+ }
122
+ export async function connectorsSync(provider, opts) {
123
+ let cfg;
124
+ try {
125
+ cfg = await resolveHubConfig();
126
+ }
127
+ catch (err) {
128
+ log.error(err.message);
129
+ process.exit(1);
130
+ }
131
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
132
+ // Find the connectionId
133
+ let connectionId;
134
+ try {
135
+ const providers = await fetchProviders(cfg, workspaceId);
136
+ const match = providers.find((p) => p.provider === provider || p.id === provider || p.displayName.toLowerCase() === provider.toLowerCase());
137
+ if (!match || !match.connected) {
138
+ log.error(`Provider ${chalk.bold(provider)} is not connected. Run: ${chalk.cyan(`synap connect ${provider}`)}`);
139
+ process.exit(1);
140
+ }
141
+ connectionId = match.connectionId;
142
+ }
143
+ catch (err) {
144
+ log.error(err.message);
145
+ process.exit(1);
146
+ }
147
+ const spinner = ora({ text: "Triggering sync…", color: "cyan" }).start();
148
+ try {
149
+ await hubPost("/connectors/actions", { connectionId, providerConfigKey: provider, actionName: "sync", input: {} }, cfg);
150
+ spinner.succeed(chalk.green(`Sync triggered for ${chalk.bold(provider)}. Records will import in the background.`));
151
+ }
152
+ catch (err) {
153
+ const msg = err.message;
154
+ // Non-200 may mean manual sync not configured — handle gracefully
155
+ spinner.warn(chalk.yellow(`Sync triggered (manual sync may not be configured for this provider — automatic sync runs on the Nango schedule)`));
156
+ log.dim(msg);
157
+ }
158
+ }
159
+ export async function connectorsDisconnect(provider, opts) {
160
+ let cfg;
161
+ try {
162
+ cfg = await resolveHubConfig();
163
+ }
164
+ catch (err) {
165
+ log.error(err.message);
166
+ process.exit(1);
167
+ }
168
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
169
+ // Find the connectionId
170
+ let connectionId;
171
+ try {
172
+ const providers = await fetchProviders(cfg, workspaceId);
173
+ const match = providers.find((p) => p.provider === provider || p.id === provider || p.displayName.toLowerCase() === provider.toLowerCase());
174
+ if (!match || !match.connected) {
175
+ log.error(`Provider ${chalk.bold(provider)} is not connected.`);
176
+ process.exit(1);
177
+ }
178
+ connectionId = match.connectionId;
179
+ }
180
+ catch (err) {
181
+ log.error(err.message);
182
+ process.exit(1);
183
+ }
184
+ if (!opts.force) {
185
+ const response = await prompts({
186
+ type: "confirm",
187
+ name: "confirmed",
188
+ message: `Disconnect ${provider}? This will stop syncing but won't delete imported entities.`,
189
+ initial: false,
190
+ });
191
+ if (!response.confirmed) {
192
+ log.dim("Cancelled.");
193
+ return;
194
+ }
195
+ }
196
+ const spinner = ora({ text: `Disconnecting ${provider}…`, color: "cyan" }).start();
197
+ try {
198
+ await hubPost("/connectors/disconnect", { connectionId, provider }, cfg);
199
+ spinner.succeed(chalk.green(`Disconnected ${chalk.bold(provider)}. Your imported entities remain intact.`));
200
+ }
201
+ catch (err) {
202
+ spinner.fail(chalk.red(`Failed to disconnect ${provider}`));
203
+ log.error(err.message);
204
+ process.exit(1);
205
+ }
206
+ }
207
+ export async function connectorsSchema(opts) {
208
+ let cfg;
209
+ try {
210
+ cfg = await resolveHubConfig();
211
+ }
212
+ catch (err) {
213
+ log.error(err.message);
214
+ process.exit(1);
215
+ }
216
+ const spinner = opts.json ? null : ora({ text: "Fetching connector schema…", color: "cyan" }).start();
217
+ let schema;
218
+ try {
219
+ schema = await hubGet("/connectors/schema", {}, cfg);
220
+ spinner?.stop();
221
+ }
222
+ catch (err) {
223
+ spinner?.fail(chalk.red("Failed to fetch connector schema"));
224
+ log.error(err.message);
225
+ process.exit(1);
226
+ }
227
+ if (opts.json) {
228
+ console.log(JSON.stringify(schema, null, 2));
229
+ return;
230
+ }
231
+ const s = schema;
232
+ const md = buildConnectorSchemaMarkdown(s, cfg.podUrl);
233
+ if (opts.writeContext !== undefined && opts.writeContext !== false) {
234
+ const outputPath = typeof opts.writeContext === "string" && opts.writeContext.length > 0
235
+ ? opts.writeContext
236
+ : ".claude/CONNECTOR_CONTEXT.md";
237
+ const dir = outputPath.includes("/") ? outputPath.split("/").slice(0, -1).join("/") : ".";
238
+ if (dir && dir !== "." && !existsSync(dir)) {
239
+ mkdirSync(dir, { recursive: true });
240
+ }
241
+ writeFileSync(outputPath, md, "utf-8");
242
+ log.success(`Context written to ${chalk.underline(outputPath)} — Claude Code will auto-load this in all sessions from this directory`);
243
+ }
244
+ else {
245
+ console.log(md);
246
+ }
247
+ }
248
+ function buildConnectorSchemaMarkdown(schema, podUrl) {
249
+ const lines = [
250
+ `# Synap Connector Reference`,
251
+ ``,
252
+ `> Fetched from pod: ${podUrl} — use this context to connect, manage, and query external service integrations.`,
253
+ ``,
254
+ `## Supported Providers`,
255
+ ];
256
+ const providers = (schema.providers ?? schema.supported ?? []);
257
+ if (providers.length > 0) {
258
+ for (const p of providers) {
259
+ lines.push(``, `### ${p.displayName ?? p.provider ?? p.id}`);
260
+ if (p.description)
261
+ lines.push(``, String(p.description));
262
+ if (p.actions) {
263
+ lines.push(``, `**Available actions:**`);
264
+ for (const action of p.actions) {
265
+ lines.push(`- \`${action}\``);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ else {
271
+ lines.push(``, `Providers are configured in Nango. Common integrations include:`, `- Google Workspace (gmail, google-calendar, google-drive)`, `- GitHub (github)`, `- Notion (notion)`, `- Linear (linear)`, `- Slack (slack)`, `- HubSpot (hubspot)`);
272
+ }
273
+ lines.push(``, `## CLI Commands`, ``, `\`\`\`bash`, `# Connect a service (opens OAuth flow in browser)`, `synap connect [service]`, `synap connect google`, `synap connect github`, ``, `# List all connectors and connection status`, `synap connectors list`, `synap connectors list --json`, ``, `# Trigger a manual sync for a connected provider`, `synap connectors sync <provider>`, ``, `# Disconnect a provider`, `synap connectors disconnect <provider>`, `synap connectors disconnect google --force`, ``, `# Fetch this schema`, `synap connectors schema`, `synap connectors schema --write-context # writes to .claude/CONNECTOR_CONTEXT.md`, `\`\`\``, ``, `## Hub REST Endpoints`, ``, `| Method | Path | Description |`, `|--------|------|-------------|`, `| GET | /api/hub/connectors/providers | List providers and connection status |`, `| POST | /api/hub/connectors/session | Start OAuth session, get redirectUrl |`, `| POST | /api/hub/connectors/disconnect | Disconnect a provider |`, `| GET | /api/hub/connectors/schema | This schema |`, `| POST | /api/hub/connectors/actions | Trigger a provider action (e.g. sync) |`, ``, `## AI Usage Flow`, ``, `1. Check connected services: \`synap connectors list\``, `2. Connect a new service: \`synap connect <provider>\` — opens OAuth in browser`, `3. Once connected, records import automatically on Nango's schedule`, `4. Trigger immediate import: \`synap connectors sync <provider>\``, `5. Query imported entities: \`synap ask "meeting notes from Google Calendar"\``);
274
+ return lines.join("\n");
275
+ }
276
+ //# sourceMappingURL=connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.js","sourceRoot":"","sources":["../../src/commands/connectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * synap context
3
+ *
4
+ * Emit a session-start context summary: recent engineering knowledge,
5
+ * open proposals, active tasks. Designed for injection into CLAUDE.md or
6
+ * as JSON for agents to consume at session start.
7
+ *
8
+ * Usage:
9
+ * synap context # markdown output
10
+ * synap context --json # NDJSON (one object per section)
11
+ * synap context --repo synap-backend # filter knowledge by repo tag
12
+ * synap context --limit 5 # entries per section (default: 5)
13
+ */
14
+ export interface ContextOpts {
15
+ repo?: string;
16
+ limit?: string;
17
+ json?: boolean;
18
+ podUrl?: string;
19
+ apiKey?: string;
20
+ workspace?: string;
21
+ }
22
+ export declare function contextSummary(opts: ContextOpts): Promise<void>;
@@ -0,0 +1,151 @@
1
+ /**
2
+ * synap context
3
+ *
4
+ * Emit a session-start context summary: recent engineering knowledge,
5
+ * open proposals, active tasks. Designed for injection into CLAUDE.md or
6
+ * as JSON for agents to consume at session start.
7
+ *
8
+ * Usage:
9
+ * synap context # markdown output
10
+ * synap context --json # NDJSON (one object per section)
11
+ * synap context --repo synap-backend # filter knowledge by repo tag
12
+ * synap context --limit 5 # entries per section (default: 5)
13
+ */
14
+ import chalk from "chalk";
15
+ import { log } from "../utils/logger.js";
16
+ import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
17
+ import { getAgentWorkspaceRouting } from "../lib/pod.js";
18
+ async function fetchEntities(cfg, params, workspaceId) {
19
+ try {
20
+ if (workspaceId)
21
+ params.workspaceId = workspaceId;
22
+ const res = await hubGet("/entities", params, cfg);
23
+ const items = (res.entities ?? res.items ?? res);
24
+ return Array.isArray(items) ? items : [];
25
+ }
26
+ catch {
27
+ return [];
28
+ }
29
+ }
30
+ async function fetchProposals(cfg, workspaceId, limit) {
31
+ try {
32
+ const params = { status: "pending", limit };
33
+ if (workspaceId)
34
+ params.workspaceId = workspaceId;
35
+ const res = await hubGet("/proposals", params, cfg);
36
+ const items = (res.proposals ?? res.items ?? res);
37
+ return Array.isArray(items) ? items : [];
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ }
43
+ async function fetchSessions(cfg, workspaceId, limit) {
44
+ try {
45
+ const params = { status: "active", limit };
46
+ if (workspaceId)
47
+ params.workspaceId = workspaceId;
48
+ const res = await hubGet("/focus-sessions", params, cfg);
49
+ const items = (res.sessions ?? res.items ?? res);
50
+ return Array.isArray(items) ? items : [];
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ export async function contextSummary(opts) {
57
+ try {
58
+ const cfg = await resolveHubConfig(opts);
59
+ const limit = parseInt(opts.limit ?? "5", 10);
60
+ // Resolve workspace: explicit > agent routing memory workspace > cfg active
61
+ const routing = getAgentWorkspaceRouting();
62
+ const workspaceId = opts.workspace ??
63
+ routing?.memoryWorkspaceId ??
64
+ cfg.workspaceId;
65
+ const [rawKnowledge, proposals, tasks, sessions] = await Promise.all([
66
+ fetchEntities(cfg, { profileSlug: "knowledge", limit }, workspaceId),
67
+ fetchProposals(cfg, workspaceId, limit),
68
+ fetchEntities(cfg, { profileSlug: "task", limit, status: "todo" }, workspaceId),
69
+ fetchSessions(cfg, workspaceId, limit),
70
+ ]);
71
+ // Filter knowledge by repo tag if requested
72
+ const knowledge = opts.repo
73
+ ? rawKnowledge.filter((item) => {
74
+ const tags = (item.properties?.ek_tags ?? []);
75
+ if (!Array.isArray(tags))
76
+ return false;
77
+ return tags.some((t) => {
78
+ const tag = String(t);
79
+ return tag === opts.repo || tag === `repo:${opts.repo}`;
80
+ });
81
+ })
82
+ : rawKnowledge;
83
+ if (opts.json) {
84
+ console.log(JSON.stringify({ section: "knowledge", items: knowledge }));
85
+ console.log(JSON.stringify({ section: "proposals", items: proposals }));
86
+ console.log(JSON.stringify({ section: "tasks", items: tasks }));
87
+ console.log(JSON.stringify({ section: "sessions", items: sessions }));
88
+ return;
89
+ }
90
+ // ── Markdown output ────────────────────────────────────────────────────
91
+ // Knowledge
92
+ console.log(chalk.bold("\n## Engineering Knowledge"));
93
+ if (knowledge.length === 0) {
94
+ console.log(chalk.dim(" (none)"));
95
+ }
96
+ else {
97
+ for (const item of knowledge) {
98
+ const props = (item.properties ?? {});
99
+ const type = String(props.ek_type ?? "–");
100
+ const claim = String(props.ek_claim ?? item.name ?? "–");
101
+ const tags = Array.isArray(props.ek_tags) && props.ek_tags.length > 0
102
+ ? chalk.dim(` [${props.ek_tags.join(", ")}]`)
103
+ : "";
104
+ console.log(`- [${type}] ${claim}${tags}`);
105
+ }
106
+ }
107
+ // Proposals
108
+ console.log(chalk.bold(`\n## Open Proposals (${proposals.length} pending)`));
109
+ if (proposals.length === 0) {
110
+ console.log(chalk.dim(" (none)"));
111
+ }
112
+ else {
113
+ for (const item of proposals) {
114
+ const title = String(item.title ?? item.name ?? "–");
115
+ const ws = String(item.workspaceName ?? item.workspace ?? "");
116
+ const wsPart = ws ? ` — workspace: ${ws}` : "";
117
+ console.log(`- ${title}${wsPart}`);
118
+ }
119
+ }
120
+ // Tasks
121
+ console.log(chalk.bold(`\n## Active Tasks (${tasks.length})`));
122
+ if (tasks.length === 0) {
123
+ console.log(chalk.dim(" (none)"));
124
+ }
125
+ else {
126
+ for (const item of tasks) {
127
+ const props = (item.properties ?? {});
128
+ const name = String(props.task_title ?? item.name ?? "–");
129
+ console.log(`- ${name}`);
130
+ }
131
+ }
132
+ // Focus sessions
133
+ console.log(chalk.bold(`\n## Active Focus Sessions (${sessions.length})`));
134
+ if (sessions.length === 0) {
135
+ console.log(chalk.dim(" (none)"));
136
+ }
137
+ else {
138
+ for (const s of sessions) {
139
+ const progress = typeof s.progress === "number" ? ` ${chalk.dim(`[${s.progress}%]`)}` : "";
140
+ const id = String(s.id ?? "").slice(0, 8);
141
+ console.log(`- ${chalk.cyan(id)}${progress} ${String(s.goal ?? "")}`);
142
+ }
143
+ }
144
+ console.log("");
145
+ }
146
+ catch (e) {
147
+ log.error("Error: " + e.message);
148
+ process.exit(1);
149
+ }
150
+ }
151
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type BaseOpts } from "./data.js";
2
+ export declare function showEntity(id: string, opts: BaseOpts & {
3
+ workspace?: string;
4
+ }): Promise<void>;
5
+ export declare function listProposals(opts: BaseOpts & {
6
+ workspace?: string;
7
+ limit?: string;
8
+ }): Promise<void>;
9
+ export declare function browseEntities(opts: BaseOpts & {
10
+ workspace?: string;
11
+ profile?: string;
12
+ limit?: string;
13
+ }): Promise<void>;
@@ -0,0 +1,161 @@
1
+ import chalk from "chalk";
2
+ import { log } from "../utils/logger.js";
3
+ import { resolveHubConfig, resolveUserId, hubGet } from "../lib/hub-client.js";
4
+ import { parseLimit } from "./data.js";
5
+ // ─── showEntity ───────────────────────────────────────────────────────────────
6
+ // Entity details + its relations in one shot.
7
+ export async function showEntity(id, opts) {
8
+ try {
9
+ const cfg = await resolveHubConfig(opts);
10
+ const userId = await resolveUserId(cfg);
11
+ const [entityRes, relationsRes] = await Promise.allSettled([
12
+ hubGet(`/entities/${id}`, { userId }, cfg),
13
+ hubGet(`/entities/${id}/relations`, { userId, limit: 50 }, cfg),
14
+ ]);
15
+ if (entityRes.status === "rejected") {
16
+ console.error(chalk.red(`Entity not found: ${id}`));
17
+ process.exit(1);
18
+ }
19
+ const entity = entityRes.value;
20
+ const relData = relationsRes.status === "fulfilled"
21
+ ? relationsRes.value
22
+ : {};
23
+ const relations = (relData.relations ?? relData.items ?? (Array.isArray(relData) ? relData : []));
24
+ if (opts.json) {
25
+ console.log(JSON.stringify({ entity, relations }, null, 2));
26
+ return;
27
+ }
28
+ log.heading(String(entity.title ?? id));
29
+ log.info(`Profile : ${String(entity.profileSlug ?? entity.profile ?? "")}`);
30
+ log.info(`ID : ${String(entity.id ?? id)}`);
31
+ const props = entity.properties;
32
+ if (props && Object.keys(props).length > 0) {
33
+ log.blank();
34
+ log.heading("Properties");
35
+ for (const [k, v] of Object.entries(props)) {
36
+ if (v !== null && v !== undefined && v !== "") {
37
+ log.info(`${k}: ${String(v)}`);
38
+ }
39
+ }
40
+ }
41
+ if (relations.length > 0) {
42
+ log.blank();
43
+ log.heading(`Relations (${relations.length})`);
44
+ for (const rel of relations) {
45
+ const r = rel;
46
+ const type = String(r.type ?? r.relationType ?? "related");
47
+ const otherId = String(r.targetEntityId ?? r.sourceEntityId ?? r.entityId ?? "");
48
+ const otherTitle = String(r.targetTitle ?? r.sourceTitle ?? r.title ?? otherId.slice(0, 8));
49
+ const direction = r.targetEntityId === id ? "←" : "→";
50
+ log.info(`${direction} ${chalk.cyan(type)} ${otherTitle} ${chalk.dim(otherId.slice(0, 8))}`);
51
+ }
52
+ }
53
+ else {
54
+ log.blank();
55
+ log.dim("No relations. Link with: synap create relation --source <id> --target <id> --type <type>");
56
+ }
57
+ }
58
+ catch (e) {
59
+ console.error(chalk.red("Error: " + e.message));
60
+ process.exit(1);
61
+ }
62
+ }
63
+ // ─── listProposals ────────────────────────────────────────────────────────────
64
+ // Pending proposals attributed to this agent — the governance inbox.
65
+ export async function listProposals(opts) {
66
+ try {
67
+ const cfg = await resolveHubConfig(opts);
68
+ const limit = parseLimit(opts.limit, 20);
69
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
70
+ const res = await hubGet("/proposals", {
71
+ status: "pending",
72
+ ...(workspaceId ? { workspaceId } : {}),
73
+ limit,
74
+ }, cfg);
75
+ const proposals = (res.proposals ?? res.items ?? (Array.isArray(res) ? res : []));
76
+ if (opts.json) {
77
+ console.log(JSON.stringify({ proposals }, null, 2));
78
+ return;
79
+ }
80
+ if (proposals.length === 0) {
81
+ log.success("No pending proposals.");
82
+ return;
83
+ }
84
+ log.heading(`${proposals.length} pending proposal${proposals.length !== 1 ? "s" : ""}`);
85
+ log.blank();
86
+ for (const p of proposals) {
87
+ const prop = p;
88
+ const id = String(prop.id ?? "").slice(0, 8);
89
+ const action = String(prop.action ?? prop.type ?? "write");
90
+ const subject = String(prop.subjectType ?? prop.subject ?? "entity");
91
+ // prefer human-readable summary; fall back to action description
92
+ const entityTitle = String(prop.entityTitle ?? prop.title ?? "");
93
+ const summary = String(prop.summary ?? prop.reasoning ?? prop.description ?? "");
94
+ const label = entityTitle
95
+ ? `${entityTitle} — ${subject}.${action}`
96
+ : summary || `${subject}.${action}`;
97
+ const reviewUrl = prop.reviewUrl ? String(prop.reviewUrl) : null;
98
+ log.info(`${chalk.yellow("●")} ${label} ${chalk.dim(id)}`);
99
+ if (entityTitle && summary)
100
+ log.dim(` ${summary.slice(0, 100)}`);
101
+ if (reviewUrl)
102
+ log.dim(` Review: ${reviewUrl}`);
103
+ }
104
+ }
105
+ catch (e) {
106
+ console.error(chalk.red("Error: " + e.message));
107
+ process.exit(1);
108
+ }
109
+ }
110
+ // ─── browseEntities ───────────────────────────────────────────────────────────
111
+ // Paginated entity list — cleaner than `list entities`, shows title + date.
112
+ export async function browseEntities(opts) {
113
+ try {
114
+ const cfg = await resolveHubConfig(opts);
115
+ const userId = await resolveUserId(cfg);
116
+ const limit = parseLimit(opts.limit, 20);
117
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
118
+ const params = { userId, limit };
119
+ if (workspaceId)
120
+ params.workspaceId = workspaceId;
121
+ if (opts.profile)
122
+ params.profileSlug = opts.profile;
123
+ const res = await hubGet("/entities", params, cfg);
124
+ const entities = (res.entities ?? res.items ?? (Array.isArray(res) ? res : []));
125
+ const total = Number(res.total ?? entities.length);
126
+ if (opts.json) {
127
+ console.log(JSON.stringify({ total, entities }, null, 2));
128
+ return;
129
+ }
130
+ if (entities.length === 0) {
131
+ log.dim("Nothing here yet.");
132
+ if (opts.profile)
133
+ log.dim(` Profile: ${opts.profile} — no entities of this type.`);
134
+ return;
135
+ }
136
+ const scope = workspaceId ? chalk.dim(` [ws: ${workspaceId.slice(0, 8)}…]`) : chalk.dim(" [pod-wide]");
137
+ const profileFilter = opts.profile ? chalk.dim(` profile: ${opts.profile}`) : "";
138
+ log.dim(`${total} total${scope}${profileFilter} — showing ${entities.length}:`);
139
+ log.blank();
140
+ for (const e of entities) {
141
+ const entity = e;
142
+ const title = String(entity.title ?? entity.name ?? entity.id ?? "");
143
+ const profile = String(entity.profileSlug ?? entity.profile ?? "");
144
+ const id = String(entity.id ?? "").slice(0, 8);
145
+ const updatedAt = entity.updatedAt ?? entity.createdAt;
146
+ const dateStr = updatedAt
147
+ ? chalk.dim(new Date(String(updatedAt)).toLocaleDateString())
148
+ : "";
149
+ log.info(`${title} ${chalk.dim(`(${profile})`)} ${chalk.dim(id)} ${dateStr}`);
150
+ }
151
+ if (total > entities.length) {
152
+ log.blank();
153
+ log.dim(`Showing ${entities.length} of ${total}. Add --limit ${limit * 2} to see more.`);
154
+ }
155
+ }
156
+ catch (e) {
157
+ console.error(chalk.red("Error: " + e.message));
158
+ process.exit(1);
159
+ }
160
+ }
161
+ //# sourceMappingURL=data-extra.js.map