@revisium/orchestrator 0.0.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 (176) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/bin/revo.js +2 -0
  4. package/control-plane/bootstrap.config.json +931 -0
  5. package/dist/app.module.js +28 -0
  6. package/dist/app.module.js.map +1 -0
  7. package/dist/cli/commands/bootstrap.js +39 -0
  8. package/dist/cli/commands/bootstrap.js.map +1 -0
  9. package/dist/cli/commands/dev.js +143 -0
  10. package/dist/cli/commands/dev.js.map +1 -0
  11. package/dist/cli/commands/inbox.js +288 -0
  12. package/dist/cli/commands/inbox.js.map +1 -0
  13. package/dist/cli/commands/mcp.js +16 -0
  14. package/dist/cli/commands/mcp.js.map +1 -0
  15. package/dist/cli/commands/playbook.js +74 -0
  16. package/dist/cli/commands/playbook.js.map +1 -0
  17. package/dist/cli/commands/poll-workflow-state.js +144 -0
  18. package/dist/cli/commands/poll-workflow-state.js.map +1 -0
  19. package/dist/cli/commands/revisium-context.js +23 -0
  20. package/dist/cli/commands/revisium-context.js.map +1 -0
  21. package/dist/cli/commands/revisium-helpers.js +61 -0
  22. package/dist/cli/commands/revisium-helpers.js.map +1 -0
  23. package/dist/cli/commands/revisium.js +89 -0
  24. package/dist/cli/commands/revisium.js.map +1 -0
  25. package/dist/cli/commands/run.js +426 -0
  26. package/dist/cli/commands/run.js.map +1 -0
  27. package/dist/cli/commands/work.js +149 -0
  28. package/dist/cli/commands/work.js.map +1 -0
  29. package/dist/cli/config.js +2 -0
  30. package/dist/cli/config.js.map +1 -0
  31. package/dist/cli/index.js +32 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/live-guard.js +49 -0
  34. package/dist/cli/live-guard.js.map +1 -0
  35. package/dist/cli/needs-host.js +78 -0
  36. package/dist/cli/needs-host.js.map +1 -0
  37. package/dist/cli/program.js +37 -0
  38. package/dist/cli/program.js.map +1 -0
  39. package/dist/config.js +102 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/control-plane/client-transport.js +146 -0
  42. package/dist/control-plane/client-transport.js.map +1 -0
  43. package/dist/control-plane/data-access.js +99 -0
  44. package/dist/control-plane/data-access.js.map +1 -0
  45. package/dist/control-plane/definitions.js +120 -0
  46. package/dist/control-plane/definitions.js.map +1 -0
  47. package/dist/control-plane/errors.js +13 -0
  48. package/dist/control-plane/errors.js.map +1 -0
  49. package/dist/control-plane/inbox.js +261 -0
  50. package/dist/control-plane/inbox.js.map +1 -0
  51. package/dist/control-plane/index.js +6 -0
  52. package/dist/control-plane/index.js.map +1 -0
  53. package/dist/control-plane/json-fields.js +68 -0
  54. package/dist/control-plane/json-fields.js.map +1 -0
  55. package/dist/control-plane/resolve-cwd.js +75 -0
  56. package/dist/control-plane/resolve-cwd.js.map +1 -0
  57. package/dist/control-plane/steps.js +381 -0
  58. package/dist/control-plane/steps.js.map +1 -0
  59. package/dist/control-plane/tables.js +13 -0
  60. package/dist/control-plane/tables.js.map +1 -0
  61. package/dist/control-plane/versioned-meaning.js +53 -0
  62. package/dist/control-plane/versioned-meaning.js.map +1 -0
  63. package/dist/engine/dbos.module.js +18 -0
  64. package/dist/engine/dbos.module.js.map +1 -0
  65. package/dist/engine/dbos.service.js +296 -0
  66. package/dist/engine/dbos.service.js.map +1 -0
  67. package/dist/engine/ensure-postgres.js +80 -0
  68. package/dist/engine/ensure-postgres.js.map +1 -0
  69. package/dist/engine/types.js +2 -0
  70. package/dist/engine/types.js.map +1 -0
  71. package/dist/host/ensure-revisium.js +269 -0
  72. package/dist/host/ensure-revisium.js.map +1 -0
  73. package/dist/host/host.lifecycle.js +75 -0
  74. package/dist/host/host.lifecycle.js.map +1 -0
  75. package/dist/mcp/mcp-capabilities.js +47 -0
  76. package/dist/mcp/mcp-capabilities.js.map +1 -0
  77. package/dist/mcp/mcp-facade.service.js +130 -0
  78. package/dist/mcp/mcp-facade.service.js.map +1 -0
  79. package/dist/mcp/mcp-stdio.service.js +48 -0
  80. package/dist/mcp/mcp-stdio.service.js.map +1 -0
  81. package/dist/mcp/mcp-tools.js +264 -0
  82. package/dist/mcp/mcp-tools.js.map +1 -0
  83. package/dist/mcp/mcp.module.js +21 -0
  84. package/dist/mcp/mcp.module.js.map +1 -0
  85. package/dist/package-info.js +10 -0
  86. package/dist/package-info.js.map +1 -0
  87. package/dist/pipeline/await-human.js +62 -0
  88. package/dist/pipeline/await-human.js.map +1 -0
  89. package/dist/pipeline/develop-task.workflow.js +497 -0
  90. package/dist/pipeline/develop-task.workflow.js.map +1 -0
  91. package/dist/pipeline/pipeline.module.js +34 -0
  92. package/dist/pipeline/pipeline.module.js.map +1 -0
  93. package/dist/playbook/catalog-loader.js +145 -0
  94. package/dist/playbook/catalog-loader.js.map +1 -0
  95. package/dist/playbook/errors.js +14 -0
  96. package/dist/playbook/errors.js.map +1 -0
  97. package/dist/playbook/import-mapper.js +186 -0
  98. package/dist/playbook/import-mapper.js.map +1 -0
  99. package/dist/playbook/manifest.js +60 -0
  100. package/dist/playbook/manifest.js.map +1 -0
  101. package/dist/playbook/playbook-installer.js +51 -0
  102. package/dist/playbook/playbook-installer.js.map +1 -0
  103. package/dist/playbook/prompt-composer.js +34 -0
  104. package/dist/playbook/prompt-composer.js.map +1 -0
  105. package/dist/playbook/source-resolver.js +105 -0
  106. package/dist/playbook/source-resolver.js.map +1 -0
  107. package/dist/poller/pr-readiness-core.js +656 -0
  108. package/dist/poller/pr-readiness-core.js.map +1 -0
  109. package/dist/poller/pr-readiness.js +91 -0
  110. package/dist/poller/pr-readiness.js.map +1 -0
  111. package/dist/revisium/inbox.service.js +67 -0
  112. package/dist/revisium/inbox.service.js.map +1 -0
  113. package/dist/revisium/playbooks.service.js +99 -0
  114. package/dist/revisium/playbooks.service.js.map +1 -0
  115. package/dist/revisium/revisium.module.js +55 -0
  116. package/dist/revisium/revisium.module.js.map +1 -0
  117. package/dist/revisium/roles.service.js +79 -0
  118. package/dist/revisium/roles.service.js.map +1 -0
  119. package/dist/revisium/run.service.js +182 -0
  120. package/dist/revisium/run.service.js.map +1 -0
  121. package/dist/revisium/tokens.js +7 -0
  122. package/dist/revisium/tokens.js.map +1 -0
  123. package/dist/run/append-event.js +112 -0
  124. package/dist/run/append-event.js.map +1 -0
  125. package/dist/run/cancel-run.js +47 -0
  126. package/dist/run/cancel-run.js.map +1 -0
  127. package/dist/run/create-run.js +208 -0
  128. package/dist/run/create-run.js.map +1 -0
  129. package/dist/run/fail-run.js +20 -0
  130. package/dist/run/fail-run.js.map +1 -0
  131. package/dist/run/inspect-run.js +287 -0
  132. package/dist/run/inspect-run.js.map +1 -0
  133. package/dist/run/terminal-run-status.js +45 -0
  134. package/dist/run/terminal-run-status.js.map +1 -0
  135. package/dist/runners/claude-code.service.js +48 -0
  136. package/dist/runners/claude-code.service.js.map +1 -0
  137. package/dist/runners/gh-identity.js +108 -0
  138. package/dist/runners/gh-identity.js.map +1 -0
  139. package/dist/runners/integrator.js +417 -0
  140. package/dist/runners/integrator.js.map +1 -0
  141. package/dist/runners/runner.module.js +40 -0
  142. package/dist/runners/runner.module.js.map +1 -0
  143. package/dist/runners/tokens.js +7 -0
  144. package/dist/runners/tokens.js.map +1 -0
  145. package/dist/task-control-plane/pr-readiness.service.js +33 -0
  146. package/dist/task-control-plane/pr-readiness.service.js.map +1 -0
  147. package/dist/task-control-plane/task-control-plane-api.service.js +440 -0
  148. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -0
  149. package/dist/task-control-plane/task-control-plane.module.js +23 -0
  150. package/dist/task-control-plane/task-control-plane.module.js.map +1 -0
  151. package/dist/worker/build-context.js +39 -0
  152. package/dist/worker/build-context.js.map +1 -0
  153. package/dist/worker/claude-code-runner.js +135 -0
  154. package/dist/worker/claude-code-runner.js.map +1 -0
  155. package/dist/worker/git-worktree-manager.js +84 -0
  156. package/dist/worker/git-worktree-manager.js.map +1 -0
  157. package/dist/worker/loop.js +122 -0
  158. package/dist/worker/loop.js.map +1 -0
  159. package/dist/worker/process-executor.js +62 -0
  160. package/dist/worker/process-executor.js.map +1 -0
  161. package/dist/worker/result-envelope.js +134 -0
  162. package/dist/worker/result-envelope.js.map +1 -0
  163. package/dist/worker/runner-dispatch.js +20 -0
  164. package/dist/worker/runner-dispatch.js.map +1 -0
  165. package/dist/worker/runner.js +2 -0
  166. package/dist/worker/runner.js.map +1 -0
  167. package/dist/worker/script-runner.js +28 -0
  168. package/dist/worker/script-runner.js.map +1 -0
  169. package/dist/worker/stub-runner.js +59 -0
  170. package/dist/worker/stub-runner.js.map +1 -0
  171. package/dist/worker/worker-id.js +18 -0
  172. package/dist/worker/worker-id.js.map +1 -0
  173. package/dist/worker/worktree-manager.js +7 -0
  174. package/dist/worker/worktree-manager.js.map +1 -0
  175. package/package.json +66 -0
  176. package/revisium.config.json +10 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * live-guard.ts — shared cost-guard helpers used by CLI commands that can spawn real runners.
