agent-composer 0.3.1 → 0.4.1
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.md +495 -180
- package/composer.config.schema.json +206 -2
- package/dist/cli/cleanup.d.ts +24 -0
- package/dist/cli/cleanup.js +151 -0
- package/dist/cli/cleanup.js.map +1 -0
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +244 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/goal.d.ts +28 -0
- package/dist/cli/goal.js +251 -0
- package/dist/cli/goal.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +31 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.js +116 -21
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/initArgs.d.ts +16 -0
- package/dist/cli/initArgs.js +19 -0
- package/dist/cli/initArgs.js.map +1 -0
- package/dist/cli/installGitHook.d.ts +7 -0
- package/dist/cli/installGitHook.js +61 -0
- package/dist/cli/installGitHook.js.map +1 -0
- package/dist/cli/mode.d.ts +6 -0
- package/dist/cli/mode.js +25 -0
- package/dist/cli/mode.js.map +1 -0
- package/dist/cli/status.d.ts +105 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/config/env.d.ts +1 -1
- package/dist/config/modes.d.ts +10 -0
- package/dist/config/modes.js +26 -0
- package/dist/config/modes.js.map +1 -0
- package/dist/config/oracleRole.d.ts +10 -0
- package/dist/config/oracleRole.js +11 -0
- package/dist/config/oracleRole.js.map +1 -0
- package/dist/config/schema.d.ts +246 -0
- package/dist/config/schema.js +127 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/evolve/reflection.d.ts +9 -0
- package/dist/evolve/reflection.js +14 -0
- package/dist/evolve/reflection.js.map +1 -1
- package/dist/evolve/runner.d.ts +2 -1
- package/dist/evolve/runner.js +2 -1
- package/dist/evolve/runner.js.map +1 -1
- package/dist/index.js +115 -6
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicCompatibleProvider.d.ts +13 -1
- package/dist/providers/AnthropicCompatibleProvider.js +115 -9
- package/dist/providers/AnthropicCompatibleProvider.js.map +1 -1
- package/dist/providers/CLIProvider.d.ts +18 -0
- package/dist/providers/CLIProvider.js +265 -62
- package/dist/providers/CLIProvider.js.map +1 -1
- package/dist/providers/IProvider.d.ts +12 -0
- package/dist/providers/SpendGuardProvider.d.ts +32 -0
- package/dist/providers/SpendGuardProvider.js +98 -0
- package/dist/providers/SpendGuardProvider.js.map +1 -0
- package/dist/registry.d.ts +5 -2
- package/dist/registry.js +17 -2
- package/dist/registry.js.map +1 -1
- package/dist/server/activeRuns.d.ts +17 -0
- package/dist/server/activeRuns.js +114 -0
- package/dist/server/activeRuns.js.map +1 -0
- package/dist/server/codexLifecycleRunner.d.ts +29 -0
- package/dist/server/codexLifecycleRunner.js +188 -0
- package/dist/server/codexLifecycleRunner.js.map +1 -0
- package/dist/server/configMutation.d.ts +22 -0
- package/dist/server/configMutation.js +121 -0
- package/dist/server/configMutation.js.map +1 -0
- package/dist/server/handoffContext.d.ts +1 -0
- package/dist/server/handoffContext.js +12 -0
- package/dist/server/handoffContext.js.map +1 -0
- package/dist/server/progress.d.ts +24 -0
- package/dist/server/progress.js +109 -0
- package/dist/server/progress.js.map +1 -0
- package/dist/server/toolDescriptions.d.ts +60 -0
- package/dist/server/toolDescriptions.js +134 -0
- package/dist/server/toolDescriptions.js.map +1 -0
- package/dist/server.d.ts +19 -25
- package/dist/server.js +87 -377
- package/dist/server.js.map +1 -1
- package/dist/tools/audit.d.ts +2 -0
- package/dist/tools/audit.js +66 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/code.d.ts +2 -0
- package/dist/tools/code.js +160 -0
- package/dist/tools/code.js.map +1 -0
- package/dist/tools/codexLifecycle.d.ts +2 -0
- package/dist/tools/codexLifecycle.js +206 -0
- package/dist/tools/codexLifecycle.js.map +1 -0
- package/dist/tools/config.d.ts +2 -0
- package/dist/tools/config.js +183 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/context.d.ts +31 -0
- package/dist/tools/context.js +2 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/goal.d.ts +2 -0
- package/dist/tools/goal.js +159 -0
- package/dist/tools/goal.js.map +1 -0
- package/dist/tools/handoff.d.ts +2 -0
- package/dist/tools/handoff.js +57 -0
- package/dist/tools/handoff.js.map +1 -0
- package/dist/tools/oracle.d.ts +2 -0
- package/dist/tools/oracle.js +248 -0
- package/dist/tools/oracle.js.map +1 -0
- package/dist/tools/research.d.ts +2 -0
- package/dist/tools/research.js +51 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/review.d.ts +2 -0
- package/dist/tools/review.js +233 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/route.d.ts +2 -0
- package/dist/tools/route.js +69 -0
- package/dist/tools/route.js.map +1 -0
- package/dist/tools/session.d.ts +2 -0
- package/dist/tools/session.js +37 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/status.d.ts +2 -0
- package/dist/tools/status.js +34 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/workflow.d.ts +2 -0
- package/dist/tools/workflow.js +27 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/util/applyFileBlocks.d.ts +18 -0
- package/dist/util/applyFileBlocks.js +163 -0
- package/dist/util/applyFileBlocks.js.map +1 -0
- package/dist/util/asyncControl.d.ts +14 -0
- package/dist/util/asyncControl.js +106 -0
- package/dist/util/asyncControl.js.map +1 -0
- package/dist/util/auditLog.d.ts +56 -0
- package/dist/util/auditLog.js +232 -0
- package/dist/util/auditLog.js.map +1 -0
- package/dist/util/codexLifecycle.d.ts +55 -0
- package/dist/util/codexLifecycle.js +102 -0
- package/dist/util/codexLifecycle.js.map +1 -0
- package/dist/util/codexLifecycleJob.d.ts +209 -0
- package/dist/util/codexLifecycleJob.js +360 -0
- package/dist/util/codexLifecycleJob.js.map +1 -0
- package/dist/util/composerDisabled.d.ts +6 -0
- package/dist/util/composerDisabled.js +27 -0
- package/dist/util/composerDisabled.js.map +1 -0
- package/dist/util/dispatchHint.d.ts +5 -3
- package/dist/util/dispatchHint.js +62 -2
- package/dist/util/dispatchHint.js.map +1 -1
- package/dist/util/goal.d.ts +132 -0
- package/dist/util/goal.js +616 -0
- package/dist/util/goal.js.map +1 -0
- package/dist/util/goalReport.d.ts +51 -0
- package/dist/util/goalReport.js +164 -0
- package/dist/util/goalReport.js.map +1 -0
- package/dist/util/jobPolling.d.ts +9 -0
- package/dist/util/jobPolling.js +17 -0
- package/dist/util/jobPolling.js.map +1 -0
- package/dist/util/oracleJob.d.ts +66 -0
- package/dist/util/oracleJob.js +295 -0
- package/dist/util/oracleJob.js.map +1 -0
- package/dist/util/oracleLock.d.ts +38 -0
- package/dist/util/oracleLock.js +182 -0
- package/dist/util/oracleLock.js.map +1 -0
- package/dist/util/reviewDiff.d.ts +8 -0
- package/dist/util/reviewDiff.js +29 -0
- package/dist/util/reviewDiff.js.map +1 -0
- package/dist/util/reviewJob.d.ts +57 -0
- package/dist/util/reviewJob.js +207 -0
- package/dist/util/reviewJob.js.map +1 -0
- package/dist/util/workflowPlan.d.ts +24 -0
- package/dist/util/workflowPlan.js +49 -0
- package/dist/util/workflowPlan.js.map +1 -0
- package/package.json +8 -1
- package/plugin/composer-mastermind/commands/evolve.md +4 -0
- package/plugin/composer-mastermind/hooks/boundary_guard.sh +43 -2
- package/plugin/composer-mastermind/hooks/codex_warm_review.sh +161 -9
- package/plugin/composer-mastermind/hooks/learn.sh +172 -32
- package/plugin/composer-mastermind/hooks/precommit_codex_review.sh +438 -64
- package/plugin/composer-mastermind/skills/composer-mastermind/SKILL.md +190 -4
- package/scripts/composer-oracle-router-safe.sh +47 -0
- package/scripts/composer-statusline-segment.mjs +40 -0
- package/scripts/oracle-codex-handoff-safe.sh +49 -0
- package/scripts/oracle-plan-mcp.sh +66 -0
- package/scripts/oracle-pro-safe.sh +572 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { COMPOSER_GOAL_CLEAR, COMPOSER_GOAL_REPORT, COMPOSER_GOAL_START, COMPOSER_GOAL_STATUS, COMPOSER_GOAL_STEP, GOAL_CLEAR_DESCRIPTION, GOAL_REPORT_DESCRIPTION, GOAL_START_DESCRIPTION, GOAL_STEP_DESCRIPTION, GOAL_STATUS_DESCRIPTION, } from "../server/toolDescriptions.js";
|
|
3
|
+
import { buildGoalReport, renderGoalReportMarkdown } from "../util/goalReport.js";
|
|
4
|
+
import { clearGoal, isTerminal, readActiveGoal, readGoal, startGoal, stepGoal } from "../util/goal.js";
|
|
5
|
+
export function registerGoalTools(ctx) {
|
|
6
|
+
const { server } = ctx;
|
|
7
|
+
server.registerTool(COMPOSER_GOAL_START, {
|
|
8
|
+
description: `${GOAL_START_DESCRIPTION} Use when storing objective/condition and check command strings as data only - the substrate never runs them.`,
|
|
9
|
+
inputSchema: {
|
|
10
|
+
objective: z.string().min(1),
|
|
11
|
+
condition: z.string().min(1),
|
|
12
|
+
checks: z.array(z.object({ name: z.string().min(1), command: z.string().min(1) })).optional(),
|
|
13
|
+
maxTurns: z.number().int().positive().optional(),
|
|
14
|
+
maxCost: z.number().nonnegative().optional(),
|
|
15
|
+
workflow: z.string().optional(),
|
|
16
|
+
mode: z.string().optional(),
|
|
17
|
+
risk: z.string().optional(),
|
|
18
|
+
},
|
|
19
|
+
annotations: {
|
|
20
|
+
title: "Composer Goal Start",
|
|
21
|
+
readOnlyHint: false,
|
|
22
|
+
destructiveHint: false,
|
|
23
|
+
idempotentHint: false,
|
|
24
|
+
openWorldHint: false,
|
|
25
|
+
},
|
|
26
|
+
}, async (input) => {
|
|
27
|
+
const record = startGoal(ctx.root, input);
|
|
28
|
+
const summary = {
|
|
29
|
+
goalId: record.goalId,
|
|
30
|
+
state: record.state,
|
|
31
|
+
turns: record.turns,
|
|
32
|
+
nextAction: { tool: "composer_route_decide", reason: "begin" },
|
|
33
|
+
checks: record.checks,
|
|
34
|
+
};
|
|
35
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
36
|
+
});
|
|
37
|
+
server.registerTool(COMPOSER_GOAL_STATUS, {
|
|
38
|
+
description: GOAL_STATUS_DESCRIPTION,
|
|
39
|
+
inputSchema: {
|
|
40
|
+
goalId: z.string().optional(),
|
|
41
|
+
},
|
|
42
|
+
annotations: {
|
|
43
|
+
title: "Composer Goal Status",
|
|
44
|
+
readOnlyHint: true,
|
|
45
|
+
destructiveHint: false,
|
|
46
|
+
idempotentHint: true,
|
|
47
|
+
openWorldHint: false,
|
|
48
|
+
},
|
|
49
|
+
}, async ({ goalId }) => {
|
|
50
|
+
const record = goalId ? readGoal(ctx.root, goalId) : readActiveGoal(ctx.root);
|
|
51
|
+
const summary = record
|
|
52
|
+
? {
|
|
53
|
+
goalId: record.goalId,
|
|
54
|
+
state: record.state,
|
|
55
|
+
turns: record.turns,
|
|
56
|
+
maxTurns: record.maxTurns,
|
|
57
|
+
checks: record.checks,
|
|
58
|
+
lastAction: record.lastAction,
|
|
59
|
+
lastVerdict: record.lastVerdict,
|
|
60
|
+
lastReason: record.lastReason,
|
|
61
|
+
}
|
|
62
|
+
: { state: "none" };
|
|
63
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
64
|
+
});
|
|
65
|
+
server.registerTool(COMPOSER_GOAL_REPORT, {
|
|
66
|
+
description: GOAL_REPORT_DESCRIPTION,
|
|
67
|
+
inputSchema: {
|
|
68
|
+
goalId: z.string().optional(),
|
|
69
|
+
format: z.enum(["json", "markdown"]).default("json").optional(),
|
|
70
|
+
includeAudit: z.boolean().default(false).optional(),
|
|
71
|
+
auditLimit: z.number().int().nonnegative().default(100).optional(),
|
|
72
|
+
includeCommands: z.boolean().default(false).optional(),
|
|
73
|
+
includeAuditEvents: z.boolean().default(false).optional(),
|
|
74
|
+
},
|
|
75
|
+
annotations: {
|
|
76
|
+
title: "Composer Goal Report",
|
|
77
|
+
readOnlyHint: true,
|
|
78
|
+
destructiveHint: false,
|
|
79
|
+
idempotentHint: true,
|
|
80
|
+
openWorldHint: false,
|
|
81
|
+
},
|
|
82
|
+
}, async ({ goalId, format = "json", includeAudit = false, auditLimit = 100, includeCommands = false, includeAuditEvents = false, }) => {
|
|
83
|
+
const report = buildGoalReport(ctx.root, {
|
|
84
|
+
goalId,
|
|
85
|
+
includeAudit,
|
|
86
|
+
auditLimit,
|
|
87
|
+
includeCommands,
|
|
88
|
+
includeAuditEvents,
|
|
89
|
+
});
|
|
90
|
+
const text = format === "markdown"
|
|
91
|
+
? renderGoalReportMarkdown(report, { includeCommands, includeAuditEvents })
|
|
92
|
+
: JSON.stringify(report, null, 2);
|
|
93
|
+
return { content: [{ type: "text", text }] };
|
|
94
|
+
});
|
|
95
|
+
server.registerTool(COMPOSER_GOAL_STEP, {
|
|
96
|
+
description: GOAL_STEP_DESCRIPTION,
|
|
97
|
+
inputSchema: {
|
|
98
|
+
goalId: z.string().optional(),
|
|
99
|
+
signals: z.object({
|
|
100
|
+
checkResults: z.array(z.object({
|
|
101
|
+
name: z.string().min(1),
|
|
102
|
+
passed: z.boolean(),
|
|
103
|
+
})).optional(),
|
|
104
|
+
conditionMet: z.boolean().optional(),
|
|
105
|
+
spentUsd: z.number().nonnegative().optional(),
|
|
106
|
+
failedAttempts: z.number().int().nonnegative().optional(),
|
|
107
|
+
stuck: z.boolean().optional(),
|
|
108
|
+
budgetExtension: z.object({
|
|
109
|
+
maxTurns: z.number().int().positive().optional(),
|
|
110
|
+
maxCost: z.number().nonnegative().optional(),
|
|
111
|
+
}).optional(),
|
|
112
|
+
testsPassed: z.boolean().optional(),
|
|
113
|
+
reviewVerdict: z.string().optional(),
|
|
114
|
+
}).optional(),
|
|
115
|
+
},
|
|
116
|
+
annotations: {
|
|
117
|
+
title: "Composer Goal Step",
|
|
118
|
+
readOnlyHint: false,
|
|
119
|
+
destructiveHint: false,
|
|
120
|
+
idempotentHint: false,
|
|
121
|
+
openWorldHint: false,
|
|
122
|
+
},
|
|
123
|
+
}, async (input) => {
|
|
124
|
+
const { record, nextAction } = stepGoal(ctx.root, input);
|
|
125
|
+
const summary = {
|
|
126
|
+
state: record.state,
|
|
127
|
+
turns: record.turns,
|
|
128
|
+
nextAction,
|
|
129
|
+
checks: record.checks,
|
|
130
|
+
lastReason: record.lastReason,
|
|
131
|
+
};
|
|
132
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
133
|
+
});
|
|
134
|
+
server.registerTool(COMPOSER_GOAL_CLEAR, {
|
|
135
|
+
description: GOAL_CLEAR_DESCRIPTION,
|
|
136
|
+
inputSchema: {
|
|
137
|
+
goalId: z.string().optional(),
|
|
138
|
+
},
|
|
139
|
+
annotations: {
|
|
140
|
+
title: "Composer Goal Clear",
|
|
141
|
+
readOnlyHint: false,
|
|
142
|
+
destructiveHint: false,
|
|
143
|
+
idempotentHint: true,
|
|
144
|
+
openWorldHint: false,
|
|
145
|
+
},
|
|
146
|
+
}, async ({ goalId }) => {
|
|
147
|
+
const prior = goalId ? readGoal(ctx.root, goalId) : readActiveGoal(ctx.root);
|
|
148
|
+
const record = clearGoal(ctx.root, goalId);
|
|
149
|
+
const summary = record
|
|
150
|
+
? {
|
|
151
|
+
goalId: record.goalId,
|
|
152
|
+
state: record.state,
|
|
153
|
+
changed: prior !== null && !isTerminal(prior.state),
|
|
154
|
+
}
|
|
155
|
+
: { state: "none" };
|
|
156
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=goal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/tools/goal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { COMPOSER_HANDOFF_CREATE, HANDOFF_CREATE_DESCRIPTION, } from "../server/toolDescriptions.js";
|
|
4
|
+
import { HANDOFF_DIR, newHandoffPacket, writeHandoffPacket, } from "../util/handoff.js";
|
|
5
|
+
export function registerHandoffTools(ctx) {
|
|
6
|
+
const { server, root } = ctx;
|
|
7
|
+
server.registerTool(COMPOSER_HANDOFF_CREATE, {
|
|
8
|
+
description: HANDOFF_CREATE_DESCRIPTION,
|
|
9
|
+
inputSchema: {
|
|
10
|
+
objective: z.string().min(1),
|
|
11
|
+
contextSummary: z.string().optional(),
|
|
12
|
+
constraints: z.array(z.string().min(1)).optional(),
|
|
13
|
+
relevantFiles: z.array(z.string().min(1)).optional(),
|
|
14
|
+
acceptanceCriteria: z.array(z.string().min(1)).optional(),
|
|
15
|
+
decisions: z.array(z.string().min(1)).optional(),
|
|
16
|
+
openQuestions: z.array(z.string().min(1)).optional(),
|
|
17
|
+
artifacts: z
|
|
18
|
+
.array(z.object({
|
|
19
|
+
kind: z.enum(["research", "code", "review", "test", "note"]),
|
|
20
|
+
summary: z.string().min(1),
|
|
21
|
+
path: z.string().min(1).optional(),
|
|
22
|
+
source: z.string().min(1).optional(),
|
|
23
|
+
}))
|
|
24
|
+
.optional(),
|
|
25
|
+
briefPath: z.string().optional(),
|
|
26
|
+
},
|
|
27
|
+
annotations: {
|
|
28
|
+
title: "Composer Handoff Create",
|
|
29
|
+
readOnlyHint: false,
|
|
30
|
+
openWorldHint: false,
|
|
31
|
+
destructiveHint: false,
|
|
32
|
+
idempotentHint: false,
|
|
33
|
+
},
|
|
34
|
+
}, async ({ objective, contextSummary, constraints, relevantFiles, acceptanceCriteria, decisions, openQuestions, artifacts, briefPath, }) => {
|
|
35
|
+
const packet = newHandoffPacket({
|
|
36
|
+
objective,
|
|
37
|
+
contextSummary,
|
|
38
|
+
constraints,
|
|
39
|
+
relevantFiles,
|
|
40
|
+
acceptanceCriteria,
|
|
41
|
+
decisions,
|
|
42
|
+
openQuestions,
|
|
43
|
+
artifacts: artifacts,
|
|
44
|
+
briefPath,
|
|
45
|
+
});
|
|
46
|
+
const handoffPath = writeHandoffPacket(packet, path.resolve(root, HANDOFF_DIR));
|
|
47
|
+
const response = {
|
|
48
|
+
runId: packet.runId,
|
|
49
|
+
handoffPath,
|
|
50
|
+
objective: packet.objective,
|
|
51
|
+
};
|
|
52
|
+
return {
|
|
53
|
+
content: [{ type: "text", text: JSON.stringify(response, null, 2) }],
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/tools/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { withProgress } from "../server/progress.js";
|
|
5
|
+
import { contextWithHandoff } from "../server/handoffContext.js";
|
|
6
|
+
import { COMPOSER_ORACLE_PLAN, COMPOSER_ORACLE_JOB_START, COMPOSER_ORACLE_JOB_RESULT, ORACLE_PLAN_DESCRIPTION, ORACLE_JOB_START_DESCRIPTION, ORACLE_JOB_RESULT_DESCRIPTION, } from "../server/toolDescriptions.js";
|
|
7
|
+
import { newOracleJob, readLatestOracleJob, readOracleJob, updateOracleJob, writeOracleJob, } from "../util/oracleJob.js";
|
|
8
|
+
import { acquireOracleLock } from "../util/oracleLock.js";
|
|
9
|
+
import { DEFAULT_ANTHROPIC_TIMEOUT_MS } from "../providers/AnthropicCompatibleProvider.js";
|
|
10
|
+
import { createDeadlineSignal } from "../util/asyncControl.js";
|
|
11
|
+
import { pollJobResult } from "../util/jobPolling.js";
|
|
12
|
+
const DEFAULT_BACKGROUND_JOB_TIMEOUT_MS = DEFAULT_ANTHROPIC_TIMEOUT_MS;
|
|
13
|
+
export function registerOracleTools(ctx) {
|
|
14
|
+
const { server, registry, root } = ctx;
|
|
15
|
+
server.registerTool(COMPOSER_ORACLE_PLAN, {
|
|
16
|
+
description: ORACLE_PLAN_DESCRIPTION,
|
|
17
|
+
inputSchema: {
|
|
18
|
+
prompt: z.string().min(1),
|
|
19
|
+
mode: z
|
|
20
|
+
.enum([
|
|
21
|
+
"auto",
|
|
22
|
+
"quick",
|
|
23
|
+
"standard",
|
|
24
|
+
"deep",
|
|
25
|
+
"plan",
|
|
26
|
+
"review",
|
|
27
|
+
"debug",
|
|
28
|
+
"research",
|
|
29
|
+
])
|
|
30
|
+
.optional(),
|
|
31
|
+
context: z.string().optional(),
|
|
32
|
+
handoffPath: z.string().optional(),
|
|
33
|
+
},
|
|
34
|
+
annotations: {
|
|
35
|
+
title: "Composer Oracle Plan (ChatGPT Pro)",
|
|
36
|
+
readOnlyHint: true,
|
|
37
|
+
openWorldHint: true,
|
|
38
|
+
destructiveHint: false,
|
|
39
|
+
idempotentHint: false,
|
|
40
|
+
},
|
|
41
|
+
}, async ({ prompt, mode, context, handoffPath }, extra) => {
|
|
42
|
+
ctx.refreshConfigIfChanged();
|
|
43
|
+
const provider = registry.getProviderForRole("oraclePlanner");
|
|
44
|
+
const cfgOracle = ctx.getActiveConfig()?.oracle;
|
|
45
|
+
const sessOracle = ctx.getSession().oracle;
|
|
46
|
+
const oracleCfg = {
|
|
47
|
+
defaultMode: sessOracle?.defaultMode ?? cfgOracle?.defaultMode,
|
|
48
|
+
requireExplicitTag: sessOracle?.requireExplicitTag ?? cfgOracle?.requireExplicitTag,
|
|
49
|
+
};
|
|
50
|
+
const resolvedMode = mode ?? oracleCfg?.defaultMode ?? "auto";
|
|
51
|
+
if (oracleCfg?.requireExplicitTag === true &&
|
|
52
|
+
resolvedMode === "auto" &&
|
|
53
|
+
!/\[oracle:(quick|standard|deep|plan|review|debug|research)\]/i.test(prompt)) {
|
|
54
|
+
throw new Error("composer_oracle_plan: oracle.requireExplicitTag is set — pass an explicit mode (quick|standard|deep|plan|review|debug|research) or tag the prompt with [oracle:<mode>].");
|
|
55
|
+
}
|
|
56
|
+
const effectivePrompt = resolvedMode !== "auto" ? `[oracle:${resolvedMode}] ${prompt}` : prompt;
|
|
57
|
+
const lock = acquireOracleLock(root, { label: "oracle_plan" });
|
|
58
|
+
emitOracleLockRecovery(lock.recovery);
|
|
59
|
+
if (!lock.acquired) {
|
|
60
|
+
throw new Error(`Oracle is busy: a run is already in progress (pid ${lock.holder.pid}` +
|
|
61
|
+
`${lock.holder.jobId ? `, job ${lock.holder.jobId}` : ""}). ` +
|
|
62
|
+
`Retry shortly, or use composer_oracle_job_start for a queued async run.`);
|
|
63
|
+
}
|
|
64
|
+
const toolSignal = createBoundedSignal(COMPOSER_ORACLE_PLAN, resolveRoleTimeoutMs(ctx.getActiveConfig()?.roles.oraclePlanner?.timeoutMs), extra.signal);
|
|
65
|
+
try {
|
|
66
|
+
const result = await withProgress(extra, COMPOSER_ORACLE_PLAN, (onProgress) => provider.execute({
|
|
67
|
+
prompt: effectivePrompt,
|
|
68
|
+
context: contextWithHandoff(root, context, handoffPath),
|
|
69
|
+
cwd: root,
|
|
70
|
+
onProgress,
|
|
71
|
+
signal: toolSignal.signal,
|
|
72
|
+
}), { tracker: ctx.activeRuns, providerLabel: provider.modelLabel, providerRole: "oraclePlanner" });
|
|
73
|
+
return { content: [{ type: "text", text: result.text }] };
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
toolSignal.cleanup();
|
|
77
|
+
lock.handle.release();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
server.registerTool(COMPOSER_ORACLE_JOB_START, {
|
|
81
|
+
description: ORACLE_JOB_START_DESCRIPTION,
|
|
82
|
+
inputSchema: {
|
|
83
|
+
prompt: z.string().min(1),
|
|
84
|
+
mode: z.enum(["auto", "quick", "standard", "deep", "plan", "review", "debug", "research"]).optional(),
|
|
85
|
+
context: z.string().optional(),
|
|
86
|
+
handoffPath: z.string().optional(),
|
|
87
|
+
},
|
|
88
|
+
annotations: {
|
|
89
|
+
title: "Composer Oracle Job Start (async ChatGPT Pro)",
|
|
90
|
+
readOnlyHint: false,
|
|
91
|
+
openWorldHint: true,
|
|
92
|
+
destructiveHint: false,
|
|
93
|
+
idempotentHint: false,
|
|
94
|
+
},
|
|
95
|
+
}, async ({ prompt, mode, context, handoffPath }, extra) => {
|
|
96
|
+
ctx.refreshConfigIfChanged();
|
|
97
|
+
const cfgOracle = ctx.getActiveConfig()?.oracle;
|
|
98
|
+
const sessOracle = ctx.getSession().oracle;
|
|
99
|
+
const oracleCfg = {
|
|
100
|
+
defaultMode: sessOracle?.defaultMode ?? cfgOracle?.defaultMode,
|
|
101
|
+
requireExplicitTag: sessOracle?.requireExplicitTag ?? cfgOracle?.requireExplicitTag,
|
|
102
|
+
};
|
|
103
|
+
const resolvedMode = mode ?? oracleCfg?.defaultMode ?? "auto";
|
|
104
|
+
if (oracleCfg?.requireExplicitTag === true &&
|
|
105
|
+
resolvedMode === "auto" &&
|
|
106
|
+
!/\[oracle:(quick|standard|deep|plan|review|debug|research)\]/i.test(prompt)) {
|
|
107
|
+
throw new Error("composer_oracle_job_start: oracle.requireExplicitTag is set — pass an explicit mode (quick|standard|deep|plan|review|debug|research) or tag the prompt with [oracle:<mode>].");
|
|
108
|
+
}
|
|
109
|
+
const provider = registry.getProviderForRole("oraclePlanner");
|
|
110
|
+
const jobTimeoutMs = resolveRoleTimeoutMs(ctx.getActiveConfig()?.roles.oraclePlanner?.timeoutMs);
|
|
111
|
+
let job = newOracleJob(root, {
|
|
112
|
+
mode: resolvedMode,
|
|
113
|
+
promptPreview: prompt.slice(0, 200),
|
|
114
|
+
handoffPath,
|
|
115
|
+
});
|
|
116
|
+
const lock = acquireOracleLock(root, { jobId: job.jobId, label: "oracle_job_start" });
|
|
117
|
+
emitOracleLockRecovery(lock.recovery);
|
|
118
|
+
if (!lock.acquired) {
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: JSON.stringify({
|
|
124
|
+
status: "rejected",
|
|
125
|
+
reason: "an Oracle run is already in progress",
|
|
126
|
+
runningJobId: lock.holder.jobId ?? null,
|
|
127
|
+
holderPid: lock.holder.pid,
|
|
128
|
+
hint: "poll composer_oracle_job_result, or retry once the current run finishes",
|
|
129
|
+
}, null, 2),
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
job = writeOracleJob(root, job);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
lock.handle.release();
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
const effectivePrompt = resolvedMode !== "auto" ? `[oracle:${resolvedMode}] ${prompt}` : prompt;
|
|
142
|
+
const runner = async () => {
|
|
143
|
+
const jobSignal = createBoundedSignal("composer_oracle_job_start", jobTimeoutMs, extra.signal);
|
|
144
|
+
try {
|
|
145
|
+
const running = updateOracleJob(root, job, {
|
|
146
|
+
status: "running",
|
|
147
|
+
startedAt: new Date().toISOString(),
|
|
148
|
+
});
|
|
149
|
+
try {
|
|
150
|
+
const result = await provider.execute({
|
|
151
|
+
prompt: effectivePrompt,
|
|
152
|
+
context: contextWithHandoff(root, context, handoffPath),
|
|
153
|
+
cwd: root,
|
|
154
|
+
signal: jobSignal.signal,
|
|
155
|
+
});
|
|
156
|
+
let answerMeta = {};
|
|
157
|
+
try {
|
|
158
|
+
const metaPath = path.join(root, ".composer", "oracle", "answers", ".last-plan-meta.json");
|
|
159
|
+
if (fs.existsSync(metaPath)) {
|
|
160
|
+
const meta = JSON.parse(fs.readFileSync(metaPath, "utf8"));
|
|
161
|
+
if (typeof meta.answerPath === "string")
|
|
162
|
+
answerMeta.answerPath = meta.answerPath;
|
|
163
|
+
if (typeof meta.oracleSlug === "string")
|
|
164
|
+
answerMeta.oracleSlug = meta.oracleSlug;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// best-effort: missing/unreadable sidecar just means no answerPath
|
|
169
|
+
}
|
|
170
|
+
updateOracleJob(root, running, {
|
|
171
|
+
status: "succeeded",
|
|
172
|
+
completedAt: new Date().toISOString(),
|
|
173
|
+
answerText: result.text,
|
|
174
|
+
...answerMeta,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
updateOracleJob(root, running, {
|
|
179
|
+
status: "failed",
|
|
180
|
+
completedAt: new Date().toISOString(),
|
|
181
|
+
error: error instanceof Error ? error.message : String(error),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
jobSignal.cleanup();
|
|
187
|
+
lock.handle.release();
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
void runner().catch(() => {
|
|
191
|
+
// The runner persists its own failures to the durable job record;
|
|
192
|
+
// this guard only prevents an unobserved promise rejection.
|
|
193
|
+
});
|
|
194
|
+
return { content: [{ type: "text", text: JSON.stringify(job, null, 2) }] };
|
|
195
|
+
});
|
|
196
|
+
server.registerTool(COMPOSER_ORACLE_JOB_RESULT, {
|
|
197
|
+
description: ORACLE_JOB_RESULT_DESCRIPTION,
|
|
198
|
+
inputSchema: {
|
|
199
|
+
jobId: z.string().uuid().optional(),
|
|
200
|
+
waitMs: z.number().int().min(0).max(600000).optional(),
|
|
201
|
+
},
|
|
202
|
+
annotations: {
|
|
203
|
+
title: "Composer Oracle Job Result",
|
|
204
|
+
readOnlyHint: true,
|
|
205
|
+
openWorldHint: false,
|
|
206
|
+
destructiveHint: false,
|
|
207
|
+
idempotentHint: true,
|
|
208
|
+
},
|
|
209
|
+
}, async ({ jobId, waitMs }, extra) => {
|
|
210
|
+
const read = () => (jobId ? readOracleJob(root, jobId) : readLatestOracleJob(root));
|
|
211
|
+
const job = await pollJobResult(read, {
|
|
212
|
+
waitMs,
|
|
213
|
+
signal: extra.signal,
|
|
214
|
+
label: COMPOSER_ORACLE_JOB_RESULT,
|
|
215
|
+
});
|
|
216
|
+
const response = job ?? {
|
|
217
|
+
found: false,
|
|
218
|
+
jobId: jobId ?? null,
|
|
219
|
+
message: jobId ? `No Oracle job found for ${jobId}.` : "No Oracle jobs found.",
|
|
220
|
+
};
|
|
221
|
+
return { content: [{ type: "text", text: JSON.stringify(response, null, 2) }] };
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function emitOracleLockRecovery(recovery) {
|
|
225
|
+
if (!recovery)
|
|
226
|
+
return;
|
|
227
|
+
const payload = {
|
|
228
|
+
reason_code: recovery.reasonCode,
|
|
229
|
+
stage: recovery.stage,
|
|
230
|
+
elapsed_wall_ms: recovery.elapsedWallMs,
|
|
231
|
+
lock_age_ms: recovery.lockAgeMs,
|
|
232
|
+
holder_pid: recovery.holder.pid,
|
|
233
|
+
holder_job_id: recovery.holder.jobId ?? null,
|
|
234
|
+
holder_label: recovery.holder.label ?? null,
|
|
235
|
+
};
|
|
236
|
+
console.error(JSON.stringify(payload));
|
|
237
|
+
}
|
|
238
|
+
function resolveRoleTimeoutMs(configuredTimeoutMs) {
|
|
239
|
+
return typeof configuredTimeoutMs === "number" &&
|
|
240
|
+
Number.isFinite(configuredTimeoutMs) &&
|
|
241
|
+
configuredTimeoutMs > 0
|
|
242
|
+
? configuredTimeoutMs
|
|
243
|
+
: DEFAULT_BACKGROUND_JOB_TIMEOUT_MS;
|
|
244
|
+
}
|
|
245
|
+
function createBoundedSignal(label, timeoutMs, callerSignal) {
|
|
246
|
+
return createDeadlineSignal(label, timeoutMs, callerSignal);
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/tools/oracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { withProgress } from "../server/progress.js";
|
|
3
|
+
import { contextWithHandoff } from "../server/handoffContext.js";
|
|
4
|
+
import { COMPOSER_RESEARCH, RESEARCH_DESCRIPTION, } from "../server/toolDescriptions.js";
|
|
5
|
+
import { createDeadlineSignal } from "../util/asyncControl.js";
|
|
6
|
+
const DEFAULT_RESEARCHER_TIMEOUT_MS = 180_000;
|
|
7
|
+
export function registerResearchTools(ctx) {
|
|
8
|
+
const { server, registry, root } = ctx;
|
|
9
|
+
server.registerTool(COMPOSER_RESEARCH, {
|
|
10
|
+
description: RESEARCH_DESCRIPTION,
|
|
11
|
+
inputSchema: {
|
|
12
|
+
prompt: z.string().min(1),
|
|
13
|
+
context: z.string().optional(),
|
|
14
|
+
handoffPath: z.string().optional(),
|
|
15
|
+
},
|
|
16
|
+
annotations: {
|
|
17
|
+
title: "Composer Research",
|
|
18
|
+
readOnlyHint: true,
|
|
19
|
+
openWorldHint: true,
|
|
20
|
+
destructiveHint: false,
|
|
21
|
+
idempotentHint: false,
|
|
22
|
+
},
|
|
23
|
+
}, async ({ prompt, context, handoffPath }, extra) => {
|
|
24
|
+
ctx.refreshConfigIfChanged();
|
|
25
|
+
const provider = registry.getProviderForRole("researcher");
|
|
26
|
+
const toolSignal = createBoundedSignal(COMPOSER_RESEARCH, resolveRoleTimeoutMs(ctx.getActiveConfig()?.roles.researcher?.timeoutMs, DEFAULT_RESEARCHER_TIMEOUT_MS), extra.signal);
|
|
27
|
+
try {
|
|
28
|
+
const result = await withProgress(extra, COMPOSER_RESEARCH, (onProgress) => provider.execute({
|
|
29
|
+
prompt,
|
|
30
|
+
context: contextWithHandoff(root, context, handoffPath),
|
|
31
|
+
onProgress,
|
|
32
|
+
signal: toolSignal.signal,
|
|
33
|
+
}), { tracker: ctx.activeRuns, providerLabel: provider.modelLabel, providerRole: "researcher" });
|
|
34
|
+
return { content: [{ type: "text", text: result.text }] };
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
toolSignal.cleanup();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function resolveRoleTimeoutMs(configuredTimeoutMs, fallbackMs) {
|
|
42
|
+
return typeof configuredTimeoutMs === "number" &&
|
|
43
|
+
Number.isFinite(configuredTimeoutMs) &&
|
|
44
|
+
configuredTimeoutMs > 0
|
|
45
|
+
? configuredTimeoutMs
|
|
46
|
+
: fallbackMs;
|
|
47
|
+
}
|
|
48
|
+
function createBoundedSignal(label, timeoutMs, callerSignal) {
|
|
49
|
+
return createDeadlineSignal(label, timeoutMs, callerSignal);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,MAAM,6BAA6B,GAAG,OAAO,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,GAAsB;IAC1D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAEvC,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,oBAAoB;QACjC,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SACnC;QACD,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;SACtB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE;QAChD,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,mBAAmB,CACpC,iBAAiB,EACjB,oBAAoB,CAClB,GAAG,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAClD,6BAA6B,CAC9B,EACD,KAAK,CAAC,MAAM,CACb,CAAC;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,UAAU,EAAE,EAAE,CACzE,QAAQ,CAAC,OAAO,CAAC;gBACf,MAAM;gBACN,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;gBACvD,UAAU;gBACV,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,EACF,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,CAC5F,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,mBAA4B,EAAE,UAAkB;IAC5E,OAAO,OAAO,mBAAmB,KAAK,QAAQ;QAC5C,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACpC,mBAAmB,GAAG,CAAC;QACvB,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,SAAiB,EAAE,YAA0B;IAIvF,OAAO,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC"}
|