@chengchenccc/oh-my-agent 0.2.0-rc.2 → 0.2.0-rc.4

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 (209) hide show
  1. package/README.md +11 -6
  2. package/dist/cli/args.d.ts +1 -1
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +9 -2
  5. package/dist/cli/gateway-commands.d.ts.map +1 -1
  6. package/dist/cli/gateway-commands.js +35 -5
  7. package/dist/cli/initial-input.d.ts +3 -2
  8. package/dist/cli/initial-input.d.ts.map +1 -1
  9. package/dist/core/coordination/registry.d.ts +11 -0
  10. package/dist/core/coordination/registry.d.ts.map +1 -1
  11. package/dist/core/coordination/registry.js +23 -0
  12. package/dist/core/gateway/artifact.d.ts +0 -1
  13. package/dist/core/gateway/artifact.d.ts.map +1 -1
  14. package/dist/core/gateway/artifact.js +1 -1
  15. package/dist/core/goals/index.d.ts +8 -0
  16. package/dist/core/goals/index.d.ts.map +1 -0
  17. package/dist/core/goals/index.js +7 -0
  18. package/dist/core/goals/runtime.d.ts +112 -0
  19. package/dist/core/goals/runtime.d.ts.map +1 -0
  20. package/dist/core/goals/runtime.js +241 -0
  21. package/dist/core/goals/state.d.ts +82 -0
  22. package/dist/core/goals/state.d.ts.map +1 -0
  23. package/dist/core/goals/state.js +225 -0
  24. package/dist/core/goals/tool.d.ts +10 -0
  25. package/dist/core/goals/tool.d.ts.map +1 -0
  26. package/dist/core/goals/tool.js +87 -0
  27. package/dist/core/index.d.ts.map +1 -1
  28. package/dist/core/index.js +4 -3
  29. package/dist/core/loops/condition.d.ts +57 -0
  30. package/dist/core/loops/condition.d.ts.map +1 -0
  31. package/dist/core/loops/condition.js +153 -0
  32. package/dist/core/loops/index.d.ts +9 -0
  33. package/dist/core/loops/index.d.ts.map +1 -0
  34. package/dist/core/loops/index.js +8 -0
  35. package/dist/core/loops/limits.d.ts +43 -0
  36. package/dist/core/loops/limits.d.ts.map +1 -0
  37. package/dist/core/loops/limits.js +219 -0
  38. package/dist/core/loops/ralph.d.ts +37 -0
  39. package/dist/core/loops/ralph.d.ts.map +1 -0
  40. package/dist/core/loops/ralph.js +72 -0
  41. package/dist/core/loops/runtime.d.ts +95 -0
  42. package/dist/core/loops/runtime.d.ts.map +1 -0
  43. package/dist/core/loops/runtime.js +222 -0
  44. package/dist/core/memory/managed-skills.d.ts +0 -11
  45. package/dist/core/memory/managed-skills.d.ts.map +1 -1
  46. package/dist/core/memory/managed-skills.js +2 -2
  47. package/dist/core/memory/vector-store.d.ts +0 -1
  48. package/dist/core/memory/vector-store.d.ts.map +1 -1
  49. package/dist/core/memory/vector-store.js +0 -3
  50. package/dist/core/plans/index.d.ts +7 -0
  51. package/dist/core/plans/index.d.ts.map +1 -0
  52. package/dist/core/plans/index.js +6 -0
  53. package/dist/core/plans/prompts.d.ts +20 -0
  54. package/dist/core/plans/prompts.d.ts.map +1 -0
  55. package/dist/core/plans/prompts.js +72 -0
  56. package/dist/core/plans/runtime.d.ts +89 -0
  57. package/dist/core/plans/runtime.d.ts.map +1 -0
  58. package/dist/core/plans/runtime.js +170 -0
  59. package/dist/core/plans/state.d.ts +55 -0
  60. package/dist/core/plans/state.d.ts.map +1 -0
  61. package/dist/core/plans/state.js +88 -0
  62. package/dist/core/runtime/agent-loop-messages.d.ts +6 -0
  63. package/dist/core/runtime/agent-loop-messages.d.ts.map +1 -1
  64. package/dist/core/runtime/agent-loop-messages.js +40 -15
  65. package/dist/core/runtime/agent-loop-run.d.ts.map +1 -1
  66. package/dist/core/runtime/agent-loop-run.js +18 -27
  67. package/dist/core/runtime/agent-loop-runner.d.ts +1 -23
  68. package/dist/core/runtime/agent-loop-runner.d.ts.map +1 -1
  69. package/dist/core/runtime/agent-loop-runner.js +84 -30
  70. package/dist/core/runtime/agent-loop-types.d.ts +4 -0
  71. package/dist/core/runtime/agent-loop-types.d.ts.map +1 -1
  72. package/dist/core/runtime/compaction.d.ts +9 -0
  73. package/dist/core/runtime/compaction.d.ts.map +1 -1
  74. package/dist/core/runtime/compaction.js +28 -0
  75. package/dist/core/runtime/context-estimate.d.ts +37 -4
  76. package/dist/core/runtime/context-estimate.d.ts.map +1 -1
  77. package/dist/core/runtime/context-estimate.js +70 -0
  78. package/dist/core/runtime/create-runtime.d.ts +27 -5
  79. package/dist/core/runtime/create-runtime.d.ts.map +1 -1
  80. package/dist/core/runtime/create-runtime.js +22 -2
  81. package/dist/core/runtime/permission-classifier.d.ts.map +1 -1
  82. package/dist/core/runtime/permission-classifier.js +83 -12
  83. package/dist/core/runtime/plugin.d.ts +7 -0
  84. package/dist/core/runtime/plugin.d.ts.map +1 -1
  85. package/dist/core/runtime/plugin.js +13 -0
  86. package/dist/core/runtime/process-tree.d.ts +0 -9
  87. package/dist/core/runtime/process-tree.d.ts.map +1 -1
  88. package/dist/core/runtime/process-tree.js +1 -1
  89. package/dist/core/runtime/run-runtime.d.ts.map +1 -1
  90. package/dist/core/runtime/run-runtime.js +88 -49
  91. package/dist/core/runtime/runtime-catalog.d.ts +0 -4
  92. package/dist/core/runtime/runtime-catalog.d.ts.map +1 -1
  93. package/dist/core/runtime/runtime-catalog.js +1 -1
  94. package/dist/core/runtime/stream-rules.d.ts +9 -2
  95. package/dist/core/runtime/stream-rules.d.ts.map +1 -1
  96. package/dist/core/runtime/stream-rules.js +19 -5
  97. package/dist/core/runtime/title.d.ts +13 -1
  98. package/dist/core/runtime/title.d.ts.map +1 -1
  99. package/dist/core/runtime/title.js +51 -17
  100. package/dist/core/runtime/tool-pruning.d.ts.map +1 -1
  101. package/dist/core/runtime/tool-pruning.js +8 -16
  102. package/dist/core/session/session-file.d.ts +91 -5
  103. package/dist/core/session/session-file.d.ts.map +1 -1
  104. package/dist/core/session/session-file.js +206 -24
  105. package/dist/core/session/session-loop.d.ts +3 -1
  106. package/dist/core/session/session-loop.d.ts.map +1 -1
  107. package/dist/core/session/session-loop.js +8 -4
  108. package/dist/core/settings/project-settings.d.ts +63 -9
  109. package/dist/core/settings/project-settings.d.ts.map +1 -1
  110. package/dist/core/settings/project-settings.js +43 -2
  111. package/dist/core/settings/workspace-context.js +4 -4
  112. package/dist/core/store/in-memory-session-store.d.ts.map +1 -1
  113. package/dist/core/store/in-memory-session-store.js +3 -2
  114. package/dist/core/store/session-store.contract.test-helper.d.ts +7 -5
  115. package/dist/core/store/session-store.contract.test-helper.d.ts.map +1 -1
  116. package/dist/core/store/session-store.contract.test-helper.js +7 -5
  117. package/dist/core/store/session-store.d.ts +4 -2
  118. package/dist/core/store/session-store.d.ts.map +1 -1
  119. package/dist/core/store/session-store.js +4 -2
  120. package/dist/core/tools/ask-question.d.ts.map +1 -1
  121. package/dist/core/tools/ask-question.js +51 -5
  122. package/dist/core/tools/bash-pty.d.ts +13 -4
  123. package/dist/core/tools/bash-pty.d.ts.map +1 -1
  124. package/dist/core/tools/bash-pty.js +15 -8
  125. package/dist/core/tools/bash-sandbox.d.ts +1 -1
  126. package/dist/core/tools/bash.d.ts +1 -1
  127. package/dist/core/tools/bash.d.ts.map +1 -1
  128. package/dist/core/tools/bash.js +18 -8
  129. package/dist/core/tools/browser.d.ts +54 -0
  130. package/dist/core/tools/browser.d.ts.map +1 -1
  131. package/dist/core/tools/browser.js +138 -1
  132. package/dist/core/tools/file-fingerprint.d.ts +24 -0
  133. package/dist/core/tools/file-fingerprint.d.ts.map +1 -0
  134. package/dist/core/tools/file-fingerprint.js +61 -0
  135. package/dist/core/tools/file-tools.d.ts +26 -0
  136. package/dist/core/tools/file-tools.d.ts.map +1 -1
  137. package/dist/core/tools/file-tools.js +113 -17
  138. package/dist/core/tools/index.d.ts +2 -0
  139. package/dist/core/tools/index.d.ts.map +1 -1
  140. package/dist/core/tools/index.js +1 -0
  141. package/dist/core/tools/mcp-mount.d.ts +1 -1
  142. package/dist/core/tools/mcp-mount.d.ts.map +1 -1
  143. package/dist/core/tools/mcp-mount.js +72 -26
  144. package/dist/core/tools/url-guard.d.ts +15 -0
  145. package/dist/core/tools/url-guard.d.ts.map +1 -1
  146. package/dist/core/tools/url-guard.js +54 -14
  147. package/dist/core/tools/web-ports-std.d.ts.map +1 -1
  148. package/dist/core/tools/web-ports-std.js +5 -2
  149. package/dist/modes/print-mode.d.ts +3 -2
  150. package/dist/modes/print-mode.d.ts.map +1 -1
  151. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  152. package/dist/modes/rpc/rpc-mode.js +2 -2
  153. package/dist/modes/shared.d.ts +12 -0
  154. package/dist/modes/shared.d.ts.map +1 -1
  155. package/dist/modes/shared.js +23 -6
  156. package/dist/modes/tui/agent-status.d.ts +20 -0
  157. package/dist/modes/tui/agent-status.d.ts.map +1 -0
  158. package/dist/modes/tui/agent-status.js +35 -0
  159. package/dist/modes/tui/ask-panel.d.ts +166 -0
  160. package/dist/modes/tui/ask-panel.d.ts.map +1 -0
  161. package/dist/modes/tui/ask-panel.js +888 -0
  162. package/dist/modes/tui/pty-console.d.ts +3 -0
  163. package/dist/modes/tui/pty-console.d.ts.map +1 -1
  164. package/dist/modes/tui/pty-console.js +19 -0
  165. package/dist/modes/tui/settings-overlay.d.ts +19 -0
  166. package/dist/modes/tui/settings-overlay.d.ts.map +1 -1
  167. package/dist/modes/tui/settings-overlay.js +46 -10
  168. package/dist/modes/tui/tui-commands-session.d.ts.map +1 -1
  169. package/dist/modes/tui/tui-commands-session.js +20 -6
  170. package/dist/modes/tui/tui-commands.d.ts +44 -3
  171. package/dist/modes/tui/tui-commands.d.ts.map +1 -1
  172. package/dist/modes/tui/tui-commands.js +380 -6
  173. package/dist/modes/tui/tui-components.d.ts +10 -0
  174. package/dist/modes/tui/tui-components.d.ts.map +1 -1
  175. package/dist/modes/tui/tui-components.js +26 -0
  176. package/dist/modes/tui/tui-format.d.ts +53 -4
  177. package/dist/modes/tui/tui-format.d.ts.map +1 -1
  178. package/dist/modes/tui/tui-format.js +137 -42
  179. package/dist/modes/tui/tui-frame-provider.d.ts +11 -3
  180. package/dist/modes/tui/tui-frame-provider.d.ts.map +1 -1
  181. package/dist/modes/tui/tui-frame-provider.js +14 -5
  182. package/dist/modes/tui/tui-interactive.d.ts.map +1 -1
  183. package/dist/modes/tui/tui-interactive.js +14 -0
  184. package/dist/modes/tui/tui-io.d.ts.map +1 -1
  185. package/dist/modes/tui/tui-io.js +150 -55
  186. package/dist/modes/tui/tui-mode.d.ts.map +1 -1
  187. package/dist/modes/tui/tui-mode.js +428 -23
  188. package/dist/modes/tui/tui-overlays.d.ts +6 -10
  189. package/dist/modes/tui/tui-overlays.d.ts.map +1 -1
  190. package/dist/modes/tui/tui-overlays.js +0 -43
  191. package/dist/modes/tui/tui-render.d.ts +10 -0
  192. package/dist/modes/tui/tui-render.d.ts.map +1 -1
  193. package/dist/modes/tui/tui-render.js +73 -38
  194. package/dist/modes/tui/tui-seam.d.ts +28 -6
  195. package/dist/modes/tui/tui-seam.d.ts.map +1 -1
  196. package/dist/modes/tui/tui-slash.d.ts.map +1 -1
  197. package/dist/modes/tui/tui-slash.js +3 -1
  198. package/dist/modes/tui/tui-tool-render.d.ts +14 -1
  199. package/dist/modes/tui/tui-tool-render.d.ts.map +1 -1
  200. package/dist/modes/tui/tui-tool-render.js +158 -50
  201. package/dist/modes/tui/tui-transcript-reconciler.d.ts +4 -0
  202. package/dist/modes/tui/tui-transcript-reconciler.d.ts.map +1 -1
  203. package/dist/modes/tui/tui-transcript-reconciler.js +12 -2
  204. package/dist/modes/tui/view-state.d.ts.map +1 -1
  205. package/dist/modes/tui/view-state.js +4 -1
  206. package/dist/protocol/transport.d.ts +10 -0
  207. package/dist/protocol/transport.d.ts.map +1 -1
  208. package/dist/protocol/transport.js +1 -0
  209. package/package.json +11 -11
