@deriest/ai-engineering-company 1.15.2
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 +807 -0
- package/LICENSE +8 -0
- package/README.md +291 -0
- package/assets/knowledge/.gitkeep +0 -0
- package/assets/offices/architecture/README.md +32 -0
- package/assets/offices/engineering/README.md +53 -0
- package/assets/offices/governance/README.md +30 -0
- package/assets/offices/product/README.md +37 -0
- package/assets/organization/organization.json +260 -0
- package/assets/organization/validation.md +107 -0
- package/assets/prompts/.gitkeep +0 -0
- package/assets/templates/.gitkeep +0 -0
- package/assets/workers/architect/AGENTS.md +49 -0
- package/assets/workers/architect/SOUL.md +21 -0
- package/assets/workers/architect/config.json +7 -0
- package/assets/workers/backend-engineer/AGENTS.md +67 -0
- package/assets/workers/backend-engineer/HEARTBEAT.md +5 -0
- package/assets/workers/backend-engineer/IDENTITY.md +27 -0
- package/assets/workers/backend-engineer/SOUL.md +24 -0
- package/assets/workers/backend-engineer/TOOLS.md +44 -0
- package/assets/workers/backend-engineer/USER.md +21 -0
- package/assets/workers/backend-engineer/company/scripts/wp3/harness-spec.md +31 -0
- package/assets/workers/backend-engineer/company/scripts/wp3/lib/semver-range.js +81 -0
- package/assets/workers/backend-engineer/company/scripts/wp3/lib/test-mr4.js +6 -0
- package/assets/workers/backend-engineer/config.json +7 -0
- package/assets/workers/backend-engineer/openclaw-workspace-state.json +4 -0
- package/assets/workers/designer/AGENTS.md +49 -0
- package/assets/workers/designer/SOUL.md +20 -0
- package/assets/workers/designer/config.json +7 -0
- package/assets/workers/dispatcher/AGENTS.md +158 -0
- package/assets/workers/dispatcher/HEARTBEAT.md +5 -0
- package/assets/workers/dispatcher/IDENTITY.md +6 -0
- package/assets/workers/dispatcher/ROUTING.md +136 -0
- package/assets/workers/dispatcher/SOUL.md +18 -0
- package/assets/workers/dispatcher/TOOLS.md +32 -0
- package/assets/workers/dispatcher/USER.md +15 -0
- package/assets/workers/dispatcher/config.json +7 -0
- package/assets/workers/dispatcher/openclaw-workspace-state.json +4 -0
- package/assets/workers/frontend-engineer/AGENTS.md +53 -0
- package/assets/workers/frontend-engineer/SOUL.md +23 -0
- package/assets/workers/frontend-engineer/config.json +7 -0
- package/assets/workers/governor/AGENTS.md +57 -0
- package/assets/workers/governor/SOUL.md +20 -0
- package/assets/workers/governor/config.json +7 -0
- package/assets/workers/infrastructure-engineer/AGENTS.md +51 -0
- package/assets/workers/infrastructure-engineer/SOUL.md +21 -0
- package/assets/workers/infrastructure-engineer/config.json +7 -0
- package/assets/workers/product-manager/AGENTS.md +52 -0
- package/assets/workers/product-manager/HEARTBEAT.md +5 -0
- package/assets/workers/product-manager/IDENTITY.md +27 -0
- package/assets/workers/product-manager/SOUL.md +20 -0
- package/assets/workers/product-manager/TOOLS.md +44 -0
- package/assets/workers/product-manager/USER.md +21 -0
- package/assets/workers/product-manager/config.json +7 -0
- package/assets/workers/product-manager/openclaw-workspace-state.json +4 -0
- package/assets/workers/qa-engineer/AGENTS.md +50 -0
- package/assets/workers/qa-engineer/HEARTBEAT.md +5 -0
- package/assets/workers/qa-engineer/IDENTITY.md +27 -0
- package/assets/workers/qa-engineer/SOUL.md +22 -0
- package/assets/workers/qa-engineer/TOOLS.md +44 -0
- package/assets/workers/qa-engineer/USER.md +21 -0
- package/assets/workers/qa-engineer/config.json +7 -0
- package/assets/workers/qa-engineer/openclaw-workspace-state.json +4 -0
- package/assets/workers/researcher/AGENTS.md +50 -0
- package/assets/workers/researcher/HEARTBEAT.md +5 -0
- package/assets/workers/researcher/IDENTITY.md +27 -0
- package/assets/workers/researcher/SOUL.md +20 -0
- package/assets/workers/researcher/TOOLS.md +44 -0
- package/assets/workers/researcher/USER.md +21 -0
- package/assets/workers/researcher/config.json +7 -0
- package/assets/workers/researcher/openclaw-workspace-state.json +4 -0
- package/config/offices.json +19 -0
- package/config/policies.json +10 -0
- package/config/workflows.json +9 -0
- package/dist/audit-logger.d.ts +49 -0
- package/dist/audit-logger.d.ts.map +1 -0
- package/dist/audit-logger.js +131 -0
- package/dist/audit-logger.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +218 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/aicompany.d.ts +12 -0
- package/dist/commands/aicompany.d.ts.map +1 -0
- package/dist/commands/aicompany.js +101 -0
- package/dist/commands/aicompany.js.map +1 -0
- package/dist/decision-queue.d.ts +31 -0
- package/dist/decision-queue.d.ts.map +1 -0
- package/dist/decision-queue.js +86 -0
- package/dist/decision-queue.js.map +1 -0
- package/dist/dispatch-service.d.ts +43 -0
- package/dist/dispatch-service.d.ts.map +1 -0
- package/dist/dispatch-service.js +569 -0
- package/dist/dispatch-service.js.map +1 -0
- package/dist/dispatcher.d.ts +24 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +84 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/file-queue-backend.d.ts +16 -0
- package/dist/file-queue-backend.d.ts.map +1 -0
- package/dist/file-queue-backend.js +93 -0
- package/dist/file-queue-backend.js.map +1 -0
- package/dist/gateway.d.ts +14 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +138 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +277 -0
- package/dist/index.js.map +1 -0
- package/dist/lease-provider.d.ts +31 -0
- package/dist/lease-provider.d.ts.map +1 -0
- package/dist/lease-provider.js +4 -0
- package/dist/lease-provider.js.map +1 -0
- package/dist/memory-lease-provider.d.ts +10 -0
- package/dist/memory-lease-provider.d.ts.map +1 -0
- package/dist/memory-lease-provider.js +54 -0
- package/dist/memory-lease-provider.js.map +1 -0
- package/dist/memory-queue-backend.d.ts +16 -0
- package/dist/memory-queue-backend.d.ts.map +1 -0
- package/dist/memory-queue-backend.js +93 -0
- package/dist/memory-queue-backend.js.map +1 -0
- package/dist/metrics-registry.d.ts +58 -0
- package/dist/metrics-registry.d.ts.map +1 -0
- package/dist/metrics-registry.js +195 -0
- package/dist/metrics-registry.js.map +1 -0
- package/dist/openclaw.plugin.json +29 -0
- package/dist/org-engine.d.ts +134 -0
- package/dist/org-engine.d.ts.map +1 -0
- package/dist/org-engine.js +129 -0
- package/dist/org-engine.js.map +1 -0
- package/dist/pipeline-checkpoint.d.ts +44 -0
- package/dist/pipeline-checkpoint.d.ts.map +1 -0
- package/dist/pipeline-checkpoint.js +90 -0
- package/dist/pipeline-checkpoint.js.map +1 -0
- package/dist/pipeline-engine.d.ts +53 -0
- package/dist/pipeline-engine.d.ts.map +1 -0
- package/dist/pipeline-engine.js +47 -0
- package/dist/pipeline-engine.js.map +1 -0
- package/dist/prompt-assembler.d.ts +13 -0
- package/dist/prompt-assembler.d.ts.map +1 -0
- package/dist/prompt-assembler.js +84 -0
- package/dist/prompt-assembler.js.map +1 -0
- package/dist/queue-backend.d.ts +44 -0
- package/dist/queue-backend.d.ts.map +1 -0
- package/dist/queue-backend.js +4 -0
- package/dist/queue-backend.js.map +1 -0
- package/dist/redis-lease-provider.d.ts +16 -0
- package/dist/redis-lease-provider.d.ts.map +1 -0
- package/dist/redis-lease-provider.js +96 -0
- package/dist/redis-lease-provider.js.map +1 -0
- package/dist/redis-queue-backend.d.ts +23 -0
- package/dist/redis-queue-backend.d.ts.map +1 -0
- package/dist/redis-queue-backend.js +131 -0
- package/dist/redis-queue-backend.js.map +1 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +100 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/dispatch-service.d.ts +25 -0
- package/dist/src/dispatch-service.d.ts.map +1 -0
- package/dist/src/dispatch-service.js +201 -0
- package/dist/src/dispatch-service.js.map +1 -0
- package/dist/src/dispatcher.d.ts +23 -0
- package/dist/src/dispatcher.d.ts.map +1 -0
- package/dist/src/dispatcher.js +66 -0
- package/dist/src/dispatcher.js.map +1 -0
- package/dist/src/gateway.d.ts +10 -0
- package/dist/src/gateway.d.ts.map +1 -0
- package/dist/src/gateway.js +66 -0
- package/dist/src/gateway.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +85 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/org-engine.d.ts +134 -0
- package/dist/src/org-engine.d.ts.map +1 -0
- package/dist/src/org-engine.js +129 -0
- package/dist/src/org-engine.js.map +1 -0
- package/dist/src/pipeline-engine.d.ts +53 -0
- package/dist/src/pipeline-engine.d.ts.map +1 -0
- package/dist/src/pipeline-engine.js +47 -0
- package/dist/src/pipeline-engine.js.map +1 -0
- package/dist/src/prompt-assembler.d.ts +13 -0
- package/dist/src/prompt-assembler.d.ts.map +1 -0
- package/dist/src/prompt-assembler.js +84 -0
- package/dist/src/prompt-assembler.js.map +1 -0
- package/dist/src/task-state.d.ts +27 -0
- package/dist/src/task-state.d.ts.map +1 -0
- package/dist/src/task-state.js +49 -0
- package/dist/src/task-state.js.map +1 -0
- package/dist/src/tools.d.ts +9 -0
- package/dist/src/tools.d.ts.map +1 -0
- package/dist/src/tools.js +107 -0
- package/dist/src/tools.js.map +1 -0
- package/dist/src/types.d.ts +99 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +4 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/validation.d.ts +11 -0
- package/dist/src/validation.d.ts.map +1 -0
- package/dist/src/validation.js +69 -0
- package/dist/src/validation.js.map +1 -0
- package/dist/src/workboard-gateway.d.ts +82 -0
- package/dist/src/workboard-gateway.d.ts.map +1 -0
- package/dist/src/workboard-gateway.js +76 -0
- package/dist/src/workboard-gateway.js.map +1 -0
- package/dist/src/worker-engine.d.ts +38 -0
- package/dist/src/worker-engine.d.ts.map +1 -0
- package/dist/src/worker-engine.js +73 -0
- package/dist/src/worker-engine.js.map +1 -0
- package/dist/task-state.d.ts +27 -0
- package/dist/task-state.d.ts.map +1 -0
- package/dist/task-state.js +62 -0
- package/dist/task-state.js.map +1 -0
- package/dist/tools.d.ts +11 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +183 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +11 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +69 -0
- package/dist/validation.js.map +1 -0
- package/dist/workboard-gateway.d.ts +82 -0
- package/dist/workboard-gateway.d.ts.map +1 -0
- package/dist/workboard-gateway.js +76 -0
- package/dist/workboard-gateway.js.map +1 -0
- package/dist/worker-engine.d.ts +38 -0
- package/dist/worker-engine.d.ts.map +1 -0
- package/dist/worker-engine.js +73 -0
- package/dist/worker-engine.js.map +1 -0
- package/openclaw.plugin.json +42 -0
- package/package.json +50 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { validateSessionKeyRequired } from "./validation.js";
|
|
3
|
+
function jsonResult(data) {
|
|
4
|
+
return {
|
|
5
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
6
|
+
details: null,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
// --- Schemas ---
|
|
10
|
+
const DispatchParams = Type.Object({
|
|
11
|
+
message: Type.String({ description: "Task description for the Dispatcher agent." }),
|
|
12
|
+
wait: Type.Optional(Type.Boolean({ description: "Wait for completion (default: true)." })),
|
|
13
|
+
timeout: Type.Optional(Type.Number({ description: "Max wait time in milliseconds (default: 900000)." })),
|
|
14
|
+
}, { additionalProperties: false });
|
|
15
|
+
const StatusParams = Type.Object({
|
|
16
|
+
sessionKey: Type.Optional(Type.String({ description: "Session key to query. Omit to list recent dispatches." })),
|
|
17
|
+
}, { additionalProperties: false });
|
|
18
|
+
const ResultParams = Type.Object({
|
|
19
|
+
sessionKey: Type.String({ description: "Session key of the completed task." }),
|
|
20
|
+
limit: Type.Optional(Type.Number({ description: "Max messages to retrieve (default: 50)." })),
|
|
21
|
+
}, { additionalProperties: false });
|
|
22
|
+
// --- Tool Factories ---
|
|
23
|
+
function makeDispatchTool(deps) {
|
|
24
|
+
return {
|
|
25
|
+
name: "ai_company_dispatch",
|
|
26
|
+
label: "AI Company Dispatch",
|
|
27
|
+
description: "Submit a task to the AI Engineering Company Dispatcher agent. Returns session key and run ID.",
|
|
28
|
+
parameters: DispatchParams,
|
|
29
|
+
execute: async (_toolCallId, params) => {
|
|
30
|
+
const { message, wait = true, timeout = 900_000 } = params;
|
|
31
|
+
try {
|
|
32
|
+
const result = await deps.dispatchService.dispatch(message, { wait, timeout });
|
|
33
|
+
return jsonResult({ task: "dispatch", ...result });
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return jsonResult({
|
|
37
|
+
task: "dispatch",
|
|
38
|
+
status: "error",
|
|
39
|
+
error: err instanceof Error ? err.message : String(err),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function makeStatusTool(deps) {
|
|
46
|
+
return {
|
|
47
|
+
name: "ai_company_status",
|
|
48
|
+
label: "AI Company Status",
|
|
49
|
+
description: "Query the status of a dispatched task or list recent dispatches.",
|
|
50
|
+
parameters: StatusParams,
|
|
51
|
+
execute: async (_toolCallId, params) => {
|
|
52
|
+
const { sessionKey } = params;
|
|
53
|
+
try {
|
|
54
|
+
if (sessionKey) {
|
|
55
|
+
const validatedKey = validateSessionKeyRequired(sessionKey);
|
|
56
|
+
const entry = deps.dispatchService.status(validatedKey);
|
|
57
|
+
if (!entry) {
|
|
58
|
+
return jsonResult({ task: "status", status: "not_found", sessionKey: validatedKey });
|
|
59
|
+
}
|
|
60
|
+
return jsonResult({ task: "status", status: "found", sessionKey: validatedKey, entry });
|
|
61
|
+
}
|
|
62
|
+
const all = deps.session.listSessionEntries();
|
|
63
|
+
const dispatches = all.filter((e) => e.key?.startsWith("ai-company:dispatch:"));
|
|
64
|
+
return jsonResult({
|
|
65
|
+
task: "status",
|
|
66
|
+
status: "list",
|
|
67
|
+
count: dispatches.length,
|
|
68
|
+
entries: dispatches,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return jsonResult({
|
|
73
|
+
task: "status",
|
|
74
|
+
status: "error",
|
|
75
|
+
error: err instanceof Error ? err.message : String(err),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function makeResultTool(deps) {
|
|
82
|
+
return {
|
|
83
|
+
name: "ai_company_result",
|
|
84
|
+
label: "AI Company Result",
|
|
85
|
+
description: "Retrieve the result messages of a completed dispatch.",
|
|
86
|
+
parameters: ResultParams,
|
|
87
|
+
execute: async (_toolCallId, params) => {
|
|
88
|
+
const { sessionKey, limit = 50 } = params;
|
|
89
|
+
try {
|
|
90
|
+
const validatedKey = validateSessionKeyRequired(sessionKey);
|
|
91
|
+
const result = await deps.dispatchService.result(validatedKey, limit);
|
|
92
|
+
return jsonResult({ task: "result", ...result });
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return jsonResult({
|
|
96
|
+
task: "result",
|
|
97
|
+
status: "error",
|
|
98
|
+
error: err instanceof Error ? err.message : String(err),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export function createAiCompanyTools(deps) {
|
|
105
|
+
return [makeDispatchTool(deps), makeStatusTool(deps), makeResultTool(deps)];
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export interface SubagentRunParams {
|
|
2
|
+
sessionKey: string;
|
|
3
|
+
message: string;
|
|
4
|
+
deliver?: boolean;
|
|
5
|
+
worker?: string;
|
|
6
|
+
prompt?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SubagentRunResult {
|
|
10
|
+
runId: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SubagentWaitParams {
|
|
13
|
+
runId: string;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SubagentWaitResult {
|
|
17
|
+
status: "ok" | "error" | "timeout";
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SubagentGetMessagesParams {
|
|
21
|
+
sessionKey: string;
|
|
22
|
+
limit?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface SubagentGetMessagesResult {
|
|
25
|
+
messages: unknown[];
|
|
26
|
+
}
|
|
27
|
+
export interface SubagentApi {
|
|
28
|
+
run(params: SubagentRunParams): Promise<SubagentRunResult>;
|
|
29
|
+
waitForRun(params: SubagentWaitParams): Promise<SubagentWaitResult>;
|
|
30
|
+
getSessionMessages(params: SubagentGetMessagesParams): Promise<SubagentGetMessagesResult>;
|
|
31
|
+
}
|
|
32
|
+
export interface SessionEntry {
|
|
33
|
+
key?: string;
|
|
34
|
+
[k: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
export interface SessionApi {
|
|
37
|
+
getSessionEntry(params: {
|
|
38
|
+
sessionKey: string;
|
|
39
|
+
}): SessionEntry | undefined;
|
|
40
|
+
listSessionEntries(): SessionEntry[];
|
|
41
|
+
}
|
|
42
|
+
export interface DispatchOptions {
|
|
43
|
+
wait?: boolean;
|
|
44
|
+
timeout?: number;
|
|
45
|
+
limit?: number;
|
|
46
|
+
/** Worker identity to dispatch to. Validates against WorkerEngine. */
|
|
47
|
+
worker?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface DispatchResult {
|
|
50
|
+
sessionKey: string;
|
|
51
|
+
runId: string;
|
|
52
|
+
status: "submitted" | "completed" | "timeout" | "error";
|
|
53
|
+
messages?: unknown[];
|
|
54
|
+
error?: string;
|
|
55
|
+
durationMs?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface DispatchStatusEntry {
|
|
58
|
+
key?: string;
|
|
59
|
+
[k: string]: unknown;
|
|
60
|
+
}
|
|
61
|
+
export interface DispatchResultMessages {
|
|
62
|
+
sessionKey: string;
|
|
63
|
+
status: "ok" | "empty";
|
|
64
|
+
messageCount?: number;
|
|
65
|
+
messages?: unknown[];
|
|
66
|
+
error?: string;
|
|
67
|
+
}
|
|
68
|
+
export interface WorkboardGatewayApi {
|
|
69
|
+
isAvailable(): Promise<boolean>;
|
|
70
|
+
createCard(params: {
|
|
71
|
+
title: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
status?: string;
|
|
74
|
+
priority?: string;
|
|
75
|
+
boardId?: string;
|
|
76
|
+
agentId?: string;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
id: string;
|
|
79
|
+
[k: string]: unknown;
|
|
80
|
+
}>;
|
|
81
|
+
dispatchCards(): Promise<{
|
|
82
|
+
started: Array<{
|
|
83
|
+
cardId: string;
|
|
84
|
+
runId: string;
|
|
85
|
+
sessionKey: string;
|
|
86
|
+
}>;
|
|
87
|
+
startFailures: Array<{
|
|
88
|
+
cardId: string;
|
|
89
|
+
error: string;
|
|
90
|
+
}>;
|
|
91
|
+
count: number;
|
|
92
|
+
}>;
|
|
93
|
+
}
|
|
94
|
+
export interface WorkerFleetHealth {
|
|
95
|
+
loaded: string[];
|
|
96
|
+
skipped: string[];
|
|
97
|
+
failed: string[];
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,mFAAmF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class DispatchValidationError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly field: string;
|
|
4
|
+
constructor(message: string, code: string, field: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function validateMessage(message: unknown): string;
|
|
7
|
+
export declare function validateSessionKey(sessionKey: unknown): string | undefined;
|
|
8
|
+
export declare function validateTimeout(timeout: unknown): number;
|
|
9
|
+
export declare function validateLimit(limit: unknown): number | undefined;
|
|
10
|
+
export declare function validateSessionKeyRequired(sessionKey: unknown): string;
|
|
11
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAUA,qBAAa,uBAAwB,SAAQ,KAAK;aAG9B,IAAI,EAAE,MAAM;aACZ,KAAK,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM;CAKhC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqBxD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAY1E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAaxD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAahE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAUtE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Input validation for ai-engineering-company dispatch operations.
|
|
2
|
+
// Limits justified in Gate 0.6 architecture freeze.
|
|
3
|
+
const MAX_MESSAGE_LENGTH = 128_000;
|
|
4
|
+
const SESSION_KEY_PATTERN = /^ai-company:dispatch:\d{8}T\d{6}Z-[a-z0-9]{4}$/;
|
|
5
|
+
const MIN_TIMEOUT = 1_000;
|
|
6
|
+
const MAX_TIMEOUT = 900_000;
|
|
7
|
+
const MIN_LIMIT = 1;
|
|
8
|
+
const MAX_LIMIT = 100;
|
|
9
|
+
export class DispatchValidationError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
field;
|
|
12
|
+
constructor(message, code, field) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.field = field;
|
|
16
|
+
this.name = "DispatchValidationError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function validateMessage(message) {
|
|
20
|
+
if (typeof message !== "string" || message.length === 0) {
|
|
21
|
+
throw new DispatchValidationError("message is required", "INVALID_MESSAGE", "message");
|
|
22
|
+
}
|
|
23
|
+
if (message.length > MAX_MESSAGE_LENGTH) {
|
|
24
|
+
throw new DispatchValidationError(`message exceeds maximum length of ${MAX_MESSAGE_LENGTH} characters`, "INVALID_MESSAGE", "message");
|
|
25
|
+
}
|
|
26
|
+
// Block control characters except newline (U+000A)
|
|
27
|
+
// eslint-disable-next-line no-control-regex
|
|
28
|
+
if (/[\x00-\x09\x0b-\x1f]/.test(message)) {
|
|
29
|
+
throw new DispatchValidationError("message contains invalid control characters", "INVALID_MESSAGE", "message");
|
|
30
|
+
}
|
|
31
|
+
return message;
|
|
32
|
+
}
|
|
33
|
+
export function validateSessionKey(sessionKey) {
|
|
34
|
+
if (sessionKey === undefined || sessionKey === null) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (typeof sessionKey !== "string" || !SESSION_KEY_PATTERN.test(sessionKey)) {
|
|
38
|
+
throw new DispatchValidationError("sessionKey must match format ai-company:dispatch:YYYYMMDDTHHmmSSZ-xxxx", "INVALID_SESSION_KEY", "sessionKey");
|
|
39
|
+
}
|
|
40
|
+
return sessionKey;
|
|
41
|
+
}
|
|
42
|
+
export function validateTimeout(timeout) {
|
|
43
|
+
if (timeout === undefined || timeout === null) {
|
|
44
|
+
return MAX_TIMEOUT;
|
|
45
|
+
}
|
|
46
|
+
const num = typeof timeout === "string" ? Number(timeout) : timeout;
|
|
47
|
+
if (!Number.isFinite(num) || num < MIN_TIMEOUT || num > MAX_TIMEOUT) {
|
|
48
|
+
throw new DispatchValidationError(`timeout must be between ${MIN_TIMEOUT} and ${MAX_TIMEOUT}`, "INVALID_TIMEOUT", "timeout");
|
|
49
|
+
}
|
|
50
|
+
return num;
|
|
51
|
+
}
|
|
52
|
+
export function validateLimit(limit) {
|
|
53
|
+
if (limit === undefined || limit === null) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const num = typeof limit === "string" ? Number(limit) : limit;
|
|
57
|
+
if (!Number.isFinite(num) || num < MIN_LIMIT || num > MAX_LIMIT || !Number.isInteger(num)) {
|
|
58
|
+
throw new DispatchValidationError(`limit must be an integer between ${MIN_LIMIT} and ${MAX_LIMIT}`, "INVALID_LIMIT", "limit");
|
|
59
|
+
}
|
|
60
|
+
return num;
|
|
61
|
+
}
|
|
62
|
+
export function validateSessionKeyRequired(sessionKey) {
|
|
63
|
+
const result = validateSessionKey(sessionKey);
|
|
64
|
+
if (result === undefined) {
|
|
65
|
+
throw new DispatchValidationError("sessionKey is required", "INVALID_SESSION_KEY", "sessionKey");
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oDAAoD;AAEpD,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,mBAAmB,GAAG,gDAAgD,CAAC;AAC7E,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAG9B;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,uBAAuB,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,uBAAuB,CAC/B,qCAAqC,kBAAkB,aAAa,EACpE,iBAAiB,EACjB,SAAS,CACV,CAAC;IACJ,CAAC;IACD,mDAAmD;IACnD,4CAA4C;IAC5C,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,uBAAuB,CAC/B,6CAA6C,EAC7C,iBAAiB,EACjB,SAAS,CACV,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAmB;IACpD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,uBAAuB,CAC/B,wEAAwE,EACxE,qBAAqB,EACrB,YAAY,CACb,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAkB,CAAC;IAChF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,WAAW,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;QACpE,MAAM,IAAI,uBAAuB,CAC/B,2BAA2B,WAAW,QAAQ,WAAW,EAAE,EAC3D,iBAAiB,EACjB,SAAS,CACV,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAgB,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,SAAS,IAAI,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,uBAAuB,CAC/B,oCAAoC,SAAS,QAAQ,SAAS,EAAE,EAChE,eAAe,EACf,OAAO,CACR,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAmB;IAC5D,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,uBAAuB,CAC/B,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,CACb,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type WorkboardPriority = "urgent" | "high" | "normal" | "low";
|
|
2
|
+
export type WorkboardStatus = "triage" | "backlog" | "todo" | "ready" | "running" | "review" | "blocked" | "done";
|
|
3
|
+
export interface WorkboardCard {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
status: WorkboardStatus;
|
|
8
|
+
priority: WorkboardPriority;
|
|
9
|
+
position: number;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
agentId?: string;
|
|
13
|
+
metadata?: Record<string, unknown>;
|
|
14
|
+
execution?: {
|
|
15
|
+
status?: string;
|
|
16
|
+
sessionKey?: string;
|
|
17
|
+
runId?: string;
|
|
18
|
+
[k: string]: unknown;
|
|
19
|
+
};
|
|
20
|
+
[k: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface WorkboardCreateCardParams {
|
|
23
|
+
title: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
status?: WorkboardStatus;
|
|
26
|
+
priority?: WorkboardPriority;
|
|
27
|
+
boardId?: string;
|
|
28
|
+
agentId?: string;
|
|
29
|
+
[k: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface WorkboardDispatchResult {
|
|
32
|
+
promoted: WorkboardCard[];
|
|
33
|
+
reclaimed: WorkboardCard[];
|
|
34
|
+
blocked: WorkboardCard[];
|
|
35
|
+
orchestrated: WorkboardCard[];
|
|
36
|
+
started: Array<{
|
|
37
|
+
cardId: string;
|
|
38
|
+
title: string;
|
|
39
|
+
sessionKey: string;
|
|
40
|
+
runId: string;
|
|
41
|
+
}>;
|
|
42
|
+
startFailures: Array<{
|
|
43
|
+
cardId: string;
|
|
44
|
+
title: string;
|
|
45
|
+
error: string;
|
|
46
|
+
}>;
|
|
47
|
+
count: number;
|
|
48
|
+
[k: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface WorkboardBoard {
|
|
51
|
+
id: string;
|
|
52
|
+
name: string;
|
|
53
|
+
archived?: boolean;
|
|
54
|
+
[k: string]: unknown;
|
|
55
|
+
}
|
|
56
|
+
export interface GatewayClient {
|
|
57
|
+
callMethod(method: string, params: Record<string, unknown>): Promise<unknown>;
|
|
58
|
+
}
|
|
59
|
+
export interface WorkboardGatewayConfig {
|
|
60
|
+
gateway: GatewayClient;
|
|
61
|
+
boardId?: string;
|
|
62
|
+
}
|
|
63
|
+
export declare class WorkboardGateway {
|
|
64
|
+
private readonly gateway;
|
|
65
|
+
private readonly boardId;
|
|
66
|
+
constructor(config: WorkboardGatewayConfig);
|
|
67
|
+
/** Call a gateway method with a timeout guard. */
|
|
68
|
+
private callWithTimeout;
|
|
69
|
+
/** Check whether the workboard extension is available and responsive. */
|
|
70
|
+
isAvailable(): Promise<boolean>;
|
|
71
|
+
/** Ensure the default board exists. Idempotent. */
|
|
72
|
+
ensureBoard(): Promise<WorkboardBoard>;
|
|
73
|
+
/** Create a card in the workboard. */
|
|
74
|
+
createCard(params: WorkboardCreateCardParams): Promise<WorkboardCard>;
|
|
75
|
+
/** Trigger workboard dispatch — claims, starts subagents, manages lifecycle. */
|
|
76
|
+
dispatchCards(): Promise<WorkboardDispatchResult>;
|
|
77
|
+
/** List cards on the board, optionally filtered. */
|
|
78
|
+
listCards(): Promise<WorkboardCard[]>;
|
|
79
|
+
/** Get a specific card by ID. */
|
|
80
|
+
getCard(id: string): Promise<WorkboardCard | null>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=workboard-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workboard-gateway.d.ts","sourceRoot":"","sources":["../../src/workboard-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Gateway RPC client for Workboard integration.
|
|
2
|
+
// Calls workboard gateway methods via in-process RPC — no direct imports.
|
|
3
|
+
// ponytail: if OpenClaw adds a typed gateway client SDK, replace this with it
|
|
4
|
+
function unwrap(response) {
|
|
5
|
+
const r = response;
|
|
6
|
+
if (!r?.ok) {
|
|
7
|
+
throw new Error(r?.error?.message ?? "workboard gateway call failed");
|
|
8
|
+
}
|
|
9
|
+
return r.data ?? {};
|
|
10
|
+
}
|
|
11
|
+
// --- WorkboardGateway ---
|
|
12
|
+
const RPC_TIMEOUT_MS = 30_000; // ponytail: make configurable if workboard extension adds latency tuning
|
|
13
|
+
export class WorkboardGateway {
|
|
14
|
+
gateway;
|
|
15
|
+
boardId;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.gateway = config.gateway;
|
|
18
|
+
this.boardId = config.boardId ?? "ai-company";
|
|
19
|
+
}
|
|
20
|
+
/** Call a gateway method with a timeout guard. */
|
|
21
|
+
async callWithTimeout(method, params) {
|
|
22
|
+
return Promise.race([
|
|
23
|
+
this.gateway.callMethod(method, params),
|
|
24
|
+
new Promise((_, reject) => {
|
|
25
|
+
setTimeout(() => reject(new Error(`RPC timeout: ${method} (${RPC_TIMEOUT_MS}ms)`)), RPC_TIMEOUT_MS);
|
|
26
|
+
}),
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
/** Check whether the workboard extension is available and responsive. */
|
|
30
|
+
async isAvailable() {
|
|
31
|
+
try {
|
|
32
|
+
const result = await this.callWithTimeout("workboard.boards.list", {});
|
|
33
|
+
const data = result;
|
|
34
|
+
return data?.ok === true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Ensure the default board exists. Idempotent. */
|
|
41
|
+
async ensureBoard() {
|
|
42
|
+
const data = unwrap(await this.callWithTimeout("workboard.boards.upsert", {
|
|
43
|
+
id: this.boardId,
|
|
44
|
+
name: "AI Engineering Company",
|
|
45
|
+
}));
|
|
46
|
+
return data.board;
|
|
47
|
+
}
|
|
48
|
+
/** Create a card in the workboard. */
|
|
49
|
+
async createCard(params) {
|
|
50
|
+
const data = unwrap(await this.callWithTimeout("workboard.cards.create", {
|
|
51
|
+
...params,
|
|
52
|
+
boardId: params.boardId ?? this.boardId,
|
|
53
|
+
}));
|
|
54
|
+
return data.card;
|
|
55
|
+
}
|
|
56
|
+
/** Trigger workboard dispatch — claims, starts subagents, manages lifecycle. */
|
|
57
|
+
async dispatchCards() {
|
|
58
|
+
const data = unwrap(await this.callWithTimeout("workboard.cards.dispatch", {
|
|
59
|
+
boardId: this.boardId,
|
|
60
|
+
}));
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
/** List cards on the board, optionally filtered. */
|
|
64
|
+
async listCards() {
|
|
65
|
+
const data = unwrap(await this.callWithTimeout("workboard.cards.list", {
|
|
66
|
+
boardId: this.boardId,
|
|
67
|
+
}));
|
|
68
|
+
return (data.cards ?? []);
|
|
69
|
+
}
|
|
70
|
+
/** Get a specific card by ID. */
|
|
71
|
+
async getCard(id) {
|
|
72
|
+
const cards = await this.listCards();
|
|
73
|
+
return cards.find((c) => c.id === id) ?? null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=workboard-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workboard-gateway.js","sourceRoot":"","sources":["../../src/workboard-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { WorkerFleetHealth } from "./types.js";
|
|
3
|
+
export declare const WorkerConfigSchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
office: z.ZodNullable<z.ZodString>;
|
|
6
|
+
description: z.ZodString;
|
|
7
|
+
capabilities: z.ZodArray<z.ZodString, "many">;
|
|
8
|
+
model: z.ZodString;
|
|
9
|
+
costPerHour: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
office: string | null;
|
|
14
|
+
capabilities: string[];
|
|
15
|
+
model: string;
|
|
16
|
+
costPerHour?: number | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
office: string | null;
|
|
21
|
+
capabilities: string[];
|
|
22
|
+
model: string;
|
|
23
|
+
costPerHour?: number | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export type WorkerConfig = z.infer<typeof WorkerConfigSchema>;
|
|
26
|
+
export interface WorkerDefinition {
|
|
27
|
+
config: WorkerConfig;
|
|
28
|
+
prompt: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class WorkerEngine {
|
|
31
|
+
private workersDir;
|
|
32
|
+
private workers;
|
|
33
|
+
constructor(workersDir: string);
|
|
34
|
+
load(): Promise<WorkerFleetHealth>;
|
|
35
|
+
getWorker(name: string): WorkerDefinition | undefined;
|
|
36
|
+
getWorkers(): WorkerDefinition[];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=worker-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-engine.d.ts","sourceRoot":"","sources":["../../src/worker-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA4C;gBAE/C,UAAU,EAAE,MAAM;IAIxB,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAwDxC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIrD,UAAU,IAAI,gBAAgB,EAAE;CAGjC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export const WorkerConfigSchema = z.object({
|
|
5
|
+
name: z.string(),
|
|
6
|
+
office: z.string().nullable(),
|
|
7
|
+
description: z.string(),
|
|
8
|
+
capabilities: z.array(z.string()),
|
|
9
|
+
model: z.string(),
|
|
10
|
+
costPerHour: z.number().optional(),
|
|
11
|
+
});
|
|
12
|
+
export class WorkerEngine {
|
|
13
|
+
workersDir;
|
|
14
|
+
workers = new Map();
|
|
15
|
+
constructor(workersDir) {
|
|
16
|
+
this.workersDir = workersDir;
|
|
17
|
+
}
|
|
18
|
+
async load() {
|
|
19
|
+
const health = { loaded: [], skipped: [], failed: [] };
|
|
20
|
+
try {
|
|
21
|
+
const entries = await fs.readdir(this.workersDir, { withFileTypes: true });
|
|
22
|
+
const dirs = entries.filter((e) => e.isDirectory());
|
|
23
|
+
for (const dir of dirs) {
|
|
24
|
+
const workerName = dir.name;
|
|
25
|
+
const workerPath = path.join(this.workersDir, workerName);
|
|
26
|
+
const configPath = path.join(workerPath, "config.json");
|
|
27
|
+
const promptPath = path.join(workerPath, "prompt.md");
|
|
28
|
+
try {
|
|
29
|
+
const configRaw = await fs.readFile(configPath, "utf-8");
|
|
30
|
+
let configObj;
|
|
31
|
+
try {
|
|
32
|
+
configObj = JSON.parse(configRaw);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
health.failed.push(workerName);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Empty object → skip silently (empty config)
|
|
39
|
+
if (typeof configObj === "object" &&
|
|
40
|
+
configObj !== null &&
|
|
41
|
+
Object.keys(configObj).length === 0) {
|
|
42
|
+
health.skipped.push(workerName);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const config = WorkerConfigSchema.parse(configObj);
|
|
46
|
+
let prompt = "";
|
|
47
|
+
try {
|
|
48
|
+
prompt = await fs.readFile(promptPath, "utf-8");
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// prompt.md missing is acceptable
|
|
52
|
+
}
|
|
53
|
+
this.workers.set(config.name, { config, prompt });
|
|
54
|
+
health.loaded.push(config.name);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
health.failed.push(workerName);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// readdir or path failure — return partial health
|
|
63
|
+
}
|
|
64
|
+
return health;
|
|
65
|
+
}
|
|
66
|
+
getWorker(name) {
|
|
67
|
+
return this.workers.get(name);
|
|
68
|
+
}
|
|
69
|
+
getWorkers() {
|
|
70
|
+
return Array.from(this.workers.values());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=worker-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-engine.js","sourceRoot":"","sources":["../../src/worker-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AASH,MAAM,OAAO,YAAY;IACf,UAAU,CAAS;IACnB,OAAO,GAAkC,IAAI,GAAG,EAAE,CAAC;IAE3D,YAAY,UAAkB;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAsB,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE1E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAEpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;gBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAEtD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACzD,IAAI,SAAkB,CAAC;oBACvB,IAAI,CAAC;wBACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACpC,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC/B,SAAS;oBACX,CAAC;oBAED,8CAA8C;oBAC9C,IACE,OAAO,SAAS,KAAK,QAAQ;wBAC7B,SAAS,KAAK,IAAI;wBAClB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EACnC,CAAC;wBACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAChC,SAAS;oBACX,CAAC;oBAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAEnD,IAAI,MAAM,GAAG,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAClD,CAAC;oBAAC,MAAM,CAAC;wBACP,kCAAkC;oBACpC,CAAC;oBAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DispatchResult } from "./types.js";
|
|
2
|
+
export declare const TASK_STATES: readonly ["created", "submitted", "running", "awaiting_approval", "completed", "failed"];
|
|
3
|
+
export type TaskState = (typeof TASK_STATES)[number];
|
|
4
|
+
export interface TaskStateEntry {
|
|
5
|
+
state: TaskState;
|
|
6
|
+
sessionKey: string;
|
|
7
|
+
worker?: string;
|
|
8
|
+
startedAt: number;
|
|
9
|
+
updatedAt: number;
|
|
10
|
+
/** Retain the last dispatch result so callers can read outcome without re-fetching. */
|
|
11
|
+
lastResult?: DispatchResult;
|
|
12
|
+
}
|
|
13
|
+
export declare class TaskStateManager {
|
|
14
|
+
/** ponytail: Map grows unbounded — add TTL sweep if dispatch volume is high. */
|
|
15
|
+
private readonly tasks;
|
|
16
|
+
/** Create a new task in CREATED state. Returns the entry (caller mutates via transition). */
|
|
17
|
+
create(sessionKey: string, worker?: string): TaskStateEntry;
|
|
18
|
+
/** Advance task to the next state. Returns null if the transition is invalid. */
|
|
19
|
+
transition(sessionKey: string, to: TaskState, result?: DispatchResult): TaskStateEntry | null;
|
|
20
|
+
/** Look up a task by sessionKey. */
|
|
21
|
+
get(sessionKey: string): TaskStateEntry | undefined;
|
|
22
|
+
/** Return all tasks matching a state filter. */
|
|
23
|
+
list(filter?: TaskState): TaskStateEntry[];
|
|
24
|
+
/** Remove a task from tracking (cleanup, not persistence). */
|
|
25
|
+
remove(sessionKey: string): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=task-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-state.d.ts","sourceRoot":"","sources":["../src/task-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,eAAO,MAAM,WAAW,0FAA2F,CAAC;AACpH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,uFAAuF;IACvF,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAcD,qBAAa,gBAAgB;IAC3B,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D,6FAA6F;IAC7F,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc;IAa3D,iFAAiF;IACjF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI;IAmB7F,oCAAoC;IACpC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAInD,gDAAgD;IAChD,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,cAAc,EAAE;IAK1C,8DAA8D;IAC9D,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;CAGpC"}
|