@chengchenccc/oh-my-agent 0.1.1-rc.1

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 (276) hide show
  1. package/README.md +79 -0
  2. package/dist/cli/args.d.ts +24 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +120 -0
  5. package/dist/cli/initial-input.d.ts +32 -0
  6. package/dist/cli/initial-input.d.ts.map +1 -0
  7. package/dist/cli/initial-input.js +131 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +3 -0
  11. package/dist/core/__fixtures__/echo-model.d.ts +6 -0
  12. package/dist/core/__fixtures__/echo-model.d.ts.map +1 -0
  13. package/dist/core/__fixtures__/echo-model.js +10 -0
  14. package/dist/core/__fixtures__/mcp-echo-server.d.ts +2 -0
  15. package/dist/core/__fixtures__/mcp-echo-server.d.ts.map +1 -0
  16. package/dist/core/__fixtures__/mcp-echo-server.js +54 -0
  17. package/dist/core/agent-runtime.d.ts +21 -0
  18. package/dist/core/agent-runtime.d.ts.map +1 -0
  19. package/dist/core/agent-runtime.js +14 -0
  20. package/dist/core/memory/autonomous-memory.d.ts +21 -0
  21. package/dist/core/memory/autonomous-memory.d.ts.map +1 -0
  22. package/dist/core/memory/autonomous-memory.js +202 -0
  23. package/dist/core/persistence/in-memory-session-store.d.ts +3 -0
  24. package/dist/core/persistence/in-memory-session-store.d.ts.map +1 -0
  25. package/dist/core/persistence/in-memory-session-store.js +109 -0
  26. package/dist/core/persistence/session-store.contract.d.ts +5 -0
  27. package/dist/core/persistence/session-store.contract.d.ts.map +1 -0
  28. package/dist/core/persistence/session-store.contract.js +183 -0
  29. package/dist/core/persistence/session-store.d.ts +33 -0
  30. package/dist/core/persistence/session-store.d.ts.map +1 -0
  31. package/dist/core/persistence/session-store.js +22 -0
  32. package/dist/core/persistence/session-tree.d.ts +49 -0
  33. package/dist/core/persistence/session-tree.d.ts.map +1 -0
  34. package/dist/core/persistence/session-tree.js +1 -0
  35. package/dist/core/plugins/plugin-code.d.ts +13 -0
  36. package/dist/core/plugins/plugin-code.d.ts.map +1 -0
  37. package/dist/core/plugins/plugin-code.js +62 -0
  38. package/dist/core/plugins/plugin-marketplace.d.ts +72 -0
  39. package/dist/core/plugins/plugin-marketplace.d.ts.map +1 -0
  40. package/dist/core/plugins/plugin-marketplace.js +340 -0
  41. package/dist/core/plugins/plugin-resolve.d.ts +32 -0
  42. package/dist/core/plugins/plugin-resolve.d.ts.map +1 -0
  43. package/dist/core/plugins/plugin-resolve.js +101 -0
  44. package/dist/core/plugins/plugin-trust.d.ts +24 -0
  45. package/dist/core/plugins/plugin-trust.d.ts.map +1 -0
  46. package/dist/core/plugins/plugin-trust.js +89 -0
  47. package/dist/core/runtime/agent-event.d.ts +98 -0
  48. package/dist/core/runtime/agent-event.d.ts.map +1 -0
  49. package/dist/core/runtime/agent-event.js +1 -0
  50. package/dist/core/runtime/agent-loop.d.ts +142 -0
  51. package/dist/core/runtime/agent-loop.d.ts.map +1 -0
  52. package/dist/core/runtime/agent-loop.js +1008 -0
  53. package/dist/core/runtime/approval.d.ts +23 -0
  54. package/dist/core/runtime/approval.d.ts.map +1 -0
  55. package/dist/core/runtime/approval.js +25 -0
  56. package/dist/core/runtime/compaction.d.ts +22 -0
  57. package/dist/core/runtime/compaction.d.ts.map +1 -0
  58. package/dist/core/runtime/compaction.js +90 -0
  59. package/dist/core/runtime/context-estimate.d.ts +42 -0
  60. package/dist/core/runtime/context-estimate.d.ts.map +1 -0
  61. package/dist/core/runtime/context-estimate.js +34 -0
  62. package/dist/core/runtime/create-runtime.d.ts +81 -0
  63. package/dist/core/runtime/create-runtime.d.ts.map +1 -0
  64. package/dist/core/runtime/create-runtime.js +250 -0
  65. package/dist/core/runtime/fake-provider.d.ts +3 -0
  66. package/dist/core/runtime/fake-provider.d.ts.map +1 -0
  67. package/dist/core/runtime/fake-provider.js +87 -0
  68. package/dist/core/runtime/logger.d.ts +13 -0
  69. package/dist/core/runtime/logger.d.ts.map +1 -0
  70. package/dist/core/runtime/logger.js +38 -0
  71. package/dist/core/runtime/loop-input.d.ts +39 -0
  72. package/dist/core/runtime/loop-input.d.ts.map +1 -0
  73. package/dist/core/runtime/loop-input.js +38 -0
  74. package/dist/core/runtime/message-cache.d.ts +16 -0
  75. package/dist/core/runtime/message-cache.d.ts.map +1 -0
  76. package/dist/core/runtime/message-cache.js +23 -0
  77. package/dist/core/runtime/model-catalog.d.ts +10 -0
  78. package/dist/core/runtime/model-catalog.d.ts.map +1 -0
  79. package/dist/core/runtime/model-catalog.js +14 -0
  80. package/dist/core/runtime/plugin-runtime.d.ts +41 -0
  81. package/dist/core/runtime/plugin-runtime.d.ts.map +1 -0
  82. package/dist/core/runtime/plugin-runtime.js +1 -0
  83. package/dist/core/runtime/plugin.d.ts +86 -0
  84. package/dist/core/runtime/plugin.d.ts.map +1 -0
  85. package/dist/core/runtime/plugin.js +23 -0
  86. package/dist/core/runtime/process-tree.d.ts +12 -0
  87. package/dist/core/runtime/process-tree.d.ts.map +1 -0
  88. package/dist/core/runtime/process-tree.js +40 -0
  89. package/dist/core/runtime/prompt.d.ts +23 -0
  90. package/dist/core/runtime/prompt.d.ts.map +1 -0
  91. package/dist/core/runtime/prompt.js +29 -0
  92. package/dist/core/runtime/prompts.d.ts +16 -0
  93. package/dist/core/runtime/prompts.d.ts.map +1 -0
  94. package/dist/core/runtime/prompts.js +36 -0
  95. package/dist/core/runtime/retry.d.ts +20 -0
  96. package/dist/core/runtime/retry.d.ts.map +1 -0
  97. package/dist/core/runtime/retry.js +60 -0
  98. package/dist/core/runtime/run-runtime.d.ts +93 -0
  99. package/dist/core/runtime/run-runtime.d.ts.map +1 -0
  100. package/dist/core/runtime/run-runtime.js +664 -0
  101. package/dist/core/runtime/runtime-catalog.d.ts +12 -0
  102. package/dist/core/runtime/runtime-catalog.d.ts.map +1 -0
  103. package/dist/core/runtime/runtime-catalog.js +89 -0
  104. package/dist/core/runtime/stream-rules.d.ts +9 -0
  105. package/dist/core/runtime/stream-rules.d.ts.map +1 -0
  106. package/dist/core/runtime/stream-rules.js +44 -0
  107. package/dist/core/runtime/title.d.ts +7 -0
  108. package/dist/core/runtime/title.d.ts.map +1 -0
  109. package/dist/core/runtime/title.js +114 -0
  110. package/dist/core/runtime/todo.d.ts +16 -0
  111. package/dist/core/runtime/todo.d.ts.map +1 -0
  112. package/dist/core/runtime/todo.js +40 -0
  113. package/dist/core/runtime/tool-filter.d.ts +12 -0
  114. package/dist/core/runtime/tool-filter.d.ts.map +1 -0
  115. package/dist/core/runtime/tool-filter.js +23 -0
  116. package/dist/core/runtime/tool-pruning.d.ts +29 -0
  117. package/dist/core/runtime/tool-pruning.d.ts.map +1 -0
  118. package/dist/core/runtime/tool-pruning.js +105 -0
  119. package/dist/core/session/input-history.d.ts +8 -0
  120. package/dist/core/session/input-history.d.ts.map +1 -0
  121. package/dist/core/session/input-history.js +41 -0
  122. package/dist/core/session/session-file.d.ts +84 -0
  123. package/dist/core/session/session-file.d.ts.map +1 -0
  124. package/dist/core/session/session-file.js +392 -0
  125. package/dist/core/session/session-loop.d.ts +33 -0
  126. package/dist/core/session/session-loop.d.ts.map +1 -0
  127. package/dist/core/session/session-loop.js +30 -0
  128. package/dist/core/settings/project-settings.d.ts +46 -0
  129. package/dist/core/settings/project-settings.d.ts.map +1 -0
  130. package/dist/core/settings/project-settings.js +85 -0
  131. package/dist/core/settings/workspace-context.d.ts +10 -0
  132. package/dist/core/settings/workspace-context.d.ts.map +1 -0
  133. package/dist/core/settings/workspace-context.js +48 -0
  134. package/dist/core/tools/agent-fs-like.d.ts +15 -0
  135. package/dist/core/tools/agent-fs-like.d.ts.map +1 -0
  136. package/dist/core/tools/agent-fs-like.js +4 -0
  137. package/dist/core/tools/ask-question.d.ts +5 -0
  138. package/dist/core/tools/ask-question.d.ts.map +1 -0
  139. package/dist/core/tools/ask-question.js +51 -0
  140. package/dist/core/tools/bash.d.ts +5 -0
  141. package/dist/core/tools/bash.d.ts.map +1 -0
  142. package/dist/core/tools/bash.js +109 -0
  143. package/dist/core/tools/eval.d.ts +10 -0
  144. package/dist/core/tools/eval.d.ts.map +1 -0
  145. package/dist/core/tools/eval.js +83 -0
  146. package/dist/core/tools/file-tools.d.ts +18 -0
  147. package/dist/core/tools/file-tools.d.ts.map +1 -0
  148. package/dist/core/tools/file-tools.js +249 -0
  149. package/dist/core/tools/glob.d.ts +5 -0
  150. package/dist/core/tools/glob.d.ts.map +1 -0
  151. package/dist/core/tools/glob.js +54 -0
  152. package/dist/core/tools/grep.d.ts +5 -0
  153. package/dist/core/tools/grep.d.ts.map +1 -0
  154. package/dist/core/tools/grep.js +61 -0
  155. package/dist/core/tools/index.d.ts +14 -0
  156. package/dist/core/tools/index.d.ts.map +1 -0
  157. package/dist/core/tools/index.js +14 -0
  158. package/dist/core/tools/ls-tree.d.ts +10 -0
  159. package/dist/core/tools/ls-tree.d.ts.map +1 -0
  160. package/dist/core/tools/ls-tree.js +177 -0
  161. package/dist/core/tools/mcp-mount.d.ts +63 -0
  162. package/dist/core/tools/mcp-mount.d.ts.map +1 -0
  163. package/dist/core/tools/mcp-mount.js +287 -0
  164. package/dist/core/tools/read-image.d.ts +6 -0
  165. package/dist/core/tools/read-image.d.ts.map +1 -0
  166. package/dist/core/tools/read-image.js +98 -0
  167. package/dist/core/tools/skill.d.ts +11 -0
  168. package/dist/core/tools/skill.d.ts.map +1 -0
  169. package/dist/core/tools/skill.js +65 -0
  170. package/dist/core/tools/skills.d.ts +10 -0
  171. package/dist/core/tools/skills.d.ts.map +1 -0
  172. package/dist/core/tools/skills.js +116 -0
  173. package/dist/core/tools/todo-store.d.ts +8 -0
  174. package/dist/core/tools/todo-store.d.ts.map +1 -0
  175. package/dist/core/tools/todo-store.js +100 -0
  176. package/dist/core/tools/todo.d.ts +8 -0
  177. package/dist/core/tools/todo.d.ts.map +1 -0
  178. package/dist/core/tools/todo.js +91 -0
  179. package/dist/core/tools/url-guard.d.ts +12 -0
  180. package/dist/core/tools/url-guard.d.ts.map +1 -0
  181. package/dist/core/tools/url-guard.js +58 -0
  182. package/dist/core/tools/web-ports-std.d.ts +6 -0
  183. package/dist/core/tools/web-ports-std.d.ts.map +1 -0
  184. package/dist/core/tools/web-ports-std.js +145 -0
  185. package/dist/core/tools/web-ports.d.ts +56 -0
  186. package/dist/core/tools/web-ports.d.ts.map +1 -0
  187. package/dist/core/tools/web-ports.js +62 -0
  188. package/dist/core/tools/workspace-sandbox.d.ts +20 -0
  189. package/dist/core/tools/workspace-sandbox.d.ts.map +1 -0
  190. package/dist/core/tools/workspace-sandbox.js +84 -0
  191. package/dist/core/workflow/subagent-registry.d.ts +40 -0
  192. package/dist/core/workflow/subagent-registry.d.ts.map +1 -0
  193. package/dist/core/workflow/subagent-registry.js +118 -0
  194. package/dist/core/workflow/workflow-evaluator.d.ts +23 -0
  195. package/dist/core/workflow/workflow-evaluator.d.ts.map +1 -0
  196. package/dist/core/workflow/workflow-evaluator.js +21 -0
  197. package/dist/core/workflow/workflow-executor.d.ts +108 -0
  198. package/dist/core/workflow/workflow-executor.d.ts.map +1 -0
  199. package/dist/core/workflow/workflow-executor.js +549 -0
  200. package/dist/core/workflow/workflow-tools.d.ts +50 -0
  201. package/dist/core/workflow/workflow-tools.d.ts.map +1 -0
  202. package/dist/core/workflow/workflow-tools.js +217 -0
  203. package/dist/index.d.ts +14 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +13 -0
  206. package/dist/main.d.ts +9 -0
  207. package/dist/main.d.ts.map +1 -0
  208. package/dist/main.js +97 -0
  209. package/dist/modes/json-mode.d.ts +5 -0
  210. package/dist/modes/json-mode.d.ts.map +1 -0
  211. package/dist/modes/json-mode.js +46 -0
  212. package/dist/modes/print-mode.d.ts +20 -0
  213. package/dist/modes/print-mode.d.ts.map +1 -0
  214. package/dist/modes/print-mode.js +82 -0
  215. package/dist/modes/rpc/jsonl.d.ts +23 -0
  216. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  217. package/dist/modes/rpc/jsonl.js +88 -0
  218. package/dist/modes/rpc/rpc-mode.d.ts +18 -0
  219. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  220. package/dist/modes/rpc/rpc-mode.js +326 -0
  221. package/dist/modes/tui/settings-overlay.d.ts +23 -0
  222. package/dist/modes/tui/settings-overlay.d.ts.map +1 -0
  223. package/dist/modes/tui/settings-overlay.js +136 -0
  224. package/dist/modes/tui/tui-commands-session.d.ts +3 -0
  225. package/dist/modes/tui/tui-commands-session.d.ts.map +1 -0
  226. package/dist/modes/tui/tui-commands-session.js +191 -0
  227. package/dist/modes/tui/tui-commands.d.ts +52 -0
  228. package/dist/modes/tui/tui-commands.d.ts.map +1 -0
  229. package/dist/modes/tui/tui-commands.js +373 -0
  230. package/dist/modes/tui/tui-components.d.ts +81 -0
  231. package/dist/modes/tui/tui-components.d.ts.map +1 -0
  232. package/dist/modes/tui/tui-components.js +248 -0
  233. package/dist/modes/tui/tui-format.d.ts +65 -0
  234. package/dist/modes/tui/tui-format.d.ts.map +1 -0
  235. package/dist/modes/tui/tui-format.js +246 -0
  236. package/dist/modes/tui/tui-frame-provider.d.ts +16 -0
  237. package/dist/modes/tui/tui-frame-provider.d.ts.map +1 -0
  238. package/dist/modes/tui/tui-frame-provider.js +31 -0
  239. package/dist/modes/tui/tui-interactive.d.ts +16 -0
  240. package/dist/modes/tui/tui-interactive.d.ts.map +1 -0
  241. package/dist/modes/tui/tui-interactive.js +123 -0
  242. package/dist/modes/tui/tui-io.d.ts +12 -0
  243. package/dist/modes/tui/tui-io.d.ts.map +1 -0
  244. package/dist/modes/tui/tui-io.js +620 -0
  245. package/dist/modes/tui/tui-mode.d.ts +120 -0
  246. package/dist/modes/tui/tui-mode.d.ts.map +1 -0
  247. package/dist/modes/tui/tui-mode.js +391 -0
  248. package/dist/modes/tui/tui-render.d.ts +54 -0
  249. package/dist/modes/tui/tui-render.d.ts.map +1 -0
  250. package/dist/modes/tui/tui-render.js +399 -0
  251. package/dist/modes/tui/tui-slash.d.ts +12 -0
  252. package/dist/modes/tui/tui-slash.d.ts.map +1 -0
  253. package/dist/modes/tui/tui-slash.js +64 -0
  254. package/dist/modes/tui/tui-tool-render.d.ts +6 -0
  255. package/dist/modes/tui/tui-tool-render.d.ts.map +1 -0
  256. package/dist/modes/tui/tui-tool-render.js +79 -0
  257. package/dist/modes/tui/tui-transcript-reconciler.d.ts +25 -0
  258. package/dist/modes/tui/tui-transcript-reconciler.d.ts.map +1 -0
  259. package/dist/modes/tui/tui-transcript-reconciler.js +97 -0
  260. package/dist/modes/tui/view-state.d.ts +67 -0
  261. package/dist/modes/tui/view-state.d.ts.map +1 -0
  262. package/dist/modes/tui/view-state.js +353 -0
  263. package/dist/prompts/agents/subagent.md +26 -0
  264. package/dist/prompts/system/base.md +20 -0
  265. package/dist/prompts/system/memory.md +23 -0
  266. package/dist/prompts/system/safety.md +12 -0
  267. package/dist/protocol/index.d.ts +5 -0
  268. package/dist/protocol/index.d.ts.map +1 -0
  269. package/dist/protocol/index.js +2 -0
  270. package/dist/protocol/mapping.d.ts +25 -0
  271. package/dist/protocol/mapping.d.ts.map +1 -0
  272. package/dist/protocol/mapping.js +115 -0
  273. package/dist/protocol/transport.d.ts +1396 -0
  274. package/dist/protocol/transport.d.ts.map +1 -0
  275. package/dist/protocol/transport.js +170 -0
  276. package/package.json +49 -0
