@sensigo/realm-cli 0.1.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 (190) hide show
  1. package/README.md +109 -0
  2. package/dist/agent/agent-utils.d.ts +27 -0
  3. package/dist/agent/agent-utils.d.ts.map +1 -0
  4. package/dist/agent/agent-utils.js +79 -0
  5. package/dist/agent/agent-utils.js.map +1 -0
  6. package/dist/agent/anthropic-provider.d.ts +23 -0
  7. package/dist/agent/anthropic-provider.d.ts.map +1 -0
  8. package/dist/agent/anthropic-provider.js +245 -0
  9. package/dist/agent/anthropic-provider.js.map +1 -0
  10. package/dist/agent/gate/slack-gate-notifier.d.ts +80 -0
  11. package/dist/agent/gate/slack-gate-notifier.d.ts.map +1 -0
  12. package/dist/agent/gate/slack-gate-notifier.js +315 -0
  13. package/dist/agent/gate/slack-gate-notifier.js.map +1 -0
  14. package/dist/agent/gate/slack-gate-server.d.ts +30 -0
  15. package/dist/agent/gate/slack-gate-server.d.ts.map +1 -0
  16. package/dist/agent/gate/slack-gate-server.js +99 -0
  17. package/dist/agent/gate/slack-gate-server.js.map +1 -0
  18. package/dist/agent/gate/slack-socket-client.d.ts +20 -0
  19. package/dist/agent/gate/slack-socket-client.d.ts.map +1 -0
  20. package/dist/agent/gate/slack-socket-client.js +141 -0
  21. package/dist/agent/gate/slack-socket-client.js.map +1 -0
  22. package/dist/agent/gate-intent-interpreter.d.ts +29 -0
  23. package/dist/agent/gate-intent-interpreter.d.ts.map +1 -0
  24. package/dist/agent/gate-intent-interpreter.js +33 -0
  25. package/dist/agent/gate-intent-interpreter.js.map +1 -0
  26. package/dist/agent/index.d.ts +4 -0
  27. package/dist/agent/index.d.ts.map +1 -0
  28. package/dist/agent/index.js +4 -0
  29. package/dist/agent/index.js.map +1 -0
  30. package/dist/agent/llm-provider.d.ts +46 -0
  31. package/dist/agent/llm-provider.d.ts.map +1 -0
  32. package/dist/agent/llm-provider.js +55 -0
  33. package/dist/agent/llm-provider.js.map +1 -0
  34. package/dist/agent/mcp/mcp-client.d.ts +18 -0
  35. package/dist/agent/mcp/mcp-client.d.ts.map +1 -0
  36. package/dist/agent/mcp/mcp-client.js +108 -0
  37. package/dist/agent/mcp/mcp-client.js.map +1 -0
  38. package/dist/agent/mcp/mcp-extensions.d.ts +40 -0
  39. package/dist/agent/mcp/mcp-extensions.d.ts.map +1 -0
  40. package/dist/agent/mcp/mcp-extensions.js +2 -0
  41. package/dist/agent/mcp/mcp-extensions.js.map +1 -0
  42. package/dist/agent/mcp-client.d.ts +18 -0
  43. package/dist/agent/mcp-client.d.ts.map +1 -0
  44. package/dist/agent/mcp-client.js +108 -0
  45. package/dist/agent/mcp-client.js.map +1 -0
  46. package/dist/agent/mcp-types.d.ts +40 -0
  47. package/dist/agent/mcp-types.d.ts.map +1 -0
  48. package/dist/agent/mcp-types.js +2 -0
  49. package/dist/agent/mcp-types.js.map +1 -0
  50. package/dist/agent/openai-provider.d.ts +30 -0
  51. package/dist/agent/openai-provider.d.ts.map +1 -0
  52. package/dist/agent/openai-provider.js +253 -0
  53. package/dist/agent/openai-provider.js.map +1 -0
  54. package/dist/agent/openai-reasoning-provider.d.ts +18 -0
  55. package/dist/agent/openai-reasoning-provider.d.ts.map +1 -0
  56. package/dist/agent/openai-reasoning-provider.js +76 -0
  57. package/dist/agent/openai-reasoning-provider.js.map +1 -0
  58. package/dist/agent/preflight.d.ts +36 -0
  59. package/dist/agent/preflight.d.ts.map +1 -0
  60. package/dist/agent/preflight.js +81 -0
  61. package/dist/agent/preflight.js.map +1 -0
  62. package/dist/agent/providers/agent-utils.d.ts +27 -0
  63. package/dist/agent/providers/agent-utils.d.ts.map +1 -0
  64. package/dist/agent/providers/agent-utils.js +79 -0
  65. package/dist/agent/providers/agent-utils.js.map +1 -0
  66. package/dist/agent/providers/anthropic-provider.d.ts +23 -0
  67. package/dist/agent/providers/anthropic-provider.d.ts.map +1 -0
  68. package/dist/agent/providers/anthropic-provider.js +257 -0
  69. package/dist/agent/providers/anthropic-provider.js.map +1 -0
  70. package/dist/agent/providers/llm-provider.d.ts +46 -0
  71. package/dist/agent/providers/llm-provider.d.ts.map +1 -0
  72. package/dist/agent/providers/llm-provider.js +56 -0
  73. package/dist/agent/providers/llm-provider.js.map +1 -0
  74. package/dist/agent/providers/openai-provider.d.ts +30 -0
  75. package/dist/agent/providers/openai-provider.d.ts.map +1 -0
  76. package/dist/agent/providers/openai-provider.js +253 -0
  77. package/dist/agent/providers/openai-provider.js.map +1 -0
  78. package/dist/agent/providers/openai-reasoning-provider.d.ts +19 -0
  79. package/dist/agent/providers/openai-reasoning-provider.d.ts.map +1 -0
  80. package/dist/agent/providers/openai-reasoning-provider.js +89 -0
  81. package/dist/agent/providers/openai-reasoning-provider.js.map +1 -0
  82. package/dist/agent/run-agent.d.ts +50 -0
  83. package/dist/agent/run-agent.d.ts.map +1 -0
  84. package/dist/agent/run-agent.js +327 -0
  85. package/dist/agent/run-agent.js.map +1 -0
  86. package/dist/agent/slack-gate-notifier.d.ts +80 -0
  87. package/dist/agent/slack-gate-notifier.d.ts.map +1 -0
  88. package/dist/agent/slack-gate-notifier.js +315 -0
  89. package/dist/agent/slack-gate-notifier.js.map +1 -0
  90. package/dist/agent/slack-gate-poller.d.ts +28 -0
  91. package/dist/agent/slack-gate-poller.d.ts.map +1 -0
  92. package/dist/agent/slack-gate-poller.js +66 -0
  93. package/dist/agent/slack-gate-poller.js.map +1 -0
  94. package/dist/agent/slack-gate-server.d.ts +30 -0
  95. package/dist/agent/slack-gate-server.d.ts.map +1 -0
  96. package/dist/agent/slack-gate-server.js +99 -0
  97. package/dist/agent/slack-gate-server.js.map +1 -0
  98. package/dist/agent/slack-socket-client.d.ts +20 -0
  99. package/dist/agent/slack-socket-client.d.ts.map +1 -0
  100. package/dist/agent/slack-socket-client.js +141 -0
  101. package/dist/agent/slack-socket-client.js.map +1 -0
  102. package/dist/commands/agent.d.ts +3 -0
  103. package/dist/commands/agent.d.ts.map +1 -0
  104. package/dist/commands/agent.js +183 -0
  105. package/dist/commands/agent.js.map +1 -0
  106. package/dist/commands/cleanup.d.ts +16 -0
  107. package/dist/commands/cleanup.d.ts.map +1 -0
  108. package/dist/commands/cleanup.js +79 -0
  109. package/dist/commands/cleanup.js.map +1 -0
  110. package/dist/commands/diff.d.ts +41 -0
  111. package/dist/commands/diff.d.ts.map +1 -0
  112. package/dist/commands/diff.js +203 -0
  113. package/dist/commands/diff.js.map +1 -0
  114. package/dist/commands/init.d.ts +10 -0
  115. package/dist/commands/init.d.ts.map +1 -0
  116. package/dist/commands/init.js +97 -0
  117. package/dist/commands/init.js.map +1 -0
  118. package/dist/commands/inspect.d.ts +14 -0
  119. package/dist/commands/inspect.d.ts.map +1 -0
  120. package/dist/commands/inspect.js +224 -0
  121. package/dist/commands/inspect.js.map +1 -0
  122. package/dist/commands/list.d.ts +18 -0
  123. package/dist/commands/list.d.ts.map +1 -0
  124. package/dist/commands/list.js +88 -0
  125. package/dist/commands/list.js.map +1 -0
  126. package/dist/commands/mcp.d.ts +8 -0
  127. package/dist/commands/mcp.d.ts.map +1 -0
  128. package/dist/commands/mcp.js +22 -0
  129. package/dist/commands/mcp.js.map +1 -0
  130. package/dist/commands/migrate.d.ts +3 -0
  131. package/dist/commands/migrate.d.ts.map +1 -0
  132. package/dist/commands/migrate.js +42 -0
  133. package/dist/commands/migrate.js.map +1 -0
  134. package/dist/commands/register.d.ts +6 -0
  135. package/dist/commands/register.d.ts.map +1 -0
  136. package/dist/commands/register.js +51 -0
  137. package/dist/commands/register.js.map +1 -0
  138. package/dist/commands/replay-format.d.ts +3 -0
  139. package/dist/commands/replay-format.d.ts.map +1 -0
  140. package/dist/commands/replay-format.js +10 -0
  141. package/dist/commands/replay-format.js.map +1 -0
  142. package/dist/commands/replay.d.ts +38 -0
  143. package/dist/commands/replay.d.ts.map +1 -0
  144. package/dist/commands/replay.js +173 -0
  145. package/dist/commands/replay.js.map +1 -0
  146. package/dist/commands/respond.d.ts +20 -0
  147. package/dist/commands/respond.d.ts.map +1 -0
  148. package/dist/commands/respond.js +49 -0
  149. package/dist/commands/respond.js.map +1 -0
  150. package/dist/commands/resume.d.ts +15 -0
  151. package/dist/commands/resume.d.ts.map +1 -0
  152. package/dist/commands/resume.js +63 -0
  153. package/dist/commands/resume.js.map +1 -0
  154. package/dist/commands/run.d.ts +3 -0
  155. package/dist/commands/run.d.ts.map +1 -0
  156. package/dist/commands/run.js +127 -0
  157. package/dist/commands/run.js.map +1 -0
  158. package/dist/commands/serve.d.ts +33 -0
  159. package/dist/commands/serve.d.ts.map +1 -0
  160. package/dist/commands/serve.js +144 -0
  161. package/dist/commands/serve.js.map +1 -0
  162. package/dist/commands/test.d.ts +12 -0
  163. package/dist/commands/test.d.ts.map +1 -0
  164. package/dist/commands/test.js +58 -0
  165. package/dist/commands/test.js.map +1 -0
  166. package/dist/commands/validate.d.ts +3 -0
  167. package/dist/commands/validate.d.ts.map +1 -0
  168. package/dist/commands/validate.js +35 -0
  169. package/dist/commands/validate.js.map +1 -0
  170. package/dist/commands/watch.d.ts +18 -0
  171. package/dist/commands/watch.d.ts.map +1 -0
  172. package/dist/commands/watch.js +112 -0
  173. package/dist/commands/watch.js.map +1 -0
  174. package/dist/commands/webhook.d.ts +51 -0
  175. package/dist/commands/webhook.d.ts.map +1 -0
  176. package/dist/commands/webhook.js +227 -0
  177. package/dist/commands/webhook.js.map +1 -0
  178. package/dist/commands-registry.d.ts +7 -0
  179. package/dist/commands-registry.d.ts.map +1 -0
  180. package/dist/commands-registry.js +44 -0
  181. package/dist/commands-registry.js.map +1 -0
  182. package/dist/index.d.ts +3 -0
  183. package/dist/index.d.ts.map +1 -0
  184. package/dist/index.js +21 -0
  185. package/dist/index.js.map +1 -0
  186. package/dist/store/replay-store.d.ts +29 -0
  187. package/dist/store/replay-store.d.ts.map +1 -0
  188. package/dist/store/replay-store.js +31 -0
  189. package/dist/store/replay-store.js.map +1 -0
  190. package/package.json +83 -0