3
+ *
4
+ * WHY: the cost guard ("no real claude/git/gh without explicit --live") must be enforced
5
+ * in ONE place with ONE warning string, so both `run start` and `revo work` use identical
6
+ * semantics and the warning cannot drift.
7
+ *
8
+ * Exports:
9
+ * - LIVE_COST_WARNING — the canonical one-line warning string (import for tests).
10
+ * - warnLiveCost() — emits LIVE_COST_WARNING to console.warn.
11
+ * - assertNoStubLive() — validates that --stub and --live are not both set; sets exitCode=1
12
+ * and returns false when contradictory.
13
+ * - requireLiveFlag() — asserts that --live is set when a real runner is requested;
14
+ * sets exitCode=1 and returns false otherwise.
15
+ */
16
+ /** Canonical cost/side-effect warning — must match between run start and revo work. */
17
+ export const LIVE_COST_WARNING = 'WARNING: --live runs real Claude (claude -p) and incurs token cost on ' +
18
+ 'architect/developer/reviewer, AND the real integrator will push a branch and open a draft PR.';
19
+ /** Emit the cost warning to stderr. */
20
+ export function warnLiveCost() {
21
+ console.warn(LIVE_COST_WARNING);
22
+ }
23
+ /**
24
+ * Validate that --stub and --live are not both set.
25
+ * Sets process.exitCode=1 and returns false when contradictory; returns true when valid.
26
+ */
27
+ export function assertNoStubLive(stub, live) {
28
+ if (stub && live) {
29
+ console.error('Error: choose either --stub or --live, not both');
30
+ process.exitCode = 1;
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ /**
36
+ * Assert that --live is explicitly set when a real runner is requested.
37
+ * Used by `revo work --runner auto` to block real execution without --live.
38
+ * Sets process.exitCode=1 and returns false when --live is absent; returns true otherwise.
39
+ */
40
+ export function requireLiveFlag(live, runnerMode) {
41
+ if (!live) {
42
+ console.error(`Error: --runner ${runnerMode} requires --live (runs real Claude and incurs cost). ` +
43
+ 'Pass --live explicitly to confirm, or omit --runner to use the zero-cost stub.');
44
+ process.exitCode = 1;
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ //# sourceMappingURL=live-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-guard.js","sourceRoot":"","sources":["../../src/cli/live-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,wEAAwE;IACxE,+FAA+F,CAAC;AAElG,uCAAuC;AACvC,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,IAAa;IAC3D,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,UAAkB;IAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CACX,mBAAmB,UAAU,uDAAuD;YAClF,gFAAgF,CACnF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * needsHost() — pure argv pre-parse (no Nest/DBOS import).
3
+ *
4
+ * Returns true ONLY for host-requiring commands:
5
+ * - dev:ping, dev:status (slice 0001)
6
+ * - run start (slice 0003 — enqueues a DBOS workflow, needs the host)
7
+ * - run create --start (slice 0006 — enqueues immediately after create, needs the host)
8
+ * - inbox resolve --approve|--reject (slice 0004 — signals a parked workflow, needs DBOS)
9
+ * - mcp (local stdio MCP server over the host services)
10
+ *
11
+ * All other run subcommands (create/list/show/events/cancel) remain host-free.
12
+ * `run create` WITHOUT --start stays host-free.
13
+ * inbox list/show and inbox resolve --answer (non-gate) remain host-free.
14
+ *
15
+ * Design rules:
16
+ * - Help/version flags anywhere → always host-free (consensus MINOR, codex round 2).
17
+ * - Default is host-free (allowlist miss → false); fail-safe for unknown commands.
18
+ * - No Nest, DBOS, or AppModule imports here (F1 — keep the host-free path lightweight).
19
+ * - `inbox resolve` is classified host-requiring ONLY when --approve or --reject is present
20
+ * in argv (pure argv-parse; cannot read the row here). Non-gate `--answer` stays host-free.
21
+ * - `run create --start` is host-requiring because it enqueues a DBOS workflow immediately.
22
+ *
23
+ * M5 (TASK 0003): subcommand-aware `run start` routing.
24
+ * G4/G6 (TASK 0004): subcommand-aware `inbox resolve --approve|--reject` routing.
25
+ * 0006: `run create --start` → host-requiring.
26
+ */
27
+ /** Commands that require the Nest/DBOS host context (colon-style, no subcommand needed). */
28
+ const HOST_COMMANDS = new Set(['dev:ping', 'dev:status', 'mcp']);
29
+ /** Flags that force host-free regardless of the command. */
30
+ const HELP_FLAGS = new Set(['--help', '-h', '--version', '-v']);
31
+ /** Gate-resolve flags that make `inbox resolve` host-requiring (0004). */
32
+ const GATE_FLAGS = new Set(['--approve', '--reject']);
33
+ function firstCommand(args) {
34
+ return args.find((a) => !a.startsWith('-'));
35
+ }
36
+ export function isMcpCommand(argv) {
37
+ const args = argv.slice(2);
38
+ if (args.some((a) => HELP_FLAGS.has(a)))
39
+ return false;
40
+ return firstCommand(args) === 'mcp';
41
+ }
42
+ /**
43
+ * Decide whether an argv array needs the Nest host context.
44
+ * @param argv - process.argv-style array (first two elements are node + script).
45
+ */
46
+ export function needsHost(argv) {
47
+ const args = argv.slice(2); // strip node + script
48
+ // Any help/version flag anywhere → host-free.
49
+ if (args.some((a) => HELP_FLAGS.has(a)))
50
+ return false;
51
+ // Find the first non-flag argument (the command name).
52
+ const command = firstCommand(args);
53
+ if (!command)
54
+ return false;
55
+ // M5: `run start` is host-requiring; all other `run` subcommands are host-free.
56
+ // 0006: `run create --start` is host-requiring (it enqueues a DBOS workflow).
57
+ if (command === 'run') {
58
+ const commandIdx = args.indexOf(command);
59
+ const sub = args.slice(commandIdx + 1).find((a) => !a.startsWith('-'));
60
+ if (sub === 'start')
61
+ return true;
62
+ if (sub === 'create')
63
+ return args.includes('--start');
64
+ return false;
65
+ }
66
+ // G4/G6: `inbox resolve --approve|--reject` is host-requiring (gate path — signals DBOS).
67
+ // `inbox list`/`show` and `inbox resolve --answer` (non-gate) stay host-free.
68
+ if (command === 'inbox') {
69
+ const commandIdx = args.indexOf(command);
70
+ const sub = args.slice(commandIdx + 1).find((a) => !a.startsWith('-'));
71
+ if (sub === 'resolve') {
72
+ return args.some((a) => GATE_FLAGS.has(a));
73
+ }
74
+ return false;
75
+ }
76
+ return HOST_COMMANDS.has(command);
77
+ }
78
+ //# sourceMappingURL=needs-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"needs-host.js","sourceRoot":"","sources":["../../src/cli/needs-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,4FAA4F;AAC5F,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjE,4DAA4D;AAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAEhE,0EAA0E;AAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtD,SAAS,YAAY,CAAC,IAAc;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;IAElD,8CAA8C;IAC9C,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtD,uDAAuD;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,gFAAgF;IAChF,8EAA8E;IAC9E,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0FAA0F;IAC1F,8EAA8E;IAC9E,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { Command } from 'commander';
2
+ import { readPackageVersion } from '../package-info.js';
3
+ import { registerBootstrap } from './commands/bootstrap.js';
4
+ import { registerDev } from './commands/dev.js';
5
+ import { registerInbox } from './commands/inbox.js';
6
+ import { registerMcp } from './commands/mcp.js';
7
+ import { registerPlaybook } from './commands/playbook.js';
8
+ import { registerRevisium } from './commands/revisium.js';
9
+ import { registerRun } from './commands/run.js';
10
+ import { registerWork } from './commands/work.js';
11
+ export { readPackageVersion };
12
+ /**
13
+ * Build the commander program.
14
+ *
15
+ * @param app - Optional Nest app context (host path only).
16
+ * - When `app` is provided, dev:ping/dev:status actions are wired to the DI context.
17
+ * - When `app` is absent (host-free path or tests), dev command DEFINITIONS are still
18
+ * registered so `dev:ping --help` works; actions guard on the absent `app`.
19
+ * - The no-arg overload is preserved for program.test.ts compatibility.
20
+ */
21
+ export function buildProgram(app) {
22
+ const program = new Command();
23
+ program
24
+ .name('revo')
25
+ .description('Agent orchestrator CLI')
26
+ .version(readPackageVersion(), '-v, --version', 'Print the revo version');
27
+ registerRevisium(program);
28
+ registerBootstrap(program);
29
+ registerPlaybook(program);
30
+ registerRun(program, app);
31
+ registerWork(program);
32
+ registerInbox(program, app); // G6: forward app so gate resolve path can access DbosService
33
+ registerMcp(program, app);
34
+ registerDev(program, app);
35
+ return program;
36
+ }
37
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,GAA6B;IACxD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,wBAAwB,CAAC;SACrC,OAAO,CAAC,kBAAkB,EAAE,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAC5E,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,8DAA8D;IAC3F,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1B,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,102 @@
1
+ import { createServer } from 'node:net';
2
+ import { existsSync, mkdirSync, readFileSync, rmSync } from 'node:fs';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import os from 'node:os';
6
+ const sourceDir = dirname(fileURLToPath(import.meta.url));
7
+ export const repoRoot = resolve(sourceDir, '..');
8
+ function expandHome(path) {
9
+ if (path === '~')
10
+ return os.homedir();
11
+ if (path.startsWith('~/'))
12
+ return join(os.homedir(), path.slice(2));
13
+ return path;
14
+ }
15
+ function loadConfig() {
16
+ const configPath = join(repoRoot, 'revisium.config.json');
17
+ return JSON.parse(readFileSync(configPath, 'utf8'));
18
+ }
19
+ let cachedConfig = null;
20
+ export function getConfig() {
21
+ if (cachedConfig)
22
+ return cachedConfig;
23
+ const rawConfig = loadConfig();
24
+ const dataDir = expandHome(rawConfig.dataDir);
25
+ mkdirSync(dataDir, { recursive: true });
26
+ cachedConfig = {
27
+ ...rawConfig,
28
+ dataDir,
29
+ logFile: join(dataDir, 'standalone.log'),
30
+ runtimeFile: join(dataDir, 'runtime.json'),
31
+ };
32
+ return cachedConfig;
33
+ }
34
+ export function readRuntime() {
35
+ const { runtimeFile } = getConfig();
36
+ if (!existsSync(runtimeFile))
37
+ return null;
38
+ try {
39
+ return JSON.parse(readFileSync(runtimeFile, 'utf8'));
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ export function removeRuntime() {
46
+ const { runtimeFile } = getConfig();
47
+ if (existsSync(runtimeFile))
48
+ rmSync(runtimeFile);
49
+ }
50
+ export function isAlive(pid) {
51
+ try {
52
+ process.kill(pid, 0);
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ export function baseUrl(port) {
60
+ const { host } = getConfig();
61
+ return `http://${host}:${port}`;
62
+ }
63
+ export function healthUrl(port) {
64
+ return `${baseUrl(port)}/api`;
65
+ }
66
+ export function revisiumUri(port) {
67
+ const { host, org, project, branch } = getConfig();
68
+ return `revisium://${host}:${port}/${org}/${project}/${branch}`;
69
+ }
70
+ export async function resolvePorts() {
71
+ const runtime = readRuntime();
72
+ if (runtime && isAlive(runtime.pid)) {
73
+ return { httpPort: runtime.httpPort, pgPort: runtime.pgPort };
74
+ }
75
+ const { preferredPort, preferredPgPort } = getConfig();
76
+ return { httpPort: preferredPort, pgPort: preferredPgPort };
77
+ }
78
+ export async function isPortFree(port) {
79
+ return new Promise((resolvePort) => {
80
+ const srv = createServer();
81
+ srv.once('error', () => resolvePort(false));
82
+ srv.once('listening', () => srv.close(() => resolvePort(true)));
83
+ srv.listen(port, '127.0.0.1');
84
+ });
85
+ }
86
+ export async function findFreePort(from) {
87
+ for (let p = from; p < from + 200; p += 1) {
88
+ if (await isPortFree(p))
89
+ return p;
90
+ }
91
+ throw new Error(`No free port found from ${from}`);
92
+ }
93
+ export async function isHealthy(port) {
94
+ try {
95
+ const response = await fetch(healthUrl(port), { signal: AbortSignal.timeout(3000) });
96
+ return response.status >= 200 && response.status < 400;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { RevisiumClient, sdk } from '@revisium/client';
2
+ import { baseUrl, getConfig, isAlive, isHealthy, readRuntime } from '../config.js';
3
+ import { ControlPlaneError } from './errors.js';
4
+ import { runtimeTables } from './tables.js';
5
+ function mapApiError(err, context) {
6
+ if (err instanceof ControlPlaneError)
7
+ return err;
8
+ const apiErr = err;
9
+ const status = apiErr.statusCode;
10
+ const message = apiErr.message ?? String(err);
11
+ if (status === 404) {
12
+ return new ControlPlaneError('ROW_NOT_FOUND', `Row not found: ${context}`, { status, details: err });
13
+ }
14
+ if (status === 409 || (status === 400 && message.startsWith('Rows already exist:'))) {
15
+ return new ControlPlaneError('ROW_CONFLICT', `Row conflict: ${context}`, { status, details: err });
16
+ }
17
+ if (status === 400 || status === 422) {
18
+ return new ControlPlaneError('VALIDATION_FAILURE', `Validation failure: ${context}`, { status, details: err });
19
+ }
20
+ return new ControlPlaneError('HTTP_ERROR', `HTTP error ${status ?? 'unknown'}: ${context}: ${message}`, {
21
+ status,
22
+ details: err,
23
+ });
24
+ }
25
+ function toTransportRow(row) {
26
+ return {
27
+ id: row.id,
28
+ data: row.data,
29
+ readonly: row.readonly,
30
+ createdAt: row.createdAt,
31
+ updatedAt: row.updatedAt,
32
+ };
33
+ }
34
+ export function extractMutationRow(result) {
35
+ const row = result.data?.row;
36
+ if (!row)
37
+ throw new ControlPlaneError('HTTP_ERROR', 'Malformed response');
38
+ return row;
39
+ }
40
+ async function getScope(mode) {
41
+ const runtime = readRuntime();
42
+ if (!runtime || !isAlive(runtime.pid) || !(await isHealthy(runtime.httpPort))) {
43
+ throw new ControlPlaneError('DAEMON_NOT_RUNNING', 'Local Revisium daemon is not running or healthy');
44
+ }
45
+ const { org, project, branch } = getConfig();
46
+ const revisiumClient = new RevisiumClient({ baseUrl: baseUrl(runtime.httpPort) });
47
+ const clientInstance = revisiumClient.client;
48
+ // Use sdk.draftRevision / sdk.headRevision directly (not revisiumClient.revision()) so that
49
+ // result.error retains statusCode. revisiumClient.revision() routes through unwrap() which throws
50
+ // a plain Error(message) and discards statusCode, making 404 indistinguishable from other errors.
51
+ const result = mode === 'draft'
52
+ ? await sdk.draftRevision({ client: clientInstance, path: { organizationId: org, projectName: project, branchName: branch } })
53
+ : await sdk.headRevision({ client: clientInstance, path: { organizationId: org, projectName: project, branchName: branch } });
54
+ if (result.error) {
55
+ const err = result.error;
56
+ if (err.statusCode === 404) {
57
+ throw new ControlPlaneError('BOOTSTRAP_NOT_APPLIED', `Control-plane bootstrap is missing or not committed: ${org}/${project}/${branch}`, { status: 404, details: result.error });
58
+ }
59
+ throw mapApiError(result.error, `${org}/${project}/${branch}:${mode}`);
60
+ }
61
+ return { revisionId: result.data.id, client: clientInstance };
62
+ }
63
+ export function createClientTransport(mode) {
64
+ let cachedScope;
65
+ function resolveScope() {
66
+ cachedScope ??= getScope(mode);
67
+ return cachedScope;
68
+ }
69
+ async function assertReady() {
70
+ const { revisionId, client } = await resolveScope();
71
+ const result = await sdk.tables({ client, path: { revisionId }, query: { first: 100 } });
72
+ if (result.error) {
73
+ const err = result.error;
74
+ if (err.statusCode === 404) {
75
+ throw new ControlPlaneError('BOOTSTRAP_NOT_APPLIED', 'Control-plane bootstrap is missing or not committed', {
76
+ status: 404,
77
+ details: result.error,
78
+ });
79
+ }
80
+ throw mapApiError(result.error, '/tables');
81
+ }
82
+ const tableIds = new Set((result.data?.edges ?? []).map((e) => e.node.id));
83
+ const missing = runtimeTables.filter((t) => !tableIds.has(t));
84
+ if (missing.length > 0) {
85
+ throw new ControlPlaneError('BOOTSTRAP_NOT_APPLIED', 'Control-plane bootstrap is missing runtime tables', {
86
+ details: { missing },
87
+ });
88
+ }
89
+ }
90
+ async function listRows(table, options) {
91
+ const { revisionId, client } = await resolveScope();
92
+ const body = {
93
+ first: options?.first ?? 100,
94
+ after: options?.after,
95
+ where: options?.where,
96
+ orderBy: options?.orderBy,
97
+ };
98
+ const result = await sdk.rows({ client, path: { revisionId, tableId: table }, body });
99
+ if (result.error)
100
+ throw mapApiError(result.error, `${table}/rows`);
101
+ const edges = (result.data?.edges ?? []).map((e) => ({ node: toTransportRow(e.node) }));
102
+ return { edges };
103
+ }
104
+ async function getRow(table, rowId) {
105
+ const { revisionId, client } = await resolveScope();
106
+ const result = await sdk.row({ client, path: { revisionId, tableId: table, rowId } });
107
+ if (result.error)
108
+ throw mapApiError(result.error, `${table}/${rowId}`);
109
+ return toTransportRow(result.data);
110
+ }
111
+ async function createRow(table, rowId, data) {
112
+ const { revisionId, client } = await resolveScope();
113
+ const result = await sdk.createRow({
114
+ client,
115
+ path: { revisionId, tableId: table },
116
+ body: { rowId, data: data },
117
+ });
118
+ if (result.error)
119
+ throw mapApiError(result.error, `${table}/${rowId}`);
120
+ return toTransportRow(result.data.row);
121
+ }
122
+ async function updateRow(table, rowId, data) {
123
+ const { revisionId, client } = await resolveScope();
124
+ const result = await sdk.updateRow({
125
+ client,
126
+ path: { revisionId, tableId: table, rowId },
127
+ body: { data: data },
128
+ });
129
+ if (result.error)
130
+ throw mapApiError(result.error, `${table}/${rowId}`);
131
+ return toTransportRow(extractMutationRow(result));
132
+ }
133
+ async function patchRow(table, rowId, patches) {
134
+ const { revisionId, client } = await resolveScope();
135
+ const result = await sdk.patchRow({
136
+ client,
137
+ path: { revisionId, tableId: table, rowId },
138
+ body: { patches: patches },
139
+ });
140
+ if (result.error)
141
+ throw mapApiError(result.error, `${table}/${rowId}`);
142
+ return toTransportRow(extractMutationRow(result));
143
+ }
144
+ return { mode, assertReady, listRows, getRow, createRow, updateRow, patchRow };
145
+ }
146
+ //# sourceMappingURL=client-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-transport.js","sourceRoot":"","sources":["../../src/control-plane/client-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { ControlPlaneError } from './errors.js';
2
+ import { deserializeData, serializeData, serializePatches } from './json-fields.js';
3
+ import { createClientTransport, } from './client-transport.js';
4
+ import { isRuntimeTable } from './tables.js';
5
+ function assertRuntimeTable(table) {
6
+ if (!isRuntimeTable(table)) {
7
+ throw new ControlPlaneError('VALIDATION_FAILURE', `Unsupported runtime table: ${String(table)}`, {
8
+ details: { table },
9
+ });
10
+ }
11
+ }
12
+ function rowPath(table, rowId) {
13
+ return `${table}/${rowId}`;
14
+ }
15
+ function mapRow(table, row) {
16
+ return {
17
+ rowId: row.id,
18
+ data: deserializeData(table, row.id, row.data ?? {}),
19
+ readonly: row.readonly,
20
+ createdAt: row.createdAt,
21
+ updatedAt: row.updatedAt,
22
+ };
23
+ }
24
+ export function createControlPlaneDataAccessForTransport(transport) {
25
+ function guardHead() {
26
+ if (transport.mode === 'head') {
27
+ throw new ControlPlaneError('VALIDATION_FAILURE', 'Writes are not allowed on head revision');
28
+ }
29
+ }
30
+ return {
31
+ assertReady: () => transport.assertReady(),
32
+ async listRows(table, listOptions = {}) {
33
+ assertRuntimeTable(table);
34
+ const result = await transport.listRows(table, listOptions);
35
+ return (result.edges ?? []).map((edge) => {
36
+ if (!edge.node) {
37
+ throw new ControlPlaneError('HTTP_ERROR', `Malformed list response for ${table}`, { details: result });
38
+ }
39
+ return mapRow(table, edge.node);
40
+ });
41
+ },
42
+ async getRow(table, rowId) {
43
+ assertRuntimeTable(table);
44
+ try {
45
+ return mapRow(table, await transport.getRow(table, rowId));
46
+ }
47
+ catch (error) {
48
+ if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND')
49
+ return null;
50
+ throw error;
51
+ }
52
+ },
53
+ async createRow(table, rowId, data) {
54
+ guardHead();
55
+ assertRuntimeTable(table);
56
+ const serialized = serializeData(table, rowId, data);
57
+ return mapRow(table, await transport.createRow(table, rowId, serialized));
58
+ },
59
+ async updateRow(table, rowId, data) {
60
+ guardHead();
61
+ assertRuntimeTable(table);
62
+ const serialized = serializeData(table, rowId, data);
63
+ try {
64
+ return mapRow(table, await transport.updateRow(table, rowId, serialized));
65
+ }
66
+ catch (error) {
67
+ if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND') {
68
+ throw new ControlPlaneError('ROW_NOT_FOUND', `Cannot update missing row: ${rowPath(table, rowId)}`, {
69
+ status: error.status,
70
+ details: error.details,
71
+ });
72
+ }
73
+ throw error;
74
+ }
75
+ },
76
+ async patchRow(table, rowId, patches) {
77
+ guardHead();
78
+ assertRuntimeTable(table);
79
+ const serialized = serializePatches(table, patches);
80
+ try {
81
+ return mapRow(table, await transport.patchRow(table, rowId, serialized));
82
+ }
83
+ catch (error) {
84
+ if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND') {
85
+ throw new ControlPlaneError('ROW_NOT_FOUND', `Cannot patch missing row: ${rowPath(table, rowId)}`, {
86
+ status: error.status,
87
+ details: error.details,
88
+ });
89
+ }
90
+ throw error;
91
+ }
92
+ },
93
+ };
94
+ }
95
+ export function createControlPlaneDataAccess(options) {
96
+ const mode = options?.revision ?? 'draft';
97
+ return createControlPlaneDataAccessForTransport(createClientTransport(mode));
98
+ }
99
+ //# sourceMappingURL=data-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-access.js","sourceRoot":"","sources":["../../src/control-plane/data-access.ts"],"names":[],"mappings":"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"}