@christianmaf80/agentic-workflow 1.24.0-beta.3 → 1.25.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.es.md +13 -57
- package/README.md +14 -56
- package/bin/cli.js +22 -29
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/acceptance.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/agent-scores.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/agent-tasks/1-dev-agent-scaffold.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/agent-tasks/2-dev-agent-manifest-command.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/agent-tasks/3-dev-agent-marketplace-evidence.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/agent-tasks/4-qa-agent-verify-build.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/analysis.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/architect/review.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/metrics.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/plan.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/researcher/research.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/results-acceptance.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/task.md +0 -6
- package/dist/agent/artifacts/1-scaffold-extension-vscode-agentinc/verification.md +0 -6
- package/dist/agent/artifacts/11-refinement-capas-constitution/analysis.md +24 -0
- package/dist/agent/artifacts/11-refinement-capas-constitution/roadmap-audit.md +34 -0
- package/dist/agent/artifacts/11-refinement-capas-constitution/task.md +58 -0
- package/dist/agent/artifacts/12-npm-workspaces/acceptance.md +78 -0
- package/dist/agent/artifacts/12-npm-workspaces/analysis.md +179 -0
- package/dist/agent/artifacts/12-npm-workspaces/plan.md +237 -0
- package/dist/agent/artifacts/12-npm-workspaces/researcher/research.md +186 -0
- package/dist/agent/artifacts/12-npm-workspaces/task.md +126 -0
- package/dist/agent/artifacts/13-implement-custom-chat-with-a2ui/acceptance.md +75 -0
- package/dist/agent/artifacts/13-implement-custom-chat-with-a2ui/researcher/research.md +121 -0
- package/dist/agent/artifacts/13-implement-custom-chat-with-a2ui/task.md +104 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/acceptance.md +75 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/architect/analysis.md +90 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/planner/implementation_plan.md +44 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/researcher/research.md +113 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/task.md +107 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/verification/walkthrough.md +37 -0
- package/dist/agent/artifacts/14-re-implement-setup-config-d1/verifier/walkthrough.md +0 -0
- package/dist/agent/artifacts/2-scaffold-vscode-chat-ai-panel/acceptance.md +0 -6
- package/dist/agent/artifacts/2-scaffold-vscode-chat-ai-panel/task.md +0 -6
- package/dist/agent/artifacts/3-new-vscode-agentic-activitybar-chat/acceptance.md +0 -6
- package/dist/agent/artifacts/3-new-vscode-agentic-activitybar-chat/task.md +0 -6
- package/dist/agent/artifacts/4-copiar-estructura-agentic-cliente/acceptance.md +0 -6
- package/dist/agent/artifacts/4-copiar-estructura-agentic-cliente/architect/implementation.md +0 -6
- package/dist/agent/artifacts/5-reestructurar-src-para-extension-vscode/acceptance.md +0 -6
- package/dist/agent/artifacts/5-reestructurar-src-para-extension-vscode/agent-tasks/1-dev-agent-reestructurar-carpetas.md +1 -1
- package/dist/agent/artifacts/5-reestructurar-src-para-extension-vscode/task.md +0 -6
- package/dist/agent/artifacts/6-release-beta-11/task.md +0 -6
- package/dist/agent/artifacts/7-extension-vscode-webview/acceptance.md +70 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/agent-scores.md +24 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/agent-tasks/1-vscode-specialist-scaffold-extension.md +99 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/agent-tasks/2-vscode-specialist-update-manifest.md +101 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/agent-tasks/3-vscode-specialist-webview-provider.md +96 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/agent-tasks/4-vscode-specialist-activitybar-icon.md +95 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/agent-tasks/5-qa-agent-manual-verify.md +97 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/analysis.md +195 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/architect/review.md +124 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/changelog.md +9 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/metrics.md +43 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/plan.md +181 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/researcher/research.md +118 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/results-acceptance.md +146 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/task.md +119 -0
- package/dist/agent/artifacts/7-extension-vscode-webview/verification.md +81 -0
- package/dist/agent/artifacts/8-create-agentic-runtime-cli-first-as-the-single-execution-engine/task.md +126 -0
- package/dist/agent/artifacts/candidate/acceptance.md +23 -0
- package/dist/agent/artifacts/candidate/brief.md +39 -0
- package/dist/agent/artifacts/candidate/init.md +3 -9
- package/dist/agent/artifacts/candidate/task.md +4 -71
- package/dist/agent/artifacts/task-20260128-reorganize-structure/acceptance.md +0 -6
- package/dist/agent/artifacts/task-20260128-reorganize-structure/brief.md +1 -1
- package/dist/agent/artifacts/task-20260128-reorganize-structure/closure.md +3 -3
- package/dist/agent/artifacts/task-20260128-reorganize-structure/implementation.md +2 -2
- package/dist/agent/artifacts/task-20260128-reorganize-structure/task.md +0 -6
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/acceptance.md +65 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-scores.md +26 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/1-neo-agent-deps-chatkit.md +108 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/15-vscode-specialist-views-router.md +89 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/1b-vscode-specialist-review-deps.md +106 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/2-neo-agent-local-server.md +111 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/22-vscode-specialist-external-js.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/23-qa-agent-coverage-tests.md +85 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/24-vscode-specialist-class-refactor.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/25-vscode-specialist-external-html.md +88 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/26-vscode-specialist-template-js-html.md +110 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/27-vscode-specialist-fix-loading-setup.md +110 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/28-vscode-specialist-webview-debug-setup.md +107 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/29-vscode-specialist-webview-logging.md +109 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/3-neo-agent-webview-ui.md +107 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/30-vscode-specialist-csp-source.md +88 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/31-vscode-specialist-logging-prefix.md +83 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/32-vscode-specialist-logging-visibility.md +85 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/33-vscode-specialist-lit-setup.md +85 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/34-vscode-specialist-core-lit-base.md +89 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/35-vscode-specialist-lit-decorators-ts.md +88 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/36-vscode-specialist-lit-module-start.md +85 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/37-vscode-specialist-lit-ready-state.md +86 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/4-qa-agent-verification.md +106 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/5-vscode-specialist-api-key-ui.md +107 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/6-vscode-specialist-refactor-protocol.md +108 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/7-qa-agent-unit-tests.md +104 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-10-vscode-specialist-api-key-handshake.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-11-vscode-specialist-api-key-button-style.md +83 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-12-vscode-specialist-key-gate-view.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-13-vscode-specialist-status-timeout.md +83 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-14-vscode-specialist-init-flow.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-16-vscode-specialist-view-context.md +87 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-17-vscode-specialist-clear-key-command.md +85 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-18-vscode-specialist-context-sync.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-19-vscode-specialist-setup-visible.md +88 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-20-vscode-specialist-loading-state.md +83 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-21-vscode-specialist-loading-label.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-8-vscode-specialist-api-key-detect.md +89 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/agent-tasks/fix-9-vscode-specialist-api-key-state.md +84 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/analysis.md +156 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/architect/review.md +141 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/changelog.md +30 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/metrics.md +43 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/plan.md +151 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/research.md +115 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/results-acceptance.md +171 -0
- package/dist/agent/artifacts/task-20260130-chatkit-mainview/verification.md +87 -0
- package/dist/agent/artifacts/task-20260130-fix-mainview-provider/acceptance.md +64 -0
- package/dist/agent/artifacts/task-20260130-fix-mainview-provider/architect/implementation.md +30 -0
- package/dist/agent/artifacts/task-20260130-fix-mainview-provider/brief.md +102 -0
- package/dist/agent/artifacts/task-20260130-fix-mainview-provider/closure.md +95 -0
- package/dist/agent/artifacts/task-20260130-rol-vscode/acceptance.md +68 -0
- package/dist/agent/artifacts/task-20260130-rol-vscode/architect/implementation.md +33 -0
- package/dist/agent/artifacts/task-20260130-rol-vscode/brief.md +104 -0
- package/dist/agent/artifacts/task-20260130-rol-vscode/closure.md +100 -0
- package/dist/agent/artifacts/task-beta-release/acceptance.md +23 -0
- package/dist/agent/artifacts/task-beta-release/brief.md +39 -0
- package/dist/agent/artifacts/task-beta-release/closure.md +29 -0
- package/dist/agent/artifacts/task-beta-release/init.md +26 -0
- package/dist/agent/artifacts/task-beta-release/task.md +64 -0
- package/dist/agent/index.md +69 -30
- package/dist/agent/rules/constitution/agents-behavior.md +110 -100
- package/dist/agent/rules/constitution/backend.md +27 -0
- package/dist/agent/rules/constitution/background.md +30 -0
- package/dist/agent/rules/constitution/clean-code.md +5 -6
- package/dist/agent/rules/constitution/modular-architecture.md +66 -0
- package/dist/agent/rules/constitution/view.md +41 -0
- package/dist/agent/rules/constitution/vscode-extensions.md +32 -0
- package/dist/agent/rules/roles/architect.md +1 -2
- package/dist/agent/rules/roles/backend.md +21 -0
- package/dist/agent/rules/roles/background.md +20 -0
- package/dist/agent/rules/roles/devops.md +20 -0
- package/dist/agent/rules/roles/engine.md +26 -0
- package/dist/agent/rules/roles/neo.md +12 -13
- package/dist/agent/rules/roles/researcher.md +2 -2
- package/dist/agent/rules/roles/view.md +22 -0
- package/dist/agent/rules/roles/vscode-specialist.md +24 -0
- package/dist/agent/templates/acceptance.md +19 -25
- package/dist/agent/templates/agent-task.md +39 -39
- package/dist/agent/templates/analysis.md +92 -92
- package/dist/agent/templates/brief.md +43 -43
- package/dist/agent/templates/changelog.md +8 -8
- package/dist/agent/templates/closure.md +29 -29
- package/dist/agent/templates/coding/coding-integration-report.md +102 -0
- package/dist/agent/templates/coding/coding-layer-report.md +78 -0
- package/dist/agent/templates/init.md +0 -6
- package/dist/agent/templates/planning.md +73 -73
- package/dist/agent/templates/research.md +43 -43
- package/dist/agent/templates/results-acceptance.md +94 -94
- package/dist/agent/templates/review.md +59 -59
- package/dist/agent/templates/subtask-implementation.md +29 -29
- package/dist/agent/templates/supplemental-report.md +0 -6
- package/dist/agent/templates/task-metrics.md +14 -14
- package/dist/agent/templates/task.md +15 -15
- package/dist/agent/templates/todo-item.md +23 -23
- package/dist/agent/workflows/coding/coding-backend.md +147 -0
- package/dist/agent/workflows/coding/coding-background.md +149 -0
- package/dist/agent/workflows/coding/coding-integration.md +174 -0
- package/dist/agent/workflows/coding/coding-view.md +151 -0
- package/dist/agent/workflows/init.md +83 -90
- package/dist/agent/workflows/scaffold-module.md +38 -0
- package/dist/agent/workflows/tasklifecycle-long/phase-0-acceptance-criteria.md +124 -134
- package/dist/agent/workflows/tasklifecycle-long/phase-1-research.md +103 -97
- package/dist/agent/workflows/tasklifecycle-long/phase-2-analysis.md +107 -102
- package/dist/agent/workflows/tasklifecycle-long/phase-3-planning.md +125 -120
- package/dist/agent/workflows/tasklifecycle-long/phase-4-implementation.md +118 -118
- package/dist/agent/workflows/tasklifecycle-long/phase-5-verification.md +105 -101
- package/dist/agent/workflows/tasklifecycle-long/phase-6-results-acceptance.md +82 -78
- package/dist/agent/workflows/tasklifecycle-long/phase-7-evaluation.md +84 -75
- package/dist/agent/workflows/tasklifecycle-long/phase-8-commit-push.md +94 -89
- package/dist/agent/workflows/tasklifecycle-short/short-phase-1-brief.md +78 -71
- package/dist/agent/workflows/tasklifecycle-short/short-phase-2-implementation.md +79 -71
- package/dist/agent/workflows/tasklifecycle-short/short-phase-3-closure.md +73 -66
- package/dist/cli/commands/create.js +4 -29
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/mcp.js +0 -6
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/runtime/engine/engine.js +29 -57
- package/dist/runtime/engine/engine.js.map +1 -1
- package/dist/runtime/engine/service.js +1 -38
- package/dist/runtime/engine/service.js.map +1 -1
- package/dist/runtime/engine/task-loader.js +1 -1
- package/dist/runtime/engine/task-loader.js.map +1 -1
- package/dist/runtime/engine/workflow-loader.js +17 -25
- package/dist/runtime/engine/workflow-loader.js.map +1 -1
- package/dist/runtime/mcp/server.js +38 -277
- package/dist/runtime/mcp/server.js.map +1 -1
- package/package.json +69 -7
- package/dist/agent/artifacts/index.md +0 -25
- package/dist/agent/rules/constitution/index.md +0 -26
- package/dist/agent/rules/constitution/runtime-integration.md +0 -101
- package/dist/agent/rules/index.md +0 -70
- package/dist/agent/rules/roles/index.md +0 -44
- package/dist/agent/templates/index.md +0 -42
- package/dist/agent/workflows/index.md +0 -30
- package/dist/agent/workflows/tasklifecycle-long/index.md +0 -172
- package/dist/agent/workflows/tasklifecycle-short/index.md +0 -70
- package/dist/cli/commands/register-mcp.js +0 -116
- package/dist/cli/commands/register-mcp.js.map +0 -1
- package/dist/runtime/engine/logger.js +0 -74
- package/dist/runtime/engine/logger.js.map +0 -1
- package/dist/runtime/mcp/check-tools.js +0 -66
- package/dist/runtime/mcp/check-tools.js.map +0 -1
|
@@ -3,7 +3,6 @@ import path from 'node:path';
|
|
|
3
3
|
import { RuntimeEmitter } from './emitter.js';
|
|
4
4
|
import { RuntimeEngine } from './engine.js';
|
|
5
5
|
import { StateStore } from './state-store.js';
|
|
6
|
-
import { Logger } from './logger.js';
|
|
7
6
|
import { loadTask, resolveWorkflowsRoot } from './task-loader.js';
|
|
8
7
|
import { resolvePhaseWorkflow } from './workflow-loader.js';
|
|
9
8
|
export async function runRuntime(options) {
|
|
@@ -37,16 +36,7 @@ export async function runRuntime(options) {
|
|
|
37
36
|
});
|
|
38
37
|
const store = new StateStore(statePath);
|
|
39
38
|
const engine = new RuntimeEngine({ emitter, stateStore: store });
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
const result = await engine.run(state, workflow);
|
|
43
|
-
Logger.info('Service', 'Runtime execution finished', { runId, status: result.status });
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
Logger.error('Service', 'Runtime execution failed', { runId, error: String(error) });
|
|
48
|
-
throw error;
|
|
49
|
-
}
|
|
39
|
+
return engine.run(state, workflow);
|
|
50
40
|
}
|
|
51
41
|
export async function resumeRuntime(options) {
|
|
52
42
|
const taskPath = path.resolve(options.taskPath);
|
|
@@ -74,33 +64,6 @@ export async function resumeRuntime(options) {
|
|
|
74
64
|
const engine = new RuntimeEngine({ emitter, stateStore: store });
|
|
75
65
|
return engine.run(state, workflow);
|
|
76
66
|
}
|
|
77
|
-
export async function stepRuntime(options) {
|
|
78
|
-
const taskPath = path.resolve(options.taskPath);
|
|
79
|
-
const task = await loadTask(taskPath);
|
|
80
|
-
ensureOwner(task.owner, options.agent);
|
|
81
|
-
const statePath = resolveStatePath(taskPath, options.statePath);
|
|
82
|
-
const store = new StateStore(statePath);
|
|
83
|
-
const state = await store.load();
|
|
84
|
-
if (!state) {
|
|
85
|
-
throw new Error('No persisted state found to resume.');
|
|
86
|
-
}
|
|
87
|
-
if (state.taskPath !== taskPath) {
|
|
88
|
-
throw new Error('State does not match the provided task path.');
|
|
89
|
-
}
|
|
90
|
-
const workflowsRoot = resolveWorkflowsRoot(path.dirname(taskPath));
|
|
91
|
-
const mapping = await resolvePhaseWorkflow(workflowsRoot, state.phase);
|
|
92
|
-
if (!mapping) {
|
|
93
|
-
throw new Error(`No workflow mapping found for phase ${state.phase}.`);
|
|
94
|
-
}
|
|
95
|
-
const workflow = { id: mapping.phaseId, path: mapping.workflowPath };
|
|
96
|
-
const emitter = new RuntimeEmitter({
|
|
97
|
-
eventsPath: options.eventsPath,
|
|
98
|
-
stdout: options.stdoutEvents ?? true
|
|
99
|
-
});
|
|
100
|
-
const engine = new RuntimeEngine({ emitter, stateStore: store });
|
|
101
|
-
Logger.info('Service', 'Runtime stepping execution', { runId: state.runId, taskId: task.id });
|
|
102
|
-
return engine.step(state, workflow);
|
|
103
|
-
}
|
|
104
67
|
function resolveStatePath(taskPath, override) {
|
|
105
68
|
if (override) {
|
|
106
69
|
return path.resolve(override);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/runtime/engine/service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/runtime/engine/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export async function loadTask(taskPath) {
|
|
|
9
9
|
const task = yaml.task ?? {};
|
|
10
10
|
const id = task.id ?? meta.id ?? '';
|
|
11
11
|
const title = task.title ?? meta.title ?? '';
|
|
12
|
-
const phase = task.phase?.current ??
|
|
12
|
+
const phase = task.phase?.current ?? '';
|
|
13
13
|
const owner = meta.owner ?? extractOwner(raw) ?? '';
|
|
14
14
|
if (!id || !title || !phase || !owner) {
|
|
15
15
|
throw new Error('Task file missing required fields (id/title/owner/phase.current).');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-loader.js","sourceRoot":"","sources":["../../../src/runtime/engine/task-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AAyBjC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAgB,CAAC;IAC9B,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAa,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"task-loader.js","sourceRoot":"","sources":["../../../src/runtime/engine/task-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,39 +33,31 @@ export async function loadWorkflows(workflowsRoot) {
|
|
|
33
33
|
return workflows;
|
|
34
34
|
}
|
|
35
35
|
export async function resolvePhaseWorkflow(workflowsRoot, phaseId) {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
// Index for strategy might not exist or be unreadable, skip
|
|
58
|
-
continue;
|
|
36
|
+
const indexPath = path.join(workflowsRoot, 'tasklifecycle-long', 'index.md');
|
|
37
|
+
const raw = await fs.readFile(indexPath, 'utf-8');
|
|
38
|
+
const { data } = matter(raw);
|
|
39
|
+
const phases = extractPhases(data) ?? extractPhases(extractYamlBlock(raw));
|
|
40
|
+
if (!phases || typeof phases !== 'object') {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
for (const phaseKey of Object.keys(phases)) {
|
|
44
|
+
const phase = phases[phaseKey];
|
|
45
|
+
if (phase?.id === phaseId && typeof phase.workflow === 'string') {
|
|
46
|
+
const workflowPath = resolveWorkflowPath(workflowsRoot, phase.workflow);
|
|
47
|
+
return {
|
|
48
|
+
phaseId,
|
|
49
|
+
workflowPath
|
|
50
|
+
};
|
|
59
51
|
}
|
|
60
52
|
}
|
|
61
53
|
return null;
|
|
62
54
|
}
|
|
63
|
-
function extractPhases(source
|
|
55
|
+
function extractPhases(source) {
|
|
64
56
|
if (!source || typeof source !== 'object') {
|
|
65
57
|
return null;
|
|
66
58
|
}
|
|
67
59
|
const aliases = source.aliases;
|
|
68
|
-
const phases = aliases?.[
|
|
60
|
+
const phases = aliases?.['tasklifecycle-long']?.phases;
|
|
69
61
|
return phases && typeof phases === 'object' ? phases : null;
|
|
70
62
|
}
|
|
71
63
|
function extractYamlBlock(markdown) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../../../src/runtime/engine/workflow-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AAWjC,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,aAAqB;IACvD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,EAAE,CAAC;YACjC,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;gBAChF,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;aAC3H,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,aAAqB,EAAE,OAAe;IAC/E,MAAM,
|
|
1
|
+
{"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../../../src/runtime/engine/workflow-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,82 +5,8 @@ import matter from 'gray-matter';
|
|
|
5
5
|
import { RuntimeEmitter } from '../engine/emitter.js';
|
|
6
6
|
import { loadWorkflows } from '../engine/workflow-loader.js';
|
|
7
7
|
import { loadTask, resolveWorkflowsRoot } from '../engine/task-loader.js';
|
|
8
|
-
import { runRuntime, resumeRuntime
|
|
9
|
-
import { Logger } from '../engine/logger.js';
|
|
10
|
-
const MCP_TOOLS = [
|
|
11
|
-
{
|
|
12
|
-
name: 'runtime_run',
|
|
13
|
-
description: 'Start a new workflow runtime execution',
|
|
14
|
-
inputSchema: {
|
|
15
|
-
type: 'object',
|
|
16
|
-
properties: {
|
|
17
|
-
taskPath: { type: 'string', description: 'Path to task.md file' },
|
|
18
|
-
agent: { type: 'string', description: 'Agent identifier' }
|
|
19
|
-
},
|
|
20
|
-
required: ['taskPath', 'agent']
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: 'runtime_chat',
|
|
25
|
-
description: 'Send a chat message to the runtime',
|
|
26
|
-
inputSchema: {
|
|
27
|
-
type: 'object',
|
|
28
|
-
properties: {
|
|
29
|
-
message: { type: 'string', description: 'Chat message content' },
|
|
30
|
-
role: { type: 'string', description: 'Message role (user/assistant)' }
|
|
31
|
-
},
|
|
32
|
-
required: ['message']
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'runtime_list_workflows',
|
|
37
|
-
description: 'List available workflows',
|
|
38
|
-
inputSchema: {
|
|
39
|
-
type: 'object',
|
|
40
|
-
properties: {
|
|
41
|
-
workflowsRoot: { type: 'string', description: 'Path to workflows directory' }
|
|
42
|
-
},
|
|
43
|
-
required: ['workflowsRoot']
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
name: 'runtime_validate_gate',
|
|
48
|
-
description: 'Validate a workflow gate',
|
|
49
|
-
inputSchema: {
|
|
50
|
-
type: 'object',
|
|
51
|
-
properties: {
|
|
52
|
-
taskPath: { type: 'string' },
|
|
53
|
-
agent: { type: 'string' },
|
|
54
|
-
expectedPhase: { type: 'string' }
|
|
55
|
-
},
|
|
56
|
-
required: ['taskPath', 'agent']
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
name: 'runtime_advance_phase',
|
|
61
|
-
description: 'Advance to the next workflow phase',
|
|
62
|
-
inputSchema: {
|
|
63
|
-
type: 'object',
|
|
64
|
-
properties: {
|
|
65
|
-
taskPath: { type: 'string' },
|
|
66
|
-
agent: { type: 'string' }
|
|
67
|
-
},
|
|
68
|
-
required: ['taskPath', 'agent']
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: 'debug_read_logs',
|
|
73
|
-
description: 'Read runtime debug logs',
|
|
74
|
-
inputSchema: {
|
|
75
|
-
type: 'object',
|
|
76
|
-
properties: {
|
|
77
|
-
limit: { type: 'number', description: 'Max logs to return' }
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
];
|
|
8
|
+
import { runRuntime, resumeRuntime } from '../engine/service.js';
|
|
82
9
|
export async function startRuntimeMcpServer() {
|
|
83
|
-
Logger.info('MCP', 'Server started via stdio transport. Waiting for JSON-RPC messages...');
|
|
84
10
|
const rl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
85
11
|
for await (const line of rl) {
|
|
86
12
|
const trimmed = line.trim();
|
|
@@ -94,36 +20,21 @@ async function handleRequest(line) {
|
|
|
94
20
|
let request;
|
|
95
21
|
try {
|
|
96
22
|
request = JSON.parse(line);
|
|
97
|
-
Logger.debug('MCP', 'Received request', { id: request.id, method: request.method });
|
|
98
23
|
}
|
|
99
24
|
catch (error) {
|
|
100
|
-
writeResponse({
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
// Notifications (no id) don't require a response
|
|
104
|
-
if (request.id === undefined || request.id === null) {
|
|
105
|
-
Logger.debug('MCP', 'Received notification, no response needed', { method: request.method });
|
|
25
|
+
writeResponse({ id: 'unknown', error: { message: 'Invalid JSON request.' } });
|
|
106
26
|
return;
|
|
107
27
|
}
|
|
108
28
|
try {
|
|
109
29
|
const result = await dispatchRequest(request);
|
|
110
|
-
writeResponse({
|
|
30
|
+
writeResponse({ id: request.id, result });
|
|
111
31
|
}
|
|
112
32
|
catch (error) {
|
|
113
|
-
|
|
114
|
-
writeResponse({ jsonrpc: '2.0', id: request.id, error: { code: -32603, message: formatError(error) } });
|
|
33
|
+
writeResponse({ id: request.id, error: { message: formatError(error) } });
|
|
115
34
|
}
|
|
116
35
|
}
|
|
117
36
|
async function dispatchRequest(request) {
|
|
118
37
|
switch (request.method) {
|
|
119
|
-
// MCP Standard Protocol
|
|
120
|
-
case 'initialize':
|
|
121
|
-
return handleInitialize();
|
|
122
|
-
case 'tools/list':
|
|
123
|
-
return handleToolsList();
|
|
124
|
-
case 'tools/call':
|
|
125
|
-
return handleToolsCall(request.params ?? {});
|
|
126
|
-
// Runtime-specific methods (via tools/call)
|
|
127
38
|
case 'runtime.run':
|
|
128
39
|
return handleRun(request.params ?? {});
|
|
129
40
|
case 'runtime.resume':
|
|
@@ -140,58 +51,15 @@ async function dispatchRequest(request) {
|
|
|
140
51
|
return handleEmitEvent(request.params ?? {});
|
|
141
52
|
case 'runtime.chat':
|
|
142
53
|
return handleChat(request.params ?? {});
|
|
143
|
-
case 'runtime.next_step':
|
|
144
|
-
return handleNextStep(request.params ?? {});
|
|
145
|
-
case 'runtime.complete_step':
|
|
146
|
-
return handleCompleteStep(request.params ?? {});
|
|
147
|
-
case 'debug_read_logs':
|
|
148
|
-
return handleDebugReadLogs(request.params ?? {});
|
|
149
54
|
default:
|
|
150
55
|
throw new Error(`Unknown method: ${request.method}`);
|
|
151
56
|
}
|
|
152
57
|
}
|
|
153
|
-
function handleInitialize() {
|
|
154
|
-
return {
|
|
155
|
-
protocolVersion: '2024-11-05',
|
|
156
|
-
capabilities: {
|
|
157
|
-
tools: {}
|
|
158
|
-
},
|
|
159
|
-
serverInfo: {
|
|
160
|
-
name: 'agentic-workflow',
|
|
161
|
-
version: '1.0.0'
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
function handleToolsList() {
|
|
166
|
-
return { tools: MCP_TOOLS };
|
|
167
|
-
}
|
|
168
|
-
async function handleToolsCall(params) {
|
|
169
|
-
const toolName = ensureString(params.name, 'name');
|
|
170
|
-
const args = (params.arguments ?? {});
|
|
171
|
-
switch (toolName) {
|
|
172
|
-
case 'runtime_run':
|
|
173
|
-
return handleRun(args);
|
|
174
|
-
case 'runtime_chat':
|
|
175
|
-
return handleChat(args);
|
|
176
|
-
case 'runtime_list_workflows':
|
|
177
|
-
return handleListWorkflows(args);
|
|
178
|
-
case 'runtime_validate_gate':
|
|
179
|
-
return handleValidateGate(args);
|
|
180
|
-
case 'runtime_advance_phase':
|
|
181
|
-
return handleAdvancePhase(args);
|
|
182
|
-
case 'debug_read_logs':
|
|
183
|
-
return handleDebugReadLogs(args);
|
|
184
|
-
default:
|
|
185
|
-
Logger.error('MCP', `Unknown tool called: ${toolName}`);
|
|
186
|
-
throw new Error(`Unknown tool: ${toolName}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
58
|
async function handleRun(params) {
|
|
190
59
|
const taskPath = ensureString(params.taskPath, 'taskPath');
|
|
191
60
|
const agent = ensureString(params.agent, 'agent');
|
|
192
61
|
const statePath = getOptionalString(params.statePath);
|
|
193
62
|
const eventsPath = getOptionalString(params.eventsPath);
|
|
194
|
-
Logger.info('MCP', `Tool called: runtime_run`, { taskPath, agent });
|
|
195
63
|
const result = await runRuntime({
|
|
196
64
|
taskPath,
|
|
197
65
|
agent,
|
|
@@ -199,14 +67,7 @@ async function handleRun(params) {
|
|
|
199
67
|
eventsPath,
|
|
200
68
|
stdoutEvents: false
|
|
201
69
|
});
|
|
202
|
-
return {
|
|
203
|
-
content: [
|
|
204
|
-
{
|
|
205
|
-
type: 'text',
|
|
206
|
-
text: JSON.stringify({ status: 'ok', runId: result.runId, phase: result.phase })
|
|
207
|
-
}
|
|
208
|
-
]
|
|
209
|
-
};
|
|
70
|
+
return { status: 'ok', runId: result.runId, phase: result.phase };
|
|
210
71
|
}
|
|
211
72
|
async function handleResume(params) {
|
|
212
73
|
const taskPath = ensureString(params.taskPath, 'taskPath');
|
|
@@ -222,92 +83,32 @@ async function handleResume(params) {
|
|
|
222
83
|
});
|
|
223
84
|
return { status: 'ok', runId: result.runId, phase: result.phase };
|
|
224
85
|
}
|
|
225
|
-
async function handleNextStep(params) {
|
|
226
|
-
const taskPath = ensureString(params.taskPath, 'taskPath');
|
|
227
|
-
const agent = ensureString(params.agent, 'agent');
|
|
228
|
-
const statePath = getOptionalString(params.statePath);
|
|
229
|
-
const eventsPath = getOptionalString(params.eventsPath);
|
|
230
|
-
const result = await stepRuntime({
|
|
231
|
-
taskPath,
|
|
232
|
-
agent,
|
|
233
|
-
statePath,
|
|
234
|
-
eventsPath,
|
|
235
|
-
stdoutEvents: false
|
|
236
|
-
});
|
|
237
|
-
return { status: 'ok', runId: result.runId, phase: result.phase, step: result.steps.find(s => s.status === 'completed' || s.status === 'failed') };
|
|
238
|
-
}
|
|
239
|
-
async function handleCompleteStep(params) {
|
|
240
|
-
return { status: 'ok', message: 'Step completion acknowledged (logic pending specific requirement).' };
|
|
241
|
-
}
|
|
242
86
|
async function handleGetState(params) {
|
|
243
87
|
const statePath = ensureString(params.statePath, 'statePath');
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
// Enrich with task content
|
|
247
|
-
let taskContent = '';
|
|
248
|
-
try {
|
|
249
|
-
if (state.taskPath) {
|
|
250
|
-
taskContent = await fs.readFile(state.taskPath, 'utf-8');
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
catch (e) {
|
|
254
|
-
// Ignore if task file not found
|
|
255
|
-
}
|
|
256
|
-
return { ...state, taskContent };
|
|
88
|
+
const raw = await fs.readFile(path.resolve(statePath), 'utf-8');
|
|
89
|
+
return JSON.parse(raw);
|
|
257
90
|
}
|
|
258
91
|
async function handleListWorkflows(params) {
|
|
259
92
|
const workflowsRoot = ensureString(params.workflowsRoot, 'workflowsRoot');
|
|
260
|
-
|
|
261
|
-
const workflows = await loadWorkflows(workflowsRoot);
|
|
262
|
-
return {
|
|
263
|
-
content: [
|
|
264
|
-
{
|
|
265
|
-
type: 'text',
|
|
266
|
-
text: JSON.stringify(workflows)
|
|
267
|
-
}
|
|
268
|
-
]
|
|
269
|
-
};
|
|
93
|
+
return loadWorkflows(workflowsRoot);
|
|
270
94
|
}
|
|
271
95
|
async function handleValidateGate(params) {
|
|
272
96
|
const taskPath = ensureString(params.taskPath, 'taskPath');
|
|
273
97
|
const agent = ensureString(params.agent, 'agent');
|
|
274
98
|
const expectedPhase = getOptionalString(params.expectedPhase);
|
|
275
|
-
Logger.info('MCP', `Tool called: runtime_validate_gate`, { taskPath, agent, expectedPhase });
|
|
276
99
|
const task = await loadTask(taskPath);
|
|
277
100
|
if (task.owner !== agent) {
|
|
278
|
-
return {
|
|
279
|
-
content: [
|
|
280
|
-
{
|
|
281
|
-
type: 'text',
|
|
282
|
-
text: JSON.stringify({ valid: false, reason: 'Agent mismatch.' })
|
|
283
|
-
}
|
|
284
|
-
]
|
|
285
|
-
};
|
|
101
|
+
return { valid: false, reason: 'Agent mismatch.' };
|
|
286
102
|
}
|
|
287
103
|
if (expectedPhase && task.phase !== expectedPhase) {
|
|
288
|
-
return {
|
|
289
|
-
content: [
|
|
290
|
-
{
|
|
291
|
-
type: 'text',
|
|
292
|
-
text: JSON.stringify({ valid: false, reason: `Phase mismatch. Current: ${task.phase}.` })
|
|
293
|
-
}
|
|
294
|
-
]
|
|
295
|
-
};
|
|
104
|
+
return { valid: false, reason: `Phase mismatch. Current: ${task.phase}.` };
|
|
296
105
|
}
|
|
297
|
-
return {
|
|
298
|
-
content: [
|
|
299
|
-
{
|
|
300
|
-
type: 'text',
|
|
301
|
-
text: JSON.stringify({ valid: true })
|
|
302
|
-
}
|
|
303
|
-
]
|
|
304
|
-
};
|
|
106
|
+
return { valid: true };
|
|
305
107
|
}
|
|
306
108
|
async function handleAdvancePhase(params) {
|
|
307
109
|
const taskPath = ensureString(params.taskPath, 'taskPath');
|
|
308
110
|
const agent = ensureString(params.agent, 'agent');
|
|
309
111
|
const eventsPath = getOptionalString(params.eventsPath);
|
|
310
|
-
Logger.info('MCP', `Tool called: runtime_advance_phase`, { taskPath, agent });
|
|
311
112
|
const task = await loadTask(taskPath);
|
|
312
113
|
if (task.owner !== agent) {
|
|
313
114
|
throw new Error('Agent mismatch.');
|
|
@@ -323,14 +124,7 @@ async function handleAdvancePhase(params) {
|
|
|
323
124
|
phase: nextPhase,
|
|
324
125
|
payload: { previousPhase: task.phase }
|
|
325
126
|
});
|
|
326
|
-
return {
|
|
327
|
-
content: [
|
|
328
|
-
{
|
|
329
|
-
type: 'text',
|
|
330
|
-
text: JSON.stringify({ status: 'ok', previousPhase: task.phase, currentPhase: nextPhase, updatedAt: updated.updatedAt })
|
|
331
|
-
}
|
|
332
|
-
]
|
|
333
|
-
};
|
|
127
|
+
return { status: 'ok', previousPhase: task.phase, currentPhase: nextPhase, updatedAt: updated.updatedAt };
|
|
334
128
|
}
|
|
335
129
|
async function handleEmitEvent(params) {
|
|
336
130
|
const eventsPath = getOptionalString(params.eventsPath);
|
|
@@ -346,7 +140,6 @@ async function handleChat(params) {
|
|
|
346
140
|
const eventsPath = getOptionalString(params.eventsPath);
|
|
347
141
|
const message = ensureString(params.message, 'message');
|
|
348
142
|
const role = getOptionalString(params.role) ?? 'user';
|
|
349
|
-
Logger.info('Runtime', `Chat message received from ${role}`, { message });
|
|
350
143
|
const emitter = new RuntimeEmitter({ eventsPath, stdout: false });
|
|
351
144
|
await emitter.emit({
|
|
352
145
|
type: 'chat_message',
|
|
@@ -354,26 +147,7 @@ async function handleChat(params) {
|
|
|
354
147
|
runId: 'chat',
|
|
355
148
|
payload: { role, content: message }
|
|
356
149
|
});
|
|
357
|
-
return {
|
|
358
|
-
content: [
|
|
359
|
-
{
|
|
360
|
-
type: 'text',
|
|
361
|
-
text: JSON.stringify({ status: 'ok' })
|
|
362
|
-
}
|
|
363
|
-
]
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
async function handleDebugReadLogs(params) {
|
|
367
|
-
const limit = typeof params.limit === 'number' ? params.limit : 100;
|
|
368
|
-
const logs = Logger.getInstance().getLogs(limit);
|
|
369
|
-
return {
|
|
370
|
-
content: [
|
|
371
|
-
{
|
|
372
|
-
type: 'text',
|
|
373
|
-
text: JSON.stringify(logs, null, 2)
|
|
374
|
-
}
|
|
375
|
-
]
|
|
376
|
-
};
|
|
150
|
+
return { status: 'ok' };
|
|
377
151
|
}
|
|
378
152
|
function ensureString(value, name) {
|
|
379
153
|
if (typeof value !== 'string' || value.length === 0) {
|
|
@@ -385,51 +159,38 @@ function getOptionalString(value) {
|
|
|
385
159
|
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
386
160
|
}
|
|
387
161
|
function writeResponse(response) {
|
|
388
|
-
Logger.debug('MCP', 'Sending response', { id: response.id, error: !!response.error });
|
|
389
162
|
process.stdout.write(`${JSON.stringify(response)}\n`);
|
|
390
163
|
}
|
|
391
164
|
function formatError(error) {
|
|
392
165
|
return error instanceof Error ? error.message : String(error);
|
|
393
166
|
}
|
|
394
167
|
async function resolveNextPhase(workflowsRoot, currentPhase) {
|
|
395
|
-
const
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
throw new Error('Phase entry missing id.');
|
|
420
|
-
}
|
|
421
|
-
return id;
|
|
422
|
-
});
|
|
423
|
-
const index = phaseIds.indexOf(currentPhase);
|
|
424
|
-
if (index !== -1 && index < phaseIds.length - 1) {
|
|
425
|
-
return phaseIds[index + 1];
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
catch (error) {
|
|
429
|
-
continue;
|
|
430
|
-
}
|
|
168
|
+
const indexPath = path.join(workflowsRoot, 'tasklifecycle-long', 'index.md');
|
|
169
|
+
const raw = await fs.readFile(indexPath, 'utf-8');
|
|
170
|
+
const match = raw.match(/```yaml\n([\s\S]*?)```/);
|
|
171
|
+
if (!match) {
|
|
172
|
+
throw new Error('Missing workflow index YAML block.');
|
|
173
|
+
}
|
|
174
|
+
const yaml = match[1];
|
|
175
|
+
const data = matter(`---\n${yaml}\n---`).data;
|
|
176
|
+
const phases = data.aliases?.['tasklifecycle-long']?.phases;
|
|
177
|
+
if (!phases || typeof phases !== 'object') {
|
|
178
|
+
throw new Error('Invalid workflow index structure.');
|
|
179
|
+
}
|
|
180
|
+
const phaseIds = Object.entries(phases)
|
|
181
|
+
.sort(([a], [b]) => parseInt(a.split('_')[1] ?? '0', 10) - parseInt(b.split('_')[1] ?? '0', 10))
|
|
182
|
+
.map(([, value]) => {
|
|
183
|
+
const id = value.id;
|
|
184
|
+
if (!id) {
|
|
185
|
+
throw new Error('Phase entry missing id.');
|
|
186
|
+
}
|
|
187
|
+
return id;
|
|
188
|
+
});
|
|
189
|
+
const index = phaseIds.indexOf(currentPhase);
|
|
190
|
+
if (index === -1 || index === phaseIds.length - 1) {
|
|
191
|
+
throw new Error('No next phase available.');
|
|
431
192
|
}
|
|
432
|
-
|
|
193
|
+
return phaseIds[index + 1];
|
|
433
194
|
}
|
|
434
195
|
async function updateTaskPhase(taskPath, currentPhase, nextPhase, agent) {
|
|
435
196
|
const timestamp = new Date().toISOString();
|