@caupulican/pi-adaptative 0.90.12 → 0.91.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/README.md +8 -10
- package/dist/bundled-resources/skills/icm-architect/LICENSE +21 -0
- package/dist/bundled-resources/skills/icm-architect/SKILL.md +112 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/CLAUDE.md +27 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/CONTEXT.md +14 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/node.md +29 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/object.md +43 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/process.md +38 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/questionnaire.md +9 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/schema.md +24 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/stage-CONTEXT.md +21 -0
- package/dist/bundled-resources/skills/icm-architect/references/core.md +92 -0
- package/dist/bundled-resources/skills/icm-architect/references/forms.md +182 -0
- package/dist/bundled-resources/skills/icm-architect/references/system-map.md +122 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-paths.d.ts +2 -2
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +1 -0
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +40 -10
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +2 -0
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +9 -0
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +23 -0
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/bash-executor.js +3 -3
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/context/local-graph-memory-provider.d.ts +9 -0
- package/dist/core/context/local-graph-memory-provider.d.ts.map +1 -0
- package/dist/core/context/local-graph-memory-provider.js +122 -0
- package/dist/core/context/local-graph-memory-provider.js.map +1 -0
- package/dist/core/context/tool-output-packer.d.ts +2 -2
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js +3 -3
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +2 -0
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/default-tool-surface.d.ts.map +1 -1
- package/dist/core/default-tool-surface.js +5 -0
- package/dist/core/default-tool-surface.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +1 -0
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +16 -8
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +2 -0
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-context-inheritance-policy.d.ts +3 -3
- package/dist/core/delegation/worker-context-inheritance-policy.js +4 -4
- package/dist/core/delegation/worker-context-inheritance-policy.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +1 -5
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +19 -9
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +2 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.js +6 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +0 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +1 -2
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goals/goal-continuation-controller.d.ts +7 -1
- package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-controller.js +16 -0
- package/dist/core/goals/goal-continuation-controller.js.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.d.ts +3 -0
- package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.js +8 -1
- package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +2 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +1 -0
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +18 -0
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +62 -0
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
- package/dist/core/goals/natural-language-goal.js +4 -2
- package/dist/core/goals/natural-language-goal.js.map +1 -1
- package/dist/core/human-input-controller.d.ts +3 -34
- package/dist/core/human-input-controller.d.ts.map +1 -1
- package/dist/core/human-input-controller.js +3 -161
- package/dist/core/human-input-controller.js.map +1 -1
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/learning/reflection-turn-analysis.d.ts.map +1 -1
- package/dist/core/learning/reflection-turn-analysis.js +10 -1
- package/dist/core/learning/reflection-turn-analysis.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +4 -0
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory-controller.d.ts +3 -0
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +18 -0
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +1 -0
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/orchestration/work-state-projection.d.ts +4 -0
- package/dist/core/orchestration/work-state-projection.d.ts.map +1 -1
- package/dist/core/orchestration/work-state-projection.js +11 -0
- package/dist/core/orchestration/work-state-projection.js.map +1 -1
- package/dist/core/pipelines/context.d.ts +6 -0
- package/dist/core/pipelines/context.d.ts.map +1 -0
- package/dist/core/pipelines/context.js +102 -0
- package/dist/core/pipelines/context.js.map +1 -0
- package/dist/core/pipelines/discover.d.ts +11 -0
- package/dist/core/pipelines/discover.d.ts.map +1 -0
- package/dist/core/pipelines/discover.js +147 -0
- package/dist/core/pipelines/discover.js.map +1 -0
- package/dist/core/pipelines/increment.d.ts +24 -0
- package/dist/core/pipelines/increment.d.ts.map +1 -0
- package/dist/core/pipelines/increment.js +121 -0
- package/dist/core/pipelines/increment.js.map +1 -0
- package/dist/core/pipelines/index.d.ts +8 -0
- package/dist/core/pipelines/index.d.ts.map +1 -0
- package/dist/core/pipelines/index.js +8 -0
- package/dist/core/pipelines/index.js.map +1 -0
- package/dist/core/pipelines/parse-contract.d.ts +10 -0
- package/dist/core/pipelines/parse-contract.d.ts.map +1 -0
- package/dist/core/pipelines/parse-contract.js +105 -0
- package/dist/core/pipelines/parse-contract.js.map +1 -0
- package/dist/core/pipelines/run-state.d.ts +26 -0
- package/dist/core/pipelines/run-state.d.ts.map +1 -0
- package/dist/core/pipelines/run-state.js +135 -0
- package/dist/core/pipelines/run-state.js.map +1 -0
- package/dist/core/pipelines/session-pipeline-run.d.ts +6 -0
- package/dist/core/pipelines/session-pipeline-run.d.ts.map +1 -0
- package/dist/core/pipelines/session-pipeline-run.js +18 -0
- package/dist/core/pipelines/session-pipeline-run.js.map +1 -0
- package/dist/core/pipelines/types.d.ts +91 -0
- package/dist/core/pipelines/types.d.ts.map +1 -0
- package/dist/core/pipelines/types.js +44 -0
- package/dist/core/pipelines/types.js.map +1 -0
- package/dist/core/reflection-controller.d.ts +2 -0
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +53 -30
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +21 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +45 -18
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +3 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +49 -1
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js +2 -0
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +43 -9
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt-builder.js +1 -1
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +30 -22
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/task-projection.d.ts +2 -0
- package/dist/core/tasks/task-projection.d.ts.map +1 -1
- package/dist/core/tasks/task-projection.js +1 -0
- package/dist/core/tasks/task-projection.js.map +1 -1
- package/dist/core/tasks/task-state.d.ts.map +1 -1
- package/dist/core/tasks/task-state.js +6 -1
- package/dist/core/tasks/task-state.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -3
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +9 -3
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +47 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/goal.d.ts +16 -1
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +14 -2
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +5 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +33 -2
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/pipeline.d.ts +35 -0
- package/dist/core/tools/pipeline.d.ts.map +1 -0
- package/dist/core/tools/pipeline.js +203 -0
- package/dist/core/tools/pipeline.js.map +1 -0
- package/dist/core/tools/skill-audit.d.ts.map +1 -1
- package/dist/core/tools/skill-audit.js +2 -1
- package/dist/core/tools/skill-audit.js.map +1 -1
- package/dist/core/tools/skill.d.ts.map +1 -1
- package/dist/core/tools/skill.js +2 -1
- package/dist/core/tools/skill.js.map +1 -1
- package/dist/core/tools/skillify.d.ts.map +1 -1
- package/dist/core/tools/skillify.js +3 -1
- package/dist/core/tools/skillify.js.map +1 -1
- package/dist/core/tools/task-steps.d.ts +1 -1
- package/dist/core/tools/task-steps.d.ts.map +1 -1
- package/dist/core/tools/task-steps.js +9 -0
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tool-task.d.ts.map +1 -1
- package/dist/core/tools/tool-task.js +5 -1
- package/dist/core/tools/tool-task.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +66 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +6 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +20 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts +4 -0
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +96 -7
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +8 -10
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/key-handlers.d.ts +1 -0
- package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/key-handlers.js +2 -1
- package/dist/modes/interactive/key-handlers.js.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.js +12 -0
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
- package/docs/extensions.md +7 -5
- package/docs/harness-architecture.md +3 -4
- package/docs/keybindings.md +3 -2
- package/docs/quickstart.md +4 -4
- package/docs/sdk.md +3 -1
- package/docs/settings.md +16 -2
- package/docs/task-steps.md +1 -0
- package/docs/usage.md +6 -7
- package/docs/worker-profiles.md +1 -1
- package/docs/worktree-sync.md +1 -1
- 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/minimal-mode.ts +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/examples/sdk/07-context-files.ts +5 -2
- package/npm-shrinkwrap.json +12 -12
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-state-projection.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"work-state-projection.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAkC,MAAM,uCAAuC,CAAC;AAEnH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACN,KAAK,sBAAsB,EAG3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErF,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,8BAA8B;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACjD,YAAY,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACxD,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,oFAAoF;IACpF,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,uBAAuB,CAa7E;AAkBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,EAAE,CAiBjF;AAwBD,2GAA2G;AAC3G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC7C,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,mBAAmB,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACvD,GAAG,0BAA0B,CAmD7B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { collectCitedRunningToolTaskIds } from "../background-tool-task-controller.js";
|
|
1
2
|
import { getTrustedRequirementEvidence } from "../goals/goal-acceptance.js";
|
|
2
3
|
import { projectOpenTaskSteps, resolveTaskStepRequirementIds, } from "../tasks/task-projection.js";
|
|
3
4
|
export function goalObjectiveId(goalId) {
|
|
@@ -72,6 +73,14 @@ function collectRelatedDelegatedTaskIds(runtime, objectiveId, boundLaneId) {
|
|
|
72
73
|
/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */
|
|
73
74
|
export function projectSessionWorkState(args) {
|
|
74
75
|
const openTaskSteps = projectOpenTaskSteps(args.taskStepsState);
|
|
76
|
+
const citedUris = [
|
|
77
|
+
...(args.goalState?.evidence.map((evidence) => evidence.uri).filter((uri) => Boolean(uri)) ?? []),
|
|
78
|
+
...openTaskSteps.flatMap((step) => step.evidence ?? []),
|
|
79
|
+
];
|
|
80
|
+
const runningToolTaskIds = collectCitedRunningToolTaskIds({
|
|
81
|
+
records: args.backgroundToolTasks ?? [],
|
|
82
|
+
uris: citedUris,
|
|
83
|
+
});
|
|
75
84
|
const goal = args.goalState;
|
|
76
85
|
if (!goal) {
|
|
77
86
|
return {
|
|
@@ -80,6 +89,7 @@ export function projectSessionWorkState(args) {
|
|
|
80
89
|
unlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),
|
|
81
90
|
unknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],
|
|
82
91
|
unboundDelegatedTaskIds: [],
|
|
92
|
+
runningToolTaskIds,
|
|
83
93
|
};
|
|
84
94
|
}
|
|
85
95
|
const objectiveId = goalObjectiveId(goal.goalId);
|
|
@@ -111,6 +121,7 @@ export function projectSessionWorkState(args) {
|
|
|
111
121
|
unlinkedOpenTaskStepIds,
|
|
112
122
|
unknownRequirementIds: [...unknownRequirementIds],
|
|
113
123
|
unboundDelegatedTaskIds,
|
|
124
|
+
runningToolTaskIds,
|
|
114
125
|
};
|
|
115
126
|
}
|
|
116
127
|
//# sourceMappingURL=work-state-projection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-state-projection.js","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTrustedRequirementEvidence } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport {\n\ttype OpenTaskStepProjection,\n\tprojectOpenTaskSteps,\n\tresolveTaskStepRequirementIds,\n} from \"../tasks/task-projection.ts\";\nimport type { TaskStepsState } from \"../tasks/task-state.ts\";\nimport type { AcceptanceCriterion, EvidenceContract } from \"./contracts.ts\";\nimport type { CreateObjectiveInput, TaskRuntimeProjection } from \"./task-runtime.ts\";\n\nexport interface GoalObjectiveProjection extends CreateObjectiveInput {\n\tobjectiveId: string;\n\tacceptanceCriteria: readonly AcceptanceCriterion[];\n}\n\nexport interface RequirementExecutionProjection {\n\trequirementId: string;\n\tforegroundStepIds: readonly string[];\n\tdelegatedTaskIds: readonly string[];\n}\n\nexport interface SessionWorkStateProjection {\n\tobjectiveId?: string;\n\topenTaskSteps: readonly OpenTaskStepProjection[];\n\trequirements: readonly RequirementExecutionProjection[];\n\tunlinkedOpenTaskStepIds: readonly string[];\n\tunknownRequirementIds: readonly string[];\n\tunboundDelegatedTaskIds: readonly string[];\n}\n\nexport function goalObjectiveId(goalId: string): string {\n\treturn `goal:${goalId}`;\n}\n\nexport function projectGoalObjective(goal: GoalState): GoalObjectiveProjection {\n\treturn {\n\t\tobjectiveId: goalObjectiveId(goal.goalId),\n\t\ttitle: `Goal ${goal.goalId}`,\n\t\tdescription: goal.userGoal,\n\t\tconstraints: [],\n\t\tacceptanceCriteria: goal.requirements.map((requirement) => ({\n\t\t\tid: requirement.id,\n\t\t\tdescription: requirement.text,\n\t\t\trequired: true,\n\t\t})),\n\t\triskBudget: goal.tokenBudget !== undefined ? { maxTokens: goal.tokenBudget } : {},\n\t};\n}\n\nfunction orchestrationEvidenceKind(kind: GoalState[\"evidence\"][number][\"kind\"]): EvidenceContract[\"kind\"] {\n\tswitch (kind) {\n\t\tcase \"test\":\n\t\t\treturn \"test\";\n\t\tcase \"tool\":\n\t\t\treturn \"command\";\n\t\tcase \"worker\":\n\t\t\treturn \"review\";\n\t\tcase \"user\":\n\t\t\treturn \"external\";\n\t\tcase \"file\":\n\t\tcase \"finding\":\n\t\t\treturn \"observation\";\n\t}\n}\n\nexport function projectGoalAcceptanceEvidence(goal: GoalState): EvidenceContract[] {\n\treturn goal.requirements.flatMap((requirement) =>\n\t\tgetTrustedRequirementEvidence(goal, requirement).map((evidence) => ({\n\t\t\tevidenceId: `goal-evidence:${goal.goalId}:${requirement.id}:${evidence.id}`,\n\t\t\tcriterionId: requirement.id,\n\t\t\tkind: orchestrationEvidenceKind(evidence.kind),\n\t\t\tsummary: evidence.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: true,\n\t\t\tcreatedAt: evidence.createdAt,\n\t\t\tmetadata: {\n\t\t\t\tsourceGoalEvidenceId: evidence.id,\n\t\t\t\tsourceKind: evidence.kind,\n\t\t\t\t...(evidence.uri ? { uri: evidence.uri } : {}),\n\t\t\t},\n\t\t})),\n\t);\n}\n\nfunction collectRelatedDelegatedTaskIds(\n\truntime: TaskRuntimeProjection | undefined,\n\tobjectiveId: string,\n\tboundLaneId: string | undefined,\n): string[] {\n\tif (!runtime || !boundLaneId) return [];\n\tconst direct = runtime.tasks[boundLaneId];\n\tif (!direct || direct.task.objectiveId !== objectiveId) return [];\n\tconst related = new Set([boundLaneId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const task of Object.values(runtime.tasks)) {\n\t\t\tif (task.task.objectiveId !== objectiveId || !task.task.verificationOfTaskId) continue;\n\t\t\tif (!related.has(task.task.verificationOfTaskId) || related.has(task.task.taskId)) continue;\n\t\t\trelated.add(task.task.taskId);\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn [...related];\n}\n\n/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */\nexport function projectSessionWorkState(args: {\n\tgoalState: GoalState | undefined;\n\ttaskStepsState: TaskStepsState | undefined;\n\ttaskRuntime?: TaskRuntimeProjection;\n}): SessionWorkStateProjection {\n\tconst openTaskSteps = projectOpenTaskSteps(args.taskStepsState);\n\tconst goal = args.goalState;\n\tif (!goal) {\n\t\treturn {\n\t\t\topenTaskSteps,\n\t\t\trequirements: [],\n\t\t\tunlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),\n\t\t\tunknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],\n\t\t\tunboundDelegatedTaskIds: [],\n\t\t};\n\t}\n\n\tconst objectiveId = goalObjectiveId(goal.goalId);\n\tconst foregroundByRequirement = new Map(goal.requirements.map((requirement) => [requirement.id, [] as string[]]));\n\tconst unknownRequirementIds = new Set<string>();\n\tconst unlinkedOpenTaskStepIds: string[] = [];\n\tfor (const step of openTaskSteps) {\n\t\tconst resolved = resolveTaskStepRequirementIds(step, goal.requirements);\n\t\tfor (const unknownId of resolved.unknownIds) unknownRequirementIds.add(unknownId);\n\t\tif (resolved.matchedIds.length === 0) unlinkedOpenTaskStepIds.push(step.id);\n\t\tfor (const requirementId of resolved.matchedIds) foregroundByRequirement.get(requirementId)?.push(step.id);\n\t}\n\n\tconst requirements = goal.requirements.map((requirement) => ({\n\t\trequirementId: requirement.id,\n\t\tforegroundStepIds: foregroundByRequirement.get(requirement.id) ?? [],\n\t\tdelegatedTaskIds: collectRelatedDelegatedTaskIds(args.taskRuntime, objectiveId, requirement.boundLaneId),\n\t}));\n\tconst linkedDelegatedTaskIds = new Set(requirements.flatMap((requirement) => requirement.delegatedTaskIds));\n\tconst unboundDelegatedTaskIds = Object.values(args.taskRuntime?.tasks ?? {})\n\t\t.filter((task) => task.task.objectiveId === objectiveId && !linkedDelegatedTaskIds.has(task.task.taskId))\n\t\t.map((task) => task.task.taskId);\n\treturn {\n\t\tobjectiveId,\n\t\topenTaskSteps,\n\t\trequirements,\n\t\tunlinkedOpenTaskStepIds,\n\t\tunknownRequirementIds: [...unknownRequirementIds],\n\t\tunboundDelegatedTaskIds,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"work-state-projection.js","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { type BackgroundToolTaskRef, collectCitedRunningToolTaskIds } from \"../background-tool-task-controller.ts\";\nimport { getTrustedRequirementEvidence } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport {\n\ttype OpenTaskStepProjection,\n\tprojectOpenTaskSteps,\n\tresolveTaskStepRequirementIds,\n} from \"../tasks/task-projection.ts\";\nimport type { TaskStepsState } from \"../tasks/task-state.ts\";\nimport type { AcceptanceCriterion, EvidenceContract } from \"./contracts.ts\";\nimport type { CreateObjectiveInput, TaskRuntimeProjection } from \"./task-runtime.ts\";\n\nexport interface GoalObjectiveProjection extends CreateObjectiveInput {\n\tobjectiveId: string;\n\tacceptanceCriteria: readonly AcceptanceCriterion[];\n}\n\nexport interface RequirementExecutionProjection {\n\trequirementId: string;\n\tforegroundStepIds: readonly string[];\n\tdelegatedTaskIds: readonly string[];\n}\n\nexport interface SessionWorkStateProjection {\n\tobjectiveId?: string;\n\topenTaskSteps: readonly OpenTaskStepProjection[];\n\trequirements: readonly RequirementExecutionProjection[];\n\tunlinkedOpenTaskStepIds: readonly string[];\n\tunknownRequirementIds: readonly string[];\n\tunboundDelegatedTaskIds: readonly string[];\n\t/** Background tool_task ids still running and cited by the goal or an open step. */\n\trunningToolTaskIds: readonly string[];\n}\n\nexport function goalObjectiveId(goalId: string): string {\n\treturn `goal:${goalId}`;\n}\n\nexport function projectGoalObjective(goal: GoalState): GoalObjectiveProjection {\n\treturn {\n\t\tobjectiveId: goalObjectiveId(goal.goalId),\n\t\ttitle: `Goal ${goal.goalId}`,\n\t\tdescription: goal.userGoal,\n\t\tconstraints: [],\n\t\tacceptanceCriteria: goal.requirements.map((requirement) => ({\n\t\t\tid: requirement.id,\n\t\t\tdescription: requirement.text,\n\t\t\trequired: true,\n\t\t})),\n\t\triskBudget: goal.tokenBudget !== undefined ? { maxTokens: goal.tokenBudget } : {},\n\t};\n}\n\nfunction orchestrationEvidenceKind(kind: GoalState[\"evidence\"][number][\"kind\"]): EvidenceContract[\"kind\"] {\n\tswitch (kind) {\n\t\tcase \"test\":\n\t\t\treturn \"test\";\n\t\tcase \"tool\":\n\t\t\treturn \"command\";\n\t\tcase \"worker\":\n\t\t\treturn \"review\";\n\t\tcase \"user\":\n\t\t\treturn \"external\";\n\t\tcase \"file\":\n\t\tcase \"finding\":\n\t\t\treturn \"observation\";\n\t}\n}\n\nexport function projectGoalAcceptanceEvidence(goal: GoalState): EvidenceContract[] {\n\treturn goal.requirements.flatMap((requirement) =>\n\t\tgetTrustedRequirementEvidence(goal, requirement).map((evidence) => ({\n\t\t\tevidenceId: `goal-evidence:${goal.goalId}:${requirement.id}:${evidence.id}`,\n\t\t\tcriterionId: requirement.id,\n\t\t\tkind: orchestrationEvidenceKind(evidence.kind),\n\t\t\tsummary: evidence.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: true,\n\t\t\tcreatedAt: evidence.createdAt,\n\t\t\tmetadata: {\n\t\t\t\tsourceGoalEvidenceId: evidence.id,\n\t\t\t\tsourceKind: evidence.kind,\n\t\t\t\t...(evidence.uri ? { uri: evidence.uri } : {}),\n\t\t\t},\n\t\t})),\n\t);\n}\n\nfunction collectRelatedDelegatedTaskIds(\n\truntime: TaskRuntimeProjection | undefined,\n\tobjectiveId: string,\n\tboundLaneId: string | undefined,\n): string[] {\n\tif (!runtime || !boundLaneId) return [];\n\tconst direct = runtime.tasks[boundLaneId];\n\tif (!direct || direct.task.objectiveId !== objectiveId) return [];\n\tconst related = new Set([boundLaneId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const task of Object.values(runtime.tasks)) {\n\t\t\tif (task.task.objectiveId !== objectiveId || !task.task.verificationOfTaskId) continue;\n\t\t\tif (!related.has(task.task.verificationOfTaskId) || related.has(task.task.taskId)) continue;\n\t\t\trelated.add(task.task.taskId);\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn [...related];\n}\n\n/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */\nexport function projectSessionWorkState(args: {\n\tgoalState: GoalState | undefined;\n\ttaskStepsState: TaskStepsState | undefined;\n\ttaskRuntime?: TaskRuntimeProjection;\n\tbackgroundToolTasks?: readonly BackgroundToolTaskRef[];\n}): SessionWorkStateProjection {\n\tconst openTaskSteps = projectOpenTaskSteps(args.taskStepsState);\n\tconst citedUris = [\n\t\t...(args.goalState?.evidence.map((evidence) => evidence.uri).filter((uri): uri is string => Boolean(uri)) ?? []),\n\t\t...openTaskSteps.flatMap((step) => step.evidence ?? []),\n\t];\n\tconst runningToolTaskIds = collectCitedRunningToolTaskIds({\n\t\trecords: args.backgroundToolTasks ?? [],\n\t\turis: citedUris,\n\t});\n\tconst goal = args.goalState;\n\tif (!goal) {\n\t\treturn {\n\t\t\topenTaskSteps,\n\t\t\trequirements: [],\n\t\t\tunlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),\n\t\t\tunknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],\n\t\t\tunboundDelegatedTaskIds: [],\n\t\t\trunningToolTaskIds,\n\t\t};\n\t}\n\n\tconst objectiveId = goalObjectiveId(goal.goalId);\n\tconst foregroundByRequirement = new Map(goal.requirements.map((requirement) => [requirement.id, [] as string[]]));\n\tconst unknownRequirementIds = new Set<string>();\n\tconst unlinkedOpenTaskStepIds: string[] = [];\n\tfor (const step of openTaskSteps) {\n\t\tconst resolved = resolveTaskStepRequirementIds(step, goal.requirements);\n\t\tfor (const unknownId of resolved.unknownIds) unknownRequirementIds.add(unknownId);\n\t\tif (resolved.matchedIds.length === 0) unlinkedOpenTaskStepIds.push(step.id);\n\t\tfor (const requirementId of resolved.matchedIds) foregroundByRequirement.get(requirementId)?.push(step.id);\n\t}\n\n\tconst requirements = goal.requirements.map((requirement) => ({\n\t\trequirementId: requirement.id,\n\t\tforegroundStepIds: foregroundByRequirement.get(requirement.id) ?? [],\n\t\tdelegatedTaskIds: collectRelatedDelegatedTaskIds(args.taskRuntime, objectiveId, requirement.boundLaneId),\n\t}));\n\tconst linkedDelegatedTaskIds = new Set(requirements.flatMap((requirement) => requirement.delegatedTaskIds));\n\tconst unboundDelegatedTaskIds = Object.values(args.taskRuntime?.tasks ?? {})\n\t\t.filter((task) => task.task.objectiveId === objectiveId && !linkedDelegatedTaskIds.has(task.task.taskId))\n\t\t.map((task) => task.task.taskId);\n\treturn {\n\t\tobjectiveId,\n\t\topenTaskSteps,\n\t\trequirements,\n\t\tunlinkedOpenTaskStepIds,\n\t\tunknownRequirementIds: [...unknownRequirementIds],\n\t\tunboundDelegatedTaskIds,\n\t\trunningToolTaskIds,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AssembledStageContext, type PipelineDefinition, type PipelineRun, type PipelineStage } from "./types.ts";
|
|
2
|
+
export declare function currentPipelineStage(definition: PipelineDefinition, run: PipelineRun): PipelineStage | undefined;
|
|
3
|
+
export declare function assembleStageContext(definition: PipelineDefinition, run: PipelineRun, stage?: PipelineStage): AssembledStageContext;
|
|
4
|
+
export declare function formatPipelineContext(definition: PipelineDefinition, run: PipelineRun, assembled: AssembledStageContext): string;
|
|
5
|
+
export declare function formatActivePipelineContext(run: PipelineRun): string | undefined;
|
|
6
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/pipelines/context.ts"],"names":[],"mappings":"AAGA,OAAO,EAEN,KAAK,qBAAqB,EAK1B,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,MAAM,YAAY,CAAC;AA+CpB,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa,GAAG,SAAS,CAEhH;AAED,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,kBAAkB,EAC9B,GAAG,EAAE,WAAW,EAChB,KAAK,GAAE,aAA8E,GACnF,qBAAqB,CAiCvB;AAED,wBAAgB,qBAAqB,CACpC,UAAU,EAAE,kBAAkB,EAC9B,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,qBAAqB,GAC9B,MAAM,CAWR;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKhF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { loadPipelineDefinition } from "./discover.js";
|
|
4
|
+
import { isPipelineRunActive, MAX_LAYER_FILE_CHARS, MAX_STAGE_CONTEXT_CHARS, } from "./types.js";
|
|
5
|
+
const CHARS_PER_TOKEN = 4;
|
|
6
|
+
function isInsideRoot(root, candidate) {
|
|
7
|
+
const rel = relative(resolve(root), resolve(candidate));
|
|
8
|
+
return rel === "" || (!rel.startsWith(`..${sep}`) && rel !== ".." && !isAbsolute(rel));
|
|
9
|
+
}
|
|
10
|
+
function resolveUnder(baseDir, sandboxRoot, rawPath) {
|
|
11
|
+
const trimmed = rawPath.trim();
|
|
12
|
+
if (!trimmed)
|
|
13
|
+
return undefined;
|
|
14
|
+
const resolved = resolve(isAbsolute(trimmed) ? trimmed : join(baseDir, trimmed));
|
|
15
|
+
if (!isInsideRoot(sandboxRoot, resolved))
|
|
16
|
+
return undefined;
|
|
17
|
+
return normalize(resolved);
|
|
18
|
+
}
|
|
19
|
+
function readBounded(path, maxChars) {
|
|
20
|
+
try {
|
|
21
|
+
if (!existsSync(path) || !statSync(path).isFile()) {
|
|
22
|
+
return { text: `(missing: ${path})`, truncated: false };
|
|
23
|
+
}
|
|
24
|
+
const raw = readFileSync(path, "utf8");
|
|
25
|
+
if (raw.length <= maxChars)
|
|
26
|
+
return { text: raw, truncated: false };
|
|
27
|
+
return { text: `${raw.slice(0, maxChars)}\n…[truncated ${raw.length - maxChars} chars]`, truncated: true };
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return { text: `(unreadable: ${error instanceof Error ? error.message : String(error)})`, truncated: false };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function pushLayer(layers, layer, path, label, remaining) {
|
|
34
|
+
if (remaining <= 0) {
|
|
35
|
+
layers.push({ layer, path, label, text: "(omitted: stage context budget)", truncated: true });
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
const budget = Math.min(MAX_LAYER_FILE_CHARS, remaining);
|
|
39
|
+
const read = readBounded(path, budget);
|
|
40
|
+
layers.push({ layer, path, label, text: read.text, truncated: read.truncated });
|
|
41
|
+
return remaining - read.text.length;
|
|
42
|
+
}
|
|
43
|
+
export function currentPipelineStage(definition, run) {
|
|
44
|
+
return definition.stages.find((stage) => stage.id === run.currentStageId);
|
|
45
|
+
}
|
|
46
|
+
export function assembleStageContext(definition, run, stage = currentPipelineStage(definition, run) ?? definition.stages[0]) {
|
|
47
|
+
const layers = [];
|
|
48
|
+
let remaining = MAX_STAGE_CONTEXT_CHARS;
|
|
49
|
+
remaining = pushLayer(layers, 0, definition.entryFile, "L0 entry", remaining);
|
|
50
|
+
if (definition.routingPath !== definition.entryFile) {
|
|
51
|
+
remaining = pushLayer(layers, 1, definition.routingPath, "L1 routing", remaining);
|
|
52
|
+
}
|
|
53
|
+
remaining = pushLayer(layers, 2, stage.contractPath, "L2 stage contract", remaining);
|
|
54
|
+
const definitionStageDir = join(definition.stagesDir, stage.folderName);
|
|
55
|
+
const runStageDir = join(run.runRoot, stage.folderName);
|
|
56
|
+
for (const input of stage.contract.inputs) {
|
|
57
|
+
if (input.kind === "reference") {
|
|
58
|
+
const path = resolveUnder(definitionStageDir, definition.rootDir, input.path);
|
|
59
|
+
if (!path)
|
|
60
|
+
continue;
|
|
61
|
+
remaining = pushLayer(layers, 3, path, `L3 ${input.path}`, remaining);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const path = resolveUnder(runStageDir, run.runRoot, input.path);
|
|
65
|
+
if (!path)
|
|
66
|
+
continue;
|
|
67
|
+
remaining = pushLayer(layers, 4, path, `L4 ${input.path}`, remaining);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const text = layers
|
|
71
|
+
.map((item) => `### ${item.label}\npath: ${item.path}\n${item.text}`)
|
|
72
|
+
.join("\n\n")
|
|
73
|
+
.slice(0, MAX_STAGE_CONTEXT_CHARS);
|
|
74
|
+
return {
|
|
75
|
+
stageId: stage.id,
|
|
76
|
+
layers,
|
|
77
|
+
text,
|
|
78
|
+
tokenEstimate: Math.ceil(text.length / CHARS_PER_TOKEN),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export function formatPipelineContext(definition, run, assembled) {
|
|
82
|
+
const stage = currentPipelineStage(definition, run);
|
|
83
|
+
const humanCheck = stage?.contract.humanCheck.trim();
|
|
84
|
+
const lines = [
|
|
85
|
+
`PIPELINE ${definition.name} run=${run.runId} status=${run.status} stage=${run.currentStageId}`,
|
|
86
|
+
stage ? `ONE JOB: ${stage.contract.oneJob || stage.contract.title || stage.id}` : "",
|
|
87
|
+
humanCheck ? `HUMAN CHECK: ${humanCheck}` : "",
|
|
88
|
+
`Increment completes this stage after output/ has files, then starts the next. Status is the files on disk.`,
|
|
89
|
+
assembled.text,
|
|
90
|
+
].filter((line) => line.length > 0);
|
|
91
|
+
return `${PIPELINE_CONTEXT_OPEN} revision=${run.revision}>\n${lines.join("\n")}\n</pipeline_context>`;
|
|
92
|
+
}
|
|
93
|
+
export function formatActivePipelineContext(run) {
|
|
94
|
+
if (!isPipelineRunActive(run))
|
|
95
|
+
return undefined;
|
|
96
|
+
const definition = loadPipelineDefinition(run.definitionPath);
|
|
97
|
+
if (!definition)
|
|
98
|
+
return undefined;
|
|
99
|
+
return formatPipelineContext(definition, run, assembleStageContext(definition, run));
|
|
100
|
+
}
|
|
101
|
+
const PIPELINE_CONTEXT_OPEN = "<pipeline_context";
|
|
102
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/core/pipelines/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { isAbsolute, join, normalize, relative, resolve, sep } from \"node:path\";\nimport { loadPipelineDefinition } from \"./discover.ts\";\nimport {\n\ttype AssembledLayer,\n\ttype AssembledStageContext,\n\ttype ContextLayer,\n\tisPipelineRunActive,\n\tMAX_LAYER_FILE_CHARS,\n\tMAX_STAGE_CONTEXT_CHARS,\n\ttype PipelineDefinition,\n\ttype PipelineRun,\n\ttype PipelineStage,\n} from \"./types.ts\";\n\nconst CHARS_PER_TOKEN = 4;\n\nfunction isInsideRoot(root: string, candidate: string): boolean {\n\tconst rel = relative(resolve(root), resolve(candidate));\n\treturn rel === \"\" || (!rel.startsWith(`..${sep}`) && rel !== \"..\" && !isAbsolute(rel));\n}\n\nfunction resolveUnder(baseDir: string, sandboxRoot: string, rawPath: string): string | undefined {\n\tconst trimmed = rawPath.trim();\n\tif (!trimmed) return undefined;\n\tconst resolved = resolve(isAbsolute(trimmed) ? trimmed : join(baseDir, trimmed));\n\tif (!isInsideRoot(sandboxRoot, resolved)) return undefined;\n\treturn normalize(resolved);\n}\n\nfunction readBounded(path: string, maxChars: number): { text: string; truncated: boolean } {\n\ttry {\n\t\tif (!existsSync(path) || !statSync(path).isFile()) {\n\t\t\treturn { text: `(missing: ${path})`, truncated: false };\n\t\t}\n\t\tconst raw = readFileSync(path, \"utf8\");\n\t\tif (raw.length <= maxChars) return { text: raw, truncated: false };\n\t\treturn { text: `${raw.slice(0, maxChars)}\\n…[truncated ${raw.length - maxChars} chars]`, truncated: true };\n\t} catch (error) {\n\t\treturn { text: `(unreadable: ${error instanceof Error ? error.message : String(error)})`, truncated: false };\n\t}\n}\n\nfunction pushLayer(\n\tlayers: AssembledLayer[],\n\tlayer: ContextLayer,\n\tpath: string,\n\tlabel: string,\n\tremaining: number,\n): number {\n\tif (remaining <= 0) {\n\t\tlayers.push({ layer, path, label, text: \"(omitted: stage context budget)\", truncated: true });\n\t\treturn 0;\n\t}\n\tconst budget = Math.min(MAX_LAYER_FILE_CHARS, remaining);\n\tconst read = readBounded(path, budget);\n\tlayers.push({ layer, path, label, text: read.text, truncated: read.truncated });\n\treturn remaining - read.text.length;\n}\n\nexport function currentPipelineStage(definition: PipelineDefinition, run: PipelineRun): PipelineStage | undefined {\n\treturn definition.stages.find((stage) => stage.id === run.currentStageId);\n}\n\nexport function assembleStageContext(\n\tdefinition: PipelineDefinition,\n\trun: PipelineRun,\n\tstage: PipelineStage = currentPipelineStage(definition, run) ?? definition.stages[0]!,\n): AssembledStageContext {\n\tconst layers: AssembledLayer[] = [];\n\tlet remaining = MAX_STAGE_CONTEXT_CHARS;\n\tremaining = pushLayer(layers, 0, definition.entryFile, \"L0 entry\", remaining);\n\tif (definition.routingPath !== definition.entryFile) {\n\t\tremaining = pushLayer(layers, 1, definition.routingPath, \"L1 routing\", remaining);\n\t}\n\tremaining = pushLayer(layers, 2, stage.contractPath, \"L2 stage contract\", remaining);\n\n\tconst definitionStageDir = join(definition.stagesDir, stage.folderName);\n\tconst runStageDir = join(run.runRoot, stage.folderName);\n\tfor (const input of stage.contract.inputs) {\n\t\tif (input.kind === \"reference\") {\n\t\t\tconst path = resolveUnder(definitionStageDir, definition.rootDir, input.path);\n\t\t\tif (!path) continue;\n\t\t\tremaining = pushLayer(layers, 3, path, `L3 ${input.path}`, remaining);\n\t\t} else {\n\t\t\tconst path = resolveUnder(runStageDir, run.runRoot, input.path);\n\t\t\tif (!path) continue;\n\t\t\tremaining = pushLayer(layers, 4, path, `L4 ${input.path}`, remaining);\n\t\t}\n\t}\n\n\tconst text = layers\n\t\t.map((item) => `### ${item.label}\\npath: ${item.path}\\n${item.text}`)\n\t\t.join(\"\\n\\n\")\n\t\t.slice(0, MAX_STAGE_CONTEXT_CHARS);\n\treturn {\n\t\tstageId: stage.id,\n\t\tlayers,\n\t\ttext,\n\t\ttokenEstimate: Math.ceil(text.length / CHARS_PER_TOKEN),\n\t};\n}\n\nexport function formatPipelineContext(\n\tdefinition: PipelineDefinition,\n\trun: PipelineRun,\n\tassembled: AssembledStageContext,\n): string {\n\tconst stage = currentPipelineStage(definition, run);\n\tconst humanCheck = stage?.contract.humanCheck.trim();\n\tconst lines = [\n\t\t`PIPELINE ${definition.name} run=${run.runId} status=${run.status} stage=${run.currentStageId}`,\n\t\tstage ? `ONE JOB: ${stage.contract.oneJob || stage.contract.title || stage.id}` : \"\",\n\t\thumanCheck ? `HUMAN CHECK: ${humanCheck}` : \"\",\n\t\t`Increment completes this stage after output/ has files, then starts the next. Status is the files on disk.`,\n\t\tassembled.text,\n\t].filter((line) => line.length > 0);\n\treturn `${PIPELINE_CONTEXT_OPEN} revision=${run.revision}>\\n${lines.join(\"\\n\")}\\n</pipeline_context>`;\n}\n\nexport function formatActivePipelineContext(run: PipelineRun): string | undefined {\n\tif (!isPipelineRunActive(run)) return undefined;\n\tconst definition = loadPipelineDefinition(run.definitionPath);\n\tif (!definition) return undefined;\n\treturn formatPipelineContext(definition, run, assembleStageContext(definition, run));\n}\n\nconst PIPELINE_CONTEXT_OPEN = \"<pipeline_context\";\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type PipelineDefinition } from "./types.ts";
|
|
2
|
+
export declare function projectPipelinesDir(cwd: string): string;
|
|
3
|
+
export declare function projectPipelineRunsDir(cwd: string): string;
|
|
4
|
+
export interface DiscoverPipelineOptions {
|
|
5
|
+
agentPipelinesDir: string;
|
|
6
|
+
cwd: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadPipelineDefinition(rootDir: string): PipelineDefinition | undefined;
|
|
9
|
+
export declare function discoverPipelineDefinitions(options: DiscoverPipelineOptions): PipelineDefinition[];
|
|
10
|
+
export declare function findPipelineDefinition(options: DiscoverPipelineOptions, name: string): PipelineDefinition | undefined;
|
|
11
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/core/pipelines/discover.ts"],"names":[],"mappings":"AAGA,OAAO,EAIN,KAAK,kBAAkB,EAEvB,MAAM,YAAY,CAAC;AAOpB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,uBAAuB;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACZ;AAoFD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAqBtF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,uBAAuB,GAAG,kBAAkB,EAAE,CAelG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAIrH"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { parseStageContract, parseWorkspaceFrontmatter } from "./parse-contract.js";
|
|
4
|
+
import { MAX_PIPELINE_NAME_LENGTH, MAX_PIPELINE_STAGES, PIPELINE_STAGE_FOLDER_RE, } from "./types.js";
|
|
5
|
+
const ENTRY_FILES = ["AGENTS.md", "CLAUDE.md"];
|
|
6
|
+
const ROUTING_FILE = "CONTEXT.md";
|
|
7
|
+
const CONTRACT_FILE = "CONTEXT.md";
|
|
8
|
+
const FACTORY_DIRS = ["_shared", "references"];
|
|
9
|
+
export function projectPipelinesDir(cwd) {
|
|
10
|
+
return join(cwd, ".pi", "pipelines");
|
|
11
|
+
}
|
|
12
|
+
export function projectPipelineRunsDir(cwd) {
|
|
13
|
+
return join(cwd, ".pi", "pipeline-runs");
|
|
14
|
+
}
|
|
15
|
+
function readText(path) {
|
|
16
|
+
try {
|
|
17
|
+
return readFileSync(path, "utf8");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function isDir(path) {
|
|
24
|
+
try {
|
|
25
|
+
return statSync(path).isDirectory();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function listDirs(path) {
|
|
32
|
+
if (!isDir(path))
|
|
33
|
+
return [];
|
|
34
|
+
try {
|
|
35
|
+
return readdirSync(path, { withFileTypes: true })
|
|
36
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
|
|
37
|
+
.map((entry) => entry.name)
|
|
38
|
+
.sort();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function pickEntryFile(rootDir) {
|
|
45
|
+
for (const name of ENTRY_FILES) {
|
|
46
|
+
const path = join(rootDir, name);
|
|
47
|
+
if (existsSync(path))
|
|
48
|
+
return path;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function pickFactoryDir(rootDir) {
|
|
53
|
+
for (const name of FACTORY_DIRS) {
|
|
54
|
+
const path = join(rootDir, name);
|
|
55
|
+
if (isDir(path))
|
|
56
|
+
return path;
|
|
57
|
+
}
|
|
58
|
+
return join(rootDir, "_shared");
|
|
59
|
+
}
|
|
60
|
+
function parseStageFolder(name) {
|
|
61
|
+
const match = name.match(PIPELINE_STAGE_FOLDER_RE);
|
|
62
|
+
if (!match)
|
|
63
|
+
return undefined;
|
|
64
|
+
return { ordinal: Number(match[1]), slug: match[2] };
|
|
65
|
+
}
|
|
66
|
+
function loadStage(stagesDir, folderName) {
|
|
67
|
+
const parsed = parseStageFolder(folderName);
|
|
68
|
+
if (!parsed)
|
|
69
|
+
return undefined;
|
|
70
|
+
const contractPath = join(stagesDir, folderName, CONTRACT_FILE);
|
|
71
|
+
const content = readText(contractPath);
|
|
72
|
+
if (content === undefined)
|
|
73
|
+
return undefined;
|
|
74
|
+
const contract = parseStageContract(content);
|
|
75
|
+
return {
|
|
76
|
+
id: `${String(parsed.ordinal).padStart(2, "0")}_${parsed.slug}`,
|
|
77
|
+
ordinal: parsed.ordinal,
|
|
78
|
+
slug: parsed.slug,
|
|
79
|
+
folderName,
|
|
80
|
+
contractPath,
|
|
81
|
+
outputDir: join(stagesDir, folderName, "output"),
|
|
82
|
+
contract,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function collectStages(rootDir) {
|
|
86
|
+
const nested = join(rootDir, "stages");
|
|
87
|
+
const stagesDir = isDir(nested) && listDirs(nested).some((name) => PIPELINE_STAGE_FOLDER_RE.test(name)) ? nested : rootDir;
|
|
88
|
+
const stages = [];
|
|
89
|
+
for (const name of listDirs(stagesDir)) {
|
|
90
|
+
const stage = loadStage(stagesDir, name);
|
|
91
|
+
if (stage)
|
|
92
|
+
stages.push(stage);
|
|
93
|
+
if (stages.length >= MAX_PIPELINE_STAGES)
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
stages.sort((left, right) => left.ordinal - right.ordinal || left.slug.localeCompare(right.slug));
|
|
97
|
+
return { stagesDir, stages };
|
|
98
|
+
}
|
|
99
|
+
export function loadPipelineDefinition(rootDir) {
|
|
100
|
+
if (!isDir(rootDir))
|
|
101
|
+
return undefined;
|
|
102
|
+
const { stagesDir, stages } = collectStages(rootDir);
|
|
103
|
+
if (stages.length === 0)
|
|
104
|
+
return undefined;
|
|
105
|
+
const routingPath = join(rootDir, ROUTING_FILE);
|
|
106
|
+
const routing = readText(routingPath);
|
|
107
|
+
const parsed = routing !== undefined ? parseWorkspaceFrontmatter(routing) : undefined;
|
|
108
|
+
const folderName = basename(rootDir).slice(0, MAX_PIPELINE_NAME_LENGTH);
|
|
109
|
+
const name = (parsed?.name || folderName).slice(0, MAX_PIPELINE_NAME_LENGTH);
|
|
110
|
+
const entryFile = pickEntryFile(rootDir) ?? routingPath;
|
|
111
|
+
return {
|
|
112
|
+
name,
|
|
113
|
+
description: parsed?.description ?? "",
|
|
114
|
+
form: parsed?.form ?? "pipeline",
|
|
115
|
+
rootDir,
|
|
116
|
+
entryFile,
|
|
117
|
+
routingPath: existsSync(routingPath) ? routingPath : entryFile,
|
|
118
|
+
factoryDir: pickFactoryDir(rootDir),
|
|
119
|
+
stagesDir,
|
|
120
|
+
stages,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function discoverPipelineDefinitions(options) {
|
|
124
|
+
const roots = [options.agentPipelinesDir, projectPipelinesDir(options.cwd)];
|
|
125
|
+
const seen = new Set();
|
|
126
|
+
const definitions = [];
|
|
127
|
+
for (const root of roots) {
|
|
128
|
+
for (const name of listDirs(root)) {
|
|
129
|
+
const path = join(root, name);
|
|
130
|
+
if (seen.has(path))
|
|
131
|
+
continue;
|
|
132
|
+
const definition = loadPipelineDefinition(path);
|
|
133
|
+
if (!definition)
|
|
134
|
+
continue;
|
|
135
|
+
seen.add(path);
|
|
136
|
+
definitions.push(definition);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return definitions;
|
|
140
|
+
}
|
|
141
|
+
export function findPipelineDefinition(options, name) {
|
|
142
|
+
const wanted = name.trim().toLocaleLowerCase();
|
|
143
|
+
if (!wanted)
|
|
144
|
+
return undefined;
|
|
145
|
+
return discoverPipelineDefinitions(options).find((definition) => definition.name.toLocaleLowerCase() === wanted);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/core/pipelines/discover.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { parseStageContract, parseWorkspaceFrontmatter } from \"./parse-contract.ts\";\nimport {\n\tMAX_PIPELINE_NAME_LENGTH,\n\tMAX_PIPELINE_STAGES,\n\tPIPELINE_STAGE_FOLDER_RE,\n\ttype PipelineDefinition,\n\ttype PipelineStage,\n} from \"./types.ts\";\n\nconst ENTRY_FILES = [\"AGENTS.md\", \"CLAUDE.md\"] as const;\nconst ROUTING_FILE = \"CONTEXT.md\";\nconst CONTRACT_FILE = \"CONTEXT.md\";\nconst FACTORY_DIRS = [\"_shared\", \"references\"] as const;\n\nexport function projectPipelinesDir(cwd: string): string {\n\treturn join(cwd, \".pi\", \"pipelines\");\n}\n\nexport function projectPipelineRunsDir(cwd: string): string {\n\treturn join(cwd, \".pi\", \"pipeline-runs\");\n}\n\nexport interface DiscoverPipelineOptions {\n\tagentPipelinesDir: string;\n\tcwd: string;\n}\n\nfunction readText(path: string): string | undefined {\n\ttry {\n\t\treturn readFileSync(path, \"utf8\");\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isDir(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction listDirs(path: string): string[] {\n\tif (!isDir(path)) return [];\n\ttry {\n\t\treturn readdirSync(path, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\"))\n\t\t\t.map((entry) => entry.name)\n\t\t\t.sort();\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction pickEntryFile(rootDir: string): string | undefined {\n\tfor (const name of ENTRY_FILES) {\n\t\tconst path = join(rootDir, name);\n\t\tif (existsSync(path)) return path;\n\t}\n\treturn undefined;\n}\n\nfunction pickFactoryDir(rootDir: string): string {\n\tfor (const name of FACTORY_DIRS) {\n\t\tconst path = join(rootDir, name);\n\t\tif (isDir(path)) return path;\n\t}\n\treturn join(rootDir, \"_shared\");\n}\n\nfunction parseStageFolder(name: string): { ordinal: number; slug: string } | undefined {\n\tconst match = name.match(PIPELINE_STAGE_FOLDER_RE);\n\tif (!match) return undefined;\n\treturn { ordinal: Number(match[1]), slug: match[2] };\n}\n\nfunction loadStage(stagesDir: string, folderName: string): PipelineStage | undefined {\n\tconst parsed = parseStageFolder(folderName);\n\tif (!parsed) return undefined;\n\tconst contractPath = join(stagesDir, folderName, CONTRACT_FILE);\n\tconst content = readText(contractPath);\n\tif (content === undefined) return undefined;\n\tconst contract = parseStageContract(content);\n\treturn {\n\t\tid: `${String(parsed.ordinal).padStart(2, \"0\")}_${parsed.slug}`,\n\t\tordinal: parsed.ordinal,\n\t\tslug: parsed.slug,\n\t\tfolderName,\n\t\tcontractPath,\n\t\toutputDir: join(stagesDir, folderName, \"output\"),\n\t\tcontract,\n\t};\n}\n\nfunction collectStages(rootDir: string): { stagesDir: string; stages: PipelineStage[] } {\n\tconst nested = join(rootDir, \"stages\");\n\tconst stagesDir =\n\t\tisDir(nested) && listDirs(nested).some((name) => PIPELINE_STAGE_FOLDER_RE.test(name)) ? nested : rootDir;\n\tconst stages: PipelineStage[] = [];\n\tfor (const name of listDirs(stagesDir)) {\n\t\tconst stage = loadStage(stagesDir, name);\n\t\tif (stage) stages.push(stage);\n\t\tif (stages.length >= MAX_PIPELINE_STAGES) break;\n\t}\n\tstages.sort((left, right) => left.ordinal - right.ordinal || left.slug.localeCompare(right.slug));\n\treturn { stagesDir, stages };\n}\n\nexport function loadPipelineDefinition(rootDir: string): PipelineDefinition | undefined {\n\tif (!isDir(rootDir)) return undefined;\n\tconst { stagesDir, stages } = collectStages(rootDir);\n\tif (stages.length === 0) return undefined;\n\tconst routingPath = join(rootDir, ROUTING_FILE);\n\tconst routing = readText(routingPath);\n\tconst parsed = routing !== undefined ? parseWorkspaceFrontmatter(routing) : undefined;\n\tconst folderName = basename(rootDir).slice(0, MAX_PIPELINE_NAME_LENGTH);\n\tconst name = (parsed?.name || folderName).slice(0, MAX_PIPELINE_NAME_LENGTH);\n\tconst entryFile = pickEntryFile(rootDir) ?? routingPath;\n\treturn {\n\t\tname,\n\t\tdescription: parsed?.description ?? \"\",\n\t\tform: parsed?.form ?? \"pipeline\",\n\t\trootDir,\n\t\tentryFile,\n\t\troutingPath: existsSync(routingPath) ? routingPath : entryFile,\n\t\tfactoryDir: pickFactoryDir(rootDir),\n\t\tstagesDir,\n\t\tstages,\n\t};\n}\n\nexport function discoverPipelineDefinitions(options: DiscoverPipelineOptions): PipelineDefinition[] {\n\tconst roots = [options.agentPipelinesDir, projectPipelinesDir(options.cwd)];\n\tconst seen = new Set<string>();\n\tconst definitions: PipelineDefinition[] = [];\n\tfor (const root of roots) {\n\t\tfor (const name of listDirs(root)) {\n\t\t\tconst path = join(root, name);\n\t\t\tif (seen.has(path)) continue;\n\t\t\tconst definition = loadPipelineDefinition(path);\n\t\t\tif (!definition) continue;\n\t\t\tseen.add(path);\n\t\t\tdefinitions.push(definition);\n\t\t}\n\t}\n\treturn definitions;\n}\n\nexport function findPipelineDefinition(options: DiscoverPipelineOptions, name: string): PipelineDefinition | undefined {\n\tconst wanted = name.trim().toLocaleLowerCase();\n\tif (!wanted) return undefined;\n\treturn discoverPipelineDefinitions(options).find((definition) => definition.name.toLocaleLowerCase() === wanted);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BackgroundToolTaskRef } from "../background-tool-task-controller.ts";
|
|
2
|
+
import type { GoalState } from "../goals/goal-state.ts";
|
|
3
|
+
import type { OpenTaskStepRef } from "../goals/goal-tool-core.ts";
|
|
4
|
+
import { type TaskStep, type TaskStepsState } from "../tasks/task-state.ts";
|
|
5
|
+
import { type IncrementResult, type PipelineDefinition, type PipelineRun } from "./types.ts";
|
|
6
|
+
export interface PipelineIncrementJoin {
|
|
7
|
+
goal?: GoalState;
|
|
8
|
+
openTaskSteps?: readonly OpenTaskStepRef[];
|
|
9
|
+
backgroundToolTasks?: readonly BackgroundToolTaskRef[];
|
|
10
|
+
}
|
|
11
|
+
export declare class PipelineIncrementError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
export declare function incrementPipelineRun(definition: PipelineDefinition, run: PipelineRun, now: string, join?: PipelineIncrementJoin): {
|
|
15
|
+
run: PipelineRun;
|
|
16
|
+
result: IncrementResult;
|
|
17
|
+
};
|
|
18
|
+
export declare function abandonPipelineRun(run: PipelineRun, now: string): PipelineRun;
|
|
19
|
+
export declare function advanceTaskSteps(state: TaskStepsState, now: string): {
|
|
20
|
+
state: TaskStepsState;
|
|
21
|
+
result: IncrementResult;
|
|
22
|
+
};
|
|
23
|
+
export declare function currentOpenTaskStep(steps: readonly TaskStep[]): TaskStep | undefined;
|
|
24
|
+
//# sourceMappingURL=increment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"increment.d.ts","sourceRoot":"","sources":["../../../src/core/pipelines/increment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAkB,MAAM,wBAAwB,CAAC;AAG5F,OAAO,EAAE,KAAK,eAAe,EAAuB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAElH,MAAM,WAAW,qBAAqB;IACrC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,mBAAmB,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACvD;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAeD,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,kBAAkB,EAC9B,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,qBAA0B,GAC9B;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAmD/C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAG7E;AAED,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,MAAM,GACT;IACF,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;CACxB,CA2CA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,GAAG,SAAS,CAEpF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { taskStepReferencesRequirement } from "../tasks/task-projection.js";
|
|
2
|
+
import { updateTaskStep } from "../tasks/task-state.js";
|
|
3
|
+
import { currentPipelineStage } from "./context.js";
|
|
4
|
+
import { persistPipelineRun, scanStageOutput, stageOutputDir } from "./run-state.js";
|
|
5
|
+
import { isPipelineRunActive } from "./types.js";
|
|
6
|
+
export class PipelineIncrementError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "PipelineIncrementError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function inFlightToolTasks(tasks) {
|
|
13
|
+
if (!tasks)
|
|
14
|
+
return [];
|
|
15
|
+
return tasks.filter((task) => task.status === "running").map((task) => task.taskId);
|
|
16
|
+
}
|
|
17
|
+
function linkedOpenStepIds(join, run) {
|
|
18
|
+
if (!run.goalId || !join.goal || join.goal.goalId !== run.goalId)
|
|
19
|
+
return [];
|
|
20
|
+
if (!join.openTaskSteps || join.openTaskSteps.length === 0)
|
|
21
|
+
return [];
|
|
22
|
+
return join.openTaskSteps
|
|
23
|
+
.filter((step) => join.goal.requirements.some((requirement) => taskStepReferencesRequirement(step, requirement)))
|
|
24
|
+
.map((step) => step.id);
|
|
25
|
+
}
|
|
26
|
+
export function incrementPipelineRun(definition, run, now, join = {}) {
|
|
27
|
+
if (!isPipelineRunActive(run)) {
|
|
28
|
+
throw new PipelineIncrementError(`Pipeline run '${run.runId}' is ${run.status}.`);
|
|
29
|
+
}
|
|
30
|
+
const linked = linkedOpenStepIds(join, run);
|
|
31
|
+
if (linked.length > 0) {
|
|
32
|
+
throw new PipelineIncrementError(`Cannot increment pipeline: open task_steps still reference the linked goal (${linked.join(", ")}).`);
|
|
33
|
+
}
|
|
34
|
+
const running = inFlightToolTasks(join.backgroundToolTasks);
|
|
35
|
+
if (running.length > 0) {
|
|
36
|
+
throw new PipelineIncrementError(`Cannot increment pipeline: tool_task(s) still running (${running.join(", ")}). Wait once via tool_task.`);
|
|
37
|
+
}
|
|
38
|
+
const stage = currentPipelineStage(definition, run);
|
|
39
|
+
if (!stage) {
|
|
40
|
+
throw new PipelineIncrementError(`Current stage '${run.currentStageId}' is missing from the definition.`);
|
|
41
|
+
}
|
|
42
|
+
const scanned = scanStageOutput(stageOutputDir(run.runRoot, stage));
|
|
43
|
+
if (scanned.status !== "complete") {
|
|
44
|
+
throw new PipelineIncrementError(`Cannot increment pipeline: stage '${stage.id}' output/ has no files yet. Write the stage outputs first.`);
|
|
45
|
+
}
|
|
46
|
+
const currentIndex = definition.stages.findIndex((candidate) => candidate.id === stage.id);
|
|
47
|
+
const next = definition.stages[currentIndex + 1];
|
|
48
|
+
if (!next) {
|
|
49
|
+
const completed = persistPipelineRun({ ...run, status: "completed" }, now);
|
|
50
|
+
return {
|
|
51
|
+
run: completed,
|
|
52
|
+
result: {
|
|
53
|
+
surface: "pipeline",
|
|
54
|
+
from: stage.id,
|
|
55
|
+
completed: true,
|
|
56
|
+
detail: `Completed final stage '${stage.id}'. Pipeline run '${run.runId}' is done.`,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const advanced = persistPipelineRun({ ...run, currentStageId: next.id }, now);
|
|
61
|
+
return {
|
|
62
|
+
run: advanced,
|
|
63
|
+
result: {
|
|
64
|
+
surface: "pipeline",
|
|
65
|
+
from: stage.id,
|
|
66
|
+
to: next.id,
|
|
67
|
+
completed: false,
|
|
68
|
+
detail: `Completed '${stage.id}', started '${next.id}'. ${next.contract.oneJob || next.contract.title}`,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function abandonPipelineRun(run, now) {
|
|
73
|
+
if (!isPipelineRunActive(run))
|
|
74
|
+
return run;
|
|
75
|
+
return persistPipelineRun({ ...run, status: "abandoned" }, now);
|
|
76
|
+
}
|
|
77
|
+
export function advanceTaskSteps(state, now) {
|
|
78
|
+
const current = state.steps.find((step) => step.status === "in_progress") ??
|
|
79
|
+
state.steps.find((step) => step.status === "pending");
|
|
80
|
+
if (!current) {
|
|
81
|
+
return {
|
|
82
|
+
state,
|
|
83
|
+
result: {
|
|
84
|
+
surface: "task_steps",
|
|
85
|
+
completed: true,
|
|
86
|
+
detail: "No open task steps remain.",
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
let nextState = state;
|
|
91
|
+
if (current.status !== "completed") {
|
|
92
|
+
nextState = updateTaskStep(nextState, current.id, { status: "completed" }, now);
|
|
93
|
+
}
|
|
94
|
+
const following = nextState.steps.find((step) => step.id !== current.id && (step.status === "pending" || step.status === "blocked"));
|
|
95
|
+
if (following && following.status === "pending") {
|
|
96
|
+
nextState = updateTaskStep(nextState, following.id, { status: "in_progress" }, now);
|
|
97
|
+
return {
|
|
98
|
+
state: nextState,
|
|
99
|
+
result: {
|
|
100
|
+
surface: "task_steps",
|
|
101
|
+
from: current.id,
|
|
102
|
+
to: following.id,
|
|
103
|
+
completed: false,
|
|
104
|
+
detail: `Completed ${current.id}, started ${following.id}.`,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
state: nextState,
|
|
110
|
+
result: {
|
|
111
|
+
surface: "task_steps",
|
|
112
|
+
from: current.id,
|
|
113
|
+
completed: true,
|
|
114
|
+
detail: `Completed ${current.id}. No further pending steps.`,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export function currentOpenTaskStep(steps) {
|
|
119
|
+
return steps.find((step) => step.status === "in_progress") ?? steps.find((step) => step.status === "pending");
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=increment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"increment.js","sourceRoot":"","sources":["../../../src/core/pipelines/increment.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BackgroundToolTaskRef } from \"../background-tool-task-controller.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport type { OpenTaskStepRef } from \"../goals/goal-tool-core.ts\";\nimport { taskStepReferencesRequirement } from \"../tasks/task-projection.ts\";\nimport { type TaskStep, type TaskStepsState, updateTaskStep } from \"../tasks/task-state.ts\";\nimport { currentPipelineStage } from \"./context.ts\";\nimport { persistPipelineRun, scanStageOutput, stageOutputDir } from \"./run-state.ts\";\nimport { type IncrementResult, isPipelineRunActive, type PipelineDefinition, type PipelineRun } from \"./types.ts\";\n\nexport interface PipelineIncrementJoin {\n\tgoal?: GoalState;\n\topenTaskSteps?: readonly OpenTaskStepRef[];\n\tbackgroundToolTasks?: readonly BackgroundToolTaskRef[];\n}\n\nexport class PipelineIncrementError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"PipelineIncrementError\";\n\t}\n}\n\nfunction inFlightToolTasks(tasks: readonly BackgroundToolTaskRef[] | undefined): string[] {\n\tif (!tasks) return [];\n\treturn tasks.filter((task) => task.status === \"running\").map((task) => task.taskId);\n}\n\nfunction linkedOpenStepIds(join: PipelineIncrementJoin, run: PipelineRun): string[] {\n\tif (!run.goalId || !join.goal || join.goal.goalId !== run.goalId) return [];\n\tif (!join.openTaskSteps || join.openTaskSteps.length === 0) return [];\n\treturn join.openTaskSteps\n\t\t.filter((step) => join.goal!.requirements.some((requirement) => taskStepReferencesRequirement(step, requirement)))\n\t\t.map((step) => step.id);\n}\n\nexport function incrementPipelineRun(\n\tdefinition: PipelineDefinition,\n\trun: PipelineRun,\n\tnow: string,\n\tjoin: PipelineIncrementJoin = {},\n): { run: PipelineRun; result: IncrementResult } {\n\tif (!isPipelineRunActive(run)) {\n\t\tthrow new PipelineIncrementError(`Pipeline run '${run.runId}' is ${run.status}.`);\n\t}\n\tconst linked = linkedOpenStepIds(join, run);\n\tif (linked.length > 0) {\n\t\tthrow new PipelineIncrementError(\n\t\t\t`Cannot increment pipeline: open task_steps still reference the linked goal (${linked.join(\", \")}).`,\n\t\t);\n\t}\n\tconst running = inFlightToolTasks(join.backgroundToolTasks);\n\tif (running.length > 0) {\n\t\tthrow new PipelineIncrementError(\n\t\t\t`Cannot increment pipeline: tool_task(s) still running (${running.join(\", \")}). Wait once via tool_task.`,\n\t\t);\n\t}\n\tconst stage = currentPipelineStage(definition, run);\n\tif (!stage) {\n\t\tthrow new PipelineIncrementError(`Current stage '${run.currentStageId}' is missing from the definition.`);\n\t}\n\tconst scanned = scanStageOutput(stageOutputDir(run.runRoot, stage));\n\tif (scanned.status !== \"complete\") {\n\t\tthrow new PipelineIncrementError(\n\t\t\t`Cannot increment pipeline: stage '${stage.id}' output/ has no files yet. Write the stage outputs first.`,\n\t\t);\n\t}\n\tconst currentIndex = definition.stages.findIndex((candidate) => candidate.id === stage.id);\n\tconst next = definition.stages[currentIndex + 1];\n\tif (!next) {\n\t\tconst completed = persistPipelineRun({ ...run, status: \"completed\" }, now);\n\t\treturn {\n\t\t\trun: completed,\n\t\t\tresult: {\n\t\t\t\tsurface: \"pipeline\",\n\t\t\t\tfrom: stage.id,\n\t\t\t\tcompleted: true,\n\t\t\t\tdetail: `Completed final stage '${stage.id}'. Pipeline run '${run.runId}' is done.`,\n\t\t\t},\n\t\t};\n\t}\n\tconst advanced = persistPipelineRun({ ...run, currentStageId: next.id }, now);\n\treturn {\n\t\trun: advanced,\n\t\tresult: {\n\t\t\tsurface: \"pipeline\",\n\t\t\tfrom: stage.id,\n\t\t\tto: next.id,\n\t\t\tcompleted: false,\n\t\t\tdetail: `Completed '${stage.id}', started '${next.id}'. ${next.contract.oneJob || next.contract.title}`,\n\t\t},\n\t};\n}\n\nexport function abandonPipelineRun(run: PipelineRun, now: string): PipelineRun {\n\tif (!isPipelineRunActive(run)) return run;\n\treturn persistPipelineRun({ ...run, status: \"abandoned\" }, now);\n}\n\nexport function advanceTaskSteps(\n\tstate: TaskStepsState,\n\tnow: string,\n): {\n\tstate: TaskStepsState;\n\tresult: IncrementResult;\n} {\n\tconst current =\n\t\tstate.steps.find((step) => step.status === \"in_progress\") ??\n\t\tstate.steps.find((step) => step.status === \"pending\");\n\tif (!current) {\n\t\treturn {\n\t\t\tstate,\n\t\t\tresult: {\n\t\t\t\tsurface: \"task_steps\",\n\t\t\t\tcompleted: true,\n\t\t\t\tdetail: \"No open task steps remain.\",\n\t\t\t},\n\t\t};\n\t}\n\tlet nextState = state;\n\tif (current.status !== \"completed\") {\n\t\tnextState = updateTaskStep(nextState, current.id, { status: \"completed\" }, now);\n\t}\n\tconst following = nextState.steps.find(\n\t\t(step) => step.id !== current.id && (step.status === \"pending\" || step.status === \"blocked\"),\n\t);\n\tif (following && following.status === \"pending\") {\n\t\tnextState = updateTaskStep(nextState, following.id, { status: \"in_progress\" }, now);\n\t\treturn {\n\t\t\tstate: nextState,\n\t\t\tresult: {\n\t\t\t\tsurface: \"task_steps\",\n\t\t\t\tfrom: current.id,\n\t\t\t\tto: following.id,\n\t\t\t\tcompleted: false,\n\t\t\t\tdetail: `Completed ${current.id}, started ${following.id}.`,\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tstate: nextState,\n\t\tresult: {\n\t\t\tsurface: \"task_steps\",\n\t\t\tfrom: current.id,\n\t\t\tcompleted: true,\n\t\t\tdetail: `Completed ${current.id}. No further pending steps.`,\n\t\t},\n\t};\n}\n\nexport function currentOpenTaskStep(steps: readonly TaskStep[]): TaskStep | undefined {\n\treturn steps.find((step) => step.status === \"in_progress\") ?? steps.find((step) => step.status === \"pending\");\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { assembleStageContext, currentPipelineStage, formatActivePipelineContext, formatPipelineContext, } from "./context.ts";
|
|
2
|
+
export { discoverPipelineDefinitions, findPipelineDefinition, loadPipelineDefinition, projectPipelineRunsDir, projectPipelinesDir, } from "./discover.ts";
|
|
3
|
+
export { abandonPipelineRun, advanceTaskSteps, currentOpenTaskStep, incrementPipelineRun, PipelineIncrementError, type PipelineIncrementJoin, } from "./increment.ts";
|
|
4
|
+
export { parseStageContract, parseWorkspaceFrontmatter } from "./parse-contract.ts";
|
|
5
|
+
export { createPipelineRunRoot, findActivePipelineRun, instantiatePipelineRun, loadPipelineRunById, persistPipelineRun, readPipelineRun, scanPipelineRun, scanStageOutput, stageOutputDir, writePipelineRun, } from "./run-state.ts";
|
|
6
|
+
export { appendPipelineRunSnapshot, decodePipelineRunSnapshotPayload, getLatestPipelineRunSnapshot, } from "./session-pipeline-run.ts";
|
|
7
|
+
export { type AssembledStageContext, clonePipelineRun, type IncrementResult, isPipelineRun, isPipelineRunActive, PIPELINE_CONTEXT_MARKER, PIPELINE_RUN_CUSTOM_TYPE, PIPELINE_STAGE_FOLDER_RE, type PipelineDefinition, type PipelineForm, type PipelineRun, type PipelineStage, type StageContract, type StageScan, } from "./types.ts";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/pipelines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,qBAAqB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,qBAAqB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACN,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,yBAAyB,EACzB,gCAAgC,EAChC,4BAA4B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,KAAK,qBAAqB,EAC1B,gBAAgB,EAChB,KAAK,eAAe,EACpB,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,SAAS,GACd,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { assembleStageContext, currentPipelineStage, formatActivePipelineContext, formatPipelineContext, } from "./context.js";
|
|
2
|
+
export { discoverPipelineDefinitions, findPipelineDefinition, loadPipelineDefinition, projectPipelineRunsDir, projectPipelinesDir, } from "./discover.js";
|
|
3
|
+
export { abandonPipelineRun, advanceTaskSteps, currentOpenTaskStep, incrementPipelineRun, PipelineIncrementError, } from "./increment.js";
|
|
4
|
+
export { parseStageContract, parseWorkspaceFrontmatter } from "./parse-contract.js";
|
|
5
|
+
export { createPipelineRunRoot, findActivePipelineRun, instantiatePipelineRun, loadPipelineRunById, persistPipelineRun, readPipelineRun, scanPipelineRun, scanStageOutput, stageOutputDir, writePipelineRun, } from "./run-state.js";
|
|
6
|
+
export { appendPipelineRunSnapshot, decodePipelineRunSnapshotPayload, getLatestPipelineRunSnapshot, } from "./session-pipeline-run.js";
|
|
7
|
+
export { clonePipelineRun, isPipelineRun, isPipelineRunActive, PIPELINE_CONTEXT_MARKER, PIPELINE_RUN_CUSTOM_TYPE, PIPELINE_STAGE_FOLDER_RE, } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|