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.
Files changed (180) hide show
  1. package/README.md +495 -180
  2. package/composer.config.schema.json +206 -2
  3. package/dist/cli/cleanup.d.ts +24 -0
  4. package/dist/cli/cleanup.js +151 -0
  5. package/dist/cli/cleanup.js.map +1 -0
  6. package/dist/cli/doctor.d.ts +12 -0
  7. package/dist/cli/doctor.js +244 -4
  8. package/dist/cli/doctor.js.map +1 -1
  9. package/dist/cli/goal.d.ts +28 -0
  10. package/dist/cli/goal.js +251 -0
  11. package/dist/cli/goal.js.map +1 -0
  12. package/dist/cli/help.d.ts +3 -0
  13. package/dist/cli/help.js +31 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli/init.d.ts +5 -0
  16. package/dist/cli/init.js +116 -21
  17. package/dist/cli/init.js.map +1 -1
  18. package/dist/cli/initArgs.d.ts +16 -0
  19. package/dist/cli/initArgs.js +19 -0
  20. package/dist/cli/initArgs.js.map +1 -0
  21. package/dist/cli/installGitHook.d.ts +7 -0
  22. package/dist/cli/installGitHook.js +61 -0
  23. package/dist/cli/installGitHook.js.map +1 -0
  24. package/dist/cli/mode.d.ts +6 -0
  25. package/dist/cli/mode.js +25 -0
  26. package/dist/cli/mode.js.map +1 -0
  27. package/dist/cli/status.d.ts +105 -0
  28. package/dist/cli/status.js +400 -0
  29. package/dist/cli/status.js.map +1 -0
  30. package/dist/config/env.d.ts +1 -1
  31. package/dist/config/modes.d.ts +10 -0
  32. package/dist/config/modes.js +26 -0
  33. package/dist/config/modes.js.map +1 -0
  34. package/dist/config/oracleRole.d.ts +10 -0
  35. package/dist/config/oracleRole.js +11 -0
  36. package/dist/config/oracleRole.js.map +1 -0
  37. package/dist/config/schema.d.ts +246 -0
  38. package/dist/config/schema.js +127 -2
  39. package/dist/config/schema.js.map +1 -1
  40. package/dist/evolve/reflection.d.ts +9 -0
  41. package/dist/evolve/reflection.js +14 -0
  42. package/dist/evolve/reflection.js.map +1 -1
  43. package/dist/evolve/runner.d.ts +2 -1
  44. package/dist/evolve/runner.js +2 -1
  45. package/dist/evolve/runner.js.map +1 -1
  46. package/dist/index.js +115 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/providers/AnthropicCompatibleProvider.d.ts +13 -1
  49. package/dist/providers/AnthropicCompatibleProvider.js +115 -9
  50. package/dist/providers/AnthropicCompatibleProvider.js.map +1 -1
  51. package/dist/providers/CLIProvider.d.ts +18 -0
  52. package/dist/providers/CLIProvider.js +265 -62
  53. package/dist/providers/CLIProvider.js.map +1 -1
  54. package/dist/providers/IProvider.d.ts +12 -0
  55. package/dist/providers/SpendGuardProvider.d.ts +32 -0
  56. package/dist/providers/SpendGuardProvider.js +98 -0
  57. package/dist/providers/SpendGuardProvider.js.map +1 -0
  58. package/dist/registry.d.ts +5 -2
  59. package/dist/registry.js +17 -2
  60. package/dist/registry.js.map +1 -1
  61. package/dist/server/activeRuns.d.ts +17 -0
  62. package/dist/server/activeRuns.js +114 -0
  63. package/dist/server/activeRuns.js.map +1 -0
  64. package/dist/server/codexLifecycleRunner.d.ts +29 -0
  65. package/dist/server/codexLifecycleRunner.js +188 -0
  66. package/dist/server/codexLifecycleRunner.js.map +1 -0
  67. package/dist/server/configMutation.d.ts +22 -0
  68. package/dist/server/configMutation.js +121 -0
  69. package/dist/server/configMutation.js.map +1 -0
  70. package/dist/server/handoffContext.d.ts +1 -0
  71. package/dist/server/handoffContext.js +12 -0
  72. package/dist/server/handoffContext.js.map +1 -0
  73. package/dist/server/progress.d.ts +24 -0
  74. package/dist/server/progress.js +109 -0
  75. package/dist/server/progress.js.map +1 -0
  76. package/dist/server/toolDescriptions.d.ts +60 -0
  77. package/dist/server/toolDescriptions.js +134 -0
  78. package/dist/server/toolDescriptions.js.map +1 -0
  79. package/dist/server.d.ts +19 -25
  80. package/dist/server.js +87 -377
  81. package/dist/server.js.map +1 -1
  82. package/dist/tools/audit.d.ts +2 -0
  83. package/dist/tools/audit.js +66 -0
  84. package/dist/tools/audit.js.map +1 -0
  85. package/dist/tools/code.d.ts +2 -0
  86. package/dist/tools/code.js +160 -0
  87. package/dist/tools/code.js.map +1 -0
  88. package/dist/tools/codexLifecycle.d.ts +2 -0
  89. package/dist/tools/codexLifecycle.js +206 -0
  90. package/dist/tools/codexLifecycle.js.map +1 -0
  91. package/dist/tools/config.d.ts +2 -0
  92. package/dist/tools/config.js +183 -0
  93. package/dist/tools/config.js.map +1 -0
  94. package/dist/tools/context.d.ts +31 -0
  95. package/dist/tools/context.js +2 -0
  96. package/dist/tools/context.js.map +1 -0
  97. package/dist/tools/goal.d.ts +2 -0
  98. package/dist/tools/goal.js +159 -0
  99. package/dist/tools/goal.js.map +1 -0
  100. package/dist/tools/handoff.d.ts +2 -0
  101. package/dist/tools/handoff.js +57 -0
  102. package/dist/tools/handoff.js.map +1 -0
  103. package/dist/tools/oracle.d.ts +2 -0
  104. package/dist/tools/oracle.js +248 -0
  105. package/dist/tools/oracle.js.map +1 -0
  106. package/dist/tools/research.d.ts +2 -0
  107. package/dist/tools/research.js +51 -0
  108. package/dist/tools/research.js.map +1 -0
  109. package/dist/tools/review.d.ts +2 -0
  110. package/dist/tools/review.js +233 -0
  111. package/dist/tools/review.js.map +1 -0
  112. package/dist/tools/route.d.ts +2 -0
  113. package/dist/tools/route.js +69 -0
  114. package/dist/tools/route.js.map +1 -0
  115. package/dist/tools/session.d.ts +2 -0
  116. package/dist/tools/session.js +37 -0
  117. package/dist/tools/session.js.map +1 -0
  118. package/dist/tools/status.d.ts +2 -0
  119. package/dist/tools/status.js +34 -0
  120. package/dist/tools/status.js.map +1 -0
  121. package/dist/tools/workflow.d.ts +2 -0
  122. package/dist/tools/workflow.js +27 -0
  123. package/dist/tools/workflow.js.map +1 -0
  124. package/dist/util/applyFileBlocks.d.ts +18 -0
  125. package/dist/util/applyFileBlocks.js +163 -0
  126. package/dist/util/applyFileBlocks.js.map +1 -0
  127. package/dist/util/asyncControl.d.ts +14 -0
  128. package/dist/util/asyncControl.js +106 -0
  129. package/dist/util/asyncControl.js.map +1 -0
  130. package/dist/util/auditLog.d.ts +56 -0
  131. package/dist/util/auditLog.js +232 -0
  132. package/dist/util/auditLog.js.map +1 -0
  133. package/dist/util/codexLifecycle.d.ts +55 -0
  134. package/dist/util/codexLifecycle.js +102 -0
  135. package/dist/util/codexLifecycle.js.map +1 -0
  136. package/dist/util/codexLifecycleJob.d.ts +209 -0
  137. package/dist/util/codexLifecycleJob.js +360 -0
  138. package/dist/util/codexLifecycleJob.js.map +1 -0
  139. package/dist/util/composerDisabled.d.ts +6 -0
  140. package/dist/util/composerDisabled.js +27 -0
  141. package/dist/util/composerDisabled.js.map +1 -0
  142. package/dist/util/dispatchHint.d.ts +5 -3
  143. package/dist/util/dispatchHint.js +62 -2
  144. package/dist/util/dispatchHint.js.map +1 -1
  145. package/dist/util/goal.d.ts +132 -0
  146. package/dist/util/goal.js +616 -0
  147. package/dist/util/goal.js.map +1 -0
  148. package/dist/util/goalReport.d.ts +51 -0
  149. package/dist/util/goalReport.js +164 -0
  150. package/dist/util/goalReport.js.map +1 -0
  151. package/dist/util/jobPolling.d.ts +9 -0
  152. package/dist/util/jobPolling.js +17 -0
  153. package/dist/util/jobPolling.js.map +1 -0
  154. package/dist/util/oracleJob.d.ts +66 -0
  155. package/dist/util/oracleJob.js +295 -0
  156. package/dist/util/oracleJob.js.map +1 -0
  157. package/dist/util/oracleLock.d.ts +38 -0
  158. package/dist/util/oracleLock.js +182 -0
  159. package/dist/util/oracleLock.js.map +1 -0
  160. package/dist/util/reviewDiff.d.ts +8 -0
  161. package/dist/util/reviewDiff.js +29 -0
  162. package/dist/util/reviewDiff.js.map +1 -0
  163. package/dist/util/reviewJob.d.ts +57 -0
  164. package/dist/util/reviewJob.js +207 -0
  165. package/dist/util/reviewJob.js.map +1 -0
  166. package/dist/util/workflowPlan.d.ts +24 -0
  167. package/dist/util/workflowPlan.js +49 -0
  168. package/dist/util/workflowPlan.js.map +1 -0
  169. package/package.json +8 -1
  170. package/plugin/composer-mastermind/commands/evolve.md +4 -0
  171. package/plugin/composer-mastermind/hooks/boundary_guard.sh +43 -2
  172. package/plugin/composer-mastermind/hooks/codex_warm_review.sh +161 -9
  173. package/plugin/composer-mastermind/hooks/learn.sh +172 -32
  174. package/plugin/composer-mastermind/hooks/precommit_codex_review.sh +438 -64
  175. package/plugin/composer-mastermind/skills/composer-mastermind/SKILL.md +190 -4
  176. package/scripts/composer-oracle-router-safe.sh +47 -0
  177. package/scripts/composer-statusline-segment.mjs +40 -0
  178. package/scripts/oracle-codex-handoff-safe.sh +49 -0
  179. package/scripts/oracle-plan-mcp.sh +66 -0
  180. 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,2 @@
1
+ import type { ServerToolContext } from "./context.js";
2
+ export declare function registerHandoffTools(ctx: ServerToolContext): void;
@@ -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,2 @@
1
+ import type { ServerToolContext } from "./context.js";
2
+ export declare function registerOracleTools(ctx: ServerToolContext): void;
@@ -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,2 @@
1
+ import type { ServerToolContext } from "./context.js";
2
+ export declare function registerResearchTools(ctx: ServerToolContext): void;
@@ -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"}
@@ -0,0 +1,2 @@
1
+ import type { ServerToolContext } from "./context.js";
2
+ export declare function registerReviewTools(ctx: ServerToolContext): void;