package/README.md CHANGED
@@ -7,7 +7,7 @@ Product Backend → Agent Run → Adapter → spawn oma --mode rpc
7
7
  → per-Run Runtime → BackendRunOutcome → stdout → child 退出
8
8
  ```
9
9
 
10
- **不是 daemon**:一个 Run = 一个子进程 = 一个 Runtime = 一个 outcome。没有常驻进程、没有 session supervisor、没有 worker pool
10
+ **不是 daemon**(就 Run 执行模型而言):一个 Run = 一个子进程 = 一个 Runtime = 一个 outcome。没有常驻的 session supervisor,没有 worker pool。同一个包里的 `core/gateway/` 是另一回事——`oma gateway up -d` 确实会起一个 detached daemon,那是它自己的 pidfile 加 supervisor,与 Run 无关。
11
11
 
12
12
  ## TUI
13
13
 
@@ -38,13 +38,13 @@ Product Backend → Agent Run → Adapter → spawn oma --mode rpc
38
38
 
39
39
  ## Runtime
40
40
 
41
- `createOmaRuntime()`(`src/core/create-runtime.ts`)构造一个 Runtime = 一个 Run:
41
+ `createOmaRuntime()`(`src/core/runtime/create-runtime.ts`)构造一个 Runtime = 一个 Run:
42
42
 
43
43
  - `run(input)` 返回唯一 segment,其 `outcome` 是 Run 的唯一终态;
44
44
  - `steer(input)` 注入 live loop;`stop()` 中止;
45
45
  - `close()` 拆除 MCP clients 与 SessionStore。
46
46
 
47
- Runtime 主体就在本 app 的 `src/core/`:OmaSession(model/tool loop、retry、compaction、插件、todo、tool-result pruning)与 in-memory SessionStore(`core/store/`)。seed 时把 **full Product history + meta + input** 原子写入,Run 结束即销毁。
47
+ Runtime 主体就在本 app 的 `src/core/`:OmaSession(model/tool loop、retry、compaction、插件、todo、tool-result pruning)与 in-memory SessionStore(`core/store/`)。in-memory store Run 销毁,但子进程会把本轮写进自己的 session 文件(`core/session/` JSONL),并通过 outcome 回传 `cliSessionRef`;下一个 Run 用它 resume 那个文件,扁平的历史桥只在没有引用时才用。
48
48
 
49
49
  ## 运行
50
50
 
@@ -53,7 +53,7 @@ bun run --cwd apps/oh-my-agent dev -- -p "hello" # source CLI (dev)
53
53
  bun apps/oh-my-agent/src/cli.ts -p "hello" # source CLI, direct
54
54
 
55
55
  bun run --cwd apps/oh-my-agent build # → dist/cli.js (executable)
56
- apps/oh-my-agent/dist/cli.js -p "hello" # built binary
56
+ ./dist/cli.js -p "hello" # built binary (inside apps/oh-my-agent)
57
57
 
58
58
  cd apps/oh-my-agent && bun link # optional local install
59
59
  oma -p "hello" # then run from anywhere
@@ -69,9 +69,14 @@ oma # standalone interactive TUI
69
69
  src/
70
70
  cli.ts 可执行入口(shebang + runCli())
71
71
  main.ts main()/runCli():参数解析、模式分发、退出码(无 process.exit)
72
- cli/ print/json 模式、初始输入构建、CLI 测试
72
+ cli/ 参数解析、初始输入构建、gateway 子命令
73
73
  modes/ tui / print / json / rpc 模式
74
- core/ create-runtime.ts(per-Run Runtime 装配)、project-settings.ts(.oma/settings.json)、fake-provider(测试)
74
+ core/
75
+ runtime/ create-runtime.ts(per-Run Runtime 装配)
76
+ session/ session 文件(JSONL):/resume、--continue 与跨 Run resume 的持久侧
77
+ settings/ project-settings.ts(.oma/settings.json)
78
+ loops/ goals/ plans/ 三种持续模式的状态机与工具面
79
+ gateway/ `oma gateway` 的 daemon、supervisor、doctor、artifact
75
80
  ```
