@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.
Files changed (128) 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 +220 -109
  28. package/dist/commands/data.js.map +1 -1
  29. package/dist/commands/discover.d.ts +18 -0
  30. package/dist/commands/discover.js +71 -0
  31. package/dist/commands/discover.js.map +1 -0
  32. package/dist/commands/doc.d.ts +39 -0
  33. package/dist/commands/doc.js +130 -0
  34. package/dist/commands/doc.js.map +1 -0
  35. package/dist/commands/events.d.ts +26 -0
  36. package/dist/commands/events.js +68 -0
  37. package/dist/commands/events.js.map +1 -0
  38. package/dist/commands/explain.d.ts +21 -0
  39. package/dist/commands/explain.js +248 -0
  40. package/dist/commands/explain.js.map +1 -0
  41. package/dist/commands/graph.d.ts +18 -0
  42. package/dist/commands/graph.js +73 -0
  43. package/dist/commands/graph.js.map +1 -0
  44. package/dist/commands/home.d.ts +12 -0
  45. package/dist/commands/home.js +54 -0
  46. package/dist/commands/home.js.map +1 -0
  47. package/dist/commands/init.d.ts +0 -2
  48. package/dist/commands/init.js +62 -102
  49. package/dist/commands/init.js.map +1 -1
  50. package/dist/commands/keys.d.ts +9 -0
  51. package/dist/commands/keys.js +79 -0
  52. package/dist/commands/keys.js.map +1 -0
  53. package/dist/commands/knowledge.d.ts +32 -18
  54. package/dist/commands/knowledge.js +303 -53
  55. package/dist/commands/knowledge.js.map +1 -1
  56. package/dist/commands/observe.d.ts +9 -0
  57. package/dist/commands/observe.js +90 -0
  58. package/dist/commands/observe.js.map +1 -0
  59. package/dist/commands/open.d.ts +15 -0
  60. package/dist/commands/open.js +44 -0
  61. package/dist/commands/open.js.map +1 -0
  62. package/dist/commands/pods.d.ts +5 -0
  63. package/dist/commands/pods.js +85 -37
  64. package/dist/commands/pods.js.map +1 -1
  65. package/dist/commands/proposals-actions.d.ts +7 -0
  66. package/dist/commands/proposals-actions.js +40 -0
  67. package/dist/commands/proposals-actions.js.map +1 -0
  68. package/dist/commands/providers.d.ts +38 -0
  69. package/dist/commands/providers.js +170 -0
  70. package/dist/commands/providers.js.map +1 -0
  71. package/dist/commands/sessions.d.ts +31 -0
  72. package/dist/commands/sessions.js +224 -0
  73. package/dist/commands/sessions.js.map +1 -0
  74. package/dist/commands/skills-commands.d.ts +26 -0
  75. package/dist/commands/skills-commands.js +186 -0
  76. package/dist/commands/skills-commands.js.map +1 -0
  77. package/dist/commands/skills.d.ts +26 -0
  78. package/dist/commands/skills.js +195 -0
  79. package/dist/commands/skills.js.map +1 -0
  80. package/dist/commands/status.js +68 -30
  81. package/dist/commands/status.js.map +1 -1
  82. package/dist/commands/subscribe.d.ts +19 -0
  83. package/dist/commands/subscribe.js +91 -0
  84. package/dist/commands/subscribe.js.map +1 -0
  85. package/dist/commands/view.d.ts +57 -0
  86. package/dist/commands/view.js +194 -0
  87. package/dist/commands/view.js.map +1 -0
  88. package/dist/index.d.ts +3 -4
  89. package/dist/index.js +823 -206
  90. package/dist/index.js.map +1 -1
  91. package/dist/lib/agent-templates.d.ts +25 -0
  92. package/dist/lib/agent-templates.js +148 -0
  93. package/dist/lib/agent-templates.js.map +1 -0
  94. package/dist/lib/agents-config.d.ts +4 -1
  95. package/dist/lib/agents-config.js +19 -2
  96. package/dist/lib/agents-config.js.map +1 -1
  97. package/dist/lib/capture-lane.d.ts +49 -0
  98. package/dist/lib/capture-lane.js +79 -0
  99. package/dist/lib/capture-lane.js.map +1 -0
  100. package/dist/lib/hub-client.d.ts +14 -0
  101. package/dist/lib/hub-client.js +45 -3
  102. package/dist/lib/hub-client.js.map +1 -1
  103. package/dist/lib/pod.d.ts +22 -1
  104. package/dist/lib/pod.js +32 -2
  105. package/dist/lib/pod.js.map +1 -1
  106. package/dist/lib/skills-installer.d.ts +1 -1
  107. package/dist/lib/skills-installer.js +1 -1
  108. package/dist/lib/skills-installer.js.map +1 -1
  109. package/dist/lib/targets.d.ts +17 -1
  110. package/dist/lib/targets.js +744 -70
  111. package/dist/lib/targets.js.map +1 -1
  112. package/node_modules/@synap/hub-rest-client/dist/index.cjs +881 -0
  113. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +907 -0
  114. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +907 -0
  115. package/node_modules/@synap/hub-rest-client/dist/index.js +851 -0
  116. package/node_modules/@synap/hub-rest-client/package.json +45 -0
  117. package/node_modules/@synap/hub-rest-client/src/client.ts +1143 -0
  118. package/node_modules/@synap/hub-rest-client/src/errors.ts +30 -0
  119. package/node_modules/@synap/hub-rest-client/src/index.ts +111 -0
  120. package/node_modules/@synap/hub-rest-client/src/setup.ts +77 -0
  121. package/node_modules/@synap/hub-rest-client/src/types.ts +639 -0
  122. package/package.json +9 -2
  123. package/skills/synap/SKILL.md +374 -100
  124. package/skills/synap-ui/SKILL.md +12 -9
  125. package/dist/lib/templates.d.ts +0 -11
  126. package/dist/lib/templates.js +0 -13
  127. package/dist/lib/templates.js.map +0 -1
  128. package/dist/templates/agent-os.json +0 -3090
