@pleri/olam-cli 0.1.7

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 (196) hide show
  1. package/dist/__tests__/auth-status.test.d.ts +2 -0
  2. package/dist/__tests__/auth-status.test.d.ts.map +1 -0
  3. package/dist/__tests__/auth-status.test.js +290 -0
  4. package/dist/__tests__/auth-status.test.js.map +1 -0
  5. package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
  6. package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth-upgrade.test.js +161 -0
  8. package/dist/__tests__/auth-upgrade.test.js.map +1 -0
  9. package/dist/__tests__/create-app-urls.test.d.ts +2 -0
  10. package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
  11. package/dist/__tests__/create-app-urls.test.js +102 -0
  12. package/dist/__tests__/create-app-urls.test.js.map +1 -0
  13. package/dist/__tests__/enter.test.d.ts +2 -0
  14. package/dist/__tests__/enter.test.d.ts.map +1 -0
  15. package/dist/__tests__/enter.test.js +90 -0
  16. package/dist/__tests__/enter.test.js.map +1 -0
  17. package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
  18. package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
  19. package/dist/__tests__/host-cp-gh-token.test.js +119 -0
  20. package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
  21. package/dist/__tests__/host-cp.test.d.ts +9 -0
  22. package/dist/__tests__/host-cp.test.d.ts.map +1 -0
  23. package/dist/__tests__/host-cp.test.js +254 -0
  24. package/dist/__tests__/host-cp.test.js.map +1 -0
  25. package/dist/__tests__/keys.test.d.ts +9 -0
  26. package/dist/__tests__/keys.test.d.ts.map +1 -0
  27. package/dist/__tests__/keys.test.js +145 -0
  28. package/dist/__tests__/keys.test.js.map +1 -0
  29. package/dist/__tests__/logs.test.d.ts +9 -0
  30. package/dist/__tests__/logs.test.d.ts.map +1 -0
  31. package/dist/__tests__/logs.test.js +124 -0
  32. package/dist/__tests__/logs.test.js.map +1 -0
  33. package/dist/__tests__/ps.test.d.ts +2 -0
  34. package/dist/__tests__/ps.test.d.ts.map +1 -0
  35. package/dist/__tests__/ps.test.js +172 -0
  36. package/dist/__tests__/ps.test.js.map +1 -0
  37. package/dist/__tests__/status-app-urls.test.d.ts +2 -0
  38. package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
  39. package/dist/__tests__/status-app-urls.test.js +125 -0
  40. package/dist/__tests__/status-app-urls.test.js.map +1 -0
  41. package/dist/__tests__/upgrade.test.d.ts +9 -0
  42. package/dist/__tests__/upgrade.test.d.ts.map +1 -0
  43. package/dist/__tests__/upgrade.test.js +262 -0
  44. package/dist/__tests__/upgrade.test.js.map +1 -0
  45. package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
  46. package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
  47. package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
  48. package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
  49. package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
  50. package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
  51. package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
  52. package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
  53. package/dist/commands/__tests__/refresh.test.d.ts +13 -0
  54. package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
  55. package/dist/commands/__tests__/refresh.test.js +170 -0
  56. package/dist/commands/__tests__/refresh.test.js.map +1 -0
  57. package/dist/commands/auth-status.d.ts +43 -0
  58. package/dist/commands/auth-status.d.ts.map +1 -0
  59. package/dist/commands/auth-status.js +208 -0
  60. package/dist/commands/auth-status.js.map +1 -0
  61. package/dist/commands/auth-upgrade.d.ts +47 -0
  62. package/dist/commands/auth-upgrade.d.ts.map +1 -0
  63. package/dist/commands/auth-upgrade.js +277 -0
  64. package/dist/commands/auth-upgrade.js.map +1 -0
  65. package/dist/commands/auth.d.ts +16 -0
  66. package/dist/commands/auth.d.ts.map +1 -0
  67. package/dist/commands/auth.js +283 -0
  68. package/dist/commands/auth.js.map +1 -0
  69. package/dist/commands/create.d.ts +8 -0
  70. package/dist/commands/create.d.ts.map +1 -0
  71. package/dist/commands/create.js +512 -0
  72. package/dist/commands/create.js.map +1 -0
  73. package/dist/commands/crystallize.d.ts +8 -0
  74. package/dist/commands/crystallize.d.ts.map +1 -0
  75. package/dist/commands/crystallize.js +101 -0
  76. package/dist/commands/crystallize.js.map +1 -0
  77. package/dist/commands/destroy.d.ts +6 -0
  78. package/dist/commands/destroy.d.ts.map +1 -0
  79. package/dist/commands/destroy.js +54 -0
  80. package/dist/commands/destroy.js.map +1 -0
  81. package/dist/commands/dispatch.d.ts +9 -0
  82. package/dist/commands/dispatch.d.ts.map +1 -0
  83. package/dist/commands/dispatch.js +94 -0
  84. package/dist/commands/dispatch.js.map +1 -0
  85. package/dist/commands/enter.d.ts +63 -0
  86. package/dist/commands/enter.d.ts.map +1 -0
  87. package/dist/commands/enter.js +206 -0
  88. package/dist/commands/enter.js.map +1 -0
  89. package/dist/commands/host-cp.d.ts +191 -0
  90. package/dist/commands/host-cp.d.ts.map +1 -0
  91. package/dist/commands/host-cp.js +797 -0
  92. package/dist/commands/host-cp.js.map +1 -0
  93. package/dist/commands/init.d.ts +9 -0
  94. package/dist/commands/init.d.ts.map +1 -0
  95. package/dist/commands/init.js +143 -0
  96. package/dist/commands/init.js.map +1 -0
  97. package/dist/commands/install.d.ts +22 -0
  98. package/dist/commands/install.d.ts.map +1 -0
  99. package/dist/commands/install.js +203 -0
  100. package/dist/commands/install.js.map +1 -0
  101. package/dist/commands/keys.d.ts +26 -0
  102. package/dist/commands/keys.d.ts.map +1 -0
  103. package/dist/commands/keys.js +151 -0
  104. package/dist/commands/keys.js.map +1 -0
  105. package/dist/commands/lanes.d.ts +18 -0
  106. package/dist/commands/lanes.d.ts.map +1 -0
  107. package/dist/commands/lanes.js +122 -0
  108. package/dist/commands/lanes.js.map +1 -0
  109. package/dist/commands/list.d.ts +6 -0
  110. package/dist/commands/list.d.ts.map +1 -0
  111. package/dist/commands/list.js +39 -0
  112. package/dist/commands/list.js.map +1 -0
  113. package/dist/commands/logs.d.ts +38 -0
  114. package/dist/commands/logs.d.ts.map +1 -0
  115. package/dist/commands/logs.js +177 -0
  116. package/dist/commands/logs.js.map +1 -0
  117. package/dist/commands/observe.d.ts +9 -0
  118. package/dist/commands/observe.d.ts.map +1 -0
  119. package/dist/commands/observe.js +34 -0
  120. package/dist/commands/observe.js.map +1 -0
  121. package/dist/commands/policy-check.d.ts +14 -0
  122. package/dist/commands/policy-check.d.ts.map +1 -0
  123. package/dist/commands/policy-check.js +76 -0
  124. package/dist/commands/policy-check.js.map +1 -0
  125. package/dist/commands/pr.d.ts +17 -0
  126. package/dist/commands/pr.d.ts.map +1 -0
  127. package/dist/commands/pr.js +148 -0
  128. package/dist/commands/pr.js.map +1 -0
  129. package/dist/commands/ps.d.ts +25 -0
  130. package/dist/commands/ps.d.ts.map +1 -0
  131. package/dist/commands/ps.js +164 -0
  132. package/dist/commands/ps.js.map +1 -0
  133. package/dist/commands/refresh-helpers.d.ts +25 -0
  134. package/dist/commands/refresh-helpers.d.ts.map +1 -0
  135. package/dist/commands/refresh-helpers.js +56 -0
  136. package/dist/commands/refresh-helpers.js.map +1 -0
  137. package/dist/commands/refresh.d.ts +23 -0
  138. package/dist/commands/refresh.d.ts.map +1 -0
  139. package/dist/commands/refresh.js +237 -0
  140. package/dist/commands/refresh.js.map +1 -0
  141. package/dist/commands/status.d.ts +6 -0
  142. package/dist/commands/status.d.ts.map +1 -0
  143. package/dist/commands/status.js +51 -0
  144. package/dist/commands/status.js.map +1 -0
  145. package/dist/commands/upgrade.d.ts +67 -0
  146. package/dist/commands/upgrade.d.ts.map +1 -0
  147. package/dist/commands/upgrade.js +358 -0
  148. package/dist/commands/upgrade.js.map +1 -0
  149. package/dist/commands/workspace.d.ts +23 -0
  150. package/dist/commands/workspace.d.ts.map +1 -0
  151. package/dist/commands/workspace.js +198 -0
  152. package/dist/commands/workspace.js.map +1 -0
  153. package/dist/commands/world-snapshot.d.ts +18 -0
  154. package/dist/commands/world-snapshot.d.ts.map +1 -0
  155. package/dist/commands/world-snapshot.js +327 -0
  156. package/dist/commands/world-snapshot.js.map +1 -0
  157. package/dist/context.d.ts +26 -0
  158. package/dist/context.d.ts.map +1 -0
  159. package/dist/context.js +51 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/index.d.ts +9 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +18007 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/mcp-server.js +32236 -0
  166. package/dist/output.d.ts +10 -0
  167. package/dist/output.d.ts.map +1 -0
  168. package/dist/output.js +31 -0
  169. package/dist/output.js.map +1 -0
  170. package/host-cp/compose.yaml +126 -0
  171. package/host-cp/src/auth-secret-hint.mjs +45 -0
  172. package/host-cp/src/auth.mjs +155 -0
  173. package/host-cp/src/compose-worlds-sources.mjs +170 -0
  174. package/host-cp/src/container-secret-fetcher.mjs +163 -0
  175. package/host-cp/src/docker-events.mjs +184 -0
  176. package/host-cp/src/local-worlds-source.mjs +83 -0
  177. package/host-cp/src/plan-orchestrator.mjs +829 -0
  178. package/host-cp/src/plan-progress.mjs +282 -0
  179. package/host-cp/src/pr-cache.mjs +201 -0
  180. package/host-cp/src/pr-merge-poller.mjs +154 -0
  181. package/host-cp/src/process-poller.mjs +250 -0
  182. package/host-cp/src/proxy.mjs +245 -0
  183. package/host-cp/src/pylon-worlds-source.mjs +68 -0
  184. package/host-cp/src/redact.mjs +67 -0
  185. package/host-cp/src/secret-cache.mjs +104 -0
  186. package/host-cp/src/server.mjs +2215 -0
  187. package/host-cp/src/sse-gate.mjs +117 -0
  188. package/host-cp/src/version-status.mjs +209 -0
  189. package/host-cp/src/workspace-catalog.mjs +149 -0
  190. package/host-cp/src/world-names-store.mjs +176 -0
  191. package/host-cp/src/world-pr-state.mjs +97 -0
  192. package/host-cp/src/world-progress.mjs +322 -0
  193. package/host-cp/src/world-tunnel-manager.mjs +288 -0
  194. package/host-cp/src/worlds-db-source.mjs +191 -0
  195. package/host-cp/src/worlds-source.mjs +59 -0
  196. package/package.json +38 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Phase C8 (olam-dogfood-vision): `olam lanes <subcommand>` — operator-
