botmux 2.93.1 → 2.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/backend/tmux-backend.d.ts +18 -2
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +45 -3
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +8 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +1 -1
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +6 -1
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/bot-registry.d.ts +50 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +30 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +11 -4
- package/dist/cli/workflow.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +146 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +28 -3
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +92 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/inherit-peer.d.ts +5 -0
- package/dist/core/inherit-peer.d.ts.map +1 -1
- package/dist/core/inherit-peer.js +3 -0
- package/dist/core/inherit-peer.js.map +1 -1
- package/dist/core/session-discovery.d.ts +9 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +24 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +7 -6
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +15 -0
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/trigger-session.js +2 -2
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +30 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +296 -23
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +5 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +7 -0
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +7 -1
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +2 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +2 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +14 -3
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +2 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +7 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/v3-runs-api.d.ts +26 -0
- package/dist/dashboard/v3-runs-api.d.ts.map +1 -0
- package/dist/dashboard/v3-runs-api.js +67 -0
- package/dist/dashboard/v3-runs-api.js.map +1 -0
- package/dist/dashboard/web/app.js +21 -9
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +128 -33
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +42 -6
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/legacy-workflow-link.d.ts +2 -0
- package/dist/dashboard/web/legacy-workflow-link.d.ts.map +1 -0
- package/dist/dashboard/web/legacy-workflow-link.js +12 -0
- package/dist/dashboard/web/legacy-workflow-link.js.map +1 -0
- package/dist/dashboard/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +11 -0
- package/dist/dashboard/web/settings.js.map +1 -1
- package/dist/dashboard/web/v3-terminal.d.ts +11 -0
- package/dist/dashboard/web/v3-terminal.d.ts.map +1 -0
- package/dist/dashboard/web/v3-terminal.js +143 -0
- package/dist/dashboard/web/v3-terminal.js.map +1 -0
- package/dist/dashboard/web/v3.d.ts +2 -0
- package/dist/dashboard/web/v3.d.ts.map +1 -0
- package/dist/dashboard/web/v3.js +564 -0
- package/dist/dashboard/web/v3.js.map +1 -0
- package/dist/dashboard/web/whiteboards.d.ts.map +1 -1
- package/dist/dashboard/web/whiteboards.js +14 -5
- package/dist/dashboard/web/whiteboards.js.map +1 -1
- package/dist/dashboard/web/workflows.d.ts.map +1 -1
- package/dist/dashboard/web/workflows.js +12 -8
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard-web/app.js +834 -724
- package/dist/dashboard-web/apple-touch-icon.png +0 -0
- package/dist/dashboard-web/favicon.png +0 -0
- package/dist/dashboard-web/index.html +3 -1
- package/dist/dashboard-web/style.css +223 -0
- package/dist/dashboard.js +170 -10
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +10 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +8 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +23 -3
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +23 -3
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +12 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +28 -0
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +3 -12
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +2 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +20 -6
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.js +4 -4
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts +29 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +35 -1
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.d.ts +28 -0
- package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-blocked-card-handler.js +134 -0
- package/dist/im/lark/v3-blocked-card-handler.js.map +1 -0
- package/dist/im/lark/v3-blocked-card.d.ts +75 -0
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -0
- package/dist/im/lark/v3-blocked-card.js +206 -0
- package/dist/im/lark/v3-blocked-card.js.map +1 -0
- package/dist/im/lark/v3-gate-card-handler.d.ts +31 -0
- package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-gate-card-handler.js +110 -0
- package/dist/im/lark/v3-gate-card-handler.js.map +1 -0
- package/dist/im/lark/v3-gate-card.d.ts +47 -0
- package/dist/im/lark/v3-gate-card.d.ts.map +1 -0
- package/dist/im/lark/v3-gate-card.js +119 -0
- package/dist/im/lark/v3-gate-card.js.map +1 -0
- package/dist/im/lark/v3-loop-grant-card-handler.d.ts +28 -0
- package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-loop-grant-card-handler.js +90 -0
- package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -0
- package/dist/im/lark/v3-loop-grant-card.d.ts +46 -0
- package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -0
- package/dist/im/lark/v3-loop-grant-card.js +119 -0
- package/dist/im/lark/v3-loop-grant-card.js.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.d.ts +29 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.js +96 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card.d.ts +52 -0
- package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card.js +123 -0
- package/dist/im/lark/v3-revisit-grant-card.js.map +1 -0
- package/dist/im/lark/workflow-cards.d.ts.map +1 -1
- package/dist/im/lark/workflow-cards.js +5 -1
- package/dist/im/lark/workflow-cards.js.map +1 -1
- package/dist/im/lark/workflow-progress-card.d.ts +1 -1
- package/dist/im/lark/workflow-progress-card.js +1 -1
- package/dist/im/lark/workflow-slash-command.d.ts +28 -0
- package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
- package/dist/im/lark/workflow-slash-command.js +61 -5
- package/dist/im/lark/workflow-slash-command.js.map +1 -1
- package/dist/platform/binding.d.ts +6 -0
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +17 -0
- package/dist/platform/binding.js.map +1 -1
- package/dist/platform/tunnel-client.d.ts +2 -0
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +1 -0
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/card-prefs-store.d.ts +4 -0
- package/dist/services/card-prefs-store.d.ts.map +1 -1
- package/dist/services/card-prefs-store.js +19 -0
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/oncall-store.d.ts +25 -0
- package/dist/services/oncall-store.d.ts.map +1 -1
- package/dist/services/oncall-store.js +56 -0
- package/dist/services/oncall-store.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts.map +1 -1
- package/dist/services/transcript-resolver.js +21 -4
- package/dist/services/transcript-resolver.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +7 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +33 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +208 -4
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/terminal-favicon.d.ts +2 -0
- package/dist/utils/terminal-favicon.d.ts.map +1 -0
- package/dist/utils/terminal-favicon.js +5 -0
- package/dist/utils/terminal-favicon.js.map +1 -0
- package/dist/worker.js +152 -8
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +80 -80
- package/dist/workflows/events/payloads.d.ts +4 -4
- package/dist/workflows/events/schema.d.ts +16 -16
- package/dist/workflows/v3/architect.d.ts +37 -0
- package/dist/workflows/v3/architect.d.ts.map +1 -0
- package/dist/workflows/v3/architect.js +226 -0
- package/dist/workflows/v3/architect.js.map +1 -0
- package/dist/workflows/v3/bot-resolve.d.ts +21 -0
- package/dist/workflows/v3/bot-resolve.d.ts.map +1 -0
- package/dist/workflows/v3/bot-resolve.js +48 -0
- package/dist/workflows/v3/bot-resolve.js.map +1 -0
- package/dist/workflows/v3/cli-run.d.ts +24 -0
- package/dist/workflows/v3/cli-run.d.ts.map +1 -0
- package/dist/workflows/v3/cli-run.js +265 -0
- package/dist/workflows/v3/cli-run.js.map +1 -0
- package/dist/workflows/v3/contract.d.ts +302 -0
- package/dist/workflows/v3/contract.d.ts.map +1 -0
- package/dist/workflows/v3/contract.js +91 -0
- package/dist/workflows/v3/contract.js.map +1 -0
- package/dist/workflows/v3/daemon-run.d.ts +311 -0
- package/dist/workflows/v3/daemon-run.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-run.js +775 -0
- package/dist/workflows/v3/daemon-run.js.map +1 -0
- package/dist/workflows/v3/dag.d.ts +332 -0
- package/dist/workflows/v3/dag.d.ts.map +1 -0
- package/dist/workflows/v3/dag.js +1040 -0
- package/dist/workflows/v3/dag.js.map +1 -0
- package/dist/workflows/v3/ephemeral-pool.d.ts +29 -0
- package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -0
- package/dist/workflows/v3/ephemeral-pool.js +331 -0
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -0
- package/dist/workflows/v3/grill-state.d.ts +92 -0
- package/dist/workflows/v3/grill-state.d.ts.map +1 -0
- package/dist/workflows/v3/grill-state.js +151 -0
- package/dist/workflows/v3/grill-state.js.map +1 -0
- package/dist/workflows/v3/host.d.ts +88 -0
- package/dist/workflows/v3/host.d.ts.map +1 -0
- package/dist/workflows/v3/host.js +349 -0
- package/dist/workflows/v3/host.js.map +1 -0
- package/dist/workflows/v3/human-gate.d.ts +85 -0
- package/dist/workflows/v3/human-gate.d.ts.map +1 -0
- package/dist/workflows/v3/human-gate.js +153 -0
- package/dist/workflows/v3/human-gate.js.map +1 -0
- package/dist/workflows/v3/journal.d.ts +207 -0
- package/dist/workflows/v3/journal.d.ts.map +1 -0
- package/dist/workflows/v3/journal.js +74 -0
- package/dist/workflows/v3/journal.js.map +1 -0
- package/dist/workflows/v3/manifest.d.ts +17 -0
- package/dist/workflows/v3/manifest.d.ts.map +1 -0
- package/dist/workflows/v3/manifest.js +266 -0
- package/dist/workflows/v3/manifest.js.map +1 -0
- package/dist/workflows/v3/ops-projection.d.ts +110 -0
- package/dist/workflows/v3/ops-projection.d.ts.map +1 -0
- package/dist/workflows/v3/ops-projection.js +0 -0
- package/dist/workflows/v3/ops-projection.js.map +1 -0
- package/dist/workflows/v3/orchestrator.d.ts +168 -0
- package/dist/workflows/v3/orchestrator.d.ts.map +1 -0
- package/dist/workflows/v3/orchestrator.js +417 -0
- package/dist/workflows/v3/orchestrator.js.map +1 -0
- package/dist/workflows/v3/runtime.d.ts +193 -0
- package/dist/workflows/v3/runtime.d.ts.map +1 -0
- package/dist/workflows/v3/runtime.js +1284 -0
- package/dist/workflows/v3/runtime.js.map +1 -0
- package/dist/workflows/v3/spec.d.ts +32 -0
- package/dist/workflows/v3/spec.d.ts.map +1 -0
- package/dist/workflows/v3/spec.js +173 -0
- package/dist/workflows/v3/spec.js.map +1 -0
- package/dist/workflows/v3/state.d.ts +74 -0
- package/dist/workflows/v3/state.d.ts.map +1 -0
- package/dist/workflows/v3/state.js +353 -0
- package/dist/workflows/v3/state.js.map +1 -0
- package/package.json +2 -2
- package/dist/dashboard/web/workflow-catalog.d.ts +0 -2
- package/dist/dashboard/web/workflow-catalog.d.ts.map +0 -1
- package/dist/dashboard/web/workflow-catalog.js +0 -323
- package/dist/dashboard/web/workflow-catalog.js.map +0 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 node manifest validator.
|
|
3
|
+
*
|
|
4
|
+
* Goal-mode workers write `manifest.json` at BOTMUX_GOAL_MANIFEST_PATH.
|
|
5
|
+
* The runtime treats that file as untrusted agent output: this module checks
|
|
6
|
+
* the shape, status invariants, path containment, file metadata, and hashes
|
|
7
|
+
* before downstream nodes receive any file paths.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
import { promises as fs } from 'node:fs';
|
|
11
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
12
|
+
import { MANIFEST_FILE_KINDS, MANIFEST_PREVIEW_MAX_BYTES, MANIFEST_SCHEMA_VERSION, MANIFEST_SUMMARY_MAX_BYTES, MANIFEST_STATUSES, } from './contract.js';
|
|
13
|
+
export class ManifestValidationError extends Error {
|
|
14
|
+
problems;
|
|
15
|
+
constructor(problems) {
|
|
16
|
+
super(`Invalid v3 manifest:\n - ${problems.join('\n - ')}`);
|
|
17
|
+
this.problems = problems;
|
|
18
|
+
this.name = 'ManifestValidationError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function readAndValidateManifest(manifestPath, outputDir) {
|
|
22
|
+
let raw;
|
|
23
|
+
try {
|
|
24
|
+
raw = await fs.readFile(manifestPath, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
throw new ManifestValidationError([
|
|
28
|
+
`manifest not readable at ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
29
|
+
]);
|
|
30
|
+
}
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
throw new ManifestValidationError([
|
|
37
|
+
`manifest is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
return validateManifest(parsed, outputDir);
|
|
41
|
+
}
|
|
42
|
+
export async function validateManifest(value, outputDir) {
|
|
43
|
+
const problems = [];
|
|
44
|
+
const outputRoot = await canonicalDir(outputDir, problems, 'outputDir');
|
|
45
|
+
if (!isRecord(value)) {
|
|
46
|
+
throw new ManifestValidationError(['manifest root must be an object']);
|
|
47
|
+
}
|
|
48
|
+
const schemaVersion = value.schemaVersion;
|
|
49
|
+
if (schemaVersion !== MANIFEST_SCHEMA_VERSION) {
|
|
50
|
+
problems.push(`schemaVersion must be ${MANIFEST_SCHEMA_VERSION} (got ${JSON.stringify(schemaVersion)})`);
|
|
51
|
+
}
|
|
52
|
+
const status = value.status;
|
|
53
|
+
if (typeof status !== 'string' || !isManifestStatus(status)) {
|
|
54
|
+
problems.push(`status must be one of ${MANIFEST_STATUSES.join(' | ')} (got ${JSON.stringify(status)})`);
|
|
55
|
+
}
|
|
56
|
+
const summary = normalizeString(value.summary, 'summary', MANIFEST_SUMMARY_MAX_BYTES, problems);
|
|
57
|
+
const filesRaw = value.files;
|
|
58
|
+
if (!Array.isArray(filesRaw)) {
|
|
59
|
+
problems.push('files must be an array');
|
|
60
|
+
}
|
|
61
|
+
const error = normalizeError(value.error, problems);
|
|
62
|
+
const files = [];
|
|
63
|
+
if (Array.isArray(filesRaw)) {
|
|
64
|
+
for (let i = 0; i < filesRaw.length; i++) {
|
|
65
|
+
const file = await normalizeFile(filesRaw[i], i, outputRoot, problems);
|
|
66
|
+
if (file)
|
|
67
|
+
files.push(file);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (status === 'ok') {
|
|
71
|
+
if (files.length < 1)
|
|
72
|
+
problems.push('status "ok" requires at least one file');
|
|
73
|
+
if (value.error !== undefined)
|
|
74
|
+
problems.push('status "ok" must not include error');
|
|
75
|
+
}
|
|
76
|
+
else if (status === 'fail') {
|
|
77
|
+
if (!error)
|
|
78
|
+
problems.push('status "fail" requires error');
|
|
79
|
+
}
|
|
80
|
+
if (problems.length > 0)
|
|
81
|
+
throw new ManifestValidationError(problems);
|
|
82
|
+
return {
|
|
83
|
+
schemaVersion: MANIFEST_SCHEMA_VERSION,
|
|
84
|
+
status: status,
|
|
85
|
+
summary,
|
|
86
|
+
...(error ? { error } : {}),
|
|
87
|
+
files,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function resolveManifestFilePath(outputDir, relativePath) {
|
|
91
|
+
return resolve(outputDir, relativePath);
|
|
92
|
+
}
|
|
93
|
+
function isRecord(value) {
|
|
94
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
95
|
+
}
|
|
96
|
+
async function canonicalDir(path, problems, label) {
|
|
97
|
+
try {
|
|
98
|
+
const st = await fs.stat(path);
|
|
99
|
+
if (!st.isDirectory()) {
|
|
100
|
+
problems.push(`${label} is not a directory: ${path}`);
|
|
101
|
+
return resolve(path);
|
|
102
|
+
}
|
|
103
|
+
return await fs.realpath(path);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
problems.push(`${label} is not accessible at ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
107
|
+
return resolve(path);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function normalizeString(value, field, maxBytes, problems) {
|
|
111
|
+
if (typeof value !== 'string') {
|
|
112
|
+
problems.push(`${field} must be a string`);
|
|
113
|
+
return '';
|
|
114
|
+
}
|
|
115
|
+
return truncateUtf8(value, maxBytes);
|
|
116
|
+
}
|
|
117
|
+
function normalizeError(value, problems) {
|
|
118
|
+
if (value === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
if (!isRecord(value)) {
|
|
121
|
+
problems.push('error must be an object when present');
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const code = value.code;
|
|
125
|
+
const message = value.message;
|
|
126
|
+
const retryable = value.retryable;
|
|
127
|
+
if (typeof code !== 'string' || code.trim() === '')
|
|
128
|
+
problems.push('error.code must be a non-empty string');
|
|
129
|
+
if (typeof message !== 'string' || message.trim() === '')
|
|
130
|
+
problems.push('error.message must be a non-empty string');
|
|
131
|
+
if (retryable !== undefined && typeof retryable !== 'boolean')
|
|
132
|
+
problems.push('error.retryable must be boolean when present');
|
|
133
|
+
if (typeof code !== 'string' || typeof message !== 'string')
|
|
134
|
+
return undefined;
|
|
135
|
+
return {
|
|
136
|
+
code,
|
|
137
|
+
message,
|
|
138
|
+
...(typeof retryable === 'boolean' ? { retryable } : {}),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async function normalizeFile(value, index, outputRoot, problems) {
|
|
142
|
+
const prefix = `files[${index}]`;
|
|
143
|
+
if (!isRecord(value)) {
|
|
144
|
+
problems.push(`${prefix} must be an object`);
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
const name = value.name;
|
|
148
|
+
const path = value.path;
|
|
149
|
+
const kind = value.kind;
|
|
150
|
+
const bytes = value.bytes;
|
|
151
|
+
const sha256 = value.sha256;
|
|
152
|
+
const mime = value.mime;
|
|
153
|
+
if (typeof name !== 'string' || name.trim() === '')
|
|
154
|
+
problems.push(`${prefix}.name must be a non-empty string`);
|
|
155
|
+
if (typeof path !== 'string' || path.trim() === '')
|
|
156
|
+
problems.push(`${prefix}.path must be a non-empty relative string`);
|
|
157
|
+
if (typeof kind !== 'string' || !isManifestFileKind(kind)) {
|
|
158
|
+
problems.push(`${prefix}.kind must be one of ${MANIFEST_FILE_KINDS.join(' | ')}`);
|
|
159
|
+
}
|
|
160
|
+
if (typeof bytes !== 'number' || !Number.isInteger(bytes) || bytes < 0) {
|
|
161
|
+
problems.push(`${prefix}.bytes must be a non-negative integer`);
|
|
162
|
+
}
|
|
163
|
+
if (typeof sha256 !== 'string')
|
|
164
|
+
problems.push(`${prefix}.sha256 must be a string`);
|
|
165
|
+
if (typeof mime !== 'string' || mime.trim() === '')
|
|
166
|
+
problems.push(`${prefix}.mime must be a non-empty string`);
|
|
167
|
+
const preview = value.preview === undefined
|
|
168
|
+
? undefined
|
|
169
|
+
: normalizeString(value.preview, `${prefix}.preview`, MANIFEST_PREVIEW_MAX_BYTES, problems);
|
|
170
|
+
if (typeof path === 'string') {
|
|
171
|
+
await validateFileOnDisk(prefix, outputRoot, path, kind, bytes, sha256, problems);
|
|
172
|
+
}
|
|
173
|
+
if (typeof name !== 'string' ||
|
|
174
|
+
typeof path !== 'string' ||
|
|
175
|
+
typeof kind !== 'string' ||
|
|
176
|
+
!isManifestFileKind(kind) ||
|
|
177
|
+
typeof bytes !== 'number' ||
|
|
178
|
+
typeof sha256 !== 'string' ||
|
|
179
|
+
typeof mime !== 'string') {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
name,
|
|
184
|
+
path,
|
|
185
|
+
kind,
|
|
186
|
+
bytes,
|
|
187
|
+
sha256,
|
|
188
|
+
mime,
|
|
189
|
+
...(preview !== undefined ? { preview } : {}),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
async function validateFileOnDisk(prefix, outputRoot, relativePath, kind, bytes, sha256, problems) {
|
|
193
|
+
if (isAbsolute(relativePath)) {
|
|
194
|
+
problems.push(`${prefix}.path must be relative to outputDir`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (relativePath.includes('\0')) {
|
|
198
|
+
problems.push(`${prefix}.path must not contain NUL bytes`);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const candidate = resolveManifestFilePath(outputRoot, relativePath);
|
|
202
|
+
let real;
|
|
203
|
+
try {
|
|
204
|
+
real = await fs.realpath(candidate);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
problems.push(`${prefix}.path does not exist under outputDir: ${relativePath} (${err instanceof Error ? err.message : String(err)})`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (!isPathInside(outputRoot, real)) {
|
|
211
|
+
problems.push(`${prefix}.path escapes outputDir: ${relativePath}`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
let st;
|
|
215
|
+
try {
|
|
216
|
+
st = await fs.stat(real);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
problems.push(`${prefix}.path is not stat-able: ${relativePath} (${err instanceof Error ? err.message : String(err)})`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (kind === 'directory') {
|
|
223
|
+
if (!st.isDirectory())
|
|
224
|
+
problems.push(`${prefix}.kind is directory but path is not a directory`);
|
|
225
|
+
if (sha256 !== '')
|
|
226
|
+
problems.push(`${prefix}.sha256 must be "" for directory entries`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (st.isDirectory()) {
|
|
230
|
+
problems.push(`${prefix}.path is a directory but kind is ${JSON.stringify(kind)}`);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (!st.isFile()) {
|
|
234
|
+
problems.push(`${prefix}.path must be a regular file or directory`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (typeof bytes === 'number' && st.size !== bytes) {
|
|
238
|
+
problems.push(`${prefix}.bytes mismatch: manifest=${bytes}, actual=${st.size}`);
|
|
239
|
+
}
|
|
240
|
+
if (typeof sha256 === 'string') {
|
|
241
|
+
const actual = await sha256File(real);
|
|
242
|
+
if (actual !== sha256)
|
|
243
|
+
problems.push(`${prefix}.sha256 mismatch`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function isManifestFileKind(value) {
|
|
247
|
+
return MANIFEST_FILE_KINDS.includes(value);
|
|
248
|
+
}
|
|
249
|
+
function isManifestStatus(value) {
|
|
250
|
+
return MANIFEST_STATUSES.includes(value);
|
|
251
|
+
}
|
|
252
|
+
function isPathInside(parentReal, childReal) {
|
|
253
|
+
const parent = parentReal.endsWith('/') ? parentReal : `${parentReal}/`;
|
|
254
|
+
return childReal === parentReal || childReal.startsWith(parent);
|
|
255
|
+
}
|
|
256
|
+
async function sha256File(path) {
|
|
257
|
+
const buf = await fs.readFile(path);
|
|
258
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
259
|
+
}
|
|
260
|
+
function truncateUtf8(value, maxBytes) {
|
|
261
|
+
const buf = Buffer.from(value, 'utf-8');
|
|
262
|
+
if (buf.length <= maxBytes)
|
|
263
|
+
return value;
|
|
264
|
+
return buf.subarray(0, maxBytes).toString('utf-8').replace(/\uFFFD+$/g, '');
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/workflows/v3/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { type V3RunStatus } from './state.js';
|
|
2
|
+
import type { V3NodeStatus } from './orchestrator.js';
|
|
3
|
+
export declare function isValidRunId(runId: string): boolean;
|
|
4
|
+
export declare function isValidWaitId(waitId: string): boolean;
|
|
5
|
+
/** Default run root, aligned with cli-run.ts / grill-state.ts. */
|
|
6
|
+
export declare function defaultRunsDir(): string;
|
|
7
|
+
export interface WebTerminalView {
|
|
8
|
+
sessionId: string;
|
|
9
|
+
webPort?: number;
|
|
10
|
+
/** `live` while the node's work worker is in flight; `closed` once the node
|
|
11
|
+
* reached a terminal verdict (then replay via the pty-log endpoint). */
|
|
12
|
+
status: 'live' | 'closed';
|
|
13
|
+
}
|
|
14
|
+
export interface RunNodeView {
|
|
15
|
+
id: string;
|
|
16
|
+
status: V3NodeStatus;
|
|
17
|
+
/** Upstream node ids (graph edges) — from the persisted dag.json. */
|
|
18
|
+
depends: string[];
|
|
19
|
+
goal?: string;
|
|
20
|
+
attemptId?: string;
|
|
21
|
+
/** Present once the node's worker reported `nodeSessionReady`. */
|
|
22
|
+
webTerminal?: WebTerminalView;
|
|
23
|
+
/** Whether a raw PTY log exists for replay. The absolute path is NOT exposed
|
|
24
|
+
* to the frontend (codex review) — a replay endpoint locates it server-side
|
|
25
|
+
* via `ptyLogPathFor(runsDir, runId, nodeId)`. */
|
|
26
|
+
hasPtyLog: boolean;
|
|
27
|
+
/** Whether the node produced a manifest (i.e. succeeded with a recorded
|
|
28
|
+
* manifest). The raw fs path is NOT exposed — same rationale as `hasPtyLog`:
|
|
29
|
+
* `GET /api/v3/runs/:id` is link-shareable public-read, so a public reader
|
|
30
|
+
* must never see absolute `/root/.botmux/...` paths (codex security review
|
|
31
|
+
* 2026-06-02). A download, if ever needed, goes through a cookie-auth
|
|
32
|
+
* endpoint that locates the file server-side via runId/nodeId. */
|
|
33
|
+
hasManifest: boolean;
|
|
34
|
+
/** For blocked/failed nodes: the coarse error class + the node's
|
|
35
|
+
* self-reported `manifest.error.code` (e.g. AUTH_REQUIRED). The free-text
|
|
36
|
+
* `message` is deliberately NOT projected — it can quote validator problems
|
|
37
|
+
* containing absolute paths, and this view is link-shareable public-read. */
|
|
38
|
+
errorClass?: string;
|
|
39
|
+
errorCode?: string;
|
|
40
|
+
/** True for composite loop nodes (from dag.json). */
|
|
41
|
+
isLoop?: boolean;
|
|
42
|
+
/** Composite loop progress (loop nodes only, once started). `lastDecision`
|
|
43
|
+
* is the coarse enum; the free-text decision `detail` is deliberately NOT
|
|
44
|
+
* projected (it can quote agent-written result strings) — same public-read
|
|
45
|
+
* rationale as `message`. */
|
|
46
|
+
loopState?: {
|
|
47
|
+
iteration: number;
|
|
48
|
+
maxIterations?: number;
|
|
49
|
+
granted: number;
|
|
50
|
+
lastDecision?: 'exit' | 'continue' | 'exhausted';
|
|
51
|
+
/** Per-iteration verdict history (enum ONLY — same no-detail rationale).
|
|
52
|
+
* Lets the dashboard draw an honest round timeline instead of guessing
|
|
53
|
+
* past verdicts from `lastDecision`. */
|
|
54
|
+
decisions: Array<{
|
|
55
|
+
iteration: number;
|
|
56
|
+
decision: 'exit' | 'continue' | 'exhausted';
|
|
57
|
+
}>;
|
|
58
|
+
/** Body template shape (authored ids + body-internal depends) — the
|
|
59
|
+
* dashboard lays every round's mini-dag on this skeleton, so a round
|
|
60
|
+
* whose later nodes have not dispatched yet still shows its full shape
|
|
61
|
+
* (undispatched slots render as pending ghosts). */
|
|
62
|
+
bodyTemplate: Array<{
|
|
63
|
+
id: string;
|
|
64
|
+
depends: string[];
|
|
65
|
+
}>;
|
|
66
|
+
};
|
|
67
|
+
/** For loop BODY INSTANCE nodes (`repairLoop.i001.code`): the structured
|
|
68
|
+
* membership ref from the dispatch event. The id stays opaque — group by
|
|
69
|
+
* THIS, never parse the id string. */
|
|
70
|
+
loop?: {
|
|
71
|
+
loopId: string;
|
|
72
|
+
iteration: number;
|
|
73
|
+
bodyNodeId: string;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export interface RunView {
|
|
77
|
+
runId: string;
|
|
78
|
+
runStatus: V3RunStatus;
|
|
79
|
+
failedNodeId?: string;
|
|
80
|
+
blockedNodeId?: string;
|
|
81
|
+
nodes: RunNodeView[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Project an already-resolved run dir into a `RunView`. Read-only + defensive:
|
|
85
|
+
* a missing journal / dag still yields a (possibly sparse) view rather than
|
|
86
|
+
* throwing — the dashboard polls this while a run is mid-flight.
|
|
87
|
+
*/
|
|
88
|
+
export declare function projectRun(runId: string, runDir: string): RunView;
|
|
89
|
+
/**
|
|
90
|
+
* Validate a caller-supplied `runId`, resolve it under `runsDir` (re-checking
|
|
91
|
+
* the join stays inside runsDir — defense in depth), and project. Returns
|
|
92
|
+
* `undefined` for an invalid id / traversal attempt / missing run.
|
|
93
|
+
*/
|
|
94
|
+
export declare function projectRunById(runsDir: string, runId: string): RunView | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Server-side resolver for a node's raw PTY log path (for the replay endpoint).
|
|
97
|
+
* The absolute path is NEVER in the public RunView — callers locate it here by
|
|
98
|
+
* runId/nodeId, and it's re-validated to be inside the run dir (defense in
|
|
99
|
+
* depth) before any read. Returns undefined for invalid id / traversal / no log.
|
|
100
|
+
*/
|
|
101
|
+
export declare function ptyLogPathFor(runsDir: string, runId: string, nodeId: string): string | undefined;
|
|
102
|
+
export interface RunSummary {
|
|
103
|
+
runId: string;
|
|
104
|
+
runStatus: V3RunStatus;
|
|
105
|
+
nodeCount: number;
|
|
106
|
+
}
|
|
107
|
+
/** List runs under `runsDir` (dirs that have a journal.ndjson), newest-first by
|
|
108
|
+
* name (runIds carry a `<slug>-<yymmdd-hhmm>` stamp so name sort ≈ time sort). */
|
|
109
|
+
export declare function listRuns(runsDir: string): RunSummary[];
|
|
110
|
+
//# sourceMappingURL=ops-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-projection.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/ops-projection.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAQD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IAIjB;6EACyE;IACzE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,qEAAqE;IACrE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;uDAEmD;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;uEAKmE;IACnE,WAAW,EAAE,OAAO,CAAC;IACrB;;;kFAG8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;kCAG8B;IAC9B,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;QACjD;;iDAEyC;QACzC,SAAS,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;SAAE,CAAC,CAAC;QACrF;;;6DAGqD;QACrD,YAAY,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;KACxD,CAAC;IACF;;2CAEuC;IACvC,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AA+DD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAuHjE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAOlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyBhG;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;mFACmF;AACnF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAUtD"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-projection.js","sourceRoot":"","sources":["../../../src/workflows/v3/ops-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAG3D;uEACuE;AACvE,MAAM,SAAS,GAAG,oCAAoC,CAAC;AACvD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;+EAI+E;AAC/E,MAAM,UAAU,GAAG,qCAAqC,CAAC;AACzD,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAsFD;;;iEAGiE;AACjE,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,CAAC;SACL,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAE,CAA+B,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;SAC9F,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAwB,CAAC;QACxE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAe,EAAE;YACxC,MAAM,CAAC,GAAG,GAAmH,CAAC;YAC9H,IAAI,IAAyB,CAAC;YAC9B,MAAM,SAAS,GAAI,CAAC,CAAC,IAAwC,EAAE,KAAK,CAAC;YACrE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClD,IAAI,GAAG,IAAI,GAAG,CACZ,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAClB,MAAM,EAAE,GAAG,CAAwD,CAAC;oBACpE,OAAO;wBACL,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;wBACb;4BACE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC;4BACjC,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;yBACxD;qBACF,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;gBAChC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACrD,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS;gBACtC,aAAa,EAAE,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBAChF,IAAI;aACL,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACnD,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E,IAAI,MAAM,GAAmC,EAAE,CAAC;IAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwE,CAAC;IACjG,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsD,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqE,CAAC;IAC9F,MAAM,aAAa,GAAG,IAAI,GAAG,EAAqF,CAAC;IACnH,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,8CAA8C;QACzE,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAC9C,0EAA0E;YAC1E,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC;iBAC5E,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,6EAA6E;IAC7E,gDAAgD;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM;QACzB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;QAChD,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3B,2EAA2E;IAC3E,0EAA0E;IAC1E,oDAAoD;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,QAAQ;QAAE,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACxG,MAAM,YAAY,GAAG,CAAC,EAAU,EAAoD,EAAE;QACpF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;iBACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;iBAChE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,KAAK,GAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,SAAS,CAAiB,CAAC;QACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAgB;YACxB,EAAE;YACF,MAAM;YACN,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE;YACxD,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI;YACzC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC;YACpC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;SAC/B,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,WAAW,GAAG;gBACjB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;aACjD,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,OAAO,EAAE,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG;gBACf,SAAS,EAAE,EAAE,CAAC,SAAS;gBACvB,aAAa,EAAE,OAAO,EAAE,aAAa;gBACrC,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;gBACtC,YAAY,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aACrG,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,KAAa;IAC3D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAa,EAAE,MAAc;IAC1E,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,QAA4B,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU;YAAE,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3C,CAAC;AAQD;mFACmF;AACnF,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAChE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YAAE,SAAS;QACvE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 orchestrator — pure decision layer.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors v0.2's `orchestrator.ts` pattern: a pure function maps the current
|
|
5
|
+
* run state + DAG to a list of action descriptors. The runtime (`runtime.ts`)
|
|
6
|
+
* owns every side effect — journal/STATE writes, ephemeral-worker dispatch via
|
|
7
|
+
* `runNode`, humanGate card posting — and the per-bot/per-CLI/global
|
|
8
|
+
* concurrency caps. Keeping the decision pure makes the critical-path
|
|
9
|
+
* semantics testable without spawning workers or touching the filesystem.
|
|
10
|
+
*
|
|
11
|
+
* MVP scope: static DAG, fail-fast. No loops / decisions / dynamic expand
|
|
12
|
+
* (those are deferred — design Q3/§7). Gate set is frozen at authoring time;
|
|
13
|
+
* the orchestrator never invents or skips a gate (design Q10).
|
|
14
|
+
*/
|
|
15
|
+
import { type V3Dag } from './dag.js';
|
|
16
|
+
import type { V3RunFailureReason } from './journal.js';
|
|
17
|
+
import type { V3LoopRef } from './journal.js';
|
|
18
|
+
export type V3NodeStatus = 'pending' | 'gateWaiting' | 'running' | 'done' | 'skipped' | 'cancelled' | 'blocked' | 'superseded' | 'failed';
|
|
19
|
+
export interface V3NodeState {
|
|
20
|
+
status: V3NodeStatus;
|
|
21
|
+
/** True once an approved humanGate cleared this node — so after approval the
|
|
22
|
+
* next tick dispatches work instead of re-dispatching the gate. A rejected
|
|
23
|
+
* gate transitions the node straight to `failed` (set by the runtime), so
|
|
24
|
+
* this flag only ever records the approved case. */
|
|
25
|
+
gateCleared?: boolean;
|
|
26
|
+
/** The current live runtime instance of this DEFINITION node (`A#002`).
|
|
27
|
+
* Set on dispatch; cleared when a revisit supersedes it (the node then
|
|
28
|
+
* re-dispatches a fresh instance). Absent on the pre-instance-layer path
|
|
29
|
+
* (plain nodeId-keyed events) and loop body expansions. */
|
|
30
|
+
effectiveInstanceId?: string;
|
|
31
|
+
}
|
|
32
|
+
/** nodeId → state. A node absent from the map is treated as `pending`. */
|
|
33
|
+
export type V3RunState = Map<string, V3NodeState>;
|
|
34
|
+
/**
|
|
35
|
+
* Per-loop composite state, folded from the loop lifecycle events. A loop
|
|
36
|
+
* absent from the map has not started. The loop's coarse status (running /
|
|
37
|
+
* blocked / done) lives in the regular node-state map under the loop's id;
|
|
38
|
+
* this struct carries what that one enum can't: where the iteration cursor is
|
|
39
|
+
* and what the last decision said.
|
|
40
|
+
*/
|
|
41
|
+
export interface V3LoopState {
|
|
42
|
+
/** Current iteration, 1-based; 0 between loopStarted and the first
|
|
43
|
+
* loopIterationStarted. */
|
|
44
|
+
iteration: number;
|
|
45
|
+
/** True once the CURRENT iteration's decision event is recorded (reset by
|
|
46
|
+
* the next loopIterationStarted). */
|
|
47
|
+
decided: boolean;
|
|
48
|
+
/** The latest decision — drives what the orchestrator does next. */
|
|
49
|
+
lastDecision?: 'exit' | 'continue' | 'exhausted';
|
|
50
|
+
/** Extra iterations granted (each loopIterationGranted adds one); the
|
|
51
|
+
* effective budget is maxIterations + granted. */
|
|
52
|
+
granted: number;
|
|
53
|
+
/** An appended-but-unconsumed grant (cleared by the next
|
|
54
|
+
* loopIterationStarted) — the idempotency key for "already granted". */
|
|
55
|
+
pendingGrant: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** loopId → loop state. */
|
|
58
|
+
export type V3LoopRunState = Map<string, V3LoopState>;
|
|
59
|
+
export interface V3EdgeState {
|
|
60
|
+
active: boolean;
|
|
61
|
+
sourceAttemptId: string;
|
|
62
|
+
}
|
|
63
|
+
/** `${from}->${to}` → conditional edge state. */
|
|
64
|
+
export type V3EdgeRunState = Map<string, V3EdgeState>;
|
|
65
|
+
export interface V3OmittedInput {
|
|
66
|
+
from: string;
|
|
67
|
+
reason: 'edgeInactive' | 'sourceSkipped' | 'sourceCancelled' | 'earlyRelease';
|
|
68
|
+
}
|
|
69
|
+
export type V3Action =
|
|
70
|
+
/** Read one source result.json once and append edgeResolved. */
|
|
71
|
+
{
|
|
72
|
+
kind: 'resolveEdge';
|
|
73
|
+
from: string;
|
|
74
|
+
to: string;
|
|
75
|
+
}
|
|
76
|
+
/** Mark a node skipped because its triggerRule cannot be satisfied. */
|
|
77
|
+
| {
|
|
78
|
+
kind: 'skipNode';
|
|
79
|
+
nodeId: string;
|
|
80
|
+
detail?: string;
|
|
81
|
+
}
|
|
82
|
+
/** Abort an early-release loser whose remaining products are no longer used. */
|
|
83
|
+
| {
|
|
84
|
+
kind: 'cancelNode';
|
|
85
|
+
nodeId: string;
|
|
86
|
+
byNodeId: string;
|
|
87
|
+
detail?: string;
|
|
88
|
+
}
|
|
89
|
+
/** Post the humanGate approval card + persist a `waits/<id>.json` (Q10). */
|
|
90
|
+
| {
|
|
91
|
+
kind: 'dispatchGate';
|
|
92
|
+
nodeId: string;
|
|
93
|
+
instanceId?: string;
|
|
94
|
+
}
|
|
95
|
+
/** Spawn an ephemeral worker via `runNode` for this node's goal. `loop` is
|
|
96
|
+
* set for body-instance dispatches (the runtime synthesizes the instance
|
|
97
|
+
* node from the loop's body definition). `instanceId` is set when this is a
|
|
98
|
+
* cross-node-revisit RE-DISPATCH (`A#002`): the prior instance was
|
|
99
|
+
* superseded, so decideNext computes the next instance number deterministically
|
|
100
|
+
* from `state.instances` (constraint 4 — the action carries it, the runtime
|
|
101
|
+
* does not guess). Absent on a first dispatch / loop body (those keep the
|
|
102
|
+
* pre-instance-layer path until the runtime brick threads instances through). */
|
|
103
|
+
| {
|
|
104
|
+
kind: 'dispatchWork';
|
|
105
|
+
nodeId: string;
|
|
106
|
+
instanceId?: string;
|
|
107
|
+
loop?: V3LoopRef;
|
|
108
|
+
omitted?: V3OmittedInput[];
|
|
109
|
+
}
|
|
110
|
+
/** Outer deps of a loop are done → append loopStarted. */
|
|
111
|
+
| {
|
|
112
|
+
kind: 'startLoop';
|
|
113
|
+
loopId: string;
|
|
114
|
+
}
|
|
115
|
+
/** Begin iteration N (first, after a continue-decision, or after a grant). */
|
|
116
|
+
| {
|
|
117
|
+
kind: 'startLoopIteration';
|
|
118
|
+
loopId: string;
|
|
119
|
+
iteration: number;
|
|
120
|
+
}
|
|
121
|
+
/** Current iteration's body is fully done and undecided → the runtime reads
|
|
122
|
+
* the exit node's result.json, evaluates exit.when, appends the decision. */
|
|
123
|
+
| {
|
|
124
|
+
kind: 'evaluateLoopIteration';
|
|
125
|
+
loopId: string;
|
|
126
|
+
iteration: number;
|
|
127
|
+
}
|
|
128
|
+
/** Decision was 'exit' → seal the loop with a nodeSucceeded on the LOOP id
|
|
129
|
+
* carrying the output projection's manifest (downstream inputs/deps then
|
|
130
|
+
* treat the loop like any done node — zero special-casing). */
|
|
131
|
+
| {
|
|
132
|
+
kind: 'completeLoop';
|
|
133
|
+
loopId: string;
|
|
134
|
+
iteration: number;
|
|
135
|
+
}
|
|
136
|
+
/** Terminal: every node done; the run's product is the sink set. */
|
|
137
|
+
| {
|
|
138
|
+
kind: 'completeRunSucceeded';
|
|
139
|
+
}
|
|
140
|
+
/** Terminal (fail-fast): a node failed, so the run cannot proceed. */
|
|
141
|
+
| {
|
|
142
|
+
kind: 'completeRunFailed';
|
|
143
|
+
failedNodeId?: string;
|
|
144
|
+
reason?: V3RunFailureReason;
|
|
145
|
+
detail?: string;
|
|
146
|
+
}
|
|
147
|
+
/** Terminal-for-now: a node is blocked (contract failure, recoverable).
|
|
148
|
+
* Halts dispatch like failed, but the run can resume via a retry event. */
|
|
149
|
+
| {
|
|
150
|
+
kind: 'completeRunBlocked';
|
|
151
|
+
blockedNodeId: string;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Pure decision: given the current `state`, return every action that can be
|
|
155
|
+
* taken *now*. The runtime applies concurrency caps by acting on a prefix of
|
|
156
|
+
* the returned dispatch actions and re-invoking on the next tick — this
|
|
157
|
+
* function intentionally returns ALL ready dispatches (it does not throttle).
|
|
158
|
+
*
|
|
159
|
+
* Ordering follows topological order so callers see deps-ready nodes first.
|
|
160
|
+
* Fail-fast: the moment any node is `failed`, the only action is
|
|
161
|
+
* `completeRunFailed` (in-flight peers are torn down by the runtime / cancel).
|
|
162
|
+
* When no dispatch is possible and nothing is pending, the run is complete.
|
|
163
|
+
*/
|
|
164
|
+
export declare function decideNext(dag: V3Dag, state: V3RunState, loops?: V3LoopRunState, edges?: V3EdgeRunState, instances?: V3RunState): V3Action[];
|
|
165
|
+
/** Sink nodes — no other node depends on them. Their products are the run's
|
|
166
|
+
* output. Pure helper for the runtime's success path. */
|
|
167
|
+
export declare function findSinks(dag: V3Dag): string[];
|
|
168
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/orchestrator.ts"],"names":[],"mappings":"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"}
|