@@ -0,0 +1,18 @@
1
+ /**
2
+ * synap discover
3
+ *
4
+ * Runtime discovery for AI agents: fetches ground-truth entity profiles
5
+ * (with property schemas) and the canonical CLI command tree from the pod.
6
+ *
7
+ * Replaces static skill file profile descriptions — agents call this once
8
+ * per session to get current schema including any custom workspace profiles.
9
+ */
10
+ export interface DiscoverOpts {
11
+ podUrl?: string;
12
+ apiKey?: string;
13
+ workspace?: string;
14
+ json?: boolean;
15
+ profiles?: boolean;
16
+ commands?: boolean;
17
+ }
18
+ export declare function discover(opts: DiscoverOpts): Promise<void>;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * synap discover
3
+ *
4
+ * Runtime discovery for AI agents: fetches ground-truth entity profiles
5
+ * (with property schemas) and the canonical CLI command tree from the pod.
6
+ *
7
+ * Replaces static skill file profile descriptions — agents call this once
8
+ * per session to get current schema including any custom workspace profiles.
9
+ */
10
+ import chalk from "chalk";
11
+ import { log } from "../utils/logger.js";
12
+ import { resolveHubConfig, resolveUserId, hubGet } from "../lib/hub-client.js";
13
+ export async function discover(opts) {
14
+ try {
15
+ const cfg = await resolveHubConfig(opts);
16
+ const userId = await resolveUserId(cfg);
17
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
18
+ if (!workspaceId) {
19
+ console.error(chalk.red("No workspace set. Run: synap use <workspace-id>"));
20
+ process.exit(1);
21
+ }
22
+ const res = await hubGet("/discover", { userId, workspaceId }, cfg);
23
+ // JSON mode — dump everything (or filtered slice)
24
+ if (opts.json) {
25
+ if (opts.profiles) {
26
+ console.log(JSON.stringify({ profiles: res.profiles }, null, 2));
27
+ }
28
+ else if (opts.commands) {
29
+ console.log(JSON.stringify({ commands: res.commands }, null, 2));
30
+ }
31
+ else {
32
+ console.log(JSON.stringify(res, null, 2));
33
+ }
34
+ return;
35
+ }
36
+ // Human-readable output
37
+ if (!opts.commands) {
38
+ log.heading(`Entity profiles (${res.profiles.length})`);
39
+ for (const p of res.profiles) {
40
+ const scope = p.scope === "pod" ? chalk.cyan("pod-wide") : chalk.yellow("workspace");
41
+ console.log(`\n ${chalk.bold(p.slug)} ${chalk.dim("·")} ${p.displayName} ${chalk.dim(`[${scope}]`)}`);
42
+ if (p.description)
43
+ console.log(` ${chalk.dim(p.description)}`);
44
+ if (p.properties.length > 0) {
45
+ for (const prop of p.properties) {
46
+ const opts_str = prop.options?.length ? chalk.dim(` (${prop.options.join("|")})`) : "";
47
+ const req = prop.required ? chalk.red("*") : "";
48
+ console.log(` ${chalk.dim("·")} ${prop.slug}${req}: ${chalk.dim(prop.type)}${opts_str}`);
49
+ }
50
+ }
51
+ else {
52
+ console.log(` ${chalk.dim("(no typed properties)")}`);
53
+ }
54
+ console.log(` ${chalk.dim("→")} ${chalk.dim(p.createCommand)}`);
55
+ }
56
+ }
57
+ if (!opts.profiles) {
58
+ console.log();
59
+ log.heading("Commands");
60
+ for (const [name, cmd] of Object.entries(res.commands)) {
61
+ console.log(` ${chalk.cyan(name.padEnd(18))} ${chalk.dim(cmd)}`);
62
+ }
63
+ }
64
+ console.log(`\n${chalk.dim(res.hint)}`);
65
+ }
66
+ catch (e) {
67
+ console.error(chalk.red("Error: " + e.message));
68
+ process.exit(1);
69
+ }
70
+ }
71
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAkC/E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,CAAC;QAEtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,WAAW,EACX,EAAE,MAAM,EAAE,WAAW,EAAE,EACvB,GAAG,CACc,CAAC;QAEpB,kDAAkD;QAClD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,GAAG,CAAC,OAAO,CAAC,oBAAoB,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvG,IAAI,CAAC,CAAC,WAAW;oBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;wBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * synap doc create / synap doc update
3
+ *
4
+ * Manage markdown documents on the pod.
5
+ *
6
+ * Usage:
7
+ * synap doc create --title "My Doc" --content "# Hello" [--workspace <id>] [--open]
8
+ * synap doc create --title "My Doc" --file ./notes.md [--open]
9
+ * echo "# Hello" | synap doc create --title "My Doc"
10
+ *
11
+ * synap doc update <id> --content "new body" [--title "New Title"]
12
+ * synap doc update <id> --file ./notes.md
13
+ * echo "updated" | synap doc update <id>
14
+ *
15
+ * API:
16
+ * POST /api/hub/documents — { userId, workspaceId?, title, content?, type? }
17
+ * PATCH /api/hub/documents/:id — { userId, content } (full-replace, proposal-gated)
18
+ */
19
+ export interface DocCreateOpts {
20
+ title: string;
21
+ content?: string;
22
+ file?: string;
23
+ workspace?: string;
24
+ open?: boolean;
25
+ json?: boolean;
26
+ podUrl?: string;
27
+ apiKey?: string;
28
+ }
29
+ export interface DocUpdateOpts {
30
+ content?: string;
31
+ file?: string;
32
+ title?: string;
33
+ open?: boolean;
34
+ json?: boolean;
35
+ podUrl?: string;
36
+ apiKey?: string;
37
+ }
38
+ export declare function docCreate(opts: DocCreateOpts): Promise<void>;
39
+ export declare function docUpdate(documentId: string, opts: DocUpdateOpts): Promise<void>;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * synap doc create / synap doc update
3
+ *
4
+ * Manage markdown documents on the pod.
5
+ *
6
+ * Usage:
7
+ * synap doc create --title "My Doc" --content "# Hello" [--workspace <id>] [--open]
8
+ * synap doc create --title "My Doc" --file ./notes.md [--open]
9
+ * echo "# Hello" | synap doc create --title "My Doc"
10
+ *
11
+ * synap doc update <id> --content "new body" [--title "New Title"]
12
+ * synap doc update <id> --file ./notes.md
13
+ * echo "updated" | synap doc update <id>
14
+ *
15
+ * API:
16
+ * POST /api/hub/documents — { userId, workspaceId?, title, content?, type? }
17
+ * PATCH /api/hub/documents/:id — { userId, content } (full-replace, proposal-gated)
18
+ */
19
+ import { readFileSync } from "fs";
20
+ import { log } from "../utils/logger.js";
21
+ import { resolveHubConfig, resolveUserId, hubPost, hubPatch, } from "../lib/hub-client.js";
22
+ import { openInBrowser } from "./open.js";
23
+ /** Read content from --content flag, --file flag, or stdin (in that priority order). */
24
+ async function resolveContent(content, file) {
25
+ if (content !== undefined)
26
+ return content;
27
+ if (file) {
28
+ try {
29
+ return readFileSync(file, "utf-8");
30
+ }
31
+ catch (e) {
32
+ log.error(`Cannot read file: ${file} — ${e.message}`);
33
+ process.exit(1);
34
+ }
35
+ }
36
+ // stdin — only when it's a pipe (not a TTY)
37
+ if (!process.stdin.isTTY) {
38
+ return new Promise((resolve, reject) => {
39
+ const chunks = [];
40
+ process.stdin.on("data", (chunk) => chunks.push(chunk));
41
+ process.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
42
+ process.stdin.on("error", reject);
43
+ });
44
+ }
45
+ return undefined;
46
+ }
47
+ export async function docCreate(opts) {
48
+ try {
49
+ const cfg = await resolveHubConfig(opts);
50
+ const userId = await resolveUserId(cfg);
51
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
52
+ if (!workspaceId) {
53
+ log.error("Workspace ID required. Use --workspace <id> or set active workspace with: synap use <id>");
54
+ process.exit(1);
55
+ }
56
+ const content = await resolveContent(opts.content, opts.file);
57
+ const body = {
58
+ userId,
59
+ workspaceId,
60
+ title: opts.title,
61
+ type: "markdown",
62
+ };
63
+ if (content !== undefined)
64
+ body.content = content;
65
+ const res = (await hubPost("/documents", body, cfg));
66
+ const doc = res.document ?? res;
67
+ const id = String(doc.id ?? res.id ?? "");
68
+ if (opts.json) {
69
+ console.log(JSON.stringify(res, null, 2));
70
+ return;
71
+ }
72
+ const isProposed = res.status === "proposed" || Boolean(res.proposalId);
73
+ if (isProposed) {
74
+ log.warn(`Queued for approval (proposal: ${String(res.proposalId ?? "")})`);
75
+ if (res.reviewUrl)
76
+ log.dim(` Review: ${String(res.reviewUrl)}`);
77
+ return;
78
+ }
79
+ log.success(`Document created: ${opts.title}`);
80
+ log.dim(` id: ${id}`);
81
+ log.dim(` open in browser: synap open document ${id}`);
82
+ if (opts.open && id) {
83
+ await openInBrowser({ kind: "document", id });
84
+ }
85
+ }
86
+ catch (e) {
87
+ log.error("Error: " + e.message);
88
+ process.exit(1);
89
+ }
90
+ }
91
+ export async function docUpdate(documentId, opts) {
92
+ try {
93
+ const cfg = await resolveHubConfig(opts);
94
+ const userId = await resolveUserId(cfg);
95
+ const content = await resolveContent(opts.content, opts.file);
96
+ if (content === undefined && opts.title === undefined) {
97
+ log.error("Provide --content, --file, or pipe stdin to supply new content. " +
98
+ "Title-only updates require --content as well (backend limitation).");
99
+ process.exit(1);
100
+ }
101
+ const body = { userId };
102
+ if (content !== undefined)
103
+ body.content = content;
104
+ if (opts.title !== undefined)
105
+ body.title = opts.title;
106
+ const res = (await hubPatch(`/documents/${documentId}`, body, cfg));
107
+ if (opts.json) {
108
+ console.log(JSON.stringify(res, null, 2));
109
+ return;
110
+ }
111
+ const isProposed = res.status === "proposed" || Boolean(res.proposalId);
112
+ if (isProposed) {
113
+ log.warn(`Queued for approval (proposal: ${String(res.proposalId ?? "")})`);
114
+ if (res.reviewUrl)
115
+ log.dim(` Review: ${String(res.reviewUrl)}`);
116
+ return;
117
+ }
118
+ log.success(`Document updated: ${documentId.slice(0, 8)}…`);
119
+ if (opts.title)
120
+ log.dim(` title: ${opts.title}`);
121
+ if (opts.open) {
122
+ await openInBrowser({ kind: "document", id: documentId });
123
+ }
124
+ }
125
+ catch (e) {
126
+ log.error("Error: " + e.message);
127
+ process.exit(1);
128
+ }
129
+ }
130
+ //# sourceMappingURL=doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.js","sourceRoot":"","sources":["../../src/commands/doc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * synap events
3
+ *
4
+ * Show the event chain for an entity or recent pod-wide events.
5
+ *
6
+ * Usage:
7
+ * synap events --entity <id> # last 20 events for entity
8
+ * synap events --entity <id> --limit 50
9
+ * synap events --entity <id> --json
10
+ * synap events --limit 20 # recent pod-wide events
11
+ *
12
+ * API: GET /api/hub/events
13
+ * Query params: userId (pinned server-side), subjectId, type, subjectType,
14
+ * fromDate, limit (default 50, max 200).
15
+ * Response: { events: WireEvent[] } — newest first.
16
+ * WireEvent shape: { id, type, subjectType?, subjectId?, userId?, workspaceId?,
17
+ * data?, timestamp? }
18
+ */
19
+ export interface ListEventsOpts {
20
+ entity?: string;
21
+ limit?: string;
22
+ json?: boolean;
23
+ podUrl?: string;
24
+ apiKey?: string;
25
+ }
26
+ export declare function listEvents(opts: ListEventsOpts): Promise<void>;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * synap events
3
+ *
4
+ * Show the event chain for an entity or recent pod-wide events.
5
+ *
6
+ * Usage:
7
+ * synap events --entity <id> # last 20 events for entity
8
+ * synap events --entity <id> --limit 50
9
+ * synap events --entity <id> --json
10
+ * synap events --limit 20 # recent pod-wide events
11
+ *
12
+ * API: GET /api/hub/events
13
+ * Query params: userId (pinned server-side), subjectId, type, subjectType,
14
+ * fromDate, limit (default 50, max 200).
15
+ * Response: { events: WireEvent[] } — newest first.
16
+ * WireEvent shape: { id, type, subjectType?, subjectId?, userId?, workspaceId?,
17
+ * data?, timestamp? }
18
+ */
19
+ import chalk from "chalk";
20
+ import { log } from "../utils/logger.js";
21
+ import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
22
+ export async function listEvents(opts) {
23
+ try {
24
+ const cfg = await resolveHubConfig(opts);
25
+ const limit = parseInt(opts.limit ?? "20", 10);
26
+ const params = { limit };
27
+ if (opts.entity)
28
+ params.subjectId = opts.entity;
29
+ const res = await hubGet("/events", params, cfg);
30
+ const events = (res.events ?? res.items ?? (Array.isArray(res) ? res : []));
31
+ if (opts.json) {
32
+ console.log(JSON.stringify(events, null, 2));
33
+ return;
34
+ }
35
+ const scope = opts.entity
36
+ ? `entity: ${opts.entity.slice(0, 8)}…`
37
+ : "pod-wide";
38
+ console.log(chalk.bold(`\nRecent events (${scope})`));
39
+ console.log("");
40
+ if (events.length === 0) {
41
+ log.dim("(no events found)");
42
+ console.log("");
43
+ return;
44
+ }
45
+ for (const ev of events) {
46
+ // Normalise timestamp — may be ISO string or Date
47
+ const raw = ev.timestamp ?? ev.createdAt ?? "";
48
+ let ts = String(raw);
49
+ try {
50
+ if (ts) {
51
+ const d = new Date(ts);
52
+ ts = d.toISOString().replace("T", " ").slice(0, 16);
53
+ }
54
+ }
55
+ catch { /* leave as-is */ }
56
+ const evType = String(ev.eventType ?? ev.type ?? "–");
57
+ const subjectType = ev.subjectType ? chalk.dim(` [${ev.subjectType}]`) : "";
58
+ const subjectId = ev.subjectId ? chalk.dim(` → ${String(ev.subjectId).slice(0, 8)}`) : "";
59
+ console.log(` ${chalk.dim(ts.padEnd(17))} ${chalk.cyan(evType.padEnd(36))}${subjectType}${subjectId}`);
60
+ }
61
+ console.log("");
62
+ }
63
+ catch (e) {
64
+ log.error("Error: " + e.message);
65
+ process.exit(1);
66
+ }
67
+ }
68
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * synap explain [topic]
3
+ *
4
+ * Static capability map — no network calls needed. Tells any agent starting
5
+ * cold what Synap can do and which CLI command to use for each operation.
6
+ *
7
+ * Usage:
8
+ * synap explain # full capability map
9
+ * synap explain graph # relations & graph traversal
10
+ * synap explain memory # memory & knowledge
11
+ * synap explain automation # automations
12
+ * synap explain agents # agents & runner
13
+ * synap explain governance # proposals & governance
14
+ * synap explain views # views & bento
15
+ * synap explain events # event chain
16
+ * synap explain connectors # connectors
17
+ */
18
+ export interface ExplainOpts {
19
+ topic?: string;
20
+ }
21
+ export declare function explain(opts: ExplainOpts): Promise<void>;
@@ -0,0 +1,248 @@
1
+ /**
2
+ * synap explain [topic]
3
+ *
4
+ * Static capability map — no network calls needed. Tells any agent starting
5
+ * cold what Synap can do and which CLI command to use for each operation.
6
+ *
7
+ * Usage:
8
+ * synap explain # full capability map
9
+ * synap explain graph # relations & graph traversal
10
+ * synap explain memory # memory & knowledge
11
+ * synap explain automation # automations
12
+ * synap explain agents # agents & runner
13
+ * synap explain governance # proposals & governance
14
+ * synap explain views # views & bento
15
+ * synap explain events # event chain
16
+ * synap explain connectors # connectors
17
+ */
18
+ import chalk from "chalk";
19
+ // ── Section renderers ──────────────────────────────────────────────────────────
20
+ function sectionEntities() {
21
+ console.log(chalk.bold("\n## Entities & Profiles"));
22
+ console.log(chalk.dim(" Every piece of data is an entity with a profile type (schema)."));
23
+ console.log("");
24
+ console.log(` ${chalk.cyan("synap orient")} ${chalk.dim("→ see workspaces, profiles, capabilities")}`);
25
+ console.log(` ${chalk.cyan("synap list profiles")} ${chalk.dim("→ entity types available in active workspace")}`);
26
+ console.log(` ${chalk.cyan("synap list entities")} ${chalk.dim("→ browse entities (--profile, --workspace, --limit)")}`);
27
+ console.log(` ${chalk.cyan("synap show <id>")} ${chalk.dim("→ entity detail + all linked relations")}`);
28
+ console.log(` ${chalk.cyan("synap get entity <id>")} ${chalk.dim("→ raw entity properties")}`);
29
+ console.log(` ${chalk.cyan("synap create entity")} ${chalk.dim("→ --profile task --name 'Fix bug' --props '{}'")}`);
30
+ console.log(` ${chalk.cyan("synap set entity <id>")} ${chalk.dim("→ --props '{\"status\":\"done\"}'")}`);
31
+ console.log(` ${chalk.cyan("synap browse [profile]")} ${chalk.dim("→ paginated entity list (cleanest UX)")}`);
32
+ console.log(` ${chalk.cyan("synap ask <query>")} ${chalk.dim("→ the one read verb — routes across all substrates")}`);
33
+ }
34
+ function sectionGraph() {
35
+ console.log(chalk.bold("\n## Relations & Graph"));
36
+ console.log(chalk.dim(" Entities are connected by typed relations forming a traversable graph."));
37
+ console.log("");
38
+ console.log(` ${chalk.cyan("synap create relation")} ${chalk.dim("→ --source <id> --target <id> --type extends")}`);
39
+ console.log(` ${chalk.cyan("synap graph --entity <id>")} ${chalk.dim("→ BFS traversal depth 2 (--depth 3 for deeper)")}`);
40
+ console.log(` ${chalk.cyan("synap show <id>")} ${chalk.dim("→ entity + its relations in one view")}`);
41
+ console.log("");
42
+ console.log(chalk.dim(" Relation types are workspace-defined. Check your workspace schema for valid types."));
43
+ console.log(chalk.dim(" maxDepth clamped to 3. Response: flat array of entity + relation records."));
44
+ }
45
+ function sectionMemory() {
46
+ console.log(chalk.bold("\n## Memory & Knowledge"));
47
+ console.log(chalk.dim(" Canonical verbs: ask (read) · capture (structured write) · note (quick)."));
48
+ console.log("");
49
+ console.log(` ${chalk.cyan("synap note <text>")} ${chalk.dim("→ save a quick note (creates a note entity)")}`);
50
+ console.log(` ${chalk.cyan("synap ask <query>")} ${chalk.dim("→ the one read verb — routes semantic/procedural/episodic")}`);
51
+ console.log(` ${chalk.cyan("synap capture")} ${chalk.dim("→ structured knowledge: --type gotcha|lesson|decision|reference")}`);
52
+ console.log(` ${chalk.dim(" --claim 'text' --why 'context' --tags 'repo:x'")}`);
53
+ console.log(` ${chalk.cyan("synap context")} ${chalk.dim("→ session-start: knowledge + proposals + tasks")}`);
54
+ console.log(` ${chalk.cyan("synap observe write <text>")} ${chalk.dim("→ record user observation (AI-maintained model)")}`);
55
+ console.log(` ${chalk.cyan("synap observe recall <q>")} ${chalk.dim("→ search user observations")}`);
56
+ }
57
+ function sectionEvents() {
58
+ console.log(chalk.bold("\n## Events & Event Chain"));
59
+ console.log(chalk.dim(" Every mutation emits a typed event. Subscribe for real-time feeds."));
60
+ console.log("");
61
+ console.log(` ${chalk.cyan("synap events --entity <id>")} ${chalk.dim("→ recent event history for an entity")}`);
62
+ console.log(` ${chalk.cyan("synap events --limit 50")} ${chalk.dim("→ pod-wide recent events")}`);
63
+ console.log(` ${chalk.cyan("synap subscribe")} ${chalk.dim("→ NDJSON stream (long-poll, Ctrl+C to stop)")}`);
64
+ console.log(` ${chalk.cyan("synap subscribe --event proposal.*")} ${chalk.dim("→ filtered stream")}`);
65
+ console.log("");
66
+ console.log(chalk.dim(" Event shape: { id, type, subjectType, subjectId, userId, workspaceId, data, timestamp }"));
67
+ console.log(chalk.dim(" Query params: subjectId, type, subjectType, fromDate, limit (max 200)."));
68
+ }
69
+ function sectionAutomation() {
70
+ console.log(chalk.bold("\n## Automations"));
71
+ console.log(chalk.dim(" Trigger→filter→action rules. Triggers: event pattern, cron, webhook, manual."));
72
+ console.log("");
73
+ console.log(` ${chalk.cyan("synap automation list")} ${chalk.dim("→ list automations (--workspace, --status)")}`);
74
+ console.log(` ${chalk.cyan("synap automation describe <id>")}`);
75
+ console.log(` ${chalk.cyan("synap automation create")} ${chalk.dim("→ --name X --trigger event:entity.* --action notify")}`);
76
+ console.log(` ${chalk.cyan("synap automation enable <id> / disable <id> / delete <id>")}`);
77
+ console.log(` ${chalk.cyan("synap automation schema")} ${chalk.dim("→ fetch DSL schema (AI context)")}`);
78
+ console.log("");
79
+ console.log(chalk.dim(" Action types: notify | channel-message | none"));
80
+ console.log(chalk.dim(" Cron trigger: --trigger cron:0_*_*_*_* Event: --trigger event:entity.*"));
81
+ }
82
+ function sectionViews() {
83
+ console.log(chalk.bold("\n## Views"));
84
+ console.log(chalk.dim(" Named query + rendering configs over the entity store."));
85
+ console.log("");
86
+ console.log(` ${chalk.cyan("synap view list")} ${chalk.dim("→ list views (--workspace)")}`);
87
+ console.log(` ${chalk.cyan("synap view create")} ${chalk.dim("→ --type kanban --profile task --name 'My Board'")}`);
88
+ console.log("");
89
+ console.log(chalk.dim(" View types (12):"));
90
+ console.log(chalk.dim(" table | kanban | bento | list | grid | gallery"));
91
+ console.log(chalk.dim(" calendar | masonry | flow | matrix | branch_tree | whiteboard"));
92
+ console.log("");
93
+ console.log(chalk.dim(" Bento views hold a widget arrangement (react-grid-layout)."));
94
+ console.log(chalk.dim(" Each bento widget: { id, kind: view|entity|widget|<custom>, x, y, w, h, config }"));
95
+ }
96
+ function sectionGovernance() {
97
+ console.log(chalk.bold("\n## Proposals & Governance"));
98
+ console.log(chalk.dim(" AI mutations that require approval go through proposals first."));
99
+ console.log("");
100
+ console.log(` ${chalk.cyan("synap proposals list")} ${chalk.dim("→ pending proposals (--workspace, --limit)")}`);
101
+ console.log(` ${chalk.cyan("synap proposals approve <id>")} ${chalk.dim("→ --reason 'text'")}`);
102
+ console.log(` ${chalk.cyan("synap proposals reject <id>")} ${chalk.dim("→ --reason 'text'")}`);
103
+ console.log("");
104
+ console.log(chalk.dim(" When a mutation is gated: response.status = 'proposed', response.proposalId set."));
105
+ console.log(chalk.dim(" Proposals are reversible — approve, reject, or revert after execution."));
106
+ }
107
+ function sectionConnectors() {
108
+ console.log(chalk.bold("\n## Connectors"));
109
+ console.log(chalk.dim(" 39 Nango-powered integrations: Google, GitHub, Notion, Linear, Slack, Jira, …"));
110
+ console.log("");
111
+ console.log(` ${chalk.cyan("synap connectors list")} ${chalk.dim("→ available connectors + connection status")}`);
112
+ console.log(` ${chalk.cyan("synap connect-service [name]")} ${chalk.dim("→ interactive connect flow")}`);
113
+ console.log(` ${chalk.cyan("synap connectors sync <provider>")} ${chalk.dim("→ trigger manual sync")}`);
114
+ console.log(` ${chalk.cyan("synap connectors disconnect <provider>")}`);
115
+ console.log(` ${chalk.cyan("synap connectors schema")} ${chalk.dim("→ supported providers + field mapping (AI context)")}`);
116
+ }
117
+ function sectionAgents() {
118
+ console.log(chalk.bold("\n## Agents"));
119
+ console.log(chalk.dim(" Named agent identities (separate keys) + autonomous runner + recurring schedules."));
120
+ console.log("");
121
+ console.log(` ${chalk.cyan("synap agents list")} ${chalk.dim("→ configured agent identities")}`);
122
+ console.log(` ${chalk.cyan("synap agents create")} ${chalk.dim("→ --template twin|assistant|custom --name X")}`);
123
+ console.log(` ${chalk.cyan("synap agents add")} ${chalk.dim("→ register pre-existing credential")}`);
124
+ console.log(` ${chalk.cyan("synap agent run")} ${chalk.dim("→ --goal 'text' --persona researcher")}`);
125
+ console.log(` ${chalk.cyan("synap agent schedule")} ${chalk.dim("→ --goal X --name Y --every daily")}`);
126
+ console.log(` ${chalk.cyan("synap agent tick")} ${chalk.dim("→ run due schedules (wire to crontab)")}`);
127
+ console.log("");
128
+ console.log(chalk.dim(" Persona types: researcher | assistant | developer"));
129
+ console.log(chalk.dim(" Model alias: synap/advanced (default). Pass --model to override."));
130
+ }
131
+ function sectionQuickRef() {
132
+ console.log(chalk.bold("\n## CLI Quick Reference"));
133
+ console.log("");
134
+ console.log(chalk.dim(" Auth & setup"));
135
+ console.log(` ${chalk.cyan("synap pods list / add / use <name>")}`);
136
+ console.log(` ${chalk.cyan("synap use <workspace-id>")} ${chalk.dim("→ set active workspace")}`);
137
+ console.log(` ${chalk.cyan("synap orient")} ${chalk.dim("→ who am I, what workspaces, capabilities")}`);
138
+ console.log("");
139
+ console.log(chalk.dim(" Data"));
140
+ console.log(` ${chalk.cyan("synap browse [profile]")} ${chalk.cyan("synap show <id>")} ${chalk.cyan("synap ask <q>")}`);
141
+ console.log(` ${chalk.cyan("synap create entity")} ${chalk.cyan("synap set entity <id>")}`);
142
+ console.log(` ${chalk.cyan("synap note <text>")} ${chalk.cyan("synap capture --type lesson")}`);
143
+ console.log("");
144
+ console.log(chalk.dim(" Graph"));
145
+ console.log(` ${chalk.cyan("synap graph --entity <id> [--depth 2]")}`);
146
+ console.log(` ${chalk.cyan("synap create relation --source X --target Y --type related_to")}`);
147
+ console.log("");
148
+ console.log(chalk.dim(" Events"));
149
+ console.log(` ${chalk.cyan("synap events --entity <id>")}`);
150
+ console.log(` ${chalk.cyan("synap subscribe [--event proposal.*]")}`);
151
+ console.log("");
152
+ console.log(chalk.dim(" Governance"));
153
+ console.log(` ${chalk.cyan("synap proposals list")} ${chalk.cyan("synap proposals approve <id>")}`);
154
+ console.log("");
155
+ console.log(chalk.dim(" Browser navigation (requires desktop app)"));
156
+ console.log(` ${chalk.cyan("synap open entity <id>")} ${chalk.dim("→ open entity in side panel")}`);
157
+ console.log(` ${chalk.cyan("synap open view <id>")} ${chalk.dim("→ open view in main panel")}`);
158
+ console.log(` ${chalk.cyan("synap open cell <typeKey>")} ${chalk.dim("→ open any registered cell in side panel")}`);
159
+ console.log("");
160
+ console.log(chalk.dim(" AI-generated cells (Capability B)"));
161
+ console.log(` ${chalk.cyan("synap artifact create --html <file>")} ${chalk.dim("→ define a frame cell from HTML source")}`);
162
+ console.log(` ${chalk.cyan(" --name <name> --open")} ${chalk.dim("→ set cell name + open immediately in browser")}`);
163
+ console.log("");
164
+ console.log(chalk.dim(" Context for this session"));
165
+ console.log(` ${chalk.cyan("synap context")} ${chalk.dim("→ knowledge + proposals + tasks")}`);
166
+ console.log(` ${chalk.cyan("synap explain [topic]")} ${chalk.dim("→ full capability map (this command)")}`);
167
+ }
168
+ // ── Main export ───────────────────────────────────────────────────────────────
169
+ export async function explain(opts) {
170
+ const topic = opts.topic?.toLowerCase();
171
+ switch (topic) {
172
+ case "graph":
173
+ case "relations":
174
+ case "relation":
175
+ sectionGraph();
176
+ break;
177
+ case "memory":
178
+ case "knowledge":
179
+ case "note":
180
+ case "recall":
181
+ sectionMemory();
182
+ break;
183
+ case "events":
184
+ case "event":
185
+ case "subscribe":
186
+ sectionEvents();
187
+ break;
188
+ case "automation":
189
+ case "automations":
190
+ sectionAutomation();
191
+ break;
192
+ case "views":
193
+ case "view":
194
+ case "bento":
195
+ sectionViews();
196
+ break;
197
+ case "governance":
198
+ case "proposals":
199
+ case "proposal":
200
+ sectionGovernance();
201
+ break;
202
+ case "connectors":
203
+ case "connector":
204
+ case "integrations":
205
+ sectionConnectors();
206
+ break;
207
+ case "agents":
208
+ case "agent":
209
+ sectionAgents();
210
+ break;
211
+ case "entities":
212
+ case "entity":
213
+ case "profiles":
214
+ sectionEntities();
215
+ break;
216
+ case "quickref":
217
+ case "quick-ref":
218
+ case "ref":
219
+ case "commands":
220
+ sectionQuickRef();
221
+ break;
222
+ case undefined:
223
+ case "":
224
+ case "all": {
225
+ // Full capability map
226
+ console.log(chalk.bold.cyan("\nSynap Capability Map"));
227
+ console.log(chalk.dim(" Sovereign personal data infrastructure. Run any section with: synap explain <topic>"));
228
+ console.log(chalk.dim(" Topics: entities | graph | memory | events | automation | views | governance | connectors | agents\n"));
229
+ sectionEntities();
230
+ sectionGraph();
231
+ sectionMemory();
232
+ sectionEvents();
233
+ sectionAutomation();
234
+ sectionViews();
235
+ sectionGovernance();
236
+ sectionConnectors();
237
+ sectionAgents();
238
+ sectionQuickRef();
239
+ break;
240
+ }
241
+ default:
242
+ console.log(chalk.yellow(` Unknown topic: "${opts.topic}". Valid topics:`));
243
+ console.log(chalk.dim(" entities | graph | memory | events | automation | views | governance | connectors | agents | commands"));
244
+ process.exit(1);
245
+ }
246
+ console.log("");
247
+ }
248
+ //# sourceMappingURL=explain.js.map