@@ -0,0 +1,203 @@
1
+ // diff command — compares the evidence chains of two runs side by side.
2
+ import chalk from 'chalk';
3
+ import { Command } from 'commander';
4
+ import { formatPrecondColumn } from './replay-format.js';
5
+ /** Returns true when the given ID is a replay ID (starts with "rpl_"). */
6
+ export function isReplayId(id) {
7
+ return id.startsWith('rpl_');
8
+ }
9
+ /** Formats a single replay result for the diff column. */
10
+ function formatReplayColumn(result) {
11
+ if (result === undefined)
12
+ return 'missing';
13
+ return formatPrecondColumn(result.preconditions_original, result.preconditions_replay, result.has_preconditions);
14
+ }
15
+ /**
16
+ * Compares step-level precondition results from two replay records.
17
+ * @param recordA First replay record.
18
+ * @param recordB Second replay record.
19
+ */
20
+ export function diffReplays(recordA, recordB) {
21
+ const mapA = new Map(recordA.results.map((r) => [r.step_id, r]));
22
+ const mapB = new Map(recordB.results.map((r) => [r.step_id, r]));
23
+ const allSteps = new Set();
24
+ for (const r of recordA.results)
25
+ allSteps.add(r.step_id);
26
+ for (const r of recordB.results)
27
+ allSteps.add(r.step_id);
28
+ return Array.from(allSteps).map((stepId) => {
29
+ const a = mapA.get(stepId);
30
+ const b = mapB.get(stepId);
31
+ const precond_a = formatReplayColumn(a);
32
+ const precond_b = formatReplayColumn(b);
33
+ return { step_id: stepId, precond_a, precond_b, differs: precond_a !== precond_b };
34
+ });
35
+ }
36
+ /**
37
+ * Compares evidence chains of two runs, producing a row per unique step.
38
+ * @param runA First run to compare.
39
+ * @param runB Second run to compare.
40
+ */
41
+ export function diffRuns(runA, runB) {
42
+ // Build last non-gate_response snapshot per step_id for each run.
43
+ const lastA = new Map();
44
+ const lastB = new Map();
45
+ for (const snap of runA.evidence) {
46
+ if (snap.kind === 'gate_response')
47
+ continue;
48
+ lastA.set(snap.step_id, snap);
49
+ }
50
+ for (const snap of runB.evidence) {
51
+ if (snap.kind === 'gate_response')
52
+ continue;
53
+ lastB.set(snap.step_id, snap);
54
+ }
55
+ // Collect all unique step IDs, preserving appearance order from A then B.
56
+ const allSteps = new Set();
57
+ for (const id of lastA.keys())
58
+ allSteps.add(id);
59
+ for (const id of lastB.keys())
60
+ allSteps.add(id);
61
+ return Array.from(allSteps).map((stepId) => {
62
+ const snapA = lastA.get(stepId);
63
+ const snapB = lastB.get(stepId);
64
+ const statusA = snapA?.status ?? 'missing';
65
+ const statusB = snapB?.status ?? 'missing';
66
+ return {
67
+ step_id: stepId,
68
+ status_a: statusA,
69
+ status_b: statusB,
70
+ hash_a: snapA?.evidence_hash ?? '\u2014',
71
+ hash_b: snapB?.evidence_hash ?? '\u2014',
72
+ duration_a_ms: snapA?.duration_ms ?? 0,
73
+ duration_b_ms: snapB?.duration_ms ?? 0,
74
+ same_output: snapA !== undefined && snapB !== undefined && snapA.evidence_hash === snapB.evidence_hash,
75
+ same_status: statusA === statusB,
76
+ };
77
+ });
78
+ }
79
+ /** Applies chalk coloring to a status value in a diff row. */
80
+ function colorDiffStatus(status) {
81
+ if (status === 'error' || status === 'missing')
82
+ return chalk.red(status);
83
+ return status;
84
+ }
85
+ /** Returns the comparison symbol between A and B columns. */
86
+ function diffSymbol(row) {
87
+ if (row.status_a === 'missing' || row.status_b === 'missing')
88
+ return ' ';
89
+ if (row.same_output && row.same_status)
90
+ return '=';
91
+ return chalk.yellow('\u2260');
92
+ }
93
+ /** Formats Δ ms: signed difference if both steps exist, em-dash otherwise. */
94
+ function formatDelta(row) {
95
+ if (row.status_a === 'missing' || row.status_b === 'missing')
96
+ return '\u2014';
97
+ const delta = row.duration_b_ms - row.duration_a_ms;
98
+ if (delta === 0)
99
+ return '0';
100
+ return delta > 0 ? `+${delta}` : String(delta);
101
+ }
102
+ export const diffCommand = new Command('diff')
103
+ .argument('<run-id-a>', 'First run or replay ID')
104
+ .argument('<run-id-b>', 'Second run or replay ID')
105
+ .description('Compare evidence chains of two runs side by side')
106
+ .action(async (runIdA, runIdB) => {
107
+ if (isReplayId(runIdA) !== isReplayId(runIdB)) {
108
+ console.error('Error: cannot diff a run against a replay. Provide two run IDs or two replay IDs.');
109
+ process.exit(1);
110
+ }
111
+ if (isReplayId(runIdA) && isReplayId(runIdB)) {
112
+ const { JsonFileReplayStore } = await import('../store/replay-store.js');
113
+ const replayStore = new JsonFileReplayStore();
114
+ let recordA;
115
+ let recordB;
116
+ try {
117
+ recordA = await replayStore.get(runIdA);
118
+ }
119
+ catch (err) {
120
+ console.error(err instanceof Error ? err.message : String(err));
121
+ process.exit(1);
122
+ }
123
+ try {
124
+ recordB = await replayStore.get(runIdB);
125
+ }
126
+ catch (err) {
127
+ console.error(err instanceof Error ? err.message : String(err));
128
+ process.exit(1);
129
+ }
130
+ const rows = diffReplays(recordA, recordB);
131
+ console.log(`Replay diff: ${runIdA} vs ${runIdB}`);
132
+ console.log(`Origin runs: ${recordA.origin_run_id} vs ${recordB.origin_run_id}`);
133
+ if (recordA.overrides.length === 0) {
134
+ console.log('Overrides A: (none)');
135
+ }
136
+ else {
137
+ for (const ov of recordA.overrides)
138
+ console.log(`Overrides A: ${ov}`);
139
+ }
140
+ if (recordB.overrides.length === 0) {
141
+ console.log('Overrides B: (none)');
142
+ }
143
+ else {
144
+ for (const ov of recordB.overrides)
145
+ console.log(`Overrides B: ${ov}`);
146
+ }
147
+ console.log('');
148
+ const col1 = 22;
149
+ const col2 = 38;
150
+ const sep1 = '\u2500'.repeat(col1 - 1);
151
+ const sep2 = '\u2500'.repeat(col2 - 1);
152
+ console.log(`${'Step'.padEnd(col1)} ${'Replay A'.padEnd(col2)} ${'Replay B'.padEnd(col2)} Diff?`);
153
+ console.log(`${sep1} ${sep2} ${sep2} ${'\u2500'.repeat(5)}`);
154
+ for (const row of rows) {
155
+ const diffCol = row.differs ? chalk.yellow('\u2260') : '=';
156
+ console.log(`${row.step_id.padEnd(col1)} ${row.precond_a.padEnd(col2)} ${row.precond_b.padEnd(col2)} ${diffCol}`);
157
+ }
158
+ return;
159
+ }
160
+ const { JsonFileStore } = await import('@sensigo/realm');
161
+ const store = new JsonFileStore();
162
+ let runA;
163
+ let runB;
164
+ try {
165
+ runA = await store.get(runIdA);
166
+ }
167
+ catch (err) {
168
+ console.error(err instanceof Error ? err.message : String(err));
169
+ process.exit(1);
170
+ }
171
+ try {
172
+ runB = await store.get(runIdB);
173
+ }
174
+ catch (err) {
175
+ console.error(err instanceof Error ? err.message : String(err));
176
+ process.exit(1);
177
+ }
178
+ if (runA.workflow_id !== runB.workflow_id) {
179
+ console.warn(`Warning: runs are from different workflows (${runA.workflow_id} vs ${runB.workflow_id})`);
180
+ }
181
+ const rows = diffRuns(runA, runB);
182
+ console.log(`Diff: ${runIdA} vs ${runIdB}`);
183
+ console.log(`Workflow: ${runA.workflow_id}`);
184
+ console.log('');
185
+ const col1 = 22;
186
+ const col2 = 10;
187
+ const col3 = 10;
188
+ const sep1 = '\u2500'.repeat(col1 - 1);
189
+ const sep2 = '\u2500'.repeat(col2 - 1);
190
+ const sep3 = '\u2500'.repeat(col3 - 1);
191
+ console.log(`${'Step'.padEnd(col1)} ${'A status'.padEnd(col2 + 2)} ${'B status'.padEnd(col2)} ${'A hash'.padEnd(col2)} ${'B hash'.padEnd(col2)} ${'\u0394 ms'}`);
192
+ console.log(`${sep1} ${sep2} ${sep2} ${sep2} ${sep2} ${sep3}`);
193
+ for (const row of rows) {
194
+ const sym = diffSymbol(row);
195
+ const statusA = colorDiffStatus(row.status_a).padEnd(col2);
196
+ const statusB = colorDiffStatus(row.status_b).padEnd(col2);
197
+ const hashA = row.hash_a.slice(0, 8).padEnd(col2);
198
+ const hashB = row.hash_b.slice(0, 8).padEnd(col2);
199
+ const delta = formatDelta(row);
200
+ console.log(`${row.step_id.padEnd(col1)} ${statusA} ${sym} ${statusB} ${hashA} ${hashB} ${delta}`);
201
+ }
202
+ });
203
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Scaffolds a new workflow project at targetDir with four template files.
4
+ * Throws an error if targetDir already exists.
5
+ * @param name Workflow project name used in file contents.
6
+ * @param targetDir Directory to create (defaults to join(cwd, name) in the command action).
7
+ */
8
+ export declare function initWorkflow(name: string, targetDir: string): Promise<void>;
9
+ export declare const initCommand: Command;
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEjF;AAED,eAAO,MAAM,WAAW,SAmBpB,CAAC"}
@@ -0,0 +1,97 @@
1
+ // init command — scaffolds a new workflow project directory.
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { existsSync } from 'node:fs';
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Scaffolds a new workflow project at targetDir with four template files.
8
+ * Throws an error if targetDir already exists.
9
+ * @param name Workflow project name used in file contents.
10
+ * @param targetDir Directory to create (defaults to join(cwd, name) in the command action).
11
+ */
12
+ export async function initWorkflow(name, targetDir) {
13
+ if (existsSync(targetDir)) {
14
+ throw new Error(`Directory already exists: ${targetDir}`);
15
+ }
16
+ await mkdir(targetDir, { recursive: true });
17
+ const workflowYaml = `# ${name} workflow
18
+ id: ${name}
19
+ name: "${name}"
20
+ version: 1
21
+ initial_state: created
22
+
23
+ steps:
24
+ step_one:
25
+ description: "First step \u2014 replace with your own"
26
+ execution: agent
27
+ allowed_from_states: [created]
28
+ produces_state: step_one_done
29
+ input_schema:
30
+ type: object
31
+ required: [result]
32
+ properties:
33
+ result:
34
+ type: string
35
+
36
+ finalize:
37
+ description: "Final step"
38
+ execution: auto
39
+ allowed_from_states: [step_one_done]
40
+ produces_state: completed
41
+ `;
42
+ const schemaJson = JSON.stringify({
43
+ $schema: 'http://json-schema.org/draft-07/schema#',
44
+ type: 'object',
45
+ properties: {},
46
+ additionalProperties: true,
47
+ }, null, 2);
48
+ const envExample = `# Add your secrets here
49
+ # EXAMPLE_API_KEY=your_key_here
50
+ `;
51
+ const readmeMd = `# ${name}
52
+
53
+ A Realm workflow.
54
+
55
+ ## Run
56
+
57
+ \`\`\`bash
58
+ realm workflow validate ./
59
+ realm workflow register ./
60
+ realm workflow run ./
61
+ \`\`\`
62
+
63
+ ## Test
64
+
65
+ Add fixtures to \`fixtures/\` and run:
66
+
67
+ \`\`\`bash
68
+ realm workflow test ./ --fixtures ./fixtures/
69
+ \`\`\`
70
+ `;
71
+ await writeFile(join(targetDir, 'workflow.yaml'), workflowYaml, 'utf8');
72
+ await writeFile(join(targetDir, 'schema.json'), schemaJson + '\n', 'utf8');
73
+ await writeFile(join(targetDir, '.env.example'), envExample, 'utf8');
74
+ await writeFile(join(targetDir, 'README.md'), readmeMd, 'utf8');
75
+ }
76
+ export const initCommand = new Command('init')
77
+ .argument('<name>', 'Workflow project name (becomes the directory name)')
78
+ .description('Scaffold a new workflow project')
79
+ .action(async (name) => {
80
+ const { join: pathJoin } = await import('node:path');
81
+ const targetDir = pathJoin(process.cwd(), name);
82
+ try {
83
+ await initWorkflow(name, targetDir);
84
+ console.log(`Created: ${name}/`);
85
+ console.log(' workflow.yaml');
86
+ console.log(' schema.json');
87
+ console.log(' .env.example');
88
+ console.log(' README.md');
89
+ console.log('');
90
+ console.log(`Next: realm workflow validate ./${name}/`);
91
+ }
92
+ catch (err) {
93
+ console.error(err instanceof Error ? err.message : String(err));
94
+ process.exit(1);
95
+ }
96
+ });
97
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ import type { RunStore, WorkflowRegistrar } from '@sensigo/realm';
3
+ /**
4
+ * Formats and returns a colored inspection report for a workflow run.
5
+ * @param runId The ID of the run to inspect.
6
+ * @param store Store holding run records.
7
+ * @param workflowStore Registrar for workflow definitions.
8
+ * @param options Optional rendering options (e.g. verbose tool call output).
9
+ */
10
+ export declare function inspectRun(runId: string, store: RunStore, workflowStore: WorkflowRegistrar, options?: {
11
+ verbose?: boolean;
12
+ }): Promise<string>;
13
+ export declare const inspectCommand: Command;
14
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EACV,QAAQ,EAER,iBAAiB,EAGlB,MAAM,gBAAgB,CAAC;AA8BxB;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,iBAAiB,EAChC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,CAAC,CAiMjB;AAED,eAAO,MAAM,cAAc,SAoBvB,CAAC"}
@@ -0,0 +1,224 @@
1
+ // inspect command — displays the full evidence chain and diagnostics for a run.
2
+ import chalk from 'chalk';
3
+ import { Command } from 'commander';
4
+ /** Truncates a JSON-serialised summary to a readable single line. */
5
+ function formatSummary(value, maxLength = 120) {
6
+ const raw = JSON.stringify(value);
7
+ if (raw.length <= maxLength)
8
+ return raw;
9
+ return raw.slice(0, maxLength) + chalk.dim('…');
10
+ }
11
+ /** Formats a diagnostics object into a readable string for the inspect output. */
12
+ function formatDiagnostics(diag) {
13
+ const tokens = `~${diag.input_token_estimate} tokens`;
14
+ if (diag.precondition_trace.length === 0) {
15
+ return `${tokens} | no preconditions`;
16
+ }
17
+ const traceStr = diag.precondition_trace
18
+ .map((t) => `${t.expression} \u2192 ${t.passed ? 'true' : 'false'} (${String(t.resolved_value)})`)
19
+ .join(', ');
20
+ return `${tokens} | preconditions: ${traceStr}`;
21
+ }
22
+ /** Applies chalk color to a step status string. */
23
+ function colorStatus(status) {
24
+ if (status === 'success')
25
+ return chalk.green(status);
26
+ if (status === 'error')
27
+ return chalk.red(status);
28
+ return chalk.yellow(status);
29
+ }
30
+ /**
31
+ * Formats and returns a colored inspection report for a workflow run.
32
+ * @param runId The ID of the run to inspect.
33
+ * @param store Store holding run records.
34
+ * @param workflowStore Registrar for workflow definitions.
35
+ * @param options Optional rendering options (e.g. verbose tool call output).
36
+ */
37
+ export async function inspectRun(runId, store, workflowStore, options) {
38
+ const run = await store.get(runId);
39
+ // Try to load workflow definition; gracefully handle missing definition.
40
+ let workflowLabel;
41
+ let definitionMissing = false;
42
+ try {
43
+ const def = await workflowStore.get(run.workflow_id);
44
+ workflowLabel = `${def.id} v${def.version}`;
45
+ }
46
+ catch {
47
+ workflowLabel = run.workflow_id;
48
+ definitionMissing = true;
49
+ }
50
+ // Color the phase label.
51
+ let phaseLabel;
52
+ if (run.run_phase === 'completed') {
53
+ phaseLabel = chalk.green(`${run.run_phase} \u2713`);
54
+ }
55
+ else if (run.run_phase === 'failed' || run.run_phase === 'abandoned') {
56
+ phaseLabel = chalk.red(run.run_phase);
57
+ }
58
+ else {
59
+ phaseLabel = chalk.yellow(run.run_phase);
60
+ }
61
+ const lines = [];
62
+ lines.push(`Run: ${run.id}`);
63
+ lines.push(`Workflow: ${workflowLabel}`);
64
+ lines.push(`Phase: ${phaseLabel}`);
65
+ lines.push(`Completed: ${run.completed_steps.join(', ') || '(none)'}`);
66
+ lines.push(`In Progress: ${run.in_progress_steps.join(', ') || '(none)'}`);
67
+ lines.push(`Failed: ${run.failed_steps.join(', ') || '(none)'}`);
68
+ lines.push(`Skipped: ${run.skipped_steps.join(', ') || '(none)'}`);
69
+ lines.push(`Created: ${run.created_at}`);
70
+ lines.push(`Updated: ${run.updated_at}`);
71
+ if (definitionMissing) {
72
+ lines.push('');
73
+ lines.push('(workflow definition not found \u2014 showing run record only)');
74
+ }
75
+ // Group evidence snapshots by step_id, preserving first-appearance order.
76
+ const stepOrder = [];
77
+ const stepSnapshots = new Map();
78
+ for (const snap of run.evidence) {
79
+ if (!stepSnapshots.has(snap.step_id)) {
80
+ stepOrder.push(snap.step_id);
81
+ stepSnapshots.set(snap.step_id, []);
82
+ }
83
+ stepSnapshots.get(snap.step_id).push(snap);
84
+ }
85
+ // Run-level trace aggregation — summarise across all evidence snapshots.
86
+ const allSnaps = run.evidence;
87
+ const snapsWithTrace = allSnaps.filter((s) => s.trace !== undefined && s.trace.length > 0);
88
+ if (snapsWithTrace.length > 0) {
89
+ const stepsWithTrace = snapsWithTrace.length;
90
+ const stepsWithTraceUnique = new Set(snapsWithTrace.map((s) => s.step_id)).size;
91
+ const storedEntriesTotal = allSnaps.reduce((acc, s) => acc + (s.trace_summary?.stored_entries ?? 0), 0);
92
+ const discardedEntriesTotal = allSnaps.reduce((acc, s) => acc + (s.trace_summary?.discarded_entries ?? 0), 0);
93
+ const truncatedSteps = allSnaps.filter((s) => s.trace_summary?.truncated === true).length;
94
+ // Frequency map of events across all stored trace entries (excluding sentinel).
95
+ const eventFreq = new Map();
96
+ for (const snap of allSnaps) {
97
+ for (const entry of snap.trace ?? []) {
98
+ if (entry.event === 'trace.truncated')
99
+ continue;
100
+ eventFreq.set(entry.event, (eventFreq.get(entry.event) ?? 0) + 1);
101
+ }
102
+ }
103
+ const topEvents = [...eventFreq.entries()]
104
+ .sort((a, b) => b[1] - a[1])
105
+ .slice(0, 5)
106
+ .map(([event, count]) => `${event} (${count})`);
107
+ lines.push('');
108
+ lines.push('Trace Summary:');
109
+ lines.push(` steps_with_trace: ${stepsWithTrace}`);
110
+ lines.push(` steps_with_trace_unique: ${stepsWithTraceUnique}`);
111
+ lines.push(` stored_entries_total: ${storedEntriesTotal}`);
112
+ lines.push(` discarded_entries_total:${discardedEntriesTotal}`);
113
+ lines.push(` truncated_steps: ${truncatedSteps}`);
114
+ if (topEvents.length > 0) {
115
+ lines.push(` top_events: ${topEvents.join(', ')}`);
116
+ }
117
+ }
118
+ lines.push('');
119
+ lines.push(`Evidence (${stepOrder.length} steps):`);
120
+ stepOrder.forEach((stepId, idx) => {
121
+ const snaps = stepSnapshots.get(stepId);
122
+ const hasAttempts = snaps.length > 1 && snaps.some((s) => s.attempt !== undefined);
123
+ const totalAttempts = snaps.length;
124
+ lines.push('');
125
+ if (hasAttempts) {
126
+ // Show step name as header, then each attempt as a sub-item.
127
+ lines.push(` ${idx + 1}. ${stepId}`);
128
+ snaps.forEach((snap, ai) => {
129
+ const statusColored = colorStatus(snap.status);
130
+ const hashShort = chalk.dim(`hash: ${snap.evidence_hash.slice(0, 8)}`);
131
+ lines.push(` (attempt ${ai + 1}/${totalAttempts}) ${statusColored} ${snap.duration_ms}ms ${hashShort}`);
132
+ });
133
+ // Show Input/Output/Diagnostics for the last attempt.
134
+ const lastSnap = snaps[snaps.length - 1];
135
+ lines.push(` Input: ${formatSummary(lastSnap.input_summary)}`);
136
+ if (lastSnap.resolved_params !== undefined) {
137
+ lines.push(` Resolved: ${formatSummary(lastSnap.resolved_params)}`);
138
+ }
139
+ lines.push(` Output: ${formatSummary(lastSnap.output_summary)}`);
140
+ if (lastSnap.trace !== undefined) {
141
+ lines.push(` Trace: ${lastSnap.trace.length} entries (not hashed).`);
142
+ if (lastSnap.trace_summary?.truncated) {
143
+ const s = lastSnap.trace_summary;
144
+ lines.push(chalk.yellow(` ⚠ Trace truncated (${s.truncation_reason ?? 'unknown'}): ${s.stored_entries} stored, ${s.discarded_entries} discarded.`));
145
+ }
146
+ }
147
+ if (lastSnap.diagnostics !== undefined) {
148
+ lines.push(chalk.dim(` Diagnostics: ${formatDiagnostics(lastSnap.diagnostics)}`));
149
+ }
150
+ }
151
+ else {
152
+ const snap = snaps[0];
153
+ const statusColored = colorStatus(snap.status);
154
+ const hashShort = chalk.dim(`hash: ${snap.evidence_hash.slice(0, 8)}`);
155
+ const kindLabel = snap.kind === 'gate_response' ? chalk.cyan(' gate_response') : '';
156
+ const profileLabel = snap.agent_profile !== undefined ? chalk.cyan(` [profile: ${snap.agent_profile}]`) : '';
157
+ lines.push(` ${idx + 1}. ${stepId.padEnd(22)}${profileLabel}${kindLabel} ${statusColored} ${snap.duration_ms}ms ${hashShort}`);
158
+ if (snap.kind === 'gate_response') {
159
+ const choice = snap.input_summary['choice'] ?? snap.output_summary['choice'];
160
+ if (choice !== undefined) {
161
+ lines.push(` Choice: ${String(choice)}`);
162
+ }
163
+ if (snap.gate_message !== undefined) {
164
+ lines.push(` Message: "${snap.gate_message}"`);
165
+ }
166
+ lines.push(` Output: ${formatSummary(snap.output_summary)}`);
167
+ }
168
+ else {
169
+ lines.push(` Input: ${formatSummary(snap.input_summary)}`);
170
+ if (snap.resolved_params !== undefined) {
171
+ lines.push(` Resolved: ${formatSummary(snap.resolved_params)}`);
172
+ }
173
+ lines.push(` Output: ${formatSummary(snap.output_summary)}`);
174
+ if (snap.trace !== undefined) {
175
+ lines.push(` Trace: ${snap.trace.length} entries (not hashed).`);
176
+ if (snap.trace_summary?.truncated) {
177
+ const s = snap.trace_summary;
178
+ lines.push(chalk.yellow(` ⚠ Trace truncated (${s.truncation_reason ?? 'unknown'}): ${s.stored_entries} stored, ${s.discarded_entries} discarded.`));
179
+ }
180
+ }
181
+ if (snap.tool_calls === undefined) {
182
+ // callStep path — print nothing
183
+ }
184
+ else if (snap.tool_calls.length === 0) {
185
+ lines.push(' Tools declared, none called');
186
+ }
187
+ else {
188
+ lines.push(` Tool calls (${snap.tool_calls.length}):`);
189
+ for (const tc of snap.tool_calls) {
190
+ const errSuffix = tc.error ? ` error: ${tc.error}` : '';
191
+ lines.push(` [${tc.server_id}:${tc.tool}] ${tc.duration_ms}ms${errSuffix}`);
192
+ if (options?.verbose) {
193
+ lines.push(` args: ${formatSummary(tc.args)}`);
194
+ const resultStr = typeof tc.result === 'string' ? tc.result : '(null)';
195
+ lines.push(` result: ${resultStr}`);
196
+ }
197
+ }
198
+ }
199
+ if (snap.diagnostics !== undefined) {
200
+ lines.push(chalk.dim(` Diagnostics: ${formatDiagnostics(snap.diagnostics)}`));
201
+ }
202
+ }
203
+ }
204
+ });
205
+ return lines.join('\n');
206
+ }
207
+ export const inspectCommand = new Command('inspect')
208
+ .argument('<run-id>', 'ID of the run to inspect')
209
+ .description('Display the full evidence chain and diagnostics for a run')
210
+ .option('--verbose', 'Show full tool call args and results')
211
+ .action(async (runId, cmdOpts) => {
212
+ const { JsonFileStore, JsonWorkflowStore } = await import('@sensigo/realm');
213
+ const store = new JsonFileStore();
214
+ const workflowStore = new JsonWorkflowStore();
215
+ try {
216
+ const output = await inspectRun(runId, store, workflowStore, cmdOpts.verbose === true ? { verbose: true } : undefined);
217
+ console.log(output);
218
+ }
219
+ catch (err) {
220
+ console.error(err instanceof Error ? err.message : String(err));
221
+ process.exit(1);
222
+ }
223
+ });
224
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from 'commander';
2
+ import type { RunStore, RunPhase } from '@sensigo/realm';
3
+ /**
4
+ * Formats elapsed time since a gate was opened as a compact human-readable duration.
5
+ * @param openedAt ISO 8601 timestamp of when the gate was opened.
6
+ * @param now Current time — injectable for testing. Defaults to `new Date()`.
7
+ */
8
+ export declare function formatGateAge(openedAt: string, now?: Date): string;
9
+ /**
10
+ * Lists runs from the store, sorted by updated_at descending.
11
+ * @param workflowId Optional filter — only show runs from this workflow.
12
+ * @param store Store holding run records.
13
+ * @param statusFilter Optional filter — only show runs with this run_phase.
14
+ * @returns Formatted output string.
15
+ */
16
+ export declare function listRuns(workflowId: string | undefined, store: RunStore, statusFilter?: RunPhase): Promise<string>;
17
+ export declare const listCommand: Command;
18
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAa,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAUpE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAa9E;AAID;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,QAAQ,EACf,YAAY,CAAC,EAAE,QAAQ,GACtB,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,eAAO,MAAM,WAAW,SA0BpB,CAAC"}