cool-workflow 0.1.78

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.
Files changed (193) hide show
  1. package/.claude-plugin/plugin.json +20 -0
  2. package/.codex-plugin/mcp.json +10 -0
  3. package/.codex-plugin/plugin.json +38 -0
  4. package/.mcp.json +10 -0
  5. package/LICENSE +24 -0
  6. package/README.md +638 -0
  7. package/apps/architecture-review/app.json +51 -0
  8. package/apps/architecture-review/workflow.js +116 -0
  9. package/apps/end-to-end-golden-path/app.json +30 -0
  10. package/apps/end-to-end-golden-path/workflow.js +33 -0
  11. package/apps/pr-review-fix-ci/app.json +59 -0
  12. package/apps/pr-review-fix-ci/workflow.js +90 -0
  13. package/apps/release-cut/app.json +54 -0
  14. package/apps/release-cut/workflow.js +82 -0
  15. package/apps/research-synthesis/app.json +50 -0
  16. package/apps/research-synthesis/workflow.js +76 -0
  17. package/apps/workflow-app-framework-demo/app.json +29 -0
  18. package/apps/workflow-app-framework-demo/workflow.js +44 -0
  19. package/dist/agent-config.js +223 -0
  20. package/dist/candidate-scoring.js +715 -0
  21. package/dist/capability-core.js +630 -0
  22. package/dist/capability-dispatcher.js +86 -0
  23. package/dist/capability-registry.js +523 -0
  24. package/dist/cli.js +1276 -0
  25. package/dist/collaboration.js +727 -0
  26. package/dist/commit.js +570 -0
  27. package/dist/contract-migration.js +234 -0
  28. package/dist/coordinator.js +1163 -0
  29. package/dist/daemon.js +44 -0
  30. package/dist/dispatch.js +201 -0
  31. package/dist/drive.js +503 -0
  32. package/dist/error-feedback.js +415 -0
  33. package/dist/evidence-grounding.js +179 -0
  34. package/dist/evidence-reasoning.js +733 -0
  35. package/dist/execution-backend.js +1279 -0
  36. package/dist/harness.js +61 -0
  37. package/dist/mcp-server.js +1615 -0
  38. package/dist/multi-agent-eval.js +857 -0
  39. package/dist/multi-agent-host.js +764 -0
  40. package/dist/multi-agent-operator-ux.js +537 -0
  41. package/dist/multi-agent-trust.js +366 -0
  42. package/dist/multi-agent.js +1173 -0
  43. package/dist/node-snapshot.js +270 -0
  44. package/dist/observability.js +922 -0
  45. package/dist/operator-ux.js +971 -0
  46. package/dist/orchestrator/audit-operations.js +182 -0
  47. package/dist/orchestrator/candidate-operations.js +117 -0
  48. package/dist/orchestrator/cli-options.js +288 -0
  49. package/dist/orchestrator/collaboration-operations.js +86 -0
  50. package/dist/orchestrator/feedback-operations.js +81 -0
  51. package/dist/orchestrator/host-operations.js +78 -0
  52. package/dist/orchestrator/lifecycle-operations.js +462 -0
  53. package/dist/orchestrator/migration-operations.js +44 -0
  54. package/dist/orchestrator/multi-agent-operations.js +362 -0
  55. package/dist/orchestrator/report.js +369 -0
  56. package/dist/orchestrator/topology-operations.js +84 -0
  57. package/dist/orchestrator.js +874 -0
  58. package/dist/pipeline-contract.js +92 -0
  59. package/dist/pipeline-runner.js +285 -0
  60. package/dist/reclamation.js +882 -0
  61. package/dist/result-normalize.js +194 -0
  62. package/dist/run-export.js +64 -0
  63. package/dist/run-registry.js +1347 -0
  64. package/dist/run-state-schema.js +67 -0
  65. package/dist/sandbox-profile.js +471 -0
  66. package/dist/scheduler.js +266 -0
  67. package/dist/scheduling.js +184 -0
  68. package/dist/schema-validate.js +98 -0
  69. package/dist/state-explosion.js +1213 -0
  70. package/dist/state-migrations.js +463 -0
  71. package/dist/state-node.js +301 -0
  72. package/dist/state.js +308 -0
  73. package/dist/telemetry-attestation.js +156 -0
  74. package/dist/telemetry-ledger.js +145 -0
  75. package/dist/topology.js +527 -0
  76. package/dist/triggers.js +159 -0
  77. package/dist/trust-audit.js +475 -0
  78. package/dist/types/blackboard.js +2 -0
  79. package/dist/types/boundary.js +29 -0
  80. package/dist/types/candidate.js +2 -0
  81. package/dist/types/collaboration.js +2 -0
  82. package/dist/types/core.js +2 -0
  83. package/dist/types/drive.js +10 -0
  84. package/dist/types/error-feedback.js +2 -0
  85. package/dist/types/evidence-reasoning.js +2 -0
  86. package/dist/types/execution-backend.js +2 -0
  87. package/dist/types/multi-agent.js +2 -0
  88. package/dist/types/observability.js +2 -0
  89. package/dist/types/pipeline.js +2 -0
  90. package/dist/types/reclamation.js +8 -0
  91. package/dist/types/result.js +2 -0
  92. package/dist/types/run-registry.js +2 -0
  93. package/dist/types/run.js +2 -0
  94. package/dist/types/sandbox.js +2 -0
  95. package/dist/types/schedule.js +2 -0
  96. package/dist/types/state-node.js +2 -0
  97. package/dist/types/topology.js +2 -0
  98. package/dist/types/trust.js +2 -0
  99. package/dist/types/workbench.js +2 -0
  100. package/dist/types/worker.js +2 -0
  101. package/dist/types/workflow-app.js +2 -0
  102. package/dist/types.js +43 -0
  103. package/dist/verifier-registry.js +46 -0
  104. package/dist/verifier.js +78 -0
  105. package/dist/version.js +8 -0
  106. package/dist/workbench-host.js +172 -0
  107. package/dist/workbench.js +190 -0
  108. package/dist/worker-isolation.js +1028 -0
  109. package/dist/workflow-api.js +98 -0
  110. package/dist/workflow-app-framework.js +626 -0
  111. package/docs/agent-delegation-drive.7.md +190 -0
  112. package/docs/agent-framework.md +176 -0
  113. package/docs/candidate-scoring.7.md +106 -0
  114. package/docs/canonical-workflow-apps.7.md +137 -0
  115. package/docs/capability-topology-registry.7.md +168 -0
  116. package/docs/cli-mcp-parity.7.md +373 -0
  117. package/docs/contract-migration-tooling.7.md +123 -0
  118. package/docs/control-plane-scheduling.7.md +110 -0
  119. package/docs/coordinator-blackboard.7.md +183 -0
  120. package/docs/dogfood/architecture-review-cool-workflow.md +16 -0
  121. package/docs/dogfood-one-real-repo.7.md +168 -0
  122. package/docs/durable-state-and-locking.7.md +107 -0
  123. package/docs/end-to-end-golden-path.7.md +117 -0
  124. package/docs/error-feedback.7.md +153 -0
  125. package/docs/evidence-adoption-reasoning-chain.7.md +270 -0
  126. package/docs/execution-backends.7.md +300 -0
  127. package/docs/getting-started.md +99 -0
  128. package/docs/index.md +41 -0
  129. package/docs/mcp-app-surface.7.md +235 -0
  130. package/docs/multi-agent-cli-mcp-surface.7.md +265 -0
  131. package/docs/multi-agent-eval-replay-harness.7.md +302 -0
  132. package/docs/multi-agent-operator-ux.7.md +314 -0
  133. package/docs/multi-agent-runtime-core.7.md +231 -0
  134. package/docs/multi-agent-topologies.7.md +103 -0
  135. package/docs/multi-agent-trust-policy-audit.7.md +154 -0
  136. package/docs/node-snapshot-diff-replay.7.md +135 -0
  137. package/docs/observability-cost-accounting.7.md +194 -0
  138. package/docs/operator-ux.7.md +180 -0
  139. package/docs/pipeline-runner.7.md +136 -0
  140. package/docs/project-index.md +261 -0
  141. package/docs/real-execution-backends.7.md +142 -0
  142. package/docs/release-and-migration.7.md +280 -0
  143. package/docs/release-tooling.7.md +159 -0
  144. package/docs/routines.md +48 -0
  145. package/docs/run-registry-control-plane.7.md +312 -0
  146. package/docs/run-retention-reclamation.7.md +191 -0
  147. package/docs/sandbox-profiles.7.md +137 -0
  148. package/docs/scheduled-tasks.md +80 -0
  149. package/docs/security-trust-hardening.7.md +117 -0
  150. package/docs/state-explosion-management.7.md +264 -0
  151. package/docs/state-node.7.md +96 -0
  152. package/docs/team-collaboration.7.md +207 -0
  153. package/docs/unix-principles.md +192 -0
  154. package/docs/verifier-gated-commit.7.md +140 -0
  155. package/docs/web-desktop-workbench.7.md +215 -0
  156. package/docs/worker-isolation.7.md +167 -0
  157. package/docs/workflow-app-framework.7.md +274 -0
  158. package/manifest/README.md +43 -0
  159. package/manifest/plugin.manifest.json +316 -0
  160. package/manifest/pricing.policy.json +14 -0
  161. package/package.json +79 -0
  162. package/scripts/agents/claude-p-agent.js +104 -0
  163. package/scripts/agents/claude-p-agent.sh +9 -0
  164. package/scripts/agents/cw-attest-keygen.js +55 -0
  165. package/scripts/agents/cw-attest-wrap.js +143 -0
  166. package/scripts/block-unapproved-tag.sh +39 -0
  167. package/scripts/bump-version.js +249 -0
  168. package/scripts/canonical-apps.js +171 -0
  169. package/scripts/cw.js +4 -0
  170. package/scripts/dist-drift-check.js +79 -0
  171. package/scripts/dogfood-architecture-review.js +237 -0
  172. package/scripts/dogfood-release.js +624 -0
  173. package/scripts/forward-ref-docs.js +73 -0
  174. package/scripts/gen-manifests.js +232 -0
  175. package/scripts/golden-path.js +300 -0
  176. package/scripts/mcp-server.js +4 -0
  177. package/scripts/new-feature.js +121 -0
  178. package/scripts/parity-check.js +213 -0
  179. package/scripts/release-check.js +118 -0
  180. package/scripts/release-flow.js +272 -0
  181. package/scripts/release-gate.sh +85 -0
  182. package/scripts/sync-project-index.js +387 -0
  183. package/scripts/validate-run-state-schema.js +126 -0
  184. package/scripts/verify-container-selfref.js +64 -0
  185. package/scripts/version-sync-check.js +237 -0
  186. package/skills/cool-workflow/SKILL.md +162 -0
  187. package/skills/cool-workflow/references/commands.md +282 -0
  188. package/tsconfig.json +16 -0
  189. package/ui/workbench/app.css +76 -0
  190. package/ui/workbench/app.js +159 -0
  191. package/ui/workbench/index.html +32 -0
  192. package/workflows/architecture-review.workflow.js +84 -0
  193. package/workflows/research-synthesis.workflow.js +47 -0
