open-multi-agent-kit 0.98.4 → 0.98.5
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/CHANGELOG.md +12 -0
- package/README.md +3 -2
- package/dist/commands/run-command.d.ts +2 -1
- package/dist/commands/run-command.d.ts.map +1 -1
- package/dist/commands/run-command.js +9 -1
- package/dist/commands/run-command.js.map +1 -1
- package/dist/commands/verified-run-cli.d.ts +6 -0
- package/dist/commands/verified-run-cli.d.ts.map +1 -0
- package/dist/commands/verified-run-cli.js +190 -0
- package/dist/commands/verified-run-cli.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +8 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +41 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +7 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +61 -41
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/prompt-settlement.d.ts +4 -3
- package/dist/core/prompt-settlement.d.ts.map +1 -1
- package/dist/core/prompt-settlement.js.map +1 -1
- package/dist/core/run-budget-policy.d.ts +18 -0
- package/dist/core/run-budget-policy.d.ts.map +1 -0
- package/dist/core/run-budget-policy.js +52 -0
- package/dist/core/run-budget-policy.js.map +1 -0
- package/dist/core/run-budget.d.ts +33 -0
- package/dist/core/run-budget.d.ts.map +1 -0
- package/dist/core/run-budget.js +89 -0
- package/dist/core/run-budget.js.map +1 -0
- package/dist/core/run-execution-api.d.ts +15 -0
- package/dist/core/run-execution-api.d.ts.map +1 -0
- package/dist/core/run-execution-api.js +7 -0
- package/dist/core/run-execution-api.js.map +1 -0
- package/dist/core/run-journal.d.ts.map +1 -1
- package/dist/core/run-journal.js +30 -208
- package/dist/core/run-journal.js.map +1 -1
- package/dist/core/session-bash-service.d.ts +2 -2
- package/dist/core/session-bash-service.d.ts.map +1 -1
- package/dist/core/session-bash-service.js +21 -9
- package/dist/core/session-bash-service.js.map +1 -1
- package/dist/core/session-failure-cause.d.ts.map +1 -1
- package/dist/core/session-failure-cause.js +5 -0
- package/dist/core/session-failure-cause.js.map +1 -1
- package/dist/core/session-prompt-lifecycle.d.ts +25 -0
- package/dist/core/session-prompt-lifecycle.d.ts.map +1 -0
- package/dist/core/session-prompt-lifecycle.js +87 -0
- package/dist/core/session-prompt-lifecycle.js.map +1 -0
- package/dist/core/session-run-budget.d.ts +28 -0
- package/dist/core/session-run-budget.d.ts.map +1 -0
- package/dist/core/session-run-budget.js +127 -0
- package/dist/core/session-run-budget.js.map +1 -0
- package/dist/core/session-run-termination.d.ts.map +1 -1
- package/dist/core/session-run-termination.js +14 -3
- package/dist/core/session-run-termination.js.map +1 -1
- package/dist/core/session-termination-types.d.ts +97 -0
- package/dist/core/session-termination-types.d.ts.map +1 -0
- package/dist/core/session-termination-types.js +26 -0
- package/dist/core/session-termination-types.js.map +1 -0
- package/dist/core/session-termination.d.ts +3 -97
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +24 -28
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-lane-launcher.d.ts +3 -2
- package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
- package/dist/core/subagent-lane-launcher.js +24 -13
- package/dist/core/subagent-lane-launcher.js.map +1 -1
- package/dist/core/verified-run/broker.d.ts +26 -0
- package/dist/core/verified-run/broker.d.ts.map +1 -0
- package/dist/core/verified-run/broker.js +210 -0
- package/dist/core/verified-run/broker.js.map +1 -0
- package/dist/core/verified-run/candidate.d.ts +24 -0
- package/dist/core/verified-run/candidate.d.ts.map +1 -0
- package/dist/core/verified-run/candidate.js +167 -0
- package/dist/core/verified-run/candidate.js.map +1 -0
- package/dist/core/verified-run/check-receipt.d.ts +18 -0
- package/dist/core/verified-run/check-receipt.d.ts.map +1 -0
- package/dist/core/verified-run/check-receipt.js +92 -0
- package/dist/core/verified-run/check-receipt.js.map +1 -0
- package/dist/core/verified-run/coordinator.d.ts +39 -0
- package/dist/core/verified-run/coordinator.d.ts.map +1 -0
- package/dist/core/verified-run/coordinator.js +190 -0
- package/dist/core/verified-run/coordinator.js.map +1 -0
- package/dist/core/verified-run/dag-candidates.d.ts +8 -0
- package/dist/core/verified-run/dag-candidates.d.ts.map +1 -0
- package/dist/core/verified-run/dag-candidates.js +65 -0
- package/dist/core/verified-run/dag-candidates.js.map +1 -0
- package/dist/core/verified-run/dag-phase.d.ts +7 -0
- package/dist/core/verified-run/dag-phase.d.ts.map +1 -0
- package/dist/core/verified-run/dag-phase.js +92 -0
- package/dist/core/verified-run/dag-phase.js.map +1 -0
- package/dist/core/verified-run/dag-projection.d.ts +7 -0
- package/dist/core/verified-run/dag-projection.d.ts.map +1 -0
- package/dist/core/verified-run/dag-projection.js +90 -0
- package/dist/core/verified-run/dag-projection.js.map +1 -0
- package/dist/core/verified-run/dag-recovery.d.ts +13 -0
- package/dist/core/verified-run/dag-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/dag-recovery.js +98 -0
- package/dist/core/verified-run/dag-recovery.js.map +1 -0
- package/dist/core/verified-run/dag-retry-projection.d.ts +9 -0
- package/dist/core/verified-run/dag-retry-projection.d.ts.map +1 -0
- package/dist/core/verified-run/dag-retry-projection.js +43 -0
- package/dist/core/verified-run/dag-retry-projection.js.map +1 -0
- package/dist/core/verified-run/dag-types.d.ts +47 -0
- package/dist/core/verified-run/dag-types.d.ts.map +1 -0
- package/dist/core/verified-run/dag-types.js +2 -0
- package/dist/core/verified-run/dag-types.js.map +1 -0
- package/dist/core/verified-run/event-parser.d.ts +3 -0
- package/dist/core/verified-run/event-parser.d.ts.map +1 -0
- package/dist/core/verified-run/event-parser.js +153 -0
- package/dist/core/verified-run/event-parser.js.map +1 -0
- package/dist/core/verified-run/events.d.ts +4 -0
- package/dist/core/verified-run/events.d.ts.map +1 -0
- package/dist/core/verified-run/events.js +3 -0
- package/dist/core/verified-run/events.js.map +1 -0
- package/dist/core/verified-run/evidence-binding.d.ts +18 -0
- package/dist/core/verified-run/evidence-binding.d.ts.map +1 -0
- package/dist/core/verified-run/evidence-binding.js +81 -0
- package/dist/core/verified-run/evidence-binding.js.map +1 -0
- package/dist/core/verified-run/evidence.d.ts +27 -0
- package/dist/core/verified-run/evidence.d.ts.map +1 -0
- package/dist/core/verified-run/evidence.js +100 -0
- package/dist/core/verified-run/evidence.js.map +1 -0
- package/dist/core/verified-run/journal.d.ts +32 -0
- package/dist/core/verified-run/journal.d.ts.map +1 -0
- package/dist/core/verified-run/journal.js +103 -0
- package/dist/core/verified-run/journal.js.map +1 -0
- package/dist/core/verified-run/namespace-identity.d.ts +11 -0
- package/dist/core/verified-run/namespace-identity.d.ts.map +1 -0
- package/dist/core/verified-run/namespace-identity.js +77 -0
- package/dist/core/verified-run/namespace-identity.js.map +1 -0
- package/dist/core/verified-run/owned-execution.d.ts +21 -0
- package/dist/core/verified-run/owned-execution.d.ts.map +1 -0
- package/dist/core/verified-run/owned-execution.js +43 -0
- package/dist/core/verified-run/owned-execution.js.map +1 -0
- package/dist/core/verified-run/phase-context.d.ts +9 -0
- package/dist/core/verified-run/phase-context.d.ts.map +1 -0
- package/dist/core/verified-run/phase-context.js +2 -0
- package/dist/core/verified-run/phase-context.js.map +1 -0
- package/dist/core/verified-run/process-gate.d.ts +5 -0
- package/dist/core/verified-run/process-gate.d.ts.map +1 -0
- package/dist/core/verified-run/process-gate.js +31 -0
- package/dist/core/verified-run/process-gate.js.map +1 -0
- package/dist/core/verified-run/projection.d.ts +4 -0
- package/dist/core/verified-run/projection.d.ts.map +1 -0
- package/dist/core/verified-run/projection.js +219 -0
- package/dist/core/verified-run/projection.js.map +1 -0
- package/dist/core/verified-run/recovery-clock.d.ts +19 -0
- package/dist/core/verified-run/recovery-clock.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-clock.js +69 -0
- package/dist/core/verified-run/recovery-clock.js.map +1 -0
- package/dist/core/verified-run/recovery-command.d.ts +11 -0
- package/dist/core/verified-run/recovery-command.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-command.js +73 -0
- package/dist/core/verified-run/recovery-command.js.map +1 -0
- package/dist/core/verified-run/recovery-projection.d.ts +12 -0
- package/dist/core/verified-run/recovery-projection.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-projection.js +88 -0
- package/dist/core/verified-run/recovery-projection.js.map +1 -0
- package/dist/core/verified-run/recovery.d.ts +12 -0
- package/dist/core/verified-run/recovery.d.ts.map +1 -0
- package/dist/core/verified-run/recovery.js +115 -0
- package/dist/core/verified-run/recovery.js.map +1 -0
- package/dist/core/verified-run/run-types.d.ts +103 -0
- package/dist/core/verified-run/run-types.d.ts.map +1 -0
- package/dist/core/verified-run/run-types.js +2 -0
- package/dist/core/verified-run/run-types.js.map +1 -0
- package/dist/core/verified-run/scripted-writer.d.ts +15 -0
- package/dist/core/verified-run/scripted-writer.d.ts.map +1 -0
- package/dist/core/verified-run/scripted-writer.js +94 -0
- package/dist/core/verified-run/scripted-writer.js.map +1 -0
- package/dist/core/verified-run/session-port.d.ts +27 -0
- package/dist/core/verified-run/session-port.d.ts.map +1 -0
- package/dist/core/verified-run/session-port.js +2 -0
- package/dist/core/verified-run/session-port.js.map +1 -0
- package/dist/core/verified-run/storage.d.ts +15 -0
- package/dist/core/verified-run/storage.d.ts.map +1 -0
- package/dist/core/verified-run/storage.js +96 -0
- package/dist/core/verified-run/storage.js.map +1 -0
- package/dist/core/verified-run/verification-phase.d.ts +5 -0
- package/dist/core/verified-run/verification-phase.d.ts.map +1 -0
- package/dist/core/verified-run/verification-phase.js +56 -0
- package/dist/core/verified-run/verification-phase.js.map +1 -0
- package/dist/core/verified-run/work-recovery.d.ts +8 -0
- package/dist/core/verified-run/work-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/work-recovery.js +44 -0
- package/dist/core/verified-run/work-recovery.js.map +1 -0
- package/dist/core/verified-run/writer-completion.d.ts +4 -0
- package/dist/core/verified-run/writer-completion.d.ts.map +1 -0
- package/dist/core/verified-run/writer-completion.js +27 -0
- package/dist/core/verified-run/writer-completion.js.map +1 -0
- package/dist/core/verified-run/writer-phase.d.ts +8 -0
- package/dist/core/verified-run/writer-phase.d.ts.map +1 -0
- package/dist/core/verified-run/writer-phase.js +76 -0
- package/dist/core/verified-run/writer-phase.js.map +1 -0
- package/dist/core/verified-run/writer-projection.d.ts +11 -0
- package/dist/core/verified-run/writer-projection.d.ts.map +1 -0
- package/dist/core/verified-run/writer-projection.js +70 -0
- package/dist/core/verified-run/writer-projection.js.map +1 -0
- package/dist/core/verified-run/writer-recovery.d.ts +16 -0
- package/dist/core/verified-run/writer-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/writer-recovery.js +107 -0
- package/dist/core/verified-run/writer-recovery.js.map +1 -0
- package/dist/core/workload-permit-pool.d.ts +1 -3
- package/dist/core/workload-permit-pool.d.ts.map +1 -1
- package/dist/core/workload-permit-pool.js +11 -11
- package/dist/core/workload-permit-pool.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -8
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/session-failure.d.ts +13 -0
- package/dist/modes/interactive/components/session-failure.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-failure.js +81 -0
- package/dist/modes/interactive/components/session-failure.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +45 -31
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tui-diagnostics.d.ts +36 -0
- package/dist/modes/interactive/tui-diagnostics.d.ts.map +1 -0
- package/dist/modes/interactive/tui-diagnostics.js +105 -0
- package/dist/modes/interactive/tui-diagnostics.js.map +1 -0
- package/dist/modes/interactive/tui-runtime-info.d.ts +20 -0
- package/dist/modes/interactive/tui-runtime-info.d.ts.map +1 -0
- package/dist/modes/interactive/tui-runtime-info.js +76 -0
- package/dist/modes/interactive/tui-runtime-info.js.map +1 -0
- package/docs/development.md +10 -0
- package/docs/keybindings.md +1 -1
- package/docs/release-audit-0.98.5.md +84 -0
- package/docs/run-protocol.md +33 -1
- package/docs/runtime-algorithms.md +26 -0
- package/docs/sdk.md +193 -0
- package/docs/usage.md +54 -0
- package/docs/verified-run-testing.md +417 -0
- package/docs/verified-run.md +388 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +18 -18
- package/package.json +6 -6
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Component } from "omk-tui";
|
|
2
|
+
import type { SessionTermination } from "../../core/session-termination-types.ts";
|
|
3
|
+
import type { TuiRuntimeCapture, TuiRuntimeInfo } from "./tui-runtime-info.ts";
|
|
4
|
+
type DiagnosticTermination = Pick<SessionTermination, "kind" | "phase" | "causeCode" | "source" | "sideEffects" | "retryable" | "safeToAutoRetry">;
|
|
5
|
+
export interface TuiDiagnostics {
|
|
6
|
+
readonly schemaVersion: 1;
|
|
7
|
+
readonly privacy: "metadata-only";
|
|
8
|
+
readonly generatedAt: string;
|
|
9
|
+
readonly runtime: Omit<TuiRuntimeInfo, "entryPath" | "modulePath">;
|
|
10
|
+
readonly terminal: {
|
|
11
|
+
readonly columns: number;
|
|
12
|
+
readonly rows: number;
|
|
13
|
+
};
|
|
14
|
+
readonly session: {
|
|
15
|
+
readonly streaming: boolean;
|
|
16
|
+
readonly compacting: boolean;
|
|
17
|
+
readonly messageCount: number;
|
|
18
|
+
readonly lastResourceReloadAt: string | null;
|
|
19
|
+
};
|
|
20
|
+
readonly termination: DiagnosticTermination | null;
|
|
21
|
+
}
|
|
22
|
+
/** Project each approved field; never serialize a session, message, model, config or arbitrary error. */
|
|
23
|
+
export declare function createTuiDiagnostics(input: {
|
|
24
|
+
readonly runtime: TuiRuntimeInfo;
|
|
25
|
+
readonly columns: number;
|
|
26
|
+
readonly rows: number;
|
|
27
|
+
readonly isStreaming: boolean;
|
|
28
|
+
readonly isCompacting: boolean;
|
|
29
|
+
readonly messageCount: number;
|
|
30
|
+
readonly lastResourceReloadAt: string | undefined;
|
|
31
|
+
readonly termination: SessionTermination | undefined;
|
|
32
|
+
}): TuiDiagnostics;
|
|
33
|
+
export declare function saveTuiDiagnostics(report: TuiDiagnostics, directory?: string): string;
|
|
34
|
+
export declare function createTuiDiagnosticsView(report: TuiDiagnostics, locations: TuiRuntimeCapture): Component;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=tui-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/tui-diagnostics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAIlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE/E,KAAK,qBAAqB,GAAG,IAAI,CAChC,kBAAkB,EAClB,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,iBAAiB,CAC3F,CAAC;AACF,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACnD;AAED,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAC;CACrD,GAAG,cAAc,CAsCjB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,SAAW,GAAG,MAAM,CAcvF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,GAAG,SAAS,CAiDxG","sourcesContent":["import { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { type Component, Container, Text } from \"omk-tui\";\nimport type { SessionTermination } from \"../../core/session-termination-types.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport { diagnosticDisplayText } from \"./components/session-failure.ts\";\nimport { theme } from \"./theme/theme.ts\";\nimport type { TuiRuntimeCapture, TuiRuntimeInfo } from \"./tui-runtime-info.ts\";\n\ntype DiagnosticTermination = Pick<\n\tSessionTermination,\n\t\"kind\" | \"phase\" | \"causeCode\" | \"source\" | \"sideEffects\" | \"retryable\" | \"safeToAutoRetry\"\n>;\nexport interface TuiDiagnostics {\n\treadonly schemaVersion: 1;\n\treadonly privacy: \"metadata-only\";\n\treadonly generatedAt: string;\n\treadonly runtime: Omit<TuiRuntimeInfo, \"entryPath\" | \"modulePath\">;\n\treadonly terminal: { readonly columns: number; readonly rows: number };\n\treadonly session: {\n\t\treadonly streaming: boolean;\n\t\treadonly compacting: boolean;\n\t\treadonly messageCount: number;\n\t\treadonly lastResourceReloadAt: string | null;\n\t};\n\treadonly termination: DiagnosticTermination | null;\n}\n\n/** Project each approved field; never serialize a session, message, model, config or arbitrary error. */\nexport function createTuiDiagnostics(input: {\n\treadonly runtime: TuiRuntimeInfo;\n\treadonly columns: number;\n\treadonly rows: number;\n\treadonly isStreaming: boolean;\n\treadonly isCompacting: boolean;\n\treadonly messageCount: number;\n\treadonly lastResourceReloadAt: string | undefined;\n\treadonly termination: SessionTermination | undefined;\n}): TuiDiagnostics {\n\tconst r = input.runtime;\n\tconst t = input.termination;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tprivacy: \"metadata-only\",\n\t\tgeneratedAt: new Date().toISOString(),\n\t\truntime: {\n\t\t\tversion: r.version,\n\t\t\tnodeVersion: r.nodeVersion,\n\t\t\tplatform: r.platform,\n\t\t\tarch: r.arch,\n\t\t\tcapturedAt: r.capturedAt,\n\t\t\tmoduleKind: r.moduleKind,\n\t\t\tmoduleState: r.moduleState,\n\t\t\tinitialModuleSha256: r.initialModuleSha256,\n\t\t\tcurrentModuleSha256: r.currentModuleSha256,\n\t\t\tbuildRevision: r.buildRevision,\n\t\t},\n\t\tterminal: { columns: input.columns, rows: input.rows },\n\t\tsession: {\n\t\t\tstreaming: input.isStreaming,\n\t\t\tcompacting: input.isCompacting,\n\t\t\tmessageCount: input.messageCount,\n\t\t\tlastResourceReloadAt: input.lastResourceReloadAt ?? null,\n\t\t},\n\t\ttermination: t\n\t\t\t? {\n\t\t\t\t\tkind: t.kind,\n\t\t\t\t\tphase: t.phase,\n\t\t\t\t\tcauseCode: t.causeCode,\n\t\t\t\t\tsource: t.source,\n\t\t\t\t\tsideEffects: t.sideEffects,\n\t\t\t\t\tretryable: t.retryable,\n\t\t\t\t\tsafeToAutoRetry: t.safeToAutoRetry,\n\t\t\t\t}\n\t\t\t: null,\n\t};\n}\n\nexport function saveTuiDiagnostics(report: TuiDiagnostics, directory = tmpdir()): string {\n\tconst ownedDirectory = mkdtempSync(join(directory, \"omk-debug-\"));\n\ttry {\n\t\tconst outputPath = join(ownedDirectory, \"diagnostics.json\");\n\t\twriteFileSync(outputPath, `${JSON.stringify(report, null, 2)}\\n`, { flag: \"wx\", mode: 0o600 });\n\t\treturn outputPath;\n\t} catch (error) {\n\t\ttry {\n\t\t\trmSync(ownedDirectory, { recursive: true, force: true });\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError([error, cleanupError], \"Diagnostics write and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport function createTuiDiagnosticsView(report: TuiDiagnostics, locations: TuiRuntimeCapture): Component {\n\treturn {\n\t\trender(width: number): string[] {\n\t\t\tconst view = new Container();\n\t\t\tview.addChild(new DynamicBorder((s) => theme.fg(\"accent\", s)));\n\t\t\tview.addChild(new Text(theme.fg(\"accent\", theme.bold(\"OMK diagnostics\")), 1, 0));\n\t\t\tconst r = report.runtime;\n\t\t\tconst t = report.termination;\n\t\t\tconst moduleStatus =\n\t\t\t\tr.moduleState === \"changed\"\n\t\t\t\t\t? \"changed since initialization — restart to load code\"\n\t\t\t\t\t: r.moduleState === \"unchanged\"\n\t\t\t\t\t\t? \"unchanged since initialization (this file only)\"\n\t\t\t\t\t\t: \"unavailable — not confirmed\";\n\t\t\tconst lines = [\n\t\t\t\t`Runtime: OMK ${r.version} · Node ${r.nodeVersion} · ${r.platform}/${r.arch}`,\n\t\t\t\t`Loaded UI: ${r.moduleKind} · Initialized: ${r.capturedAt}`,\n\t\t\t\t`UI file on disk: ${moduleStatus}`,\n\t\t\t\t`UI SHA256 at initialization: ${r.initialModuleSha256 ?? \"unavailable\"}`,\n\t\t\t\t\"Build revision: unavailable (checkout HEAD is not a build identity)\",\n\t\t\t\t`Last resource reload: ${report.session.lastResourceReloadAt ?? \"not reloaded in this TUI\"}`,\n\t\t\t\t\"/reload refreshes resources, not core code. Core updates require a restart.\",\n\t\t\t\t`Terminal: ${report.terminal.columns}×${report.terminal.rows} · Messages: ${report.session.messageCount}`,\n\t\t\t\t`Streaming: ${report.session.streaming ? \"yes\" : \"no\"} · Compacting: ${report.session.compacting ? \"yes\" : \"no\"}`,\n\t\t\t\tt ? `Latest outcome: ${t.kind} · ${t.causeCode} · ${t.source}` : \"Latest outcome: none recorded\",\n\t\t\t\t...(t\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t`Effects: ${t.sideEffects} · Retryable: ${t.retryable ? \"yes\" : \"no\"} · Automatic retry: ${t.safeToAutoRetry ? \"yes\" : \"no\"}`,\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t\t`Launch path (local only): ${locations.entryPath ?? \"unavailable\"}`,\n\t\t\t\t`UI module (local only): ${locations.modulePath ?? \"unavailable\"}`,\n\t\t\t];\n\t\t\tview.addChild(new Text(lines.map(diagnosticDisplayText).join(\"\\n\"), 1, 0));\n\t\t\tview.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"muted\",\n\t\t\t\t\t\t\"Saving is explicit: /debug save writes a metadata-only JSON report locally.\\nMessages, prompts, outputs, config, paths, route names and session/run IDs are excluded. No upload.\",\n\t\t\t\t\t),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\tview.addChild(new DynamicBorder((s) => theme.fg(\"accent\", s)));\n\t\t\treturn view.render(width);\n\t\t},\n\t\tinvalidate(): void {},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { Container, Text } from "omk-tui";
|
|
5
|
+
import { DynamicBorder } from "./components/dynamic-border.js";
|
|
6
|
+
import { diagnosticDisplayText } from "./components/session-failure.js";
|
|
7
|
+
import { theme } from "./theme/theme.js";
|
|
8
|
+
/** Project each approved field; never serialize a session, message, model, config or arbitrary error. */
|
|
9
|
+
export function createTuiDiagnostics(input) {
|
|
10
|
+
const r = input.runtime;
|
|
11
|
+
const t = input.termination;
|
|
12
|
+
return {
|
|
13
|
+
schemaVersion: 1,
|
|
14
|
+
privacy: "metadata-only",
|
|
15
|
+
generatedAt: new Date().toISOString(),
|
|
16
|
+
runtime: {
|
|
17
|
+
version: r.version,
|
|
18
|
+
nodeVersion: r.nodeVersion,
|
|
19
|
+
platform: r.platform,
|
|
20
|
+
arch: r.arch,
|
|
21
|
+
capturedAt: r.capturedAt,
|
|
22
|
+
moduleKind: r.moduleKind,
|
|
23
|
+
moduleState: r.moduleState,
|
|
24
|
+
initialModuleSha256: r.initialModuleSha256,
|
|
25
|
+
currentModuleSha256: r.currentModuleSha256,
|
|
26
|
+
buildRevision: r.buildRevision,
|
|
27
|
+
},
|
|
28
|
+
terminal: { columns: input.columns, rows: input.rows },
|
|
29
|
+
session: {
|
|
30
|
+
streaming: input.isStreaming,
|
|
31
|
+
compacting: input.isCompacting,
|
|
32
|
+
messageCount: input.messageCount,
|
|
33
|
+
lastResourceReloadAt: input.lastResourceReloadAt ?? null,
|
|
34
|
+
},
|
|
35
|
+
termination: t
|
|
36
|
+
? {
|
|
37
|
+
kind: t.kind,
|
|
38
|
+
phase: t.phase,
|
|
39
|
+
causeCode: t.causeCode,
|
|
40
|
+
source: t.source,
|
|
41
|
+
sideEffects: t.sideEffects,
|
|
42
|
+
retryable: t.retryable,
|
|
43
|
+
safeToAutoRetry: t.safeToAutoRetry,
|
|
44
|
+
}
|
|
45
|
+
: null,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function saveTuiDiagnostics(report, directory = tmpdir()) {
|
|
49
|
+
const ownedDirectory = mkdtempSync(join(directory, "omk-debug-"));
|
|
50
|
+
try {
|
|
51
|
+
const outputPath = join(ownedDirectory, "diagnostics.json");
|
|
52
|
+
writeFileSync(outputPath, `${JSON.stringify(report, null, 2)}\n`, { flag: "wx", mode: 0o600 });
|
|
53
|
+
return outputPath;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
try {
|
|
57
|
+
rmSync(ownedDirectory, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
catch (cleanupError) {
|
|
60
|
+
throw new AggregateError([error, cleanupError], "Diagnostics write and cleanup failed");
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function createTuiDiagnosticsView(report, locations) {
|
|
66
|
+
return {
|
|
67
|
+
render(width) {
|
|
68
|
+
const view = new Container();
|
|
69
|
+
view.addChild(new DynamicBorder((s) => theme.fg("accent", s)));
|
|
70
|
+
view.addChild(new Text(theme.fg("accent", theme.bold("OMK diagnostics")), 1, 0));
|
|
71
|
+
const r = report.runtime;
|
|
72
|
+
const t = report.termination;
|
|
73
|
+
const moduleStatus = r.moduleState === "changed"
|
|
74
|
+
? "changed since initialization — restart to load code"
|
|
75
|
+
: r.moduleState === "unchanged"
|
|
76
|
+
? "unchanged since initialization (this file only)"
|
|
77
|
+
: "unavailable — not confirmed";
|
|
78
|
+
const lines = [
|
|
79
|
+
`Runtime: OMK ${r.version} · Node ${r.nodeVersion} · ${r.platform}/${r.arch}`,
|
|
80
|
+
`Loaded UI: ${r.moduleKind} · Initialized: ${r.capturedAt}`,
|
|
81
|
+
`UI file on disk: ${moduleStatus}`,
|
|
82
|
+
`UI SHA256 at initialization: ${r.initialModuleSha256 ?? "unavailable"}`,
|
|
83
|
+
"Build revision: unavailable (checkout HEAD is not a build identity)",
|
|
84
|
+
`Last resource reload: ${report.session.lastResourceReloadAt ?? "not reloaded in this TUI"}`,
|
|
85
|
+
"/reload refreshes resources, not core code. Core updates require a restart.",
|
|
86
|
+
`Terminal: ${report.terminal.columns}×${report.terminal.rows} · Messages: ${report.session.messageCount}`,
|
|
87
|
+
`Streaming: ${report.session.streaming ? "yes" : "no"} · Compacting: ${report.session.compacting ? "yes" : "no"}`,
|
|
88
|
+
t ? `Latest outcome: ${t.kind} · ${t.causeCode} · ${t.source}` : "Latest outcome: none recorded",
|
|
89
|
+
...(t
|
|
90
|
+
? [
|
|
91
|
+
`Effects: ${t.sideEffects} · Retryable: ${t.retryable ? "yes" : "no"} · Automatic retry: ${t.safeToAutoRetry ? "yes" : "no"}`,
|
|
92
|
+
]
|
|
93
|
+
: []),
|
|
94
|
+
`Launch path (local only): ${locations.entryPath ?? "unavailable"}`,
|
|
95
|
+
`UI module (local only): ${locations.modulePath ?? "unavailable"}`,
|
|
96
|
+
];
|
|
97
|
+
view.addChild(new Text(lines.map(diagnosticDisplayText).join("\n"), 1, 0));
|
|
98
|
+
view.addChild(new Text(theme.fg("muted", "Saving is explicit: /debug save writes a metadata-only JSON report locally.\nMessages, prompts, outputs, config, paths, route names and session/run IDs are excluded. No upload."), 1, 0));
|
|
99
|
+
view.addChild(new DynamicBorder((s) => theme.fg("accent", s)));
|
|
100
|
+
return view.render(width);
|
|
101
|
+
},
|
|
102
|
+
invalidate() { },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=tui-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-diagnostics.js","sourceRoot":"","sources":["../../../src/modes/interactive/tui-diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { type Component, Container, Text } from \"omk-tui\";\nimport type { SessionTermination } from \"../../core/session-termination-types.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport { diagnosticDisplayText } from \"./components/session-failure.ts\";\nimport { theme } from \"./theme/theme.ts\";\nimport type { TuiRuntimeCapture, TuiRuntimeInfo } from \"./tui-runtime-info.ts\";\n\ntype DiagnosticTermination = Pick<\n\tSessionTermination,\n\t\"kind\" | \"phase\" | \"causeCode\" | \"source\" | \"sideEffects\" | \"retryable\" | \"safeToAutoRetry\"\n>;\nexport interface TuiDiagnostics {\n\treadonly schemaVersion: 1;\n\treadonly privacy: \"metadata-only\";\n\treadonly generatedAt: string;\n\treadonly runtime: Omit<TuiRuntimeInfo, \"entryPath\" | \"modulePath\">;\n\treadonly terminal: { readonly columns: number; readonly rows: number };\n\treadonly session: {\n\t\treadonly streaming: boolean;\n\t\treadonly compacting: boolean;\n\t\treadonly messageCount: number;\n\t\treadonly lastResourceReloadAt: string | null;\n\t};\n\treadonly termination: DiagnosticTermination | null;\n}\n\n/** Project each approved field; never serialize a session, message, model, config or arbitrary error. */\nexport function createTuiDiagnostics(input: {\n\treadonly runtime: TuiRuntimeInfo;\n\treadonly columns: number;\n\treadonly rows: number;\n\treadonly isStreaming: boolean;\n\treadonly isCompacting: boolean;\n\treadonly messageCount: number;\n\treadonly lastResourceReloadAt: string | undefined;\n\treadonly termination: SessionTermination | undefined;\n}): TuiDiagnostics {\n\tconst r = input.runtime;\n\tconst t = input.termination;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tprivacy: \"metadata-only\",\n\t\tgeneratedAt: new Date().toISOString(),\n\t\truntime: {\n\t\t\tversion: r.version,\n\t\t\tnodeVersion: r.nodeVersion,\n\t\t\tplatform: r.platform,\n\t\t\tarch: r.arch,\n\t\t\tcapturedAt: r.capturedAt,\n\t\t\tmoduleKind: r.moduleKind,\n\t\t\tmoduleState: r.moduleState,\n\t\t\tinitialModuleSha256: r.initialModuleSha256,\n\t\t\tcurrentModuleSha256: r.currentModuleSha256,\n\t\t\tbuildRevision: r.buildRevision,\n\t\t},\n\t\tterminal: { columns: input.columns, rows: input.rows },\n\t\tsession: {\n\t\t\tstreaming: input.isStreaming,\n\t\t\tcompacting: input.isCompacting,\n\t\t\tmessageCount: input.messageCount,\n\t\t\tlastResourceReloadAt: input.lastResourceReloadAt ?? null,\n\t\t},\n\t\ttermination: t\n\t\t\t? {\n\t\t\t\t\tkind: t.kind,\n\t\t\t\t\tphase: t.phase,\n\t\t\t\t\tcauseCode: t.causeCode,\n\t\t\t\t\tsource: t.source,\n\t\t\t\t\tsideEffects: t.sideEffects,\n\t\t\t\t\tretryable: t.retryable,\n\t\t\t\t\tsafeToAutoRetry: t.safeToAutoRetry,\n\t\t\t\t}\n\t\t\t: null,\n\t};\n}\n\nexport function saveTuiDiagnostics(report: TuiDiagnostics, directory = tmpdir()): string {\n\tconst ownedDirectory = mkdtempSync(join(directory, \"omk-debug-\"));\n\ttry {\n\t\tconst outputPath = join(ownedDirectory, \"diagnostics.json\");\n\t\twriteFileSync(outputPath, `${JSON.stringify(report, null, 2)}\\n`, { flag: \"wx\", mode: 0o600 });\n\t\treturn outputPath;\n\t} catch (error) {\n\t\ttry {\n\t\t\trmSync(ownedDirectory, { recursive: true, force: true });\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError([error, cleanupError], \"Diagnostics write and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport function createTuiDiagnosticsView(report: TuiDiagnostics, locations: TuiRuntimeCapture): Component {\n\treturn {\n\t\trender(width: number): string[] {\n\t\t\tconst view = new Container();\n\t\t\tview.addChild(new DynamicBorder((s) => theme.fg(\"accent\", s)));\n\t\t\tview.addChild(new Text(theme.fg(\"accent\", theme.bold(\"OMK diagnostics\")), 1, 0));\n\t\t\tconst r = report.runtime;\n\t\t\tconst t = report.termination;\n\t\t\tconst moduleStatus =\n\t\t\t\tr.moduleState === \"changed\"\n\t\t\t\t\t? \"changed since initialization — restart to load code\"\n\t\t\t\t\t: r.moduleState === \"unchanged\"\n\t\t\t\t\t\t? \"unchanged since initialization (this file only)\"\n\t\t\t\t\t\t: \"unavailable — not confirmed\";\n\t\t\tconst lines = [\n\t\t\t\t`Runtime: OMK ${r.version} · Node ${r.nodeVersion} · ${r.platform}/${r.arch}`,\n\t\t\t\t`Loaded UI: ${r.moduleKind} · Initialized: ${r.capturedAt}`,\n\t\t\t\t`UI file on disk: ${moduleStatus}`,\n\t\t\t\t`UI SHA256 at initialization: ${r.initialModuleSha256 ?? \"unavailable\"}`,\n\t\t\t\t\"Build revision: unavailable (checkout HEAD is not a build identity)\",\n\t\t\t\t`Last resource reload: ${report.session.lastResourceReloadAt ?? \"not reloaded in this TUI\"}`,\n\t\t\t\t\"/reload refreshes resources, not core code. Core updates require a restart.\",\n\t\t\t\t`Terminal: ${report.terminal.columns}×${report.terminal.rows} · Messages: ${report.session.messageCount}`,\n\t\t\t\t`Streaming: ${report.session.streaming ? \"yes\" : \"no\"} · Compacting: ${report.session.compacting ? \"yes\" : \"no\"}`,\n\t\t\t\tt ? `Latest outcome: ${t.kind} · ${t.causeCode} · ${t.source}` : \"Latest outcome: none recorded\",\n\t\t\t\t...(t\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t`Effects: ${t.sideEffects} · Retryable: ${t.retryable ? \"yes\" : \"no\"} · Automatic retry: ${t.safeToAutoRetry ? \"yes\" : \"no\"}`,\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t\t`Launch path (local only): ${locations.entryPath ?? \"unavailable\"}`,\n\t\t\t\t`UI module (local only): ${locations.modulePath ?? \"unavailable\"}`,\n\t\t\t];\n\t\t\tview.addChild(new Text(lines.map(diagnosticDisplayText).join(\"\\n\"), 1, 0));\n\t\t\tview.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"muted\",\n\t\t\t\t\t\t\"Saving is explicit: /debug save writes a metadata-only JSON report locally.\\nMessages, prompts, outputs, config, paths, route names and session/run IDs are excluded. No upload.\",\n\t\t\t\t\t),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\tview.addChild(new DynamicBorder((s) => theme.fg(\"accent\", s)));\n\t\t\treturn view.render(width);\n\t\t},\n\t\tinvalidate(): void {},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TuiRuntimeCapture {
|
|
2
|
+
readonly version: string;
|
|
3
|
+
readonly nodeVersion: string;
|
|
4
|
+
readonly platform: NodeJS.Platform;
|
|
5
|
+
readonly arch: string;
|
|
6
|
+
readonly capturedAt: string;
|
|
7
|
+
readonly entryPath: string | null;
|
|
8
|
+
readonly modulePath: string | null;
|
|
9
|
+
readonly moduleKind: "source" | "dist" | "bundled" | "unknown";
|
|
10
|
+
readonly initialModuleSha256: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface TuiRuntimeInfo extends TuiRuntimeCapture {
|
|
13
|
+
readonly currentModuleSha256: string | null;
|
|
14
|
+
readonly moduleState: "unchanged" | "changed" | "unavailable";
|
|
15
|
+
/** The package currently supplies no build-to-commit binding. Never substitute checkout HEAD. */
|
|
16
|
+
readonly buildRevision: null;
|
|
17
|
+
}
|
|
18
|
+
export declare function captureTuiRuntime(moduleUrl: string): TuiRuntimeCapture;
|
|
19
|
+
export declare function inspectTuiRuntime(capture: TuiRuntimeCapture): TuiRuntimeInfo;
|
|
20
|
+
//# sourceMappingURL=tui-runtime-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-runtime-info.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/tui-runtime-info.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AACD,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IAC9D,iGAAiG;IACjG,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;CAC7B;AAqBD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAkCtE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAS5E","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { closeSync, constants, fstatSync, openSync, readSync, realpathSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { VERSION } from \"../../config.ts\";\n\nexport interface TuiRuntimeCapture {\n\treadonly version: string;\n\treadonly nodeVersion: string;\n\treadonly platform: NodeJS.Platform;\n\treadonly arch: string;\n\treadonly capturedAt: string;\n\treadonly entryPath: string | null;\n\treadonly modulePath: string | null;\n\treadonly moduleKind: \"source\" | \"dist\" | \"bundled\" | \"unknown\";\n\treadonly initialModuleSha256: string | null;\n}\nexport interface TuiRuntimeInfo extends TuiRuntimeCapture {\n\treadonly currentModuleSha256: string | null;\n\treadonly moduleState: \"unchanged\" | \"changed\" | \"unavailable\";\n\t/** The package currently supplies no build-to-commit binding. Never substitute checkout HEAD. */\n\treadonly buildRevision: null;\n}\n\nfunction moduleDigest(filePath: string | null): string | null {\n\tif (!filePath) return null;\n\tlet fd: number | undefined;\n\ttry {\n\t\tfd = openSync(filePath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);\n\t\tconst stat = fstatSync(fd);\n\t\tif (!stat.isFile() || stat.size > 1_048_576) return null;\n\t\tconst bytes = Buffer.alloc(stat.size + 1);\n\t\tconst count = readSync(fd, bytes, 0, bytes.length, 0);\n\t\tif (count !== stat.size || fstatSync(fd).mtimeMs !== stat.mtimeMs) return null;\n\t\treturn createHash(\"sha256\").update(bytes.subarray(0, count)).digest(\"hex\");\n\t} catch {\n\t\t// A missing/unreadable/virtual entry is an unavailable observation, not a clean bill of health.\n\t\treturn null;\n\t} finally {\n\t\tif (fd !== undefined) closeSync(fd);\n\t}\n}\n\nexport function captureTuiRuntime(moduleUrl: string): TuiRuntimeCapture {\n\tlet modulePath: string | null = null;\n\ttry {\n\t\tmodulePath = fileURLToPath(moduleUrl);\n\t} catch {\n\t\t// Bundled runtimes need not expose a file URL.\n\t}\n\tlet entryPath = process.argv[1] ? resolve(process.argv[1]) : null;\n\tif (entryPath) {\n\t\ttry {\n\t\t\tentryPath = realpathSync(entryPath);\n\t\t} catch {\n\t\t\t/* Keep the observed launch path when unavailable. */\n\t\t}\n\t}\n\tconst normalized = modulePath?.replaceAll(\"\\\\\", \"/\") ?? moduleUrl;\n\tconst moduleKind = /(?:^bun:|\\/\\$bunfs\\/|\\/~BUN\\/)/u.test(normalized)\n\t\t? \"bundled\"\n\t\t: modulePath && [\".ts\", \".tsx\", \".mts\", \".cts\"].includes(extname(modulePath))\n\t\t\t? \"source\"\n\t\t\t: normalized.includes(\"/dist/\")\n\t\t\t\t? \"dist\"\n\t\t\t\t: \"unknown\";\n\treturn Object.freeze({\n\t\tversion: VERSION,\n\t\tnodeVersion: process.versions.node,\n\t\tplatform: process.platform,\n\t\tarch: process.arch,\n\t\tcapturedAt: new Date().toISOString(),\n\t\tentryPath,\n\t\tmodulePath,\n\t\tmoduleKind,\n\t\tinitialModuleSha256: moduleKind === \"bundled\" ? null : moduleDigest(modulePath),\n\t});\n}\n\nexport function inspectTuiRuntime(capture: TuiRuntimeCapture): TuiRuntimeInfo {\n\tconst currentModuleSha256 = capture.moduleKind === \"bundled\" ? null : moduleDigest(capture.modulePath);\n\tconst moduleState =\n\t\t!capture.initialModuleSha256 || !currentModuleSha256\n\t\t\t? \"unavailable\"\n\t\t\t: capture.initialModuleSha256 === currentModuleSha256\n\t\t\t\t? \"unchanged\"\n\t\t\t\t: \"changed\";\n\treturn { ...capture, currentModuleSha256, moduleState, buildRevision: null };\n}\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { closeSync, constants, fstatSync, openSync, readSync, realpathSync } from "node:fs";
|
|
3
|
+
import { extname, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { VERSION } from "../../config.js";
|
|
6
|
+
function moduleDigest(filePath) {
|
|
7
|
+
if (!filePath)
|
|
8
|
+
return null;
|
|
9
|
+
let fd;
|
|
10
|
+
try {
|
|
11
|
+
fd = openSync(filePath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
12
|
+
const stat = fstatSync(fd);
|
|
13
|
+
if (!stat.isFile() || stat.size > 1_048_576)
|
|
14
|
+
return null;
|
|
15
|
+
const bytes = Buffer.alloc(stat.size + 1);
|
|
16
|
+
const count = readSync(fd, bytes, 0, bytes.length, 0);
|
|
17
|
+
if (count !== stat.size || fstatSync(fd).mtimeMs !== stat.mtimeMs)
|
|
18
|
+
return null;
|
|
19
|
+
return createHash("sha256").update(bytes.subarray(0, count)).digest("hex");
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// A missing/unreadable/virtual entry is an unavailable observation, not a clean bill of health.
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
if (fd !== undefined)
|
|
27
|
+
closeSync(fd);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function captureTuiRuntime(moduleUrl) {
|
|
31
|
+
let modulePath = null;
|
|
32
|
+
try {
|
|
33
|
+
modulePath = fileURLToPath(moduleUrl);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Bundled runtimes need not expose a file URL.
|
|
37
|
+
}
|
|
38
|
+
let entryPath = process.argv[1] ? resolve(process.argv[1]) : null;
|
|
39
|
+
if (entryPath) {
|
|
40
|
+
try {
|
|
41
|
+
entryPath = realpathSync(entryPath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* Keep the observed launch path when unavailable. */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const normalized = modulePath?.replaceAll("\\", "/") ?? moduleUrl;
|
|
48
|
+
const moduleKind = /(?:^bun:|\/\$bunfs\/|\/~BUN\/)/u.test(normalized)
|
|
49
|
+
? "bundled"
|
|
50
|
+
: modulePath && [".ts", ".tsx", ".mts", ".cts"].includes(extname(modulePath))
|
|
51
|
+
? "source"
|
|
52
|
+
: normalized.includes("/dist/")
|
|
53
|
+
? "dist"
|
|
54
|
+
: "unknown";
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
version: VERSION,
|
|
57
|
+
nodeVersion: process.versions.node,
|
|
58
|
+
platform: process.platform,
|
|
59
|
+
arch: process.arch,
|
|
60
|
+
capturedAt: new Date().toISOString(),
|
|
61
|
+
entryPath,
|
|
62
|
+
modulePath,
|
|
63
|
+
moduleKind,
|
|
64
|
+
initialModuleSha256: moduleKind === "bundled" ? null : moduleDigest(modulePath),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function inspectTuiRuntime(capture) {
|
|
68
|
+
const currentModuleSha256 = capture.moduleKind === "bundled" ? null : moduleDigest(capture.modulePath);
|
|
69
|
+
const moduleState = !capture.initialModuleSha256 || !currentModuleSha256
|
|
70
|
+
? "unavailable"
|
|
71
|
+
: capture.initialModuleSha256 === currentModuleSha256
|
|
72
|
+
? "unchanged"
|
|
73
|
+
: "changed";
|
|
74
|
+
return { ...capture, currentModuleSha256, moduleState, buildRevision: null };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=tui-runtime-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-runtime-info.js","sourceRoot":"","sources":["../../../src/modes/interactive/tui-runtime-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { closeSync, constants, fstatSync, openSync, readSync, realpathSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { VERSION } from \"../../config.ts\";\n\nexport interface TuiRuntimeCapture {\n\treadonly version: string;\n\treadonly nodeVersion: string;\n\treadonly platform: NodeJS.Platform;\n\treadonly arch: string;\n\treadonly capturedAt: string;\n\treadonly entryPath: string | null;\n\treadonly modulePath: string | null;\n\treadonly moduleKind: \"source\" | \"dist\" | \"bundled\" | \"unknown\";\n\treadonly initialModuleSha256: string | null;\n}\nexport interface TuiRuntimeInfo extends TuiRuntimeCapture {\n\treadonly currentModuleSha256: string | null;\n\treadonly moduleState: \"unchanged\" | \"changed\" | \"unavailable\";\n\t/** The package currently supplies no build-to-commit binding. Never substitute checkout HEAD. */\n\treadonly buildRevision: null;\n}\n\nfunction moduleDigest(filePath: string | null): string | null {\n\tif (!filePath) return null;\n\tlet fd: number | undefined;\n\ttry {\n\t\tfd = openSync(filePath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);\n\t\tconst stat = fstatSync(fd);\n\t\tif (!stat.isFile() || stat.size > 1_048_576) return null;\n\t\tconst bytes = Buffer.alloc(stat.size + 1);\n\t\tconst count = readSync(fd, bytes, 0, bytes.length, 0);\n\t\tif (count !== stat.size || fstatSync(fd).mtimeMs !== stat.mtimeMs) return null;\n\t\treturn createHash(\"sha256\").update(bytes.subarray(0, count)).digest(\"hex\");\n\t} catch {\n\t\t// A missing/unreadable/virtual entry is an unavailable observation, not a clean bill of health.\n\t\treturn null;\n\t} finally {\n\t\tif (fd !== undefined) closeSync(fd);\n\t}\n}\n\nexport function captureTuiRuntime(moduleUrl: string): TuiRuntimeCapture {\n\tlet modulePath: string | null = null;\n\ttry {\n\t\tmodulePath = fileURLToPath(moduleUrl);\n\t} catch {\n\t\t// Bundled runtimes need not expose a file URL.\n\t}\n\tlet entryPath = process.argv[1] ? resolve(process.argv[1]) : null;\n\tif (entryPath) {\n\t\ttry {\n\t\t\tentryPath = realpathSync(entryPath);\n\t\t} catch {\n\t\t\t/* Keep the observed launch path when unavailable. */\n\t\t}\n\t}\n\tconst normalized = modulePath?.replaceAll(\"\\\\\", \"/\") ?? moduleUrl;\n\tconst moduleKind = /(?:^bun:|\\/\\$bunfs\\/|\\/~BUN\\/)/u.test(normalized)\n\t\t? \"bundled\"\n\t\t: modulePath && [\".ts\", \".tsx\", \".mts\", \".cts\"].includes(extname(modulePath))\n\t\t\t? \"source\"\n\t\t\t: normalized.includes(\"/dist/\")\n\t\t\t\t? \"dist\"\n\t\t\t\t: \"unknown\";\n\treturn Object.freeze({\n\t\tversion: VERSION,\n\t\tnodeVersion: process.versions.node,\n\t\tplatform: process.platform,\n\t\tarch: process.arch,\n\t\tcapturedAt: new Date().toISOString(),\n\t\tentryPath,\n\t\tmodulePath,\n\t\tmoduleKind,\n\t\tinitialModuleSha256: moduleKind === \"bundled\" ? null : moduleDigest(modulePath),\n\t});\n}\n\nexport function inspectTuiRuntime(capture: TuiRuntimeCapture): TuiRuntimeInfo {\n\tconst currentModuleSha256 = capture.moduleKind === \"bundled\" ? null : moduleDigest(capture.modulePath);\n\tconst moduleState =\n\t\t!capture.initialModuleSha256 || !currentModuleSha256\n\t\t\t? \"unavailable\"\n\t\t\t: capture.initialModuleSha256 === currentModuleSha256\n\t\t\t\t? \"unchanged\"\n\t\t\t\t: \"changed\";\n\treturn { ...capture, currentModuleSha256, moduleState, buildRevision: null };\n}\n"]}
|
package/docs/development.md
CHANGED
|
@@ -76,6 +76,16 @@ LIVE_E2E=0 node ../../node_modules/vitest/dist/cli.js --run test/adaptorch-onboa
|
|
|
76
76
|
Keep explicit file filters for routine work. A keyless regression pass is not a
|
|
77
77
|
live-provider or release verification, and unfiltered suites may include e2e tests.
|
|
78
78
|
|
|
79
|
+
## Commit checks
|
|
80
|
+
|
|
81
|
+
The pre-commit hook validates the working tree without changing the selected
|
|
82
|
+
index. It never auto-stages checker edits or unstaged hunks. If a checker changes
|
|
83
|
+
the index, the hook fails and asks you to review the selection again; it does not
|
|
84
|
+
restore or discard those changes. The checks still run against the working tree,
|
|
85
|
+
not an isolated staged snapshot, so review partially staged changes separately.
|
|
86
|
+
|
|
87
|
+
Hook regression: `node --test scripts/test/pre-commit-index.test.mjs`.
|
|
88
|
+
|
|
79
89
|
## Project Structure
|
|
80
90
|
|
|
81
91
|
```
|
package/docs/keybindings.md
CHANGED
|
@@ -118,7 +118,7 @@ Modifier combinations: `ctrl+shift+x`, `alt+ctrl+x`, `ctrl+shift+alt+x`, `ctrl+1
|
|
|
118
118
|
|
|
119
119
|
| Keybinding id | Default | Description |
|
|
120
120
|
|--------|---------|-------------|
|
|
121
|
-
| `app.tools.expand` | `ctrl+o` | Collapse or expand tool output |
|
|
121
|
+
| `app.tools.expand` | `ctrl+o` | Collapse or expand tool output and typed failure details |
|
|
122
122
|
| `app.message.followUp` | `alt+enter` | Queue follow-up message |
|
|
123
123
|
| `app.message.dequeue` | `alt+up` | Restore queued messages to editor |
|
|
124
124
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Release audit: v0.98.5
|
|
2
|
+
|
|
3
|
+
Date: 2026-09-12. This records candidate preparation and verification, not proof of
|
|
4
|
+
semantic correctness, comparative performance or completed publication.
|
|
5
|
+
|
|
6
|
+
## Scope and changelog audit
|
|
7
|
+
|
|
8
|
+
The candidate retains the public v0.98.4 ancestry and the committed implementation
|
|
9
|
+
range through `b84d0d9b8e`. The audit covers index-preserving Git checks, execution
|
|
10
|
+
ownership/shared budgets, protected verified runs and candidate recovery, input
|
|
11
|
+
checkpoint writer restart, static DAG retry, and TUI diagnostics. Tool timeout
|
|
12
|
+
messages now distinguish requested cancellation from observed termination and use
|
|
13
|
+
a monotonic teardown grace period.
|
|
14
|
+
|
|
15
|
+
Preparation adds release metadata, this audit, and focused verification fixes:
|
|
16
|
+
initial failure-card expansion is applied at construction, execution wrappers
|
|
17
|
+
preserve lazy context-sensitive timeouts, and the commit hook handles changed-file
|
|
18
|
+
status under Husky's errexit mode. Existing dirty provider, retry,
|
|
19
|
+
parallel-frontier, resource-label and TB changes are excluded.
|
|
20
|
+
Their working files are preserved, and their pending changelog entries stay out of
|
|
21
|
+
the candidate. Published v0.98.4 and earlier changelog bodies remain unchanged.
|
|
22
|
+
Model catalogs are reused rather than fetched or regenerated. Credentials, private
|
|
23
|
+
agent-home configuration and the user's running TUI are not changed.
|
|
24
|
+
|
|
25
|
+
## Version and artifact contract
|
|
26
|
+
|
|
27
|
+
All seven public packages target 0.98.5: `open-multi-agent-kit`, `omk-ai`,
|
|
28
|
+
`omk-agent-core`, `omk-tui`, `omk-protocol`, `omk-adaptorch-wpl` and
|
|
29
|
+
`omk-book-to-skill`. Root/example manifests and locks, internal dependency ranges,
|
|
30
|
+
the book compiler's source version constant, CLI shrinkwrap and README pointers
|
|
31
|
+
are synchronized. External dependency versions and integrity values are unchanged.
|
|
32
|
+
|
|
33
|
+
The release candidate is selected by path/hunk and inspected as a complete staged
|
|
34
|
+
diff. Verification uses an isolated candidate, not the mixed working tree. Temporary
|
|
35
|
+
homes contain no provider credentials; live inference and benchmarks are not run.
|
|
36
|
+
|
|
37
|
+
## Observed verification
|
|
38
|
+
|
|
39
|
+
- The diagnostics implementation passed type checking and 104 focused tests in its
|
|
40
|
+
staged snapshot. Its canonical installed launcher passed offline 120/80-column
|
|
41
|
+
inspection, save, failure, reload and quit checks without model prompts.
|
|
42
|
+
- Version preparation passed 13-manifest/root-lock parity, source-version tests,
|
|
43
|
+
book metadata tests and the canonical `omk --version` check for 0.98.5.
|
|
44
|
+
- The isolated candidate build and `npm run check` exited 0. Module-size and
|
|
45
|
+
import-cycle baselines were not raised.
|
|
46
|
+
- The final full offline run exited 0: 8,181 passed, 837 environment/live-condition
|
|
47
|
+
skips, no failures. Package passes were WPL 149, agent 870, AI 631, book compiler
|
|
48
|
+
22, coding-agent 5,653, protocol 126 and TUI 730. Vitest workers were bounded at
|
|
49
|
+
four; the TUI package used its Node test runner.
|
|
50
|
+
- Seven-package npm pack dry runs and release-surface checks passed. They checked
|
|
51
|
+
package version/file metadata without publication or lifecycle scripts.
|
|
52
|
+
- Gitleaks found no leaks in the staged changes or the six implementation commits
|
|
53
|
+
since v0.98.4. Reports were redacted; this is not clearance for private histories
|
|
54
|
+
outside that range.
|
|
55
|
+
|
|
56
|
+
## Verification repairs
|
|
57
|
+
|
|
58
|
+
The isolated candidate exposed a two-line module-size overrun that the mixed tree
|
|
59
|
+
hid. Passing initial expansion to the failure-card constructor avoids a redundant
|
|
60
|
+
rebuild and keeps the existing size baseline; both initial states are tested.
|
|
61
|
+
|
|
62
|
+
The full suite exposed an execution wrapper spreading a tool's dynamic timeout
|
|
63
|
+
getter into a fixed value. The wrapper now projects tool metadata and forwards
|
|
64
|
+
that getter lazily. Regression checks cover no eager evaluation, timeout changes,
|
|
65
|
+
stale-context rejection and retained execution metadata.
|
|
66
|
+
|
|
67
|
+
The commit hook had only been tested under plain `sh`, while Husky invokes `sh -e`.
|
|
68
|
+
A changed-file `git diff --quiet` status of 1 therefore stopped valid release
|
|
69
|
+
commits. Capturing that status in an OR-list preserves errexit for real failures;
|
|
70
|
+
all six hook fixtures now run under `sh -e`, including changed paths with spaces,
|
|
71
|
+
index preservation and a fatal git-diff error.
|
|
72
|
+
|
|
73
|
+
An initial test launch resolved to the wrong checkout and was cancelled, not counted
|
|
74
|
+
as candidate evidence. Subsequent launches fix both process cwd and npm prefix.
|
|
75
|
+
An isolated HOME also hid the installed Rust toolchain: explicitly supplying its
|
|
76
|
+
location restored the real cargo diagnostic check without changing the test or
|
|
77
|
+
copying credentials. Neither fixture failure was treated as a product pass.
|
|
78
|
+
|
|
79
|
+
A source-file fingerprint is not an executed-build attestation. Linux observations
|
|
80
|
+
do not establish behavior on every target platform. CI must validate the exact tag,
|
|
81
|
+
build the six platform archives, run checks/tests, publish all seven npm packages
|
|
82
|
+
and create the GitHub Release. Existing token-based CI authentication is unchanged;
|
|
83
|
+
OIDC/Sigstore provenance is not claimed. Publication is complete only when the main
|
|
84
|
+
tag, GitHub Release and seven npm `latest` values agree.
|
package/docs/run-protocol.md
CHANGED
|
@@ -6,7 +6,7 @@ The OMK Run Protocol defines one versioned contract for task execution and evalu
|
|
|
6
6
|
TaskSpec -> ExecutionAttempt -> Observation -> EvaluationResult -> RuntimeDecision
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
`omk-protocol` owns these records and the pure reducers that connect them. Tool execution, persistence, scheduling, routing, and topology remain outside the package.
|
|
9
|
+
`omk-protocol` owns these records and the pure reducers that connect them. Tool execution, persistence, runtime scheduling, routing, and topology selection remain outside the package.
|
|
10
10
|
|
|
11
11
|
## Implemented scope
|
|
12
12
|
|
|
@@ -24,6 +24,38 @@ The first v1 slice is available under `packages/protocol` with schema version `o
|
|
|
24
24
|
|
|
25
25
|
Every top-level record carries `schemaVersion`. Parsers reject unsupported versions, malformed timestamps, duplicate claim IDs, invalid JSON facts, and empty logical conditions.
|
|
26
26
|
|
|
27
|
+
## Isolated command-run profile
|
|
28
|
+
|
|
29
|
+
`RunContract` and `RunStartCommand` add strict, immutable parsers for the opt-in
|
|
30
|
+
`linux-command-v1` and `linux-scripted-agent-v1` profiles. They pin the input digest,
|
|
31
|
+
write scope, commands, stdout assertions and finite phase/snapshot limits. The
|
|
32
|
+
scripted profile also pins 1–16 approved steps and a 1–32 logical request cap for
|
|
33
|
+
an offline AgentSession reference adapter. Unknown authority/provider fields are
|
|
34
|
+
rejected; the host must separately authorize the exact contract digest.
|
|
35
|
+
`RunResumeCommand` / `parseRunResumeCommand()` pin the contract, candidate and exact
|
|
36
|
+
expected revision/generation. The host may acquire at most three generations under
|
|
37
|
+
`MAX_VERIFIED_RUN_GENERATIONS`; a resume command does not authorize replay of a writer.
|
|
38
|
+
The separate `RunWriterRestartCommand` / `parseRunWriterRestartCommand()` binds
|
|
39
|
+
`baseDigest` to a durable input checkpoint for an explicit local writer restart.
|
|
40
|
+
Recovery commands share command IDs and the generation cap; none resets budgets.
|
|
41
|
+
|
|
42
|
+
`linux-command-dag-v1` adds `RunDagWriter` / `RunDagTask` with 1–16 nodes, explicit
|
|
43
|
+
artifact dependencies, disjoint write scopes and 1–2 preapproved command attempts per
|
|
44
|
+
node. `orderRunDag()` provides deterministic FIFO topological order and
|
|
45
|
+
`runDagAncestors()` includes the full transitive input closure. `RunTaskRetryCommand`
|
|
46
|
+
/ `parseRunTaskRetryCommand()` pins a task selection to the original input and exact
|
|
47
|
+
run revision/generation. These pure contracts never authorize dispatch or authenticate
|
|
48
|
+
cached output; the Coordinator checks stored material and records adoption before reuse.
|
|
49
|
+
|
|
50
|
+
The coding-agent's `RunCoordinator` owns execution and its separate v2 journal.
|
|
51
|
+
It binds native v3 receipt cores to the candidate through a supervisor attestation,
|
|
52
|
+
then supplies authenticated checks to the existing claim-closure reducer.
|
|
53
|
+
This does not replace the task/attempt/evaluation contracts or add execution to
|
|
54
|
+
this package. See [Verified Run](verified-run.md) for the implemented CLI/SDK
|
|
55
|
+
path, candidate recovery and checkpoint-based local writer restart, plus the
|
|
56
|
+
serial command DAG and selective retry, plus remaining live-model, parallel frontier,
|
|
57
|
+
plan amendment and control-surface work.
|
|
58
|
+
|
|
27
59
|
## Durable goal lifecycle
|
|
28
60
|
|
|
29
61
|
A durable goal is working-directory state, not a session-file field or a `TaskSpec`. `/goal <objective>` creates or edits `.omk/goals/current.json`; `/goal` without arguments shows its status and round count.
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Runtime Algorithms and Direction
|
|
2
2
|
|
|
3
|
+
## Working-tree shared run budgets
|
|
4
|
+
|
|
5
|
+
The SDK `prompt(..., { runBudget })` path now shares a monotonic deadline and
|
|
6
|
+
logical request/concurrency limits across the active prompt's main stream,
|
|
7
|
+
retries, continuations, and first-party summaries using that stream. Exhaustion
|
|
8
|
+
is a non-retryable `budget_exhausted` termination; snapshots keep outstanding
|
|
9
|
+
streams until terminal metadata arrives. No request/time budget is imposed by
|
|
10
|
+
default. Preflight is now owned even for unbounded prompts; unresolved streams
|
|
11
|
+
block a later prompt instead of being discarded when their budget scope closes.
|
|
12
|
+
See [Shared run budgets](sdk.md#shared-run-budgets-sdk-opt-in) for units, zero
|
|
13
|
+
semantics, cancellation, and uncovered paths. This is not billing enforcement,
|
|
14
|
+
a persisted budget, or a hard process-termination deadline.
|
|
15
|
+
|
|
16
|
+
## Working-tree execution ownership (2026-09-10)
|
|
17
|
+
|
|
18
|
+
The live session now retains registered tool-promise ownership after timeout or
|
|
19
|
+
abort, defers prompt settlement/resource-lease release until actual termination,
|
|
20
|
+
and rejects overlapping prompt admission. Shared permits capture request values,
|
|
21
|
+
honor zero capacity, and wake FIFO followers after head cancellation/expiry.
|
|
22
|
+
The internal lane launcher forwards cancellation and respects zero/heavy caps.
|
|
23
|
+
Independent bash calls now own separate cancellation controllers, and one call's
|
|
24
|
+
completion cannot hide another active call. Core teardown waits use a monotonic
|
|
25
|
+
clock, preserving the existing grace interval across wall-clock changes.
|
|
26
|
+
See [Prompt settlement](sdk.md#prompt-settlement) for tests, compatibility, and
|
|
27
|
+
uncovered paths. These changes do not implement a durable verified-run product.
|
|
28
|
+
|
|
3
29
|
## v0.98.3 release delta (2026-09-06)
|
|
4
30
|
|
|
5
31
|
The explicit advisory SDK requires normal first-party model completion, honors cancellation,
|