@@ -0,0 +1,50 @@
1
+ import type { PluginTool } from "../agent-runtime.js";
2
+ import type { WorkflowAgentResult, WorkflowAgentSpec, WorkflowRunResult } from "./workflow-executor.js";
3
+ export { isValidWorkflowName, parseAgentDefinition, type SubagentRegistryEntry, } from "./subagent-registry.js";
4
+ export interface WorkflowScriptResult {
5
+ readonly ok: boolean;
6
+ readonly totalTokens: number;
7
+ readonly value: unknown;
8
+ }
9
+ export interface WorkflowToolDeps {
10
+ readonly runWorkflow: (input: {
11
+ workflowId: string;
12
+ label: string;
13
+ items: readonly WorkflowAgentSpec[];
14
+ signal?: AbortSignal;
15
+ }) => Promise<WorkflowRunResult>;
16
+ /** Executes an orchestration script in the vm sandbox (Phase 2). */
17
+ readonly runScript: (input: {
18
+ script: string;
19
+ args?: unknown;
20
+ }) => Promise<WorkflowScriptResult>;
21
+ /** Persist a script to `<workspace>/.oma/workflow/<name>.js` for reuse. */
22
+ readonly writeScript: (name: string, content: string) => void;
23
+ /** Load a saved script by name (B8: `workflow_run({name})` re-runs a
24
+ * saved workflow without re-supplying the body). null = not found. */
25
+ readonly readScript: (name: string) => Promise<string | null>;
26
+ /** 3.4: dispatch ONE named subagent (workflowId/agentId are minted by the
27
+ * wiring closure). `signal` is the calling loop's abort signal. */
28
+ readonly runSubagent: (spec: WorkflowAgentSpec, signal?: AbortSignal) => Promise<WorkflowAgentResult>;
29
+ /** 3.4: raw markdown of `<workspace>/.oma/agents/<name>.md`, or null when
30
+ * absent. The name is already validated before this is called. */
31
+ readonly readAgentDefinition: (name: string) => Promise<string | null>;
32
+ /** 3.4 Phase 3 control plane. */
33
+ readonly listSubagents: () => Array<{
34
+ handle: string;
35
+ label: string;
36
+ status: string;
37
+ usage?: WorkflowAgentResult["usage"];
38
+ }>;
39
+ readonly getSubagentOutput: (handle: string) => {
40
+ handle: string;
41
+ status: string;
42
+ result?: WorkflowAgentResult;
43
+ };
44
+ readonly stopSubagent: (handle: string) => {
45
+ ok: boolean;
46
+ error?: string;
47
+ };
48
+ }
49
+ export declare function createWorkflowTools(deps: WorkflowToolDeps): readonly PluginTool[];
50
+ //# sourceMappingURL=workflow-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/workflow-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;QACpC,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjC,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjG,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;2EACuE;IACvE,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9D;wEACoE;IACpE,QAAQ,CAAC,WAAW,EAAE,CACpB,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC;uEACmE;IACnE,QAAQ,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,iCAAiC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,KAAK,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;KACtC,CAAC,CAAC;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAC9C,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,mBAAmB,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E;AAkBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAkNjF"}
@@ -0,0 +1,217 @@
1
+ import { builtinAgentNames, isValidWorkflowName, resolveAgent } from "./subagent-registry.js";
2
+ export { isValidWorkflowName, parseAgentDefinition, } from "./subagent-registry.js";
3
+ /** Boundary narrowing: tool args arrive from the model as unknown-shaped
4
+ * JSON - validate each field before it enters the executor. */
5
+ function parseItem(raw) {
6
+ const item = raw;
7
+ const schema = item.schema;
8
+ const schemaRec = schema && typeof schema === "object" && !Array.isArray(schema)
9
+ ? schema
10
+ : undefined;
11
+ return {
12
+ prompt: String(item.prompt ?? ""),
13
+ ...(typeof item.label === "string" ? { label: item.label } : {}),
14
+ ...(schemaRec ? { schema: schemaRec } : {}),
15
+ };
16
+ }
17
+ export function createWorkflowTools(deps) {
18
+ const runWorkflow = {
19
+ name: "run_workflow",
20
+ description: "Fan out independent subagent tasks in parallel and aggregate their results. " +
21
+ "Each item gets its own isolated agent session (same model, file tools). " +
22
+ "Use for audits, migrations, and multi-source research. " +
23
+ "Items: [{prompt, schema?, label?}]. Returns per-item text and schema-validated " +
24
+ "output (1 retry on violation).",
25
+ executionMode: "serial",
26
+ inputSchema: {
27
+ type: "object",
28
+ properties: {
29
+ label: { type: "string" },
30
+ items: {
31
+ type: "array",
32
+ maxItems: 64,
33
+ items: {
34
+ type: "object",
35
+ properties: {
36
+ prompt: { type: "string" },
37
+ label: { type: "string" },
38
+ schema: { type: "object" },
39
+ },
40
+ required: ["prompt"],
41
+ },
42
+ },
43
+ },
44
+ required: ["items"],
45
+ },
46
+ async execute(args, signal) {
47
+ const rawItems = Array.isArray(args.items) ? args.items : [];
48
+ const workflowId = `wf-${crypto.randomUUID()}`;
49
+ const result = await deps.runWorkflow({
50
+ workflowId,
51
+ label: typeof args.label === "string" ? args.label : "workflow",
52
+ items: rawItems.map(parseItem),
53
+ ...(signal ? { signal } : {}),
54
+ });
55
+ return { items: result.items, totalTokens: result.totalTokens, ok: result.ok };
56
+ },
57
+ };
58
+ const runScript = {
59
+ name: "workflow_run",
60
+ description: "Run an orchestration script (top-level-await JS) that fans out subagents " +
61
+ "via agent(prompt, {schema?, label?}) and pipeline(items, fn). Scripts have " +
62
+ "NO fs/network access - agents do the work. Save reusable scripts with the " +
63
+ "name argument (written to .oma/workflow/<name>.js), then re-run one later " +
64
+ "with ONLY the name argument (loads the saved script).",
65
+ executionMode: "serial",
66
+ inputSchema: {
67
+ type: "object",
68
+ properties: {
69
+ // script XOR name: either a new body, or a saved workflow to re-run
70
+ // (the runtime enforces the XOR — at least one must be present).
71
+ script: { type: "string", maxLength: 32768 },
72
+ name: { type: "string" },
73
+ args: { type: "object" },
74
+ },
75
+ },
76
+ async execute(args) {
77
+ const rawScript = typeof args.script === "string" ? args.script : "";
78
+ const name = typeof args.name === "string" && args.name.length > 0 ? args.name : null;
79
+ if (name && !isValidWorkflowName(name)) {
80
+ return { ok: false, error: `invalid workflow name (allowed: [a-z0-9-], max 64): ${name}` };
81
+ }
82
+ if (rawScript && name)
83
+ deps.writeScript(name, rawScript);
84
+ let script = rawScript;
85
+ if (!script && name) {
86
+ const saved = await deps.readScript(name);
87
+ if (saved === null) {
88
+ return { ok: false, error: `workflow "${name}" not found in .oma/workflow` };
89
+ }
90
+ script = saved;
91
+ }
92
+ if (!script)
93
+ return { ok: false, error: "script or name is required" };
94
+ const result = await deps.runScript({ script, args: args.args });
95
+ return {
96
+ ok: result.ok,
97
+ totalTokens: result.totalTokens,
98
+ value: result.value,
99
+ scriptSaved: Boolean(rawScript && name),
100
+ };
101
+ },
102
+ };
103
+ const task = {
104
+ name: "task",
105
+ description: "Dispatch ONE named subagent as a task and get its final answer. Roles: " +
106
+ "explore (read-only investigation), worker (full file tools), or any " +
107
+ ".oma/agents/<name>.md definition in the workspace. " +
108
+ "Args: {agent, prompt, schema?, background?}. The result carries a " +
109
+ "handle; pass {resume: <handle>, prompt} to continue the SAME subagent " +
110
+ "with a follow-up. background:true returns immediately with the handle " +
111
+ "(poll it via task_output). For parallel fan-out use run_workflow.",
112
+ executionMode: "serial",
113
+ inputSchema: {
114
+ type: "object",
115
+ properties: {
116
+ agent: { type: "string" },
117
+ prompt: { type: "string" },
118
+ schema: { type: "object" },
119
+ resume: { type: "string" },
120
+ background: { type: "boolean" },
121
+ },
122
+ // agent XOR resume (with prompt required either way); runtime enforces.
123
+ },
124
+ async execute(args, signal) {
125
+ const agent = typeof args.agent === "string" ? args.agent.trim() : "";
126
+ const prompt = typeof args.prompt === "string" ? args.prompt : "";
127
+ const resume = typeof args.resume === "string" ? args.resume.trim() : "";
128
+ if (!prompt)
129
+ return { ok: false, error: "prompt is required" };
130
+ if (resume) {
131
+ const result = await deps.runSubagent({ prompt, ...(agent ? { label: agent } : {}), resumeHandle: resume }, signal);
132
+ return { label: result.label, text: result.text, ok: result.ok };
133
+ }
134
+ if (!agent)
135
+ return { ok: false, error: "agent (or resume handle) and prompt are required" };
136
+ const def = await resolveAgent(agent, deps.readAgentDefinition);
137
+ if (!def) {
138
+ const builtin = builtinAgentNames().join(", ");
139
+ return {
140
+ ok: false,
141
+ error: `unknown subagent "${agent}" (builtin: ${builtin}; or .oma/agents/<name>.md)`,
142
+ };
143
+ }
144
+ const schema = args.schema;
145
+ const result = await deps.runSubagent({
146
+ prompt,
147
+ label: agent,
148
+ ...(schema && typeof schema === "object" && !Array.isArray(schema)
149
+ ? { schema: schema }
150
+ : {}),
151
+ systemPrompt: def.systemPrompt,
152
+ ...(def.tools ? { toolNames: def.tools } : {}),
153
+ ...(def.modelId ? { modelId: def.modelId } : {}),
154
+ ...(args.background === true ? { background: true } : {}),
155
+ }, signal);
156
+ return {
157
+ label: result.label,
158
+ text: result.text,
159
+ ok: result.ok,
160
+ ...(result.output !== undefined ? { output: result.output } : {}),
161
+ ...(result.error ? { error: result.error } : {}),
162
+ ...(result.usage ? { usage: result.usage } : {}),
163
+ ...(result.artifacts ? { artifacts: result.artifacts } : {}),
164
+ ...(result.handle ? { handle: result.handle } : {}),
165
+ ...(result.status ? { status: result.status } : {}),
166
+ };
167
+ },
168
+ };
169
+ const taskList = {
170
+ name: "task_list",
171
+ description: "List live task handles (label, status, usage).",
172
+ executionMode: "serial",
173
+ inputSchema: { type: "object", properties: {} },
174
+ async execute() {
175
+ return { tasks: deps.listSubagents() };
176
+ },
177
+ };
178
+ const taskOutput = {
179
+ name: "task_output",
180
+ description: "Read a background task by handle: status (running/completed/failed/stopped) " +
181
+ "and the result once finished.",
182
+ executionMode: "serial",
183
+ inputSchema: {
184
+ type: "object",
185
+ properties: { handle: { type: "string" } },
186
+ required: ["handle"],
187
+ },
188
+ async execute(args) {
189
+ const handle = typeof args.handle === "string" ? args.handle.trim() : "";
190
+ if (!handle)
191
+ return { ok: false, error: "handle is required" };
192
+ const out = deps.getSubagentOutput(handle);
193
+ return {
194
+ handle: out.handle,
195
+ status: out.status,
196
+ ...(out.result ? { result: out.result } : {}),
197
+ };
198
+ },
199
+ };
200
+ const taskStop = {
201
+ name: "task_stop",
202
+ description: "Stop a live background task by handle.",
203
+ executionMode: "serial",
204
+ inputSchema: {
205
+ type: "object",
206
+ properties: { handle: { type: "string" } },
207
+ required: ["handle"],
208
+ },
209
+ async execute(args) {
210
+ const handle = typeof args.handle === "string" ? args.handle.trim() : "";
211
+ if (!handle)
212
+ return { ok: false, error: "handle is required" };
213
+ return deps.stopSubagent(handle);
214
+ },
215
+ };
216
+ return [runWorkflow, runScript, task, taskList, taskOutput, taskStop];
217
+ }
@@ -0,0 +1,14 @@
1
+ /** Oma product public API: the single Runtime factory plus the
2
+ * pieces the modes are built from. Everything else (CLI entry, RPC/JSON/
3
+ * print modes) is app-internal. */
4
+ export { type CliArgs, type CliMode, parseArgs, UsageError } from "./cli/args.js";
5
+ export { buildCliRunInput } from "./cli/initial-input.js";
6
+ export { type CreateOmaRuntimeOptions, createOmaRuntime, type OmaRuntime, } from "./core/runtime/create-runtime.js";
7
+ export { buildBackendModelCatalog, type ModelCatalogOptions, } from "./core/runtime/model-catalog.js";
8
+ export { assembleRunRuntime, type RunRuntime, type RunRuntimeDeps, registerBuiltinProviders, } from "./core/runtime/run-runtime.js";
9
+ export { registerProvidersFromCatalog } from "./core/runtime/runtime-catalog.js";
10
+ export { runJsonMode } from "./modes/json-mode.js";
11
+ export { assistantText, type CliRunOptions, runPrintMode } from "./modes/print-mode.js";
12
+ export { createJsonlReader, type JsonlReaderOptions } from "./modes/rpc/jsonl.js";
13
+ export { type RpcModeController, type RpcModeOptions, runRpcMode } from "./modes/rpc/rpc-mode.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;oCAEoC;AAEpC,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,KAAK,UAAU,GAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /** Oma product public API: the single Runtime factory plus the
2
+ * pieces the modes are built from. Everything else (CLI entry, RPC/JSON/
3
+ * print modes) is app-internal. */
4
+ export { parseArgs, UsageError } from "./cli/args.js";
5
+ export { buildCliRunInput } from "./cli/initial-input.js";
6
+ export { createOmaRuntime, } from "./core/runtime/create-runtime.js";
7
+ export { buildBackendModelCatalog, } from "./core/runtime/model-catalog.js";
8
+ export { assembleRunRuntime, registerBuiltinProviders, } from "./core/runtime/run-runtime.js";
9
+ export { registerProvidersFromCatalog } from "./core/runtime/runtime-catalog.js";
10
+ export { runJsonMode } from "./modes/json-mode.js";
11
+ export { assistantText, runPrintMode } from "./modes/print-mode.js";
12
+ export { createJsonlReader } from "./modes/rpc/jsonl.js";
13
+ export { runRpcMode } from "./modes/rpc/rpc-mode.js";
package/dist/main.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export declare const OMA_VERSION = "0.1.0";
2
+ /** Parse args, run one CLI invocation, and return the process exit code.
3
+ * Never calls process.exit() - callers own exit-code assignment so stdout
4
+ * protocol output can flush. Pure enough to be imported from tests. */
5
+ export declare function main(argv?: string[]): Promise<number>;
6
+ /** CLI entry wrapper: run main() and map errors to stderr + exit codes.
7
+ * Used by src/cli.ts (the executable entry) and tests. */
8
+ export declare function runCli(argv?: string[]): Promise<void>;
9
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC;;wEAEwE;AACxE,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwElF;AAED;2DAC2D;AAC3D,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlF"}
package/dist/main.js ADDED
@@ -0,0 +1,97 @@
1
+ import { createModelRuntime } from "@chengchenccc/ai";
2
+ import { parseArgs, UsageError } from "./cli/args.js";
3
+ import { mergeInitialInput, readPipedStdin } from "./cli/initial-input.js";
4
+ import { buildBackendModelCatalog } from "./core/runtime/model-catalog.js";
5
+ import { registerBuiltinProviders } from "./core/runtime/run-runtime.js";
6
+ import { parseToolFilter } from "./core/runtime/tool-filter.js";
7
+ import { runJsonMode } from "./modes/json-mode.js";
8
+ import { runPrintMode } from "./modes/print-mode.js";
9
+ import { runRpcMode } from "./modes/rpc/rpc-mode.js";
10
+ import { runTuiMode } from "./modes/tui/tui-mode.js";
11
+ export const OMA_VERSION = "0.1.0";
12
+ /** Parse args, run one CLI invocation, and return the process exit code.
13
+ * Never calls process.exit() - callers own exit-code assignment so stdout
14
+ * protocol output can flush. Pure enough to be imported from tests. */
15
+ export async function main(argv = process.argv.slice(2)) {
16
+ const args = parseArgs(argv);
17
+ const modelRuntime = createModelRuntime();
18
+ registerBuiltinProviders(modelRuntime, process.env);
19
+ if (args.listModels) {
20
+ // stdout carries ONLY the catalog JSON (the adapter parses it).
21
+ const catalog = await buildBackendModelCatalog({ modelRuntime });
22
+ process.stdout.write(`${JSON.stringify(catalog)}\n`);
23
+ return 0;
24
+ }
25
+ if (args.mode === "rpc") {
26
+ // RPC stdin is the JSONL command stream: NEVER pre-read it.
27
+ const controller = runRpcMode({ modelRuntime });
28
+ let signaled = false;
29
+ const onSignal = () => {
30
+ if (signaled)
31
+ return;
32
+ signaled = true;
33
+ controller.stop();
34
+ };
35
+ process.on("SIGTERM", onSignal);
36
+ process.on("SIGINT", onSignal);
37
+ try {
38
+ return await controller.promise;
39
+ }
40
+ finally {
41
+ process.off("SIGTERM", onSignal);
42
+ process.off("SIGINT", onSignal);
43
+ }
44
+ }
45
+ if (args.mode === "tui") {
46
+ return runTuiMode({
47
+ modelRuntime,
48
+ workspaceRoot: process.cwd(),
49
+ model: args.model,
50
+ sessionId: args.session,
51
+ });
52
+ }
53
+ // Standalone default: `oma` (or `oma "<prompt>"`) on a TTY opens the
54
+ // TUI, with the positional prompt prefilled into the editor. Explicit
55
+ // -p/--mode or a pipe stays one-shot print/json.
56
+ if (!args.modeExplicit && process.stdin.isTTY) {
57
+ return runTuiMode({
58
+ modelRuntime,
59
+ workspaceRoot: process.cwd(),
60
+ model: args.model,
61
+ sessionId: args.session,
62
+ ...(args.tools ? { toolFilter: parseToolFilter(args.tools) } : {}),
63
+ ...(args.prompt ? { initialPrompt: args.prompt } : {}),
64
+ });
65
+ }
66
+ const prompt = mergeInitialInput({
67
+ prompt: args.prompt,
68
+ piped: await readPipedStdin(),
69
+ });
70
+ if (!prompt) {
71
+ throw new UsageError('bare oma opens the interactive TUI - run it in a terminal. Outside a terminal, give a prompt: oma -p "<prompt>" (or piped stdin)');
72
+ }
73
+ const opts = {
74
+ prompt,
75
+ workspaceRoot: process.cwd(),
76
+ modelRuntime,
77
+ model: args.model,
78
+ ...(args.tools ? { toolFilter: parseToolFilter(args.tools) } : {}),
79
+ };
80
+ return args.mode === "json" ? runJsonMode(opts) : runPrintMode(opts);
81
+ }
82
+ /** CLI entry wrapper: run main() and map errors to stderr + exit codes.
83
+ * Used by src/cli.ts (the executable entry) and tests. */
84
+ export async function runCli(argv = process.argv.slice(2)) {
85
+ try {
86
+ process.exitCode = await main(argv);
87
+ }
88
+ catch (err) {
89
+ if (err instanceof UsageError) {
90
+ process.stderr.write(`${err.message}\n`);
91
+ process.exitCode = 2;
92
+ return;
93
+ }
94
+ process.stderr.write(`[oma] failed: ${err instanceof Error ? err.message : String(err)}\n`);
95
+ process.exitCode = 1;
96
+ }
97
+ }
@@ -0,0 +1,5 @@
1
+ import type { CliRunOptions } from "./print-mode.js";
2
+ /** JSON mode: one Run; stdout gets ALL events as JSONL plus exactly one
3
+ * terminal outcome line; then the process exits. stderr for logs only. */
4
+ export declare function runJsonMode(opts: CliRunOptions): Promise<number>;
5
+ //# sourceMappingURL=json-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-mode.d.ts","sourceRoot":"","sources":["../../src/modes/json-mode.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;2EAC2E;AAC3E,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCtE"}
@@ -0,0 +1,46 @@
1
+ import { buildCliRunInput } from "../cli/initial-input.js";
2
+ import { assemblePluginRuntime } from "../core/plugins/plugin-resolve.js";
3
+ import { denyAllApprovals } from "../core/runtime/approval.js";
4
+ import { createOmaRuntime } from "../core/runtime/create-runtime.js";
5
+ /** JSON mode: one Run; stdout gets ALL events as JSONL plus exactly one
6
+ * terminal outcome line; then the process exits. stderr for logs only. */
7
+ export async function runJsonMode(opts) {
8
+ const built = await buildCliRunInput({
9
+ prompt: opts.prompt,
10
+ workspaceRoot: opts.workspaceRoot,
11
+ modelRuntime: opts.modelRuntime,
12
+ });
13
+ const pluginRt = await assemblePluginRuntime(built.workspace.root, "json");
14
+ for (const w of pluginRt.warnings)
15
+ console.error(`[plugin] ${w}`);
16
+ const runtime = await createOmaRuntime({
17
+ runId: built.run.runId,
18
+ modelId: built.run.model.modelId,
19
+ workspaceRoot: built.workspace.root,
20
+ workspaceAccess: built.workspace.access,
21
+ modelRuntime: opts.modelRuntime,
22
+ skillRoots: built.run.skillRoots ?? [],
23
+ gateWorkspaceMcp: true,
24
+ approvalHandler: denyAllApprovals,
25
+ ...(pluginRt.plugins.length || pluginRt.mcpServers.length
26
+ ? { pluginComponents: { plugins: pluginRt.plugins, mcpServers: pluginRt.mcpServers } }
27
+ : {}),
28
+ ...(built.run.permissionMode ? { permissionMode: built.run.permissionMode } : {}),
29
+ ...(opts.toolFilter ? { toolFilter: opts.toolFilter } : {}),
30
+ onEvent: (envelope) => {
31
+ // Raw runtime event object, e.g. {"type":"agent_start"}.
32
+ process.stdout.write(`${JSON.stringify({ type: "event", event: envelope.data })}\n`);
33
+ },
34
+ });
35
+ try {
36
+ const segment = await runtime.run(built);
37
+ const outcome = await segment.outcome;
38
+ process.stdout.write(`${JSON.stringify({ type: "outcome", outcome })}\n`);
39
+ return outcome.status === "completed" ? 0 : 1;
40
+ }
41
+ finally {
42
+ await runtime.close().catch(() => { });
43
+ // One-shot process: wait for the background memory pass (see print mode).
44
+ await runtime.memoryLearning()?.catch(() => { });
45
+ }
46
+ }
@@ -0,0 +1,20 @@
1
+ import type { ModelRuntime } from "@chengchenccc/ai";
2
+ import type { Message } from "@chengchenccc/message";
3
+ import type { ToolFilter } from "../core/runtime/tool-filter.js";
4
+ export interface CliRunOptions {
5
+ prompt: string;
6
+ workspaceRoot: string;
7
+ modelRuntime: ModelRuntime;
8
+ /** Canonical `<provider>/<model>` id; undefined = first available. */
9
+ model?: string;
10
+ /** --tools filter (CLI): applied to the final tool table. */
11
+ toolFilter?: ToolFilter;
12
+ }
13
+ /** Final assistant text of an outcome Message: the plain `text` field, or the
14
+ * concatenated text blocks. Never falls back to placeholder text. */
15
+ export declare function assistantText(message: Message | undefined): string;
16
+ /** Print mode: one Run, one prompt; stdout gets ONLY the final assistant
17
+ * text; failures go to stderr with a non-zero exit code. The completed
18
+ * turn is persisted to a fresh session file (stdout stays clean). */
19
+ export declare function runPrintMode(opts: CliRunOptions): Promise<number>;
20
+ //# sourceMappingURL=print-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAKrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAIjE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AACD;sEACsE;AACtE,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAUlE;AAED;;sEAEsE;AACtE,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDvE"}
@@ -0,0 +1,82 @@
1
+ import { buildCliRunInput } from "../cli/initial-input.js";
2
+ import { assemblePluginRuntime } from "../core/plugins/plugin-resolve.js";
3
+ import { denyAllApprovals } from "../core/runtime/approval.js";
4
+ import { createOmaRuntime } from "../core/runtime/create-runtime.js";
5
+ import { newSessionId } from "../core/session/session-file.js";
6
+ import { persistSessionTurn } from "../core/session/session-loop.js";
7
+ /** Final assistant text of an outcome Message: the plain `text` field, or the
8
+ * concatenated text blocks. Never falls back to placeholder text. */
9
+ export function assistantText(message) {
10
+ if (!message)
11
+ return "";
12
+ if (typeof message.text === "string" && message.text.length > 0)
13
+ return message.text;
14
+ if (Array.isArray(message.blocks)) {
15
+ return message.blocks
16
+ .filter((b) => b.type === "text" && typeof b.text === "string")
17
+ .map((b) => b.text)
18
+ .join("\n");
19
+ }
20
+ return "";
21
+ }
22
+ /** Print mode: one Run, one prompt; stdout gets ONLY the final assistant
23
+ * text; failures go to stderr with a non-zero exit code. The completed
24
+ * turn is persisted to a fresh session file (stdout stays clean). */
25
+ export async function runPrintMode(opts) {
26
+ const built = await buildCliRunInput({
27
+ prompt: opts.prompt,
28
+ workspaceRoot: opts.workspaceRoot,
29
+ modelRuntime: opts.modelRuntime,
30
+ modelId: opts.model,
31
+ });
32
+ const sessionId = newSessionId();
33
+ const pluginRt = await assemblePluginRuntime(built.workspace.root, "print");
34
+ for (const w of pluginRt.warnings)
35
+ console.error(`[plugin] ${w}`);
36
+ const runtime = await createOmaRuntime({
37
+ runId: built.run.runId,
38
+ modelId: built.run.model.modelId,
39
+ workspaceRoot: built.workspace.root,
40
+ workspaceAccess: built.workspace.access,
41
+ modelRuntime: opts.modelRuntime,
42
+ skillRoots: built.run.skillRoots ?? [],
43
+ gateWorkspaceMcp: true,
44
+ approvalHandler: denyAllApprovals,
45
+ ...(pluginRt.plugins.length || pluginRt.mcpServers.length
46
+ ? { pluginComponents: { plugins: pluginRt.plugins, mcpServers: pluginRt.mcpServers } }
47
+ : {}),
48
+ ...(built.run.permissionMode ? { permissionMode: built.run.permissionMode } : {}),
49
+ ...(opts.toolFilter ? { toolFilter: opts.toolFilter } : {}),
50
+ });
51
+ try {
52
+ const segment = await runtime.run(built);
53
+ const outcome = await segment.outcome;
54
+ if (outcome.status === "completed") {
55
+ await persistSessionTurn({
56
+ sessionId,
57
+ cwd: opts.workspaceRoot,
58
+ runtime,
59
+ // One-shot mode: no real-time hook, write the whole turn at once.
60
+ messages: [built.input.message, ...(outcome.messages ?? [])],
61
+ });
62
+ // Final answer = the last assistant message with text in the
63
+ // canonical sequence (ADR 0017).
64
+ const finalAnswer = [...(outcome.messages ?? [])]
65
+ .reverse()
66
+ .find((m) => m.role === "assistant" && (m.text?.trim() ?? "") !== "");
67
+ const text = assistantText(finalAnswer);
68
+ if (text)
69
+ process.stdout.write(`${text}\n`);
70
+ return 0;
71
+ }
72
+ process.stderr.write(`[oma] run failed: ${outcome.error ?? outcome.status}\n`);
73
+ return 1;
74
+ }
75
+ finally {
76
+ await runtime.close().catch(() => { });
77
+ // The memory-learn pass is fire-and-forget: a one-shot process must not
78
+ // exit before it settles, or the run's facts are lost (it has its own
79
+ // 60s bound, so this await cannot hang).
80
+ await runtime.memoryLearning()?.catch(() => { });
81
+ }
82
+ }
@@ -0,0 +1,23 @@
1
+ /** Strict LF-framed JSONL reader (Pi-style).
2
+ *
3
+ * - Only `\n` (0x0A) splits frames - a generic line reader that also splits
4
+ * on Unicode separators would corrupt payloads.
5
+ * - Byte-buffer based: half packets accumulate until the next LF.
6
+ * - A single frame is bounded (`maxLineBytes`); oversized frames are skipped
7
+ * and reported via `onOversize`. The buffer is trimmed so a hostile peer
8
+ * cannot grow memory without bound - trimmed bytes belong to an oversized
9
+ * frame, which is discarded up to its terminating LF. */
10
+ export interface JsonlReaderOptions {
11
+ /** Max bytes of one frame (default 16 MiB - history projections can be large). */
12
+ maxLineBytes?: number;
13
+ onOversize?: (length: number) => void;
14
+ }
15
+ export interface JsonlReader {
16
+ readonly lines: AsyncIterable<string>;
17
+ /** End the read loop as if the stream closed: the pending read resolves
18
+ * `{done: true}` and the iterator finishes cleanly. Used by RPC mode to
19
+ * exit the process on its own after the outcome. */
20
+ cancel(): Promise<void>;
21
+ }
22
+ export declare function createJsonlReader(stream: ReadableStream<Uint8Array>, opts?: JsonlReaderOptions): JsonlReader;
23
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;4DAQ4D;AAE5D,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC;;yDAEqD;IACrD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,IAAI,GAAE,kBAAuB,GAC5B,WAAW,CAqEb"}