3
+ * facing CRUD for claude-lane-* tmux sessions in a running world.
4
+ *
5
+ * Subcommands:
6
+ * list <world> — GET /lanes
7
+ * create <world> --name <n> --task <t> — POST /lanes/create
8
+ * destroy <world> <name> — DELETE /lanes/<name>
9
+ * dispatch <world> <name> <prompt> — POST /lanes/<name>/dispatch
10
+ *
11
+ * Goes through host-cp's `/api/world/<id>/*` proxy (Bearer-auth) so the
12
+ * operator never handles the per-world CP's CONTAINER_SECRET directly.
13
+ * The host-cp proxy injects X-Olam-Secret server-side per the
14
+ * established Phase F-2-D proxy contract.
15
+ */
16
+ import type { Command } from 'commander';
17
+ export declare function registerLanes(program: Command): void;
18
+ //# sourceMappingURL=lanes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lanes.d.ts","sourceRoot":"","sources":["../../src/commands/lanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmGzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqCpD"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Phase C8 (olam-dogfood-vision): `olam lanes <subcommand>` — operator-
3
+ * facing CRUD for claude-lane-* tmux sessions in a running world.
4
+ *
5
+ * Subcommands:
6
+ * list <world> — GET /lanes
7
+ * create <world> --name <n> --task <t> — POST /lanes/create
8
+ * destroy <world> <name> — DELETE /lanes/<name>
9
+ * dispatch <world> <name> <prompt> — POST /lanes/<name>/dispatch
10
+ *
11
+ * Goes through host-cp's `/api/world/<id>/*` proxy (Bearer-auth) so the
12
+ * operator never handles the per-world CP's CONTAINER_SECRET directly.
13
+ * The host-cp proxy injects X-Olam-Secret server-side per the
14
+ * established Phase F-2-D proxy contract.
15
+ */
16
+ import { callHostCpProxy } from './host-cp.js';
17
+ import { printError, printSuccess, printInfo, printHeader } from '../output.js';
18
+ async function handleList(world) {
19
+ printHeader(`Lanes in world ${world}`);
20
+ const result = await callHostCpProxy('GET', world, '/lanes');
21
+ if (!result.ok) {
22
+ printError(`List failed: ${result.error}`);
23
+ if (result.status === 0) {
24
+ printInfo('Hint', 'Is host CP running? `olam host-cp status`');
25
+ }
26
+ process.exitCode = 1;
27
+ return;
28
+ }
29
+ const data = result.data;
30
+ const lanes = data?.lanes ?? [];
31
+ if (lanes.length === 0) {
32
+ printInfo('Lanes', '(none — dispatch a task to spawn claude-main)');
33
+ return;
34
+ }
35
+ for (const l of lanes) {
36
+ const marker = l.isMain ? '◉' : '·';
37
+ const taskPreview = l.task.length > 60 ? l.task.slice(0, 57) + '...' : l.task;
38
+ printInfo(`${marker} ${l.name}`.padEnd(24), `${l.status.padEnd(8)} ${l.tmuxSession.padEnd(28)} ${taskPreview}`);
39
+ }
40
+ }
41
+ async function handleCreate(world, opts) {
42
+ printHeader(`Create lane ${opts.name} in ${world}`);
43
+ const result = await callHostCpProxy('POST', world, '/lanes/create', {
44
+ name: opts.name,
45
+ task: opts.task,
46
+ });
47
+ if (!result.ok) {
48
+ printError(`Create failed (HTTP ${result.status}): ${result.error}`);
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ const data = result.data;
53
+ if (!data) {
54
+ printError('Create succeeded but response body was empty');
55
+ return;
56
+ }
57
+ printSuccess(`${data.action ?? 'created'} lane ${data.name} → ${data.tmuxSession} (${data.status})`);
58
+ }
59
+ async function handleDestroy(world, name) {
60
+ printHeader(`Destroy lane ${name} in ${world}`);
61
+ const result = await callHostCpProxy('DELETE', world, `/lanes/${encodeURIComponent(name)}`);
62
+ if (!result.ok) {
63
+ printError(`Destroy failed (HTTP ${result.status}): ${result.error}`);
64
+ if (result.status === 404) {
65
+ printInfo('Hint', 'Lane already gone? Check `olam lanes list <world>`.');
66
+ }
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ printSuccess(`Destroyed lane ${name} (transcript retained)`);
71
+ }
72
+ async function handleDispatch(world, name, prompt) {
73
+ printHeader(`Dispatch to lane ${name} in ${world}`);
74
+ if (!prompt || prompt.trim().length === 0) {
75
+ printError('prompt must be a non-empty string');
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ const result = await callHostCpProxy('POST', world, `/lanes/${encodeURIComponent(name)}/dispatch`, {
80
+ prompt,
81
+ });
82
+ if (!result.ok) {
83
+ printError(`Dispatch failed (HTTP ${result.status}): ${result.error}`);
84
+ if (result.status === 503) {
85
+ printInfo('Hint', 'Lane exists but claude is not running. Try `olam lanes destroy` then re-create.');
86
+ }
87
+ process.exitCode = 1;
88
+ return;
89
+ }
90
+ printSuccess(`Dispatched to ${name} (status accepted)`);
91
+ }
92
+ export function registerLanes(program) {
93
+ const lanes = program
94
+ .command('lanes')
95
+ .description('Manage claude-lane-* tmux sessions inside a running world');
96
+ lanes
97
+ .command('list')
98
+ .description('Enumerate lanes in a world')
99
+ .argument('<world>', 'World id (e.g. ember-elk-8412)')
100
+ .action((world) => handleList(world));
101
+ lanes
102
+ .command('create')
103
+ .description('Spawn a new claude-lane-<name> session with an initial task')
104
+ .argument('<world>', 'World id')
105
+ .requiredOption('--name <name>', 'Lane name (lowercase + digits + hyphens)')
106
+ .requiredOption('--task <task>', 'Initial task prompt sent to the new lane')
107
+ .action((world, opts) => handleCreate(world, opts));
108
+ lanes
109
+ .command('destroy')
110
+ .description("Kill a lane's tmux session (transcript retained)")
111
+ .argument('<world>', 'World id')
112
+ .argument('<name>', 'Lane name')
113
+ .action((world, name) => handleDestroy(world, name));
114
+ lanes
115
+ .command('dispatch')
116
+ .description('Re-prompt an existing lane')
117
+ .argument('<world>', 'World id')
118
+ .argument('<name>', 'Lane name')
119
+ .argument('<prompt...>', 'Prompt to send (multi-arg joined with spaces)')
120
+ .action((world, name, promptParts) => handleDispatch(world, name, promptParts.join(' ')));
121
+ }
122
+ //# sourceMappingURL=lanes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lanes.js","sourceRoot":"","sources":["../../src/commands/lanes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * olam list — List all active worlds.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerList(program: Command): void;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuCnD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * olam list — List all active worlds.
3
+ */
4
+ import pc from 'picocolors';
5
+ import { loadContext } from '../context.js';
6
+ import { printError, formatAge } from '../output.js';
7
+ export function registerList(program) {
8
+ program
9
+ .command('list')
10
+ .alias('ls')
11
+ .description('List active worlds')
12
+ .action(async () => {
13
+ const { ctx, error } = await loadContext();
14
+ if (!ctx) {
15
+ printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
16
+ process.exitCode = 1;
17
+ return;
18
+ }
19
+ const worlds = ctx.worldManager.listWorlds();
20
+ if (worlds.length === 0) {
21
+ console.log(pc.dim('No worlds. Create one with `olam create --name my-world`.'));
22
+ return;
23
+ }
24
+ console.log(`${pc.bold(String(worlds.length))} world(s)\n`);
25
+ for (const w of worlds) {
26
+ const statusColor = w.status === 'running'
27
+ ? pc.green(w.status)
28
+ : w.status === 'error'
29
+ ? pc.red(w.status)
30
+ : pc.yellow(w.status);
31
+ const age = formatAge(w.createdAt);
32
+ const cost = `$${w.totalCostUsd.toFixed(2)}`;
33
+ console.log(` ${pc.bold(w.name)} ${pc.dim(`(${w.id})`)}`);
34
+ console.log(` ${statusColor} ${pc.dim('|')} ${w.repos.join(', ')} ${pc.dim('|')} ${cost} ${pc.dim('|')} ${age}`);
35
+ console.log();
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,UAAU,CAAC,KAAK,EAAE,OAAO,IAAI,gDAAgD,CAAC,CAAC;YAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;QAE7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QAE5D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACpB,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO;oBACpB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAE1B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CACT,OAAO,WAAW,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAC7G,CAAC;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * olam logs <world> — Stream application logs from a world.
3
+ *
4
+ * Connects to the per-world CP's /api/logs SSE endpoints through the
5
+ * host-cp proxy at http://127.0.0.1:19000/api/world/<worldId>/api/logs.
6
+ *
7
+ * Options:
8
+ * --service <name> Stream a single service (default: all interleaved)
9
+ * --follow Stream indefinitely until Ctrl-C (default: false)
10
+ * --tail <n> Lines to show before exiting (default: 200)
11
+ */
12
+ import type { Command } from 'commander';
13
+ /**
14
+ * Color a log line based on its log-level keyword.
15
+ * ERROR → red, WARN → yellow, INFO → dim, default → unchanged.
16
+ */
17
+ export declare function colorLine(line: string): string;
18
+ /**
19
+ * Format a log line for terminal output.
20
+ * Prepends `[service] ` (cyan) when showService is true.
21
+ */
22
+ export declare function formatLine(line: string, service: string | undefined, showService: boolean): string;
23
+ interface SseReplay {
24
+ type: 'replay';
25
+ service?: string;
26
+ lines: string[];
27
+ }
28
+ interface SseLine {
29
+ type: 'line';
30
+ service?: string;
31
+ line: string;
32
+ ts: number;
33
+ }
34
+ type SseEvent = SseReplay | SseLine;
35
+ export declare function parseSseEvent(raw: string): SseEvent | null;
36
+ export declare function registerLogs(program: Command): void;
37
+ export {};
38
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAGlG;AAMD,UAAU,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAY1D;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuHnD"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * olam logs <world> — Stream application logs from a world.
3
+ *
4
+ * Connects to the per-world CP's /api/logs SSE endpoints through the
5
+ * host-cp proxy at http://127.0.0.1:19000/api/world/<worldId>/api/logs.
6
+ *
7
+ * Options:
8
+ * --service <name> Stream a single service (default: all interleaved)
9
+ * --follow Stream indefinitely until Ctrl-C (default: false)
10
+ * --tail <n> Lines to show before exiting (default: 200)
11
+ */
12
+ import * as http from 'node:http';
13
+ import pc from 'picocolors';
14
+ import { readToken } from './host-cp.js';
15
+ import { loadContext } from '../context.js';
16
+ import { printError } from '../output.js';
17
+ const HOST_CP_PORT = 19000;
18
+ // ---------------------------------------------------------------------------
19
+ // Pure helpers — exported for unit testing
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Color a log line based on its log-level keyword.
23
+ * ERROR → red, WARN → yellow, INFO → dim, default → unchanged.
24
+ */
25
+ export function colorLine(line) {
26
+ if (/\bERROR\b/.test(line))
27
+ return pc.red(line);
28
+ if (/\bWARN\b/.test(line))
29
+ return pc.yellow(line);
30
+ if (/\bINFO\b/.test(line))
31
+ return pc.dim(line);
32
+ return line;
33
+ }
34
+ /**
35
+ * Format a log line for terminal output.
36
+ * Prepends `[service] ` (cyan) when showService is true.
37
+ */
38
+ export function formatLine(line, service, showService) {
39
+ const prefix = showService && service ? `${pc.cyan(`[${service}]`)} ` : '';
40
+ return prefix + colorLine(line);
41
+ }
42
+ export function parseSseEvent(raw) {
43
+ if (!raw.startsWith('data: '))
44
+ return null;
45
+ try {
46
+ const parsed = JSON.parse(raw.slice(6));
47
+ if (!parsed || typeof parsed !== 'object')
48
+ return null;
49
+ const ev = parsed;
50
+ if (ev.type === 'replay' && Array.isArray(ev.lines))
51
+ return ev;
52
+ if (ev.type === 'line' && typeof ev.line === 'string')
53
+ return ev;
54
+ return null;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Command registration
62
+ // ---------------------------------------------------------------------------
63
+ export function registerLogs(program) {
64
+ program
65
+ .command('logs')
66
+ .description('Stream application logs from a world')
67
+ .argument('<world>', 'World ID')
68
+ .option('--service <name>', 'Stream a specific service (default: all services)')
69
+ .option('--follow', 'Stream indefinitely until Ctrl-C', false)
70
+ .option('--tail <n>', 'Number of lines to display before exiting', '200')
71
+ .action(async (worldId, opts) => {
72
+ const { ctx, error } = await loadContext();
73
+ if (!ctx) {
74
+ printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ const world = ctx.worldManager.getWorld(worldId);
79
+ if (!world) {
80
+ printError(`World "${worldId}" not found. Run \`olam list\` to see worlds.`);
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ const token = readToken();
85
+ if (!token) {
86
+ printError('Host CP is not running. Start it with `olam host-cp start`.');
87
+ process.exitCode = 1;
88
+ return;
89
+ }
90
+ const tailLimit = Math.max(1, parseInt(opts.tail, 10) || 200);
91
+ const showService = opts.service === undefined;
92
+ const subPath = opts.service
93
+ ? `/api/logs/${encodeURIComponent(opts.service)}`
94
+ : '/api/logs';
95
+ const url = `http://127.0.0.1:${HOST_CP_PORT}/api/world/${encodeURIComponent(worldId)}${subPath}`;
96
+ let lineCount = 0;
97
+ let done = false;
98
+ let resolveStream;
99
+ const streamDone = new Promise((r) => { resolveStream = r; });
100
+ const finish = () => {
101
+ if (!done) {
102
+ done = true;
103
+ resolveStream();
104
+ }
105
+ };
106
+ const emit = (line, service) => {
107
+ process.stdout.write(formatLine(line, service, showService) + '\n');
108
+ lineCount++;
109
+ if (!opts.follow && lineCount >= tailLimit) {
110
+ finish();
111
+ return false;
112
+ }
113
+ return true;
114
+ };
115
+ const req = http.get(url, { headers: { Authorization: `Bearer ${token}` } }, (res) => {
116
+ if (res.statusCode !== 200) {
117
+ printError(`Log stream returned HTTP ${res.statusCode ?? 'unknown'}`);
118
+ process.exitCode = 1;
119
+ finish();
120
+ res.destroy();
121
+ return;
122
+ }
123
+ let buf = '';
124
+ res.on('data', (chunk) => {
125
+ if (done)
126
+ return;
127
+ buf += chunk.toString('utf8');
128
+ const rawLines = buf.split('\n');
129
+ buf = rawLines.pop() ?? '';
130
+ for (const raw of rawLines) {
131
+ if (done)
132
+ break;
133
+ const ev = parseSseEvent(raw);
134
+ if (!ev)
135
+ continue;
136
+ if (ev.type === 'replay') {
137
+ for (const l of ev.lines) {
138
+ if (!emit(l, ev.service)) {
139
+ req.destroy();
140
+ break;
141
+ }
142
+ }
143
+ }
144
+ else if (ev.type === 'line') {
145
+ if (!emit(ev.line, ev.service))
146
+ req.destroy();
147
+ }
148
+ }
149
+ });
150
+ res.on('end', () => finish());
151
+ res.on('error', (err) => {
152
+ if (!done)
153
+ printError(`Stream error: ${err.message}`);
154
+ finish();
155
+ });
156
+ });
157
+ req.on('error', (err) => {
158
+ if (!done) {
159
+ const msg = err.code === 'ECONNREFUSED'
160
+ ? 'Host CP is not reachable. Is it running? (`olam host-cp start`)'
161
+ : `Connection error: ${err.message}`;
162
+ printError(msg);
163
+ process.exitCode = 1;
164
+ }
165
+ finish();
166
+ });
167
+ // once: prevents listener accumulation in test harnesses that invoke
168
+ // the action handler multiple times in the same process.
169
+ process.once('SIGINT', () => {
170
+ done = true;
171
+ req.destroy();
172
+ process.exit(0);
173
+ });
174
+ await streamDone;
175
+ });
176
+ }
177
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * olam observe <world> — Stream thoughts from a world.
3
+ *
4
+ * Currently a placeholder matching the MCP server's stub.
5
+ * Will connect to the container's SSE /api/stream endpoint.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function registerObserve(program: Command): void;
9
+ //# sourceMappingURL=observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgCtD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * olam observe <world> — Stream thoughts from a world.
3
+ *
4
+ * Currently a placeholder matching the MCP server's stub.
5
+ * Will connect to the container's SSE /api/stream endpoint.
6
+ */
7
+ import pc from 'picocolors';
8
+ import { loadContext } from '../context.js';
9
+ import { printError } from '../output.js';
10
+ export function registerObserve(program) {
11
+ program
12
+ .command('observe')
13
+ .description('Stream thoughts from a world (coming soon)')
14
+ .argument('<world>', 'World ID')
15
+ .action(async (worldId) => {
16
+ const { ctx, error } = await loadContext();
17
+ if (!ctx) {
18
+ printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
19
+ process.exitCode = 1;
20
+ return;
21
+ }
22
+ const world = ctx.worldManager.getWorld(worldId);
23
+ if (!world) {
24
+ printError(`World "${worldId}" not found. Run \`olam list\` to see worlds.`);
25
+ process.exitCode = 1;
26
+ return;
27
+ }
28
+ console.log(pc.yellow('Observation is coming in a future release.'));
29
+ console.log(pc.dim('This will stream the world\'s reasoning in real-time.'));
30
+ const containerName = `olam-${worldId}-devbox`;
31
+ console.log(`\n${pc.dim(`For now: docker exec -it ${containerName} tmux attach -t claude-main -r`)}`);
32
+ });
33
+ }
34
+ //# sourceMappingURL=observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,UAAU,CAAC,KAAK,EAAE,OAAO,IAAI,gDAAgD,CAAC,CAAC;YAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,UAAU,OAAO,+CAA+C,CAAC,CAAC;YAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,MAAM,CAAC,4CAA4C,CAAC,CACxD,CAAC;QACF,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAChE,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,OAAO,SAAS,CAAC;QAC/C,OAAO,CAAC,GAAG,CACT,KAAK,EAAE,CAAC,GAAG,CAAC,4BAA4B,aAAa,gCAAgC,CAAC,EAAE,CACzF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * olam policy-check — validate PR policies against the current diff.
3
+ *
4
+ * Reads `.olam/policies/*.md` from the workspace root, diffs the current
5
+ * branch against origin/main (or a custom base), and exits non-zero if
6
+ * any error-severity policy is violated.
7
+ *
8
+ * olam policy-check check from cwd against origin/main
9
+ * olam policy-check --base origin/HEAD custom base ref
10
+ * olam policy-check --workspace <path> custom workspace root
11
+ */
12
+ import type { Command } from 'commander';
13
+ export declare function registerPolicyCheck(program: Command): void;
14
+ //# sourceMappingURL=policy-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/commands/policy-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC1D"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * olam policy-check — validate PR policies against the current diff.
3
+ *
4
+ * Reads `.olam/policies/*.md` from the workspace root, diffs the current
5
+ * branch against origin/main (or a custom base), and exits non-zero if
6
+ * any error-severity policy is violated.
7
+ *
8
+ * olam policy-check check from cwd against origin/main
9
+ * olam policy-check --base origin/HEAD custom base ref
10
+ * olam policy-check --workspace <path> custom workspace root
11
+ */
12
+ import { execSync } from 'node:child_process';
13
+ import pc from 'picocolors';
14
+ import { loadPolicies } from '@olam/core/src/policies/loader.js';
15
+ import { enforcePolicies } from '@olam/core/src/policies/enforce.js';
16
+ function getDiff(base, cwd) {
17
+ // Try `base...HEAD` three-dot diff first; fall back to two-dot diff on failure.
18
+ for (const range of [`${base}...HEAD`, `${base}..HEAD`]) {
19
+ try {
20
+ return execSync(`git diff --name-only ${range}`, {
21
+ cwd,
22
+ encoding: 'utf8',
23
+ stdio: ['pipe', 'pipe', 'pipe'],
24
+ });
25
+ }
26
+ catch {
27
+ // try next
28
+ }
29
+ }
30
+ // Last resort: just list uncommitted changes
31
+ try {
32
+ return execSync('git diff --name-only HEAD', {
33
+ cwd,
34
+ encoding: 'utf8',
35
+ stdio: ['pipe', 'pipe', 'pipe'],
36
+ });
37
+ }
38
+ catch {
39
+ return '';
40
+ }
41
+ }
42
+ export function registerPolicyCheck(program) {
43
+ program
44
+ .command('policy-check')
45
+ .description('Check .olam/policies/ against the current diff')
46
+ .option('--base <ref>', 'Base git ref to diff against', 'origin/main')
47
+ .option('--workspace <path>', 'Workspace root (defaults to cwd)')
48
+ .action((opts) => {
49
+ const workspaceRoot = opts.workspace ?? process.cwd();
50
+ const policies = loadPolicies(workspaceRoot);
51
+ if (policies.length === 0) {
52
+ console.log(pc.dim('policy-check: no policies found in .olam/policies/ — nothing to enforce'));
53
+ return;
54
+ }
55
+ const diff = getDiff(opts.base, workspaceRoot);
56
+ const results = enforcePolicies(policies, diff);
57
+ let hasErrorFailure = false;
58
+ for (const result of results) {
59
+ if (result.passed)
60
+ continue;
61
+ if (result.severity === 'error') {
62
+ console.error(`${pc.red('policy error')} [${result.policyId}]`);
63
+ console.error(result.message);
64
+ hasErrorFailure = true;
65
+ }
66
+ else {
67
+ console.warn(`${pc.yellow('policy warn')} [${result.policyId}]`);
68
+ console.warn(result.message);
69
+ }
70
+ }
71
+ if (hasErrorFailure) {
72
+ process.exitCode = 1;
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=policy-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-check.js","sourceRoot":"","sources":["../../src/commands/policy-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,SAAS,OAAO,CAAC,IAAY,EAAE,GAAW;IACxC,gFAAgF;IAChF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,wBAAwB,KAAK,EAAE,EAAE;gBAC/C,GAAG;gBACH,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,6CAA6C;IAC7C,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,2BAA2B,EAAE;YAC3C,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,cAAc,EAAE,8BAA8B,EAAE,aAAa,CAAC;SACrE,MAAM,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;SAChE,MAAM,CAAC,CAAC,IAA0C,EAAE,EAAE;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;YAC/F,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhD,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM;gBAAE,SAAS;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9B,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * olam pr — inspect and decide PR-gate requests opened by in-world hooks.
3
+ *
4
+ * Each running world's PreToolUse hook intercepts `gh pr create` and
5
+ * POSTs a gate to its own control plane. This CLI surface lets the
6
+ * human fan out across all running worlds, pick a gate, and approve
7
+ * or block it. Codex adversarial review (future) will plug in beside
8
+ * this as a second decision source.
9
+ *
10
+ * olam pr list list all pending gates
11
+ * olam pr show <id> full detail (diff, cmd)
12
+ * olam pr approve <id> [--reason <r>] let the PR proceed
13
+ * olam pr reject <id> [--reason <r>] block with a reason
14
+ */
15
+ import type { Command } from 'commander';
16
+ export declare function registerPr(program: Command): void;
17
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2EzC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6EjD"}