package/dist/daemon.js ADDED
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DesktopSchedulerDaemon = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const scheduler_1 = require("./scheduler");
10
+ const state_1 = require("./state");
11
+ class DesktopSchedulerDaemon {
12
+ cwd;
13
+ intervalSeconds;
14
+ scheduler;
15
+ constructor(options = {}) {
16
+ this.cwd = node_path_1.default.resolve(String(options.cwd || process.cwd()));
17
+ this.intervalSeconds = Number(options.intervalSeconds || 60);
18
+ this.scheduler = new scheduler_1.Scheduler(this.cwd);
19
+ }
20
+ tick() {
21
+ const due = this.scheduler.due();
22
+ const checkedAt = new Date().toISOString();
23
+ const inboxPath = node_path_1.default.join(this.cwd, ".cw", "schedules", "due-inbox.json");
24
+ (0, state_1.writeJson)(inboxPath, {
25
+ schemaVersion: 1,
26
+ checkedAt,
27
+ due
28
+ });
29
+ return {
30
+ checkedAt,
31
+ dueCount: due.length,
32
+ dueIds: due.map((task) => task.id),
33
+ inboxPath
34
+ };
35
+ }
36
+ async run() {
37
+ node_fs_1.default.mkdirSync(node_path_1.default.join(this.cwd, ".cw", "schedules"), { recursive: true });
38
+ process.stdout.write(`${JSON.stringify(this.tick())}\n`);
39
+ setInterval(() => {
40
+ process.stdout.write(`${JSON.stringify(this.tick())}\n`);
41
+ }, Math.max(1, this.intervalSeconds) * 1000);
42
+ }
43
+ }
44
+ exports.DesktopSchedulerDaemon = DesktopSchedulerDaemon;
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.nextDispatchTasks = nextDispatchTasks;
7
+ exports.createDispatchManifest = createDispatchManifest;
8
+ exports.firstRunnablePhase = firstRunnablePhase;
9
+ exports.updatePhaseStatuses = updatePhaseStatuses;
10
+ exports.formatDispatchTask = formatDispatchTask;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const state_1 = require("./state");
14
+ const pipeline_contract_1 = require("./pipeline-contract");
15
+ const state_node_1 = require("./state-node");
16
+ const worker_isolation_1 = require("./worker-isolation");
17
+ const sandbox_profile_1 = require("./sandbox-profile");
18
+ const execution_backend_1 = require("./execution-backend");
19
+ const multi_agent_1 = require("./multi-agent");
20
+ function nextDispatchTasks(run, limit) {
21
+ const runnablePhase = firstRunnablePhase(run);
22
+ if (!runnablePhase)
23
+ return [];
24
+ const max = Number(limit || run.workflow.limits.maxConcurrentAgents || 4);
25
+ const runnableTaskIds = new Set(runnablePhase.taskIds);
26
+ return run.tasks
27
+ .filter((task) => task.status === "pending" && runnableTaskIds.has(task.id))
28
+ .slice(0, max)
29
+ .map(formatDispatchTask);
30
+ }
31
+ function createDispatchManifest(run, limit, options = {}) {
32
+ const requestedSandboxProfileId = options.sandboxProfileId || options.sandbox;
33
+ const sandboxProfileId = String(requestedSandboxProfileId || sandbox_profile_1.DEFAULT_SANDBOX_PROFILE_ID);
34
+ (0, sandbox_profile_1.resolveSandboxProfileById)(sandboxProfileId, (0, sandbox_profile_1.sandboxContextForValidation)(run.cwd));
35
+ // Resolve the execution backend once (mechanism vs policy): the kernel records
36
+ // WHICH backend was selected; it never branches on which one. Defaults to node
37
+ // (behavior-preserving) when no `--backend` flag / CW_BACKEND env is set.
38
+ const backendSelection = (0, execution_backend_1.resolveBackendSelection)(options.backendId);
39
+ const tasks = nextDispatchTasks(run, limit);
40
+ if (!tasks.length) {
41
+ return {
42
+ schemaVersion: 1,
43
+ runId: run.id,
44
+ dispatchId: null,
45
+ tasks: [],
46
+ manifestPath: null,
47
+ sandboxProfileId,
48
+ backendId: backendSelection.backendId,
49
+ backendSelection
50
+ };
51
+ }
52
+ const dispatchId = createDispatchId();
53
+ const manifestPath = node_path_1.default.join(run.paths.dispatchesDir, `${dispatchId}.json`);
54
+ node_fs_1.default.mkdirSync(run.paths.dispatchesDir, { recursive: true });
55
+ const taskIds = new Set(tasks.map((task) => task.id));
56
+ const createdAt = new Date().toISOString();
57
+ const selectedSandboxProfileIds = new Set();
58
+ let sandboxPolicy;
59
+ for (const task of run.tasks) {
60
+ if (taskIds.has(task.id)) {
61
+ const taskSandboxProfileId = String(requestedSandboxProfileId || task.sandboxProfileId || sandbox_profile_1.DEFAULT_SANDBOX_PROFILE_ID);
62
+ selectedSandboxProfileIds.add(taskSandboxProfileId);
63
+ task.status = "running";
64
+ task.loopStage = "act";
65
+ task.dispatchId = dispatchId;
66
+ task.dispatchedAt = createdAt;
67
+ const scope = (0, worker_isolation_1.allocateWorkerScope)(run, task, {
68
+ dispatchId,
69
+ sandboxProfileId: taskSandboxProfileId,
70
+ backendSelection,
71
+ status: "running",
72
+ persist: false,
73
+ metadata: { dispatchId, phase: task.phase }
74
+ });
75
+ sandboxPolicy = sandboxPolicy || scope.sandboxPolicy;
76
+ }
77
+ }
78
+ const selectedRunTasks = run.tasks.filter((task) => taskIds.has(task.id));
79
+ const multiAgentAttachment = (0, multi_agent_1.attachDispatchToMultiAgent)(run, {
80
+ multiAgentRunId: options.multiAgentRunId,
81
+ groupId: options.multiAgentGroupId,
82
+ roleId: options.multiAgentRoleId,
83
+ fanoutId: options.multiAgentFanoutId,
84
+ dispatchId,
85
+ tasks: selectedRunTasks,
86
+ sandboxProfileId: selectedSandboxProfileIds.size === 1 ? [...selectedSandboxProfileIds][0] : "mixed",
87
+ concurrencyLimit: limit
88
+ });
89
+ for (const task of selectedRunTasks) {
90
+ const worker = task.workerId ? (0, worker_isolation_1.syncWorkerScopeFromTask)(run, task.workerId) : undefined;
91
+ if (worker)
92
+ (0, worker_isolation_1.writeWorkerManifest)(run, worker);
93
+ }
94
+ const manifest = {
95
+ schemaVersion: 1,
96
+ runId: run.id,
97
+ dispatchId,
98
+ createdAt,
99
+ phase: tasks[0].phase,
100
+ instructions: "Spawn one worker per task when the user explicitly authorized agent/parallel/background work. Save each final summary as Markdown and record it with `cw.js result <run-id> <task-id> <file>`.",
101
+ tasks: selectedRunTasks.map(formatDispatchTask),
102
+ manifestPath,
103
+ workerIndexPath: run.paths.workersDir ? node_path_1.default.join(run.paths.workersDir, "index.json") : undefined,
104
+ sandboxProfileId: selectedSandboxProfileIds.size === 1 ? [...selectedSandboxProfileIds][0] : "mixed",
105
+ sandboxPolicy: selectedSandboxProfileIds.size === 1 ? sandboxPolicy : undefined,
106
+ backendId: backendSelection.backendId,
107
+ backendSelection,
108
+ backendAttestation: selectedRunTasks.find((task) => task.backendAttestation)?.backendAttestation,
109
+ multiAgent: multiAgentAttachment.multiAgent
110
+ ? {
111
+ ...multiAgentAttachment.multiAgent,
112
+ membershipIds: multiAgentAttachment.membershipIds
113
+ }
114
+ : undefined
115
+ };
116
+ const dispatchNode = (0, state_node_1.appendRunNode)(run, (0, state_node_1.createStateNode)({
117
+ id: `${run.id}:dispatch:${dispatchId}`,
118
+ kind: "dispatch",
119
+ status: "running",
120
+ loopStage: "act",
121
+ inputs: { taskIds: tasks.map((task) => task.id), phase: manifest.phase, sandboxProfileId: manifest.sandboxProfileId },
122
+ outputs: { dispatchId, sandboxProfileId: manifest.sandboxProfileId },
123
+ artifacts: [{ id: "dispatch", kind: "json", path: manifestPath }],
124
+ parents: tasks.map((task) => `${run.id}:task:${task.id}`),
125
+ contractId: pipeline_contract_1.DEFAULT_PIPELINE_CONTRACT_ID,
126
+ metadata: { sandboxProfileId: manifest.sandboxProfileId, sandboxPolicy: manifest.sandboxPolicy }
127
+ }));
128
+ manifest.stateNodeId = dispatchNode.id;
129
+ for (const task of run.tasks) {
130
+ if (!taskIds.has(task.id) || !task.stateNodeId)
131
+ continue;
132
+ const node = run.nodes?.find((candidate) => candidate.id === task.stateNodeId);
133
+ if (node && node.status === "pending") {
134
+ (0, state_node_1.appendRunNode)(run, (0, state_node_1.transitionStateNode)(node, { status: "running", loopStage: "act" }));
135
+ }
136
+ }
137
+ run.dispatches.push({
138
+ id: dispatchId,
139
+ phase: manifest.phase || "",
140
+ taskIds: tasks.map((task) => task.id),
141
+ manifestPath,
142
+ createdAt,
143
+ stateNodeId: dispatchNode.id,
144
+ workerIds: selectedRunTasks.filter((task) => task.workerId).map((task) => String(task.workerId)),
145
+ sandboxProfileId: manifest.sandboxProfileId,
146
+ backendId: backendSelection.backendId,
147
+ multiAgent: manifest.multiAgent
148
+ });
149
+ updatePhaseStatuses(run);
150
+ (0, state_1.writeJson)(manifestPath, manifest);
151
+ return manifest;
152
+ }
153
+ function firstRunnablePhase(run) {
154
+ for (const phase of run.phases) {
155
+ const phaseTasks = run.tasks.filter((task) => phase.taskIds.includes(task.id));
156
+ if (phaseTasks.some((task) => task.status === "running"))
157
+ return phase;
158
+ if (phaseTasks.some((task) => task.status === "pending"))
159
+ return phase;
160
+ if (!phaseTasks.every((task) => task.status === "completed"))
161
+ return null;
162
+ }
163
+ return null;
164
+ }
165
+ function updatePhaseStatuses(run) {
166
+ for (const phase of run.phases) {
167
+ const phaseTasks = run.tasks.filter((task) => phase.taskIds.includes(task.id));
168
+ if (phaseTasks.every((task) => task.status === "completed")) {
169
+ phase.status = "completed";
170
+ }
171
+ else if (phaseTasks.some((task) => task.status === "running" || task.status === "completed")) {
172
+ phase.status = "running";
173
+ }
174
+ else {
175
+ phase.status = "pending";
176
+ }
177
+ }
178
+ }
179
+ function formatDispatchTask(task) {
180
+ return {
181
+ id: task.id,
182
+ kind: task.kind,
183
+ phase: task.phase,
184
+ status: task.status,
185
+ taskPath: task.taskPath,
186
+ prompt: task.prompt,
187
+ workerId: task.workerId,
188
+ workerManifestPath: task.workerManifestPath,
189
+ workerDir: task.workerManifestPath ? node_path_1.default.dirname(task.workerManifestPath) : undefined,
190
+ workerResultPath: task.workerId && task.workerManifestPath ? node_path_1.default.join(node_path_1.default.dirname(task.workerManifestPath), "result.md") : undefined,
191
+ sandboxProfileId: task.sandboxProfileId,
192
+ sandboxPolicy: task.sandboxPolicy,
193
+ backendId: task.backendId,
194
+ backendAttestation: task.backendAttestation,
195
+ multiAgent: task.multiAgent
196
+ };
197
+ }
198
+ function createDispatchId() {
199
+ const stamp = new Date().toISOString().replace(/[-:]/g, "").replace(/\..+/, "Z");
200
+ return `dispatch-${stamp}-${Math.random().toString(36).slice(2, 8)}`;
201
+ }