76
81
 
77
82
  ## 相关文档
@@ -1,6 +1,6 @@
1
1
  import { type GatewayCommand } from "./gateway-commands.js";
2
2
  export type CliMode = "print" | "json" | "rpc" | "tui";
3
- export type PermissionFlag = "ask" | "auto" | "deny" | "off";
3
+ export type PermissionFlag = "ask" | "auto" | "deny" | "off" | "yolo";
4
4
  export interface CliArgs {
5
5
  mode: CliMode;
6
6
  /** True when -p/--mode was given explicitly; a bare positional prompt
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAoB,MAAM,uBAAuB,CAAC;AAE7F,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,OAAO,CAAC;IACd;yEACqE;IACrE,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;mCAG+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAkCxC;6DAC6D;AAC7D,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAuG1D"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAoB,MAAM,uBAAuB,CAAC;AAE7F,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEtE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,OAAO,CAAC;IACd;yEACqE;IACrE,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;mCAG+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAkCxC;6DAC6D;AAC7D,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CA6G1D"}
package/dist/cli/args.js CHANGED
@@ -19,7 +19,7 @@ Usage:
19
19
  oma --continue resume the most recent session
20
20
  oma --session <id> -p "..." one-shot follow-up on a session
21
21
  oma --permission ask -p "..." gate bash/write/mcp behind approval cards
22
- oma --read-only -p "..." research-only run (no mutating tools)
22
+ oma --yolo -p "..." ungated run (OS sandbox forced when present)
23
23
  oma --model <provider/model> -p "<prompt>"
24
24
  pick a model by canonical id
25
25
  (default: first available model)
@@ -30,7 +30,7 @@ Piped stdin (print/json modes):
30
30
  cat error.log | oma -p (stdin only)
31
31
  `;
32
32
  const MODES = ["print", "json", "rpc", "tui"];
33
- const PERMISSIONS = ["ask", "auto", "deny", "off"];
33
+ const PERMISSIONS = ["ask", "auto", "deny", "off", "yolo"];
34
34
  /** Parse argv SYNTAX only: whether a run actually has an input (prompt or
35
35
  * piped stdin) is decided in main() after stdin is read. */
36
36
  export function parseArgs(argv) {
@@ -111,6 +111,13 @@ export function parseArgs(argv) {
111
111
  else if (arg === "--read-only") {
112
112
  args.readOnly = true;
113
113
  }
114
+ else if (arg === "--yolo") {
115
+ // The industry's skip-permissions flag (crush --yolo / CC
116
+ // --dangerously-skip-permissions): ungated run. Boundaries that do
117
+ // not depend on judgment (workspace containment, protected files,
118
+ // secret stripping, egress rules, write freshness) all remain.
119
+ args.permission = "yolo";
120
+ }
114
121
  else if (arg === "--permission") {
115
122
  const value = argv[i + 1];
116
123
  if (!value || !PERMISSIONS.includes(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-commands.d.ts","sourceRoot":"","sources":["../../src/cli/gateway-commands.ts"],"names":[],"mappings":"AAwBA;iEACiE;AACjE,eAAO,MAAM,aAAa,gEAAiE,CAAC;AAC5F,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,aAAa,0pBAaF,CAAC;AAEzB,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAKvE;AAED;;;uDAGuD;AACvD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,OAAO,GACnB,MAAM,EAAE,CAMV;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAyBD;qEACqE;AACrE,wBAAsB,eAAe,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBvF;AAED;qEACqE;AACrE,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgExF;AAED;iFACiF;AACjF,wBAAsB,YAAY,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCpF;AAED;;;mBAGmB;AACnB,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BxF;AA2BD,mFAAmF;AACnF,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBxF;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAUtF;AA+DD,8EAA8E;AAC9E,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB"}
1
+ {"version":3,"file":"gateway-commands.d.ts","sourceRoot":"","sources":["../../src/cli/gateway-commands.ts"],"names":[],"mappings":"AAwBA;iEACiE;AACjE,eAAO,MAAM,aAAa,gEAAiE,CAAC;AAC5F,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,aAAa,0pBAaF,CAAC;AAEzB,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAKvE;AAED;;;uDAGuD;AACvD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,OAAO,GACnB,MAAM,EAAE,CAMV;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAyBD;qEACqE;AACrE,wBAAsB,eAAe,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBvF;AAED;qEACqE;AACrE,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgExF;AAED;iFACiF;AACjF,wBAAsB,YAAY,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCpF;AAED;;;mBAGmB;AACnB,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BxF;AAmDD,mFAAmF;AACnF,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBxF;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAUtF;AA+DD,8EAA8E;AAC9E,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -1,4 +1,4 @@
1
- import { existsSync } from "node:fs";
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
2
  import { writeFile } from "node:fs/promises";
3
3
  import { join, resolve } from "node:path";
4
4
  import { currentVersion, fetchGatewayArtifact, gatewayPaths, generatePassword, installedVersions, omaHome, omaVersion, readSecrets, } from "../core/gateway/artifact.js";
@@ -205,19 +205,49 @@ export async function runGatewayPasswd(opts = {}) {
205
205
  const secrets = { ...readSecrets(home), MOCK_PASSWORD: password };
206
206
  await writeFile(secretsPath, `${JSON.stringify(secrets, null, 2)}\n`, { mode: 0o600 });
207
207
  log(`login password replaced: user-001 / ${password}`);
208
- // A password set in the console is stored as a hash and wins over this file,
209
- // so push the new one there too when the gateway is up — otherwise rotating
210
- // here would silently not take effect.
208
+ // A password set in the console is stored as a hash in the stack's settings
209
+ // and wins over this file, so the new one has to land there too — otherwise
210
+ // rotating here would silently not take effect.
211
211
  const pushed = await pushPasswordToRunningGateway(secrets, password);
212
212
  if (pushed) {
213
213
  log("the running gateway took it too (console-set password updated)");
214
+ return 0;
215
+ }
216
+ // Gateway not reachable: leave a reset request instead, so the next start
217
+ // adopts the secret above. Without this, "rotate while down" is a no-op — the
218
+ // stored hash outlives the rotation and the new password is refused.
219
+ const marker = requestPasswordReset(home);
220
+ if (marker) {
221
+ log(`the stored password will be dropped on the next start (${marker})`);
214
222
  }
215
223
  else {
216
224
  log("restart to apply: oma gateway down && oma gateway up -d");
217
- log("note: a password set in the web console wins over this file — change it there if you used that");
218
225
  }
219
226
  return 0;
220
227
  }
228
+ /** Marker filename. Owned by the backend
229
+ * (`apps/backend/src/features/auth/password.ts` PASSWORD_RESET_MARKER); oma
230
+ * cannot import a backend module, so the literal is repeated here on purpose —
231
+ * change both together. */
232
+ const PASSWORD_RESET_MARKER = "password-reset";
233
+ /** Ask the backend to drop its stored password by leaving the reset marker in
234
+ * the gateway data dir; the backend consumes it on the next boot and the
235
+ * secret file becomes authoritative again.
236
+ *
237
+ * Deliberately NOT a database write: the backend owns backend.db (see
238
+ * apps/oh-my-agent/AGENTS.md — "backend is the source of truth for product
239
+ * state; the runtime is the runtime"). Writing another process's SQLite file
240
+ * from the CLI would also race a running gateway. Returns the path written, or
241
+ * null when there is no gateway data dir to write to yet. */
242
+ function requestPasswordReset(home) {
243
+ const dataDir = join(gatewayPaths(home).data, "backend");
244
+ if (!existsSync(join(gatewayPaths(home).data)))
245
+ return null;
246
+ mkdirSync(dataDir, { recursive: true });
247
+ const marker = join(dataDir, PASSWORD_RESET_MARKER);
248
+ writeFileSync(marker, `${new Date().toISOString()}\n`);
249
+ return marker;
250
+ }
221
251
  /** Update the console-set password (a hash in the backend's settings) when the
222
252
  * gateway is reachable. Returns false when it is not: the file value then
223
253
  * applies after the next start. */
@@ -28,8 +28,9 @@ export declare function buildCliRunInput(opts: {
28
28
  modelRuntime: ModelRuntime;
29
29
  /** Canonical `<provider>/<model>` id; undefined = first available. */
30
30
  modelId?: string;
31
- /** Standalone permission gate. undefined = ungated (legacy default). */
32
- permissionMode?: "ask" | "auto" | "deny";
31
+ /** Standalone permission gate. undefined = ungated (legacy default);
32
+ * "yolo" = ungated + OS bash sandbox forced when available. */
33
+ permissionMode?: "ask" | "auto" | "deny" | "yolo";
33
34
  /** --read-only: advertise no write/edit/bash/eval to the model. */
34
35
  readOnly?: boolean;
35
36
  /** Clipboard/pasted images riding this prompt (vision input). */
@@ -1 +1 @@
1
- {"version":3,"file":"initial-input.d.ts","sourceRoot":"","sources":["../../src/cli/initial-input.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUrD;;;;;wDAKwD;AACxD,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CA+C3E;AAMD;;yCAEyC;AACzC,wBAAsB,cAAc,CAClC,MAAM,GAAE,cAAc,CAAC,UAAU,CAAsB,GACtD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAED;;iDAEiD;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKpF;AA0BD;;;wBAGwB;AAExB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,MAAM,CAAC,EAAE,aAAa,CAAC;QACrB,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;QACnE,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAyClC"}
1
+ {"version":3,"file":"initial-input.d.ts","sourceRoot":"","sources":["../../src/cli/initial-input.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUrD;;;;;wDAKwD;AACxD,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CA+C3E;AAMD;;yCAEyC;AACzC,wBAAsB,cAAc,CAClC,MAAM,GAAE,cAAc,CAAC,UAAU,CAAsB,GACtD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAED;;iDAEiD;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKpF;AA0BD;;;wBAGwB;AAExB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;oEACgE;IAChE,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClD,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,MAAM,CAAC,EAAE,aAAa,CAAC;QACrB,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;QACnE,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAyClC"}
@@ -73,6 +73,17 @@ export interface CoordinationRegistry {
73
73
  isDeliveryAcknowledged(id: string): boolean;
74
74
  settleEntry(id: string, patch: Partial<RegistryEntry>): void;
75
75
  setCompletionListener(cb: ((entry: RegistryEntry) => void) | null): void;
76
+ /** Remove THIS callback only. A TUI session installs a listener and must
77
+ * remove it on close without clobbering whichever listener a NEWER
78
+ * session has since installed (single-slot setCompletionListener(null)
79
+ * would). */
80
+ removeCompletionListener(cb: (entry: RegistryEntry) => void): void;
81
+ /** Kill every RUNNING entry that owns a kill callback (bash/eval bg
82
+ * jobs). Run teardown: the table is about to be dropped, so the children
83
+ * must go with it — clearAll() alone frees the bookkeeping and orphans
84
+ * the processes. Subagents are excluded (the delegation executor owns
85
+ * those) and settled entries have nothing to kill. */
86
+ stopRunningEntries(scope?: string): number;
76
87
  notifyEntryCompletion(entry: RegistryEntry): void;
77
88
  /** Drop every entry (Run teardown). */
78
89
  clearAll(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/coordination/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/coordination/registry.ts"],"names":[],"mappings":"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"}
@@ -130,6 +130,27 @@ export function createCoordinationRegistry() {
130
130
  function setCompletionListener(cb) {
131
131
  completionListener = cb;
132
132
  }
133
+ function removeCompletionListener(cb) {
134
+ if (completionListener === cb)
135
+ completionListener = null;
136
+ }
137
+ function stopRunningEntries(scope) {
138
+ let stopped = 0;
139
+ for (const e of entries.values()) {
140
+ if (e.status !== "running" || e.kind === "subagent" || !e.kill)
141
+ continue;
142
+ if (scope !== undefined && e.scope !== scope)
143
+ continue;
144
+ try {
145
+ e.kill();
146
+ stopped++;
147
+ }
148
+ catch {
149
+ /* a broken kill never blocks the rest of teardown */
150
+ }
151
+ }
152
+ return stopped;
153
+ }
133
154
  function acknowledgeDeliveries(ids) {
134
155
  for (const id of ids)
135
156
  ackedDeliveries.add(id);
@@ -154,6 +175,8 @@ export function createCoordinationRegistry() {
154
175
  isDeliveryAcknowledged,
155
176
  settleEntry,
156
177
  setCompletionListener,
178
+ removeCompletionListener,
179
+ stopRunningEntries,
157
180
  notifyEntryCompletion,
158
181
  clearAll,
159
182
  };
@@ -1,7 +1,6 @@
1
1
  import { type GatewayManifest } from "./manifest.js";
2
2
  export declare class GatewayArtifactError extends Error {
3
3
  }
4
- export declare const DEFAULT_STACK_REPO = "Chengchcc/my-agent-team";
5
4
  export declare function omaHome(env?: NodeJS.ProcessEnv): string;
6
5
  /** The launcher's on-disk layout, in one place: code lives under
7
6
  * gateway/versions/<version>/, state under gateway-data/ so an upgrade that swaps
@@ -1 +1 @@
1
- {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../src/core/gateway/artifact.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,eAAe,CAAC;AAE1E,qBAAa,oBAAqB,SAAQ,KAAK;CAAG;AAElD,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAM5D,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEpE;AAED;;sDAEsD;AACtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAkB,GAAG,YAAY,CAUnE;AAED;qDACqD;AACrD,wBAAgB,UAAU,IAAI,MAAM,CAQnC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;oFACoF;AACpF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CAMjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9D;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMhE;AAiFD,wBAAgB,gBAAgB,IAAI,MAAM,CAYzC;AASD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBhE;AAED;kDACkD;AAClD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiBjC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;6EAC6E;AAC7E,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDxF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,EAAE,CAMpE;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,GAAG,SAAS,CAO3E"}
1
+ {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../src/core/gateway/artifact.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,eAAe,CAAC;AAE1E,qBAAa,oBAAqB,SAAQ,KAAK;CAAG;AAQlD,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEpE;AAED;;sDAEsD;AACtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAkB,GAAG,YAAY,CAUnE;AAED;qDACqD;AACrD,wBAAgB,UAAU,IAAI,MAAM,CAQnC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;oFACoF;AACpF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CAMjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9D;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMhE;AAiFD,wBAAgB,gBAAgB,IAAI,MAAM,CAYzC;AASD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBhE;AAED;kDACkD;AAClD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiBjC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;6EAC6E;AAC7E,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDxF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,EAAE,CAMpE;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,GAAG,SAAS,CAO3E"}
@@ -5,7 +5,7 @@ import { join, resolve } from "node:path";
5
5
  import { readGatewayManifest } from "./manifest.js";
6
6
  export class GatewayArtifactError extends Error {
7
7
  }
8
- export const DEFAULT_STACK_REPO = "Chengchcc/my-agent-team";
8
+ const DEFAULT_STACK_REPO = "Chengchcc/my-agent-team";
9
9
  /** Written last, after a version is fully unpacked: its presence is what makes
10
10
  * an install idempotent. */
11
11
  const INSTALL_MARKER = ".complete";
@@ -0,0 +1,8 @@
1
+ /** Goal mode (omp goals/ port): the session's persistent autonomous
2
+ * objective — state machine + prompts (state.ts), the runtime that owns
3
+ * accounting and loop decisions (runtime.ts), and the model-facing tool
4
+ * (tool.ts). */
5
+ export { type GoalLoopDecision, GoalRuntime, type GoalTurnUsage, type SettledTurn, } from "./runtime.js";
6
+ export { accountTurn, accrueUsage, budgetLimitedGoal, canCreateGoal, completeGoal, completionBudgetReport, createGoal, dropGoal, type Goal, type GoalModeState, type GoalPromptKind, type GoalStatus, goalTokenDelta, isAccountingStatus, pauseGoal, remainingTokens, renderGoalPrompt, renderInterviewPrompt, resumeGoal, validateTokenBudget, } from "./state.js";
7
+ export { createGoalPlugin, createGoalTool } from "./tool.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/goals/index.ts"],"names":[],"mappings":"AAAA;;;iBAGiB;AAEjB,OAAO,EACL,KAAK,gBAAgB,EACrB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Goal mode (omp goals/ port): the session's persistent autonomous
2
+ * objective — state machine + prompts (state.ts), the runtime that owns
3
+ * accounting and loop decisions (runtime.ts), and the model-facing tool
4
+ * (tool.ts). */
5
+ export { GoalRuntime, } from "./runtime.js";
6
+ export { accountTurn, accrueUsage, budgetLimitedGoal, canCreateGoal, completeGoal, completionBudgetReport, createGoal, dropGoal, goalTokenDelta, isAccountingStatus, pauseGoal, remainingTokens, renderGoalPrompt, renderInterviewPrompt, resumeGoal, validateTokenBudget, } from "./state.js";
7
+ export { createGoalPlugin, createGoalTool } from "./tool.js";
@@ -0,0 +1,112 @@
1
+ import type { TodoItem } from "../tools/todo-store.js";
2
+ import { type Goal, type GoalModeState } from "./state.js";
3
+ /** The session-level goal runtime (omp's GoalRuntime analogue): the SINGLE
4
+ * owner of goal state, token/time accounting, and loop decisions. The TUI
5
+ * is presentation only — it forwards settled turns here and renders the
6
+ * decision; the `goal` tool mutates through the same object.
7
+ *
8
+ * Why a class and not loose functions: accounting is stateful, and the loop
9
+ * needs one choke point to decide continue / wrap-up / pause.
10
+ *
11
+ * The final turn's usage is the interesting part. A completion can fire
12
+ * MID-run (the model calls the tool), before that turn's usage is known, so
13
+ * flushing at the transition would write a report missing its own last turn.
14
+ * The transition therefore defers the completion RECORD
15
+ * (`#pendingFinalFlush`), and settleTurn folds the settled turn in and writes
16
+ * it once — after the transition, not before it. */
17
+ export interface GoalTurnUsage {
18
+ inputTokens?: number;
19
+ outputTokens?: number;
20
+ cacheWriteTokens?: number;
21
+ }
22
+ export interface SettledTurn {
23
+ usage: GoalTurnUsage;
24
+ wallSeconds: number;
25
+ status: "completed" | "failed" | "aborted" | "timeout";
26
+ /** Whether the turn used any tool (stall backstop input). */
27
+ usedTools: boolean;
28
+ }
29
+ export type GoalLoopDecision = {
30
+ action: "continue";
31
+ prompt: string;
32
+ tokensUsed: number;
33
+ tokenBudget?: number;
34
+ } | {
35
+ action: "budget-wrapup";
36
+ prompt: string;
37
+ tokensUsed: number;
38
+ tokenBudget: number;
39
+ } | {
40
+ action: "paused";
41
+ reason: string;
42
+ } | {
43
+ action: "completed";
44
+ objective: string;
45
+ report: string | null;
46
+ } | {
47
+ action: "idle";
48
+ };
49
+ export declare class GoalRuntime {
50
+ #private;
51
+ /** Persist a transition (session event). Called on EVERY mutation so a
52
+ * quit right after /goal pause still survives resume. */
53
+ /** Persist a transition. `recordCompletion` is false for the transition
54
+ * that still owes a usage flush (see complete()). */
55
+ private readonly persist;
56
+ /** Surface a transition for the UI (status line). */
57
+ private readonly notify;
58
+ constructor(
59
+ /** Persist a transition (session event). Called on EVERY mutation so a
60
+ * quit right after /goal pause still survives resume. */
61
+ /** Persist a transition. `recordCompletion` is false for the transition
62
+ * that still owes a usage flush (see complete()). */
63
+ persist?: (state: GoalModeState | null, recordCompletion: boolean) => void,
64
+ /** Surface a transition for the UI (status line). */
65
+ notify?: (message: string) => void);
66
+ get state(): GoalModeState | null;
67
+ get goal(): Goal | null;
68
+ get interviewing(): boolean;
69
+ /** Whether the goal tool should be mounted for the next run. */
70
+ get toolWanted(): boolean;
71
+ beginInterview(): void;
72
+ /** Resume replay (session event): a live goal comes back PAUSED. */
73
+ restore(state: GoalModeState | null): void;
74
+ /** Start a goal, or REPLACE the current one (fresh counters and budget).
75
+ * A PAUSED goal cannot be silently overwritten: resume it and use set, or
76
+ * drop it first — otherwise parked work would vanish without a word. */
77
+ create(objective: string, tokenBudget?: number): GoalModeState;
78
+ pause(): void;
79
+ resume(): void;
80
+ drop(): Goal | null;
81
+ /** Set the TOTAL token budget (not an increment); accumulated usage is
82
+ * kept. Raising it past tokensUsed resumes a budget-limited goal; lowering
83
+ * it below re-limits. Returns a continuation prompt when the goal resumed,
84
+ * else null.
85
+ *
86
+ * A PAUSED goal must be resumed first: changing the budget of work that is
87
+ * not running silently rewrites the terms of a decision the user already
88
+ * parked. */
89
+ setBudget(budget: number | undefined): {
90
+ prompt: string;
91
+ } | null;
92
+ /** Flush the in-flight turn into the goal, then mark it complete. The
93
+ * turn's provider usage is only known when the run SETTLES, so the final
94
+ * flush is deferred there (#pendingFinalFlush) — the report the settle
95
+ * returns covers the final turn, exactly like omp's flush-inside-
96
+ * completeGoalFromTool. */
97
+ complete(): void;
98
+ /** The status-bar indicator: the state plus the usage the user supervises
99
+ * the goal with. The driver owns its wording. */
100
+ statusLabel(): string | undefined;
101
+ remainingTokens(): number | null;
102
+ /** The loop's post-turn decision. Fail-safe ordering: an interrupted or
103
+ * failed turn PAUSES and never queues work (omp onTaskAborted flushes
104
+ * with steering suppressed); a terminal transition reports; budget
105
+ * crossing wraps up once; otherwise continue (or pause on a stall). */
106
+ settleTurn(turn: SettledTurn): GoalLoopDecision;
107
+ /** omp goal-todo-context: a continuation has no visible user nudge, so the
108
+ * live todo state must ride along or stale items silently rot. Appended
109
+ * to continuation/budget prompts by the caller that owns the todo file. */
110
+ static renderTodoContext(items: readonly TodoItem[]): string;
111
+ }
112
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/goals/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAML,KAAK,IAAI,EACT,KAAK,aAAa,EAKnB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;qDAaqD;AAErD,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACvD,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvB,qBAAa,WAAW;;IASpB;8DAC0D;IAC1D;0DACsD;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAIxB,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM;;IATvB;8DAC0D;IAC1D;0DACsD;IACrC,OAAO,GAAE,CACxB,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,gBAAgB,EAAE,OAAO,KACtB,IAAe;IACpB,qDAAqD;IACpC,MAAM,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe;IAG/D,IAAI,KAAK,IAAI,aAAa,GAAG,IAAI,CAEhC;IAED,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,gEAAgE;IAChE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,cAAc,IAAI,IAAI;IAItB,oEAAoE;IACpE,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAS1C;;6EAEyE;IACzE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa;IAmB9D,KAAK,IAAI,IAAI;IAMb,MAAM,IAAI,IAAI;IAOd,IAAI,IAAI,IAAI,GAAG,IAAI;IASnB;;;;;;;kBAOc;IACd,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA2BhE;;;;gCAI4B;IAC5B,QAAQ,IAAI,IAAI;IAahB;sDACkD;IAClD,WAAW,IAAI,MAAM,GAAG,SAAS;IAQjC,eAAe,IAAI,MAAM,GAAG,IAAI;IAMhC;;;4EAGwE;IACxE,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB;IA8D/C;;gFAE4E;IAC5E,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM;CAiB7D"}