@chengchenccc/oh-my-agent 0.2.0-rc.2 → 0.2.0-rc.3
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.
- package/README.md +11 -6
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -2
- package/dist/cli/gateway-commands.d.ts.map +1 -1
- package/dist/cli/gateway-commands.js +35 -5
- package/dist/cli/initial-input.d.ts +3 -2
- package/dist/cli/initial-input.d.ts.map +1 -1
- package/dist/core/coordination/registry.d.ts +11 -0
- package/dist/core/coordination/registry.d.ts.map +1 -1
- package/dist/core/coordination/registry.js +23 -0
- package/dist/core/gateway/artifact.d.ts +0 -1
- package/dist/core/gateway/artifact.d.ts.map +1 -1
- package/dist/core/gateway/artifact.js +1 -1
- package/dist/core/goals/index.d.ts +8 -0
- package/dist/core/goals/index.d.ts.map +1 -0
- package/dist/core/goals/index.js +7 -0
- package/dist/core/goals/runtime.d.ts +112 -0
- package/dist/core/goals/runtime.d.ts.map +1 -0
- package/dist/core/goals/runtime.js +241 -0
- package/dist/core/goals/state.d.ts +82 -0
- package/dist/core/goals/state.d.ts.map +1 -0
- package/dist/core/goals/state.js +225 -0
- package/dist/core/goals/tool.d.ts +10 -0
- package/dist/core/goals/tool.d.ts.map +1 -0
- package/dist/core/goals/tool.js +87 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -3
- package/dist/core/loops/condition.d.ts +57 -0
- package/dist/core/loops/condition.d.ts.map +1 -0
- package/dist/core/loops/condition.js +153 -0
- package/dist/core/loops/index.d.ts +9 -0
- package/dist/core/loops/index.d.ts.map +1 -0
- package/dist/core/loops/index.js +8 -0
- package/dist/core/loops/limits.d.ts +43 -0
- package/dist/core/loops/limits.d.ts.map +1 -0
- package/dist/core/loops/limits.js +219 -0
- package/dist/core/loops/ralph.d.ts +37 -0
- package/dist/core/loops/ralph.d.ts.map +1 -0
- package/dist/core/loops/ralph.js +72 -0
- package/dist/core/loops/runtime.d.ts +95 -0
- package/dist/core/loops/runtime.d.ts.map +1 -0
- package/dist/core/loops/runtime.js +222 -0
- package/dist/core/memory/managed-skills.d.ts +0 -11
- package/dist/core/memory/managed-skills.d.ts.map +1 -1
- package/dist/core/memory/managed-skills.js +2 -2
- package/dist/core/memory/vector-store.d.ts +0 -1
- package/dist/core/memory/vector-store.d.ts.map +1 -1
- package/dist/core/memory/vector-store.js +0 -3
- package/dist/core/plans/index.d.ts +7 -0
- package/dist/core/plans/index.d.ts.map +1 -0
- package/dist/core/plans/index.js +6 -0
- package/dist/core/plans/prompts.d.ts +20 -0
- package/dist/core/plans/prompts.d.ts.map +1 -0
- package/dist/core/plans/prompts.js +72 -0
- package/dist/core/plans/runtime.d.ts +89 -0
- package/dist/core/plans/runtime.d.ts.map +1 -0
- package/dist/core/plans/runtime.js +170 -0
- package/dist/core/plans/state.d.ts +55 -0
- package/dist/core/plans/state.d.ts.map +1 -0
- package/dist/core/plans/state.js +88 -0
- package/dist/core/runtime/agent-loop-messages.d.ts +6 -0
- package/dist/core/runtime/agent-loop-messages.d.ts.map +1 -1
- package/dist/core/runtime/agent-loop-messages.js +40 -15
- package/dist/core/runtime/agent-loop-run.d.ts.map +1 -1
- package/dist/core/runtime/agent-loop-run.js +18 -27
- package/dist/core/runtime/agent-loop-runner.d.ts +1 -23
- package/dist/core/runtime/agent-loop-runner.d.ts.map +1 -1
- package/dist/core/runtime/agent-loop-runner.js +84 -30
- package/dist/core/runtime/agent-loop-types.d.ts +4 -0
- package/dist/core/runtime/agent-loop-types.d.ts.map +1 -1
- package/dist/core/runtime/compaction.d.ts +9 -0
- package/dist/core/runtime/compaction.d.ts.map +1 -1
- package/dist/core/runtime/compaction.js +28 -0
- package/dist/core/runtime/context-estimate.d.ts +37 -4
- package/dist/core/runtime/context-estimate.d.ts.map +1 -1
- package/dist/core/runtime/context-estimate.js +70 -0
- package/dist/core/runtime/create-runtime.d.ts +27 -5
- package/dist/core/runtime/create-runtime.d.ts.map +1 -1
- package/dist/core/runtime/create-runtime.js +22 -2
- package/dist/core/runtime/permission-classifier.d.ts.map +1 -1
- package/dist/core/runtime/permission-classifier.js +83 -12
- package/dist/core/runtime/plugin.d.ts +7 -0
- package/dist/core/runtime/plugin.d.ts.map +1 -1
- package/dist/core/runtime/plugin.js +13 -0
- package/dist/core/runtime/process-tree.d.ts +0 -9
- package/dist/core/runtime/process-tree.d.ts.map +1 -1
- package/dist/core/runtime/process-tree.js +1 -1
- package/dist/core/runtime/run-runtime.d.ts.map +1 -1
- package/dist/core/runtime/run-runtime.js +88 -49
- package/dist/core/runtime/runtime-catalog.d.ts +0 -4
- package/dist/core/runtime/runtime-catalog.d.ts.map +1 -1
- package/dist/core/runtime/runtime-catalog.js +1 -1
- package/dist/core/runtime/stream-rules.d.ts +9 -2
- package/dist/core/runtime/stream-rules.d.ts.map +1 -1
- package/dist/core/runtime/stream-rules.js +19 -5
- package/dist/core/runtime/title.d.ts +13 -1
- package/dist/core/runtime/title.d.ts.map +1 -1
- package/dist/core/runtime/title.js +51 -17
- package/dist/core/runtime/tool-pruning.d.ts.map +1 -1
- package/dist/core/runtime/tool-pruning.js +8 -16
- package/dist/core/session/session-file.d.ts +91 -5
- package/dist/core/session/session-file.d.ts.map +1 -1
- package/dist/core/session/session-file.js +206 -24
- package/dist/core/session/session-loop.d.ts +3 -1
- package/dist/core/session/session-loop.d.ts.map +1 -1
- package/dist/core/session/session-loop.js +8 -4
- package/dist/core/settings/project-settings.d.ts +63 -9
- package/dist/core/settings/project-settings.d.ts.map +1 -1
- package/dist/core/settings/project-settings.js +43 -2
- package/dist/core/settings/workspace-context.js +4 -4
- package/dist/core/store/in-memory-session-store.d.ts.map +1 -1
- package/dist/core/store/in-memory-session-store.js +3 -2
- package/dist/core/store/session-store.contract.test-helper.d.ts +7 -5
- package/dist/core/store/session-store.contract.test-helper.d.ts.map +1 -1
- package/dist/core/store/session-store.contract.test-helper.js +7 -5
- package/dist/core/store/session-store.d.ts +4 -2
- package/dist/core/store/session-store.d.ts.map +1 -1
- package/dist/core/store/session-store.js +4 -2
- package/dist/core/tools/ask-question.d.ts.map +1 -1
- package/dist/core/tools/ask-question.js +51 -5
- package/dist/core/tools/bash-pty.d.ts +13 -4
- package/dist/core/tools/bash-pty.d.ts.map +1 -1
- package/dist/core/tools/bash-pty.js +15 -8
- package/dist/core/tools/bash-sandbox.d.ts +1 -1
- package/dist/core/tools/bash.d.ts +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +18 -8
- package/dist/core/tools/browser.d.ts +54 -0
- package/dist/core/tools/browser.d.ts.map +1 -1
- package/dist/core/tools/browser.js +138 -1
- package/dist/core/tools/file-fingerprint.d.ts +24 -0
- package/dist/core/tools/file-fingerprint.d.ts.map +1 -0
- package/dist/core/tools/file-fingerprint.js +61 -0
- package/dist/core/tools/file-tools.d.ts +26 -0
- package/dist/core/tools/file-tools.d.ts.map +1 -1
- package/dist/core/tools/file-tools.js +113 -17
- package/dist/core/tools/index.d.ts +2 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/mcp-mount.d.ts +1 -1
- package/dist/core/tools/mcp-mount.d.ts.map +1 -1
- package/dist/core/tools/mcp-mount.js +72 -26
- package/dist/core/tools/url-guard.d.ts +15 -0
- package/dist/core/tools/url-guard.d.ts.map +1 -1
- package/dist/core/tools/url-guard.js +54 -14
- package/dist/core/tools/web-ports-std.d.ts.map +1 -1
- package/dist/core/tools/web-ports-std.js +5 -2
- package/dist/modes/print-mode.d.ts +3 -2
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -2
- package/dist/modes/shared.d.ts +12 -0
- package/dist/modes/shared.d.ts.map +1 -1
- package/dist/modes/shared.js +23 -6
- package/dist/modes/tui/agent-status.d.ts +20 -0
- package/dist/modes/tui/agent-status.d.ts.map +1 -0
- package/dist/modes/tui/agent-status.js +35 -0
- package/dist/modes/tui/ask-panel.d.ts +166 -0
- package/dist/modes/tui/ask-panel.d.ts.map +1 -0
- package/dist/modes/tui/ask-panel.js +888 -0
- package/dist/modes/tui/pty-console.d.ts +3 -0
- package/dist/modes/tui/pty-console.d.ts.map +1 -1
- package/dist/modes/tui/pty-console.js +19 -0
- package/dist/modes/tui/settings-overlay.d.ts +19 -0
- package/dist/modes/tui/settings-overlay.d.ts.map +1 -1
- package/dist/modes/tui/settings-overlay.js +46 -10
- package/dist/modes/tui/tui-commands-session.d.ts.map +1 -1
- package/dist/modes/tui/tui-commands-session.js +20 -6
- package/dist/modes/tui/tui-commands.d.ts +44 -3
- package/dist/modes/tui/tui-commands.d.ts.map +1 -1
- package/dist/modes/tui/tui-commands.js +380 -6
- package/dist/modes/tui/tui-components.d.ts +10 -0
- package/dist/modes/tui/tui-components.d.ts.map +1 -1
- package/dist/modes/tui/tui-components.js +26 -0
- package/dist/modes/tui/tui-format.d.ts +53 -4
- package/dist/modes/tui/tui-format.d.ts.map +1 -1
- package/dist/modes/tui/tui-format.js +137 -42
- package/dist/modes/tui/tui-frame-provider.d.ts +11 -3
- package/dist/modes/tui/tui-frame-provider.d.ts.map +1 -1
- package/dist/modes/tui/tui-frame-provider.js +14 -5
- package/dist/modes/tui/tui-interactive.d.ts.map +1 -1
- package/dist/modes/tui/tui-interactive.js +14 -0
- package/dist/modes/tui/tui-io.d.ts.map +1 -1
- package/dist/modes/tui/tui-io.js +150 -55
- package/dist/modes/tui/tui-mode.d.ts.map +1 -1
- package/dist/modes/tui/tui-mode.js +428 -23
- package/dist/modes/tui/tui-overlays.d.ts +6 -10
- package/dist/modes/tui/tui-overlays.d.ts.map +1 -1
- package/dist/modes/tui/tui-overlays.js +0 -43
- package/dist/modes/tui/tui-render.d.ts +10 -0
- package/dist/modes/tui/tui-render.d.ts.map +1 -1
- package/dist/modes/tui/tui-render.js +73 -38
- package/dist/modes/tui/tui-seam.d.ts +28 -6
- package/dist/modes/tui/tui-seam.d.ts.map +1 -1
- package/dist/modes/tui/tui-slash.d.ts.map +1 -1
- package/dist/modes/tui/tui-slash.js +3 -1
- package/dist/modes/tui/tui-tool-render.d.ts +14 -1
- package/dist/modes/tui/tui-tool-render.d.ts.map +1 -1
- package/dist/modes/tui/tui-tool-render.js +158 -50
- package/dist/modes/tui/tui-transcript-reconciler.d.ts +4 -0
- package/dist/modes/tui/tui-transcript-reconciler.d.ts.map +1 -1
- package/dist/modes/tui/tui-transcript-reconciler.js +12 -2
- package/dist/modes/tui/view-state.d.ts.map +1 -1
- package/dist/modes/tui/view-state.js +4 -1
- package/dist/protocol/transport.d.ts +10 -0
- package/dist/protocol/transport.d.ts.map +1 -1
- package/dist/protocol/transport.js +1 -0
- 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
|
|
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/`)。
|
|
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
|
-
|
|
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/
|
|
72
|
+
cli/ 参数解析、初始输入构建、gateway 子命令
|
|
73
73
|
modes/ tui / print / json / rpc 模式
|
|
74
|
-
core/
|
|
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
|
## 相关文档
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -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
|
package/dist/cli/args.d.ts.map
CHANGED
|
@@ -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;
|
|
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 --
|
|
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,
|
|
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
|
|
209
|
-
// so
|
|
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
|
-
|
|
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
|
|
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;
|
|
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
|
-
|
|
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"}
|