drizzy-agent 0.6.3 → 0.7.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 +3 -3
- package/dist/agents/builtin-agents/{atlas-agent.d.ts → orchestrator-agent.d.ts} +1 -1
- package/dist/agents/coder-junior/gpt-5-3-codex.d.ts +1 -1
- package/dist/agents/coder-junior/gpt-5-4.d.ts +1 -1
- package/dist/agents/coder-junior/gpt.d.ts +1 -1
- package/dist/agents/env-context.d.ts +1 -1
- package/dist/agents/{atlas → orchestrator}/agent.d.ts +9 -9
- package/dist/agents/{atlas → orchestrator}/default.d.ts +3 -3
- package/dist/agents/{atlas → orchestrator}/gemini.d.ts +3 -3
- package/dist/agents/{atlas → orchestrator}/gpt.d.ts +3 -3
- package/dist/agents/orchestrator/index.d.ts +2 -0
- package/dist/agents/{atlas → orchestrator}/prompt-section-builder.d.ts +1 -1
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/index.js +26 -26
- package/dist/config/schema/agent-names.d.ts +3 -3
- package/dist/config/schema/agent-overrides.d.ts +1 -1
- package/dist/config/schema/drizzy-agent-config.d.ts +2 -2
- package/dist/config/schema/hooks.d.ts +1 -1
- package/dist/create-hooks.d.ts +1 -1
- package/dist/drizzy-agent.schema.json +2 -2
- package/dist/features/boulder-state/types.d.ts +1 -1
- package/dist/features/builtin-commands/templates/refactor.d.ts +1 -1
- package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
- package/dist/features/hook-message-injector/injector.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/{atlas → orchestrator}/event-handler.d.ts +3 -3
- package/dist/hooks/orchestrator/hook-name.d.ts +1 -0
- package/dist/hooks/orchestrator/idle-event.d.ts +8 -0
- package/dist/hooks/orchestrator/index.d.ts +3 -0
- package/dist/hooks/{atlas/atlas-hook.d.ts → orchestrator/orchestrator-hook.d.ts} +2 -2
- package/dist/hooks/{atlas → orchestrator}/types.d.ts +1 -1
- package/dist/hooks/planner-md-only/agent-resolution.d.ts +1 -1
- package/dist/index.js +196 -196
- package/dist/plugin/hooks/create-continuation-hooks.d.ts +2 -2
- package/dist/shared/agent-display-names.d.ts +1 -1
- package/dist/shared/agent-model-defaults.d.ts +2 -2
- package/dist/tools/call-drizzy-agent/background-agent-executor.d.ts +5 -0
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/background-executor.d.ts +2 -2
- package/dist/tools/call-drizzy-agent/constants.d.ts +2 -0
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/index.d.ts +1 -1
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/session-creator.d.ts +2 -2
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/subagent-session-creator.d.ts +2 -2
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/sync-executor.d.ts +2 -2
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/tools.d.ts +1 -1
- package/dist/tools/{call-omo-agent → call-drizzy-agent}/types.d.ts +3 -3
- package/dist/tools/delegate-task/constants.d.ts +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/package.json +12 -12
- package/dist/agents/atlas/index.d.ts +0 -2
- package/dist/hooks/atlas/hook-name.d.ts +0 -1
- package/dist/hooks/atlas/idle-event.d.ts +0 -8
- package/dist/hooks/atlas/index.d.ts +0 -3
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/dist/tools/call-omo-agent/constants.d.ts +0 -2
- /package/dist/hooks/{atlas → orchestrator}/boulder-continuation-injector.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/coder-path.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/is-abort-error.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/recent-model-resolver.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/session-last-agent.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/subagent-session-id.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/system-reminder-templates.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/tool-execute-after.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/tool-execute-before.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/verification-reminders.d.ts +0 -0
- /package/dist/hooks/{atlas → orchestrator}/write-edit-tool-policy.d.ts +0 -0
- /package/dist/tools/{call-omo-agent → call-drizzy-agent}/completion-poller.d.ts +0 -0
- /package/dist/tools/{call-omo-agent → call-drizzy-agent}/message-dir.d.ts +0 -0
- /package/dist/tools/{call-omo-agent → call-drizzy-agent}/message-processor.d.ts +0 -0
- /package/dist/tools/{call-omo-agent → call-drizzy-agent}/message-storage-directory.d.ts +0 -0
- /package/dist/tools/{call-omo-agent → call-drizzy-agent}/tool-context-with-metadata.d.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -16072,8 +16072,8 @@ var AGENT_NAME_MAP = {
|
|
|
16072
16072
|
planner: "planner",
|
|
16073
16073
|
"Prometheus (Planner)": "planner",
|
|
16074
16074
|
prometheus: "planner",
|
|
16075
|
-
|
|
16076
|
-
|
|
16075
|
+
Orchestrator: "orchestrator",
|
|
16076
|
+
orchestrator: "orchestrator",
|
|
16077
16077
|
"Plan Consultant": "plan-consultant",
|
|
16078
16078
|
metis: "plan-consultant",
|
|
16079
16079
|
"plan-consultant": "plan-consultant",
|
|
@@ -16099,7 +16099,7 @@ var BUILTIN_AGENT_NAMES = new Set([
|
|
|
16099
16099
|
"plan-reviewer",
|
|
16100
16100
|
"planner",
|
|
16101
16101
|
"prometheus",
|
|
16102
|
-
"
|
|
16102
|
+
"orchestrator",
|
|
16103
16103
|
"build"
|
|
16104
16104
|
]);
|
|
16105
16105
|
function migrateAgentNames(agents) {
|
|
@@ -16117,7 +16117,7 @@ function migrateAgentNames(agents) {
|
|
|
16117
16117
|
// src/shared/migration/hook-names.ts
|
|
16118
16118
|
var HOOK_NAME_MAP = {
|
|
16119
16119
|
"anthropic-auto-compact": "anthropic-context-window-limit-recovery",
|
|
16120
|
-
"coder-orchestrator": "
|
|
16120
|
+
"coder-orchestrator": "orchestrator",
|
|
16121
16121
|
"coder-gpt-hephaestus-reminder": "no-coder-gpt",
|
|
16122
16122
|
"no-coder-gpt": "no-coder-gpt",
|
|
16123
16123
|
"coder-junior-notepad": "coder-junior-notepad",
|
|
@@ -16621,7 +16621,7 @@ var AGENT_DISPLAY_NAMES = {
|
|
|
16621
16621
|
coder: "Coder",
|
|
16622
16622
|
gptcoder: "GPTCoder",
|
|
16623
16623
|
planner: "Planner",
|
|
16624
|
-
|
|
16624
|
+
orchestrator: "Orchestrator",
|
|
16625
16625
|
"coder-junior": "Coder Junior",
|
|
16626
16626
|
planConsultant: "Plan Consultant",
|
|
16627
16627
|
planReviewer: "Plan Reviewer",
|
|
@@ -16758,7 +16758,7 @@ var AGENT_MODEL_DEFAULTS = {
|
|
|
16758
16758
|
],
|
|
16759
16759
|
includeInInstall: true
|
|
16760
16760
|
},
|
|
16761
|
-
|
|
16761
|
+
orchestrator: {
|
|
16762
16762
|
chain: [{ providers: ["kimi-for-coding"], model: "k2p5" }, { providers: CLAUDE_PROVIDERS, model: "claude-sonnet-4-6" }, { providers: CLAUDE_PROVIDERS, model: "claude-sonnet-4-5" }, { providers: OPENAI_PROVIDERS, model: "gpt-5.4", variant: "medium" }, { providers: GEMINI_PROVIDERS, model: "gemini-3.1-pro" }],
|
|
16763
16763
|
includeInInstall: true
|
|
16764
16764
|
},
|
|
@@ -16869,8 +16869,8 @@ var LEGACY_AGENT_REQUIREMENT_OVERRIDES = {
|
|
|
16869
16869
|
gptcoder: {
|
|
16870
16870
|
requiresProvider: AGENT_MODEL_DEFAULTS.gptcoder.requiresAnyProvider
|
|
16871
16871
|
},
|
|
16872
|
-
|
|
16873
|
-
fallbackChain: pickFallbackEntries(AGENT_MODEL_DEFAULTS.
|
|
16872
|
+
orchestrator: {
|
|
16873
|
+
fallbackChain: pickFallbackEntries(AGENT_MODEL_DEFAULTS.orchestrator.chain, ["claude-sonnet-4-6", "gpt-5.4"])
|
|
16874
16874
|
}
|
|
16875
16875
|
};
|
|
16876
16876
|
var LEGACY_CATEGORY_REQUIREMENT_OVERRIDES = {
|
|
@@ -17009,7 +17009,7 @@ var EXPLORATION_AGENT_DENYLIST = {
|
|
|
17009
17009
|
write: false,
|
|
17010
17010
|
edit: false,
|
|
17011
17011
|
task: false,
|
|
17012
|
-
|
|
17012
|
+
call_drizzy_agent: false
|
|
17013
17013
|
};
|
|
17014
17014
|
var AGENT_RESTRICTIONS = {
|
|
17015
17015
|
explore: EXPLORATION_AGENT_DENYLIST,
|
|
@@ -17018,7 +17018,7 @@ var AGENT_RESTRICTIONS = {
|
|
|
17018
17018
|
write: false,
|
|
17019
17019
|
edit: false,
|
|
17020
17020
|
task: false,
|
|
17021
|
-
|
|
17021
|
+
call_drizzy_agent: false
|
|
17022
17022
|
},
|
|
17023
17023
|
planConsultant: {
|
|
17024
17024
|
write: false,
|
|
@@ -17813,7 +17813,7 @@ async function isCallerOrchestrator(sessionID, client) {
|
|
|
17813
17813
|
if (isSqliteBackend() && client) {
|
|
17814
17814
|
try {
|
|
17815
17815
|
const nearest2 = await findNearestMessageWithFieldsFromSDK(client, sessionID);
|
|
17816
|
-
return getAgentConfigKey(nearest2?.agent ?? "") === "
|
|
17816
|
+
return getAgentConfigKey(nearest2?.agent ?? "") === "orchestrator";
|
|
17817
17817
|
} catch (error) {
|
|
17818
17818
|
log("[session-utils] SDK orchestrator check failed", { sessionID, error: String(error) });
|
|
17819
17819
|
return false;
|
|
@@ -17823,7 +17823,7 @@ async function isCallerOrchestrator(sessionID, client) {
|
|
|
17823
17823
|
if (!messageDir)
|
|
17824
17824
|
return false;
|
|
17825
17825
|
const nearest = findNearestMessageWithFields(messageDir);
|
|
17826
|
-
return getAgentConfigKey(nearest?.agent ?? "") === "
|
|
17826
|
+
return getAgentConfigKey(nearest?.agent ?? "") === "orchestrator";
|
|
17827
17827
|
}
|
|
17828
17828
|
// src/shared/tmux/constants.ts
|
|
17829
17829
|
var POLL_INTERVAL_BACKGROUND_MS = 2000;
|
|
@@ -40842,7 +40842,7 @@ var TARGET_TOOLS = new Set([
|
|
|
40842
40842
|
]);
|
|
40843
40843
|
var AGENT_TOOLS = new Set([
|
|
40844
40844
|
"task",
|
|
40845
|
-
"
|
|
40845
|
+
"call_drizzy_agent",
|
|
40846
40846
|
"task"
|
|
40847
40847
|
]);
|
|
40848
40848
|
var REMINDER_MESSAGE = `
|
|
@@ -40904,7 +40904,7 @@ function clearAgentUsageState(sessionID) {
|
|
|
40904
40904
|
var ORCHESTRATOR_AGENTS = new Set([
|
|
40905
40905
|
"coder",
|
|
40906
40906
|
"coder-junior",
|
|
40907
|
-
"
|
|
40907
|
+
"orchestrator",
|
|
40908
40908
|
"gptcoder",
|
|
40909
40909
|
"planner"
|
|
40910
40910
|
]);
|
|
@@ -42536,7 +42536,7 @@ function buildReminderMessage(availableSkills) {
|
|
|
42536
42536
|
var TARGET_AGENTS = new Set([
|
|
42537
42537
|
"coder",
|
|
42538
42538
|
"coder-junior",
|
|
42539
|
-
"
|
|
42539
|
+
"orchestrator"
|
|
42540
42540
|
]);
|
|
42541
42541
|
var DELEGATABLE_WORK_TOOLS = new Set([
|
|
42542
42542
|
"edit",
|
|
@@ -42548,7 +42548,7 @@ var DELEGATABLE_WORK_TOOLS = new Set([
|
|
|
42548
42548
|
]);
|
|
42549
42549
|
var DELEGATION_TOOLS = new Set([
|
|
42550
42550
|
"task",
|
|
42551
|
-
"
|
|
42551
|
+
"call_drizzy_agent"
|
|
42552
42552
|
]);
|
|
42553
42553
|
function createCategorySkillReminderHook(_ctx, availableSkills = []) {
|
|
42554
42554
|
const sessionStates = new Map;
|
|
@@ -42568,7 +42568,7 @@ function createCategorySkillReminderHook(_ctx, availableSkills = []) {
|
|
|
42568
42568
|
if (!agent)
|
|
42569
42569
|
return false;
|
|
42570
42570
|
const agentKey = getAgentConfigKey(agent);
|
|
42571
|
-
return TARGET_AGENTS.has(agentKey) || agentKey.includes("coder") || agentKey.includes("
|
|
42571
|
+
return TARGET_AGENTS.has(agentKey) || agentKey.includes("coder") || agentKey.includes("orchestrator");
|
|
42572
42572
|
}
|
|
42573
42573
|
const toolExecuteAfter = async (input, output) => {
|
|
42574
42574
|
const { tool, sessionID } = input;
|
|
@@ -44334,11 +44334,11 @@ TodoWrite([
|
|
|
44334
44334
|
|
|
44335
44335
|
## 1.1: Launch Parallel Explore Agents (BACKGROUND)
|
|
44336
44336
|
|
|
44337
|
-
Fire ALL of these simultaneously using \`
|
|
44337
|
+
Fire ALL of these simultaneously using \`call_drizzy_agent\`:
|
|
44338
44338
|
|
|
44339
44339
|
\`\`\`
|
|
44340
44340
|
// Agent 1: Find the refactoring target
|
|
44341
|
-
|
|
44341
|
+
call_drizzy_agent(
|
|
44342
44342
|
subagent_type="explore",
|
|
44343
44343
|
run_in_background=true,
|
|
44344
44344
|
prompt="Find all occurrences and definitions of [TARGET].
|
|
@@ -44346,7 +44346,7 @@ call_omo_agent(
|
|
|
44346
44346
|
)
|
|
44347
44347
|
|
|
44348
44348
|
// Agent 2: Find related code
|
|
44349
|
-
|
|
44349
|
+
call_drizzy_agent(
|
|
44350
44350
|
subagent_type="explore",
|
|
44351
44351
|
run_in_background=true,
|
|
44352
44352
|
prompt="Find all code that imports, uses, or depends on [TARGET].
|
|
@@ -44354,7 +44354,7 @@ call_omo_agent(
|
|
|
44354
44354
|
)
|
|
44355
44355
|
|
|
44356
44356
|
// Agent 3: Find similar patterns
|
|
44357
|
-
|
|
44357
|
+
call_drizzy_agent(
|
|
44358
44358
|
subagent_type="explore",
|
|
44359
44359
|
run_in_background=true,
|
|
44360
44360
|
prompt="Find similar code patterns to [TARGET] in the codebase.
|
|
@@ -44362,7 +44362,7 @@ call_omo_agent(
|
|
|
44362
44362
|
)
|
|
44363
44363
|
|
|
44364
44364
|
// Agent 4: Find tests
|
|
44365
|
-
|
|
44365
|
+
call_drizzy_agent(
|
|
44366
44366
|
subagent_type="explore",
|
|
44367
44367
|
run_in_background=true,
|
|
44368
44368
|
prompt="Find all test files related to [TARGET].
|
|
@@ -44370,7 +44370,7 @@ call_omo_agent(
|
|
|
44370
44370
|
)
|
|
44371
44371
|
|
|
44372
44372
|
// Agent 5: Architecture context
|
|
44373
|
-
|
|
44373
|
+
call_drizzy_agent(
|
|
44374
44374
|
subagent_type="explore",
|
|
44375
44375
|
run_in_background=true,
|
|
44376
44376
|
prompt="Find architectural patterns and module organization around [TARGET].
|
|
@@ -44511,7 +44511,7 @@ ls -la *_test.go
|
|
|
44511
44511
|
|
|
44512
44512
|
\`\`\`
|
|
44513
44513
|
// Find all tests related to target
|
|
44514
|
-
|
|
44514
|
+
call_drizzy_agent(
|
|
44515
44515
|
subagent_type="explore",
|
|
44516
44516
|
run_in_background=false, // Need this synchronously
|
|
44517
44517
|
prompt="Analyze test coverage for [TARGET]:
|
|
@@ -44899,7 +44899,7 @@ var START_WORK_TEMPLATE = `You are starting a Coder work session.
|
|
|
44899
44899
|
}
|
|
44900
44900
|
\`\`\`
|
|
44901
44901
|
|
|
44902
|
-
6. **Read the plan file** and start executing tasks according to
|
|
44902
|
+
6. **Read the plan file** and start executing tasks according to orchestrator workflow
|
|
44903
44903
|
|
|
44904
44904
|
## OUTPUT FORMAT
|
|
44905
44905
|
|
|
@@ -44946,7 +44946,7 @@ Reading plan and beginning execution...
|
|
|
44946
44946
|
- Always update boulder.json BEFORE starting work
|
|
44947
44947
|
- Always set worktree_path in boulder.json before executing any tasks
|
|
44948
44948
|
- Read the FULL plan file before delegating any tasks
|
|
44949
|
-
- Follow
|
|
44949
|
+
- Follow orchestrator delegation protocols (7-section format)`;
|
|
44950
44950
|
|
|
44951
44951
|
// src/features/builtin-commands/templates/handoff.ts
|
|
44952
44952
|
var HANDOFF_TEMPLATE = `# Handoff Command
|
|
@@ -45177,7 +45177,7 @@ ${REFACTOR_TEMPLATE}
|
|
|
45177
45177
|
},
|
|
45178
45178
|
"start-work": {
|
|
45179
45179
|
description: "(builtin) Start Coder work session from Planner plan",
|
|
45180
|
-
agent: "
|
|
45180
|
+
agent: "orchestrator",
|
|
45181
45181
|
template: `<command-instruction>
|
|
45182
45182
|
${START_WORK_TEMPLATE}
|
|
45183
45183
|
</command-instruction>
|
|
@@ -47968,7 +47968,7 @@ var BuiltinAgentNameSchema = exports_external.enum([
|
|
|
47968
47968
|
"multimodal-looker",
|
|
47969
47969
|
"plan-consultant",
|
|
47970
47970
|
"plan-reviewer",
|
|
47971
|
-
"
|
|
47971
|
+
"orchestrator",
|
|
47972
47972
|
"coder-junior",
|
|
47973
47973
|
"researcher",
|
|
47974
47974
|
"researcher-junior"
|
|
@@ -47994,7 +47994,7 @@ var OverridableAgentNameSchema = exports_external.enum([
|
|
|
47994
47994
|
"librarian",
|
|
47995
47995
|
"explore",
|
|
47996
47996
|
"multimodal-looker",
|
|
47997
|
-
"
|
|
47997
|
+
"orchestrator"
|
|
47998
47998
|
]);
|
|
47999
47999
|
// src/config/schema/fallback-models.ts
|
|
48000
48000
|
var FallbackModelsSchema = exports_external.union([exports_external.string(), exports_external.array(exports_external.string())]);
|
|
@@ -48064,7 +48064,7 @@ var AgentOverridesSchema = exports_external.object({
|
|
|
48064
48064
|
librarian: AgentOverrideConfigSchema.optional(),
|
|
48065
48065
|
explore: AgentOverrideConfigSchema.optional(),
|
|
48066
48066
|
"multimodal-looker": AgentOverrideConfigSchema.optional(),
|
|
48067
|
-
|
|
48067
|
+
orchestrator: AgentOverrideConfigSchema.optional(),
|
|
48068
48068
|
researcher: AgentOverrideConfigSchema.optional(),
|
|
48069
48069
|
"researcher-junior": AgentOverrideConfigSchema.optional()
|
|
48070
48070
|
});
|
|
@@ -48256,7 +48256,7 @@ var HookNameSchema = exports_external.enum([
|
|
|
48256
48256
|
"no-coder-gpt",
|
|
48257
48257
|
"no-gptcoder-non-gpt",
|
|
48258
48258
|
"start-work",
|
|
48259
|
-
"
|
|
48259
|
+
"orchestrator",
|
|
48260
48260
|
"unstable-agent-babysitter",
|
|
48261
48261
|
"task-resume-info",
|
|
48262
48262
|
"stop-continuation-guard",
|
|
@@ -49272,7 +49272,7 @@ function isAllowedFile(filePath, workspaceRoot) {
|
|
|
49272
49272
|
}
|
|
49273
49273
|
|
|
49274
49274
|
// src/hooks/planner-md-only/hook.ts
|
|
49275
|
-
var TASK_TOOLS = ["task", "
|
|
49275
|
+
var TASK_TOOLS = ["task", "call_drizzy_agent"];
|
|
49276
49276
|
function createPlannerMdOnlyHook(ctx) {
|
|
49277
49277
|
return {
|
|
49278
49278
|
"tool.execute.before": async (input, output) => {
|
|
@@ -49477,7 +49477,7 @@ function createCoderJuniorNotepadHook(ctx) {
|
|
|
49477
49477
|
};
|
|
49478
49478
|
}
|
|
49479
49479
|
// src/hooks/task-resume-info/hook.ts
|
|
49480
|
-
var TARGET_TOOLS2 = ["task", "Task", "task_tool", "
|
|
49480
|
+
var TARGET_TOOLS2 = ["task", "Task", "task_tool", "call_drizzy_agent"];
|
|
49481
49481
|
var SESSION_ID_PATTERNS = [
|
|
49482
49482
|
/Session ID: (ses_[a-zA-Z0-9_-]+)/,
|
|
49483
49483
|
/session_id: (ses_[a-zA-Z0-9_-]+)/,
|
|
@@ -49598,7 +49598,7 @@ function createStartWorkHook(ctx) {
|
|
|
49598
49598
|
if (!promptText.includes("<session-context>"))
|
|
49599
49599
|
return;
|
|
49600
49600
|
log(`[${HOOK_NAME8}] Processing start-work command`, { sessionID: input.sessionID });
|
|
49601
|
-
updateSessionAgent(input.sessionID, "
|
|
49601
|
+
updateSessionAgent(input.sessionID, "orchestrator");
|
|
49602
49602
|
const existingState = readBoulderState(ctx.directory);
|
|
49603
49603
|
const sessionId = input.sessionID;
|
|
49604
49604
|
const timestamp2 = new Date().toISOString();
|
|
@@ -49620,7 +49620,7 @@ All ${progress.total} tasks are done. Create a new plan with: /plan "your task"`
|
|
|
49620
49620
|
} else {
|
|
49621
49621
|
if (existingState)
|
|
49622
49622
|
clearBoulderState(ctx.directory);
|
|
49623
|
-
const newState = createBoulderState(matchedPlan, sessionId, "
|
|
49623
|
+
const newState = createBoulderState(matchedPlan, sessionId, "orchestrator", worktreePath);
|
|
49624
49624
|
writeBoulderState(ctx.directory, newState);
|
|
49625
49625
|
contextInfo = `
|
|
49626
49626
|
## Auto-Selected Plan
|
|
@@ -49713,7 +49713,7 @@ All ${plans.length} plan(s) are complete. Create a new plan with: /plan "your ta
|
|
|
49713
49713
|
} else if (incompletePlans.length === 1) {
|
|
49714
49714
|
const planPath = incompletePlans[0];
|
|
49715
49715
|
const progress = getPlanProgress(planPath);
|
|
49716
|
-
const newState = createBoulderState(planPath, sessionId, "
|
|
49716
|
+
const newState = createBoulderState(planPath, sessionId, "orchestrator", worktreePath);
|
|
49717
49717
|
writeBoulderState(ctx.directory, newState);
|
|
49718
49718
|
contextInfo += `
|
|
49719
49719
|
|
|
@@ -49765,12 +49765,12 @@ ${contextInfo}`;
|
|
|
49765
49765
|
}
|
|
49766
49766
|
};
|
|
49767
49767
|
}
|
|
49768
|
-
// src/hooks/
|
|
49769
|
-
var HOOK_NAME9 = "
|
|
49770
|
-
// src/hooks/
|
|
49768
|
+
// src/hooks/orchestrator/hook-name.ts
|
|
49769
|
+
var HOOK_NAME9 = "orchestrator";
|
|
49770
|
+
// src/hooks/orchestrator/event-handler.ts
|
|
49771
49771
|
init_logger();
|
|
49772
49772
|
|
|
49773
|
-
// src/hooks/
|
|
49773
|
+
// src/hooks/orchestrator/is-abort-error.ts
|
|
49774
49774
|
function isAbortError(error48) {
|
|
49775
49775
|
if (!error48)
|
|
49776
49776
|
return false;
|
|
@@ -49792,13 +49792,13 @@ function isAbortError(error48) {
|
|
|
49792
49792
|
return false;
|
|
49793
49793
|
}
|
|
49794
49794
|
|
|
49795
|
-
// src/hooks/
|
|
49795
|
+
// src/hooks/orchestrator/idle-event.ts
|
|
49796
49796
|
init_logger();
|
|
49797
49797
|
|
|
49798
|
-
// src/hooks/
|
|
49798
|
+
// src/hooks/orchestrator/boulder-continuation-injector.ts
|
|
49799
49799
|
init_logger();
|
|
49800
49800
|
|
|
49801
|
-
// src/hooks/
|
|
49801
|
+
// src/hooks/orchestrator/system-reminder-templates.ts
|
|
49802
49802
|
var DIRECT_WORK_REMINDER = `
|
|
49803
49803
|
|
|
49804
49804
|
---
|
|
@@ -49907,7 +49907,7 @@ ${createSystemDirective(SystemDirectiveTypes.DELEGATION_REQUIRED)}
|
|
|
49907
49907
|
|
|
49908
49908
|
**STOP. YOU ARE VIOLATING ORCHESTRATOR PROTOCOL.**
|
|
49909
49909
|
|
|
49910
|
-
You (
|
|
49910
|
+
You (Orchestrator) are attempting to directly modify a file outside \`.drizzy/\`.
|
|
49911
49911
|
|
|
49912
49912
|
**Path attempted:** $FILE_PATH
|
|
49913
49913
|
|
|
@@ -49973,7 +49973,7 @@ If you were NOT given **exactly ONE atomic task**, you MUST:
|
|
|
49973
49973
|
**REFUSE multi-task requests. DEMAND single-task clarity.**
|
|
49974
49974
|
`;
|
|
49975
49975
|
|
|
49976
|
-
// src/hooks/
|
|
49976
|
+
// src/hooks/orchestrator/recent-model-resolver.ts
|
|
49977
49977
|
async function resolveRecentPromptContextForSession(ctx, sessionID) {
|
|
49978
49978
|
try {
|
|
49979
49979
|
const messagesResp = await ctx.client.session.messages({ path: { id: sessionID } });
|
|
@@ -50005,7 +50005,7 @@ async function resolveRecentPromptContextForSession(ctx, sessionID) {
|
|
|
50005
50005
|
return { model: { providerID: model.providerID, modelID: model.modelID }, tools };
|
|
50006
50006
|
}
|
|
50007
50007
|
|
|
50008
|
-
// src/hooks/
|
|
50008
|
+
// src/hooks/orchestrator/boulder-continuation-injector.ts
|
|
50009
50009
|
async function injectBoulderContinuation(input) {
|
|
50010
50010
|
const {
|
|
50011
50011
|
ctx,
|
|
@@ -50036,7 +50036,7 @@ async function injectBoulderContinuation(input) {
|
|
|
50036
50036
|
await ctx.client.session.promptAsync({
|
|
50037
50037
|
path: { id: sessionID },
|
|
50038
50038
|
body: {
|
|
50039
|
-
agent: agent ?? "
|
|
50039
|
+
agent: agent ?? "orchestrator",
|
|
50040
50040
|
...promptContext.model !== undefined ? { model: promptContext.model } : {},
|
|
50041
50041
|
...inheritedTools ? { tools: inheritedTools } : {},
|
|
50042
50042
|
parts: [createInternalAgentTextPart(prompt)]
|
|
@@ -50056,7 +50056,7 @@ async function injectBoulderContinuation(input) {
|
|
|
50056
50056
|
}
|
|
50057
50057
|
}
|
|
50058
50058
|
|
|
50059
|
-
// src/hooks/
|
|
50059
|
+
// src/hooks/orchestrator/idle-event.ts
|
|
50060
50060
|
var CONTINUATION_COOLDOWN_MS2 = 5000;
|
|
50061
50061
|
var FAILURE_BACKOFF_MS = 5 * 60 * 1000;
|
|
50062
50062
|
var RETRY_DELAY_MS = CONTINUATION_COOLDOWN_MS2 + 1000;
|
|
@@ -50144,7 +50144,7 @@ function scheduleRetry(input) {
|
|
|
50144
50144
|
});
|
|
50145
50145
|
}, RETRY_DELAY_MS);
|
|
50146
50146
|
}
|
|
50147
|
-
async function
|
|
50147
|
+
async function handleOrchestratorSessionIdle(input) {
|
|
50148
50148
|
const { ctx, options, getState, sessionID } = input;
|
|
50149
50149
|
log(`[${HOOK_NAME9}] session.idle`, { sessionID });
|
|
50150
50150
|
const activeBoulderSession = resolveActiveBoulderSession({
|
|
@@ -50219,8 +50219,8 @@ async function handleAtlasSessionIdle(input) {
|
|
|
50219
50219
|
});
|
|
50220
50220
|
}
|
|
50221
50221
|
|
|
50222
|
-
// src/hooks/
|
|
50223
|
-
function
|
|
50222
|
+
// src/hooks/orchestrator/event-handler.ts
|
|
50223
|
+
function createOrchestratorEventHandler(input) {
|
|
50224
50224
|
const { ctx, options, sessions, getState } = input;
|
|
50225
50225
|
return async ({ event }) => {
|
|
50226
50226
|
const props = event.properties;
|
|
@@ -50238,7 +50238,7 @@ function createAtlasEventHandler(input) {
|
|
|
50238
50238
|
const sessionID = props?.sessionID;
|
|
50239
50239
|
if (!sessionID)
|
|
50240
50240
|
return;
|
|
50241
|
-
await
|
|
50241
|
+
await handleOrchestratorSessionIdle({ ctx, options, getState, sessionID });
|
|
50242
50242
|
return;
|
|
50243
50243
|
}
|
|
50244
50244
|
if (event.type === "message.updated") {
|
|
@@ -50300,21 +50300,21 @@ function createAtlasEventHandler(input) {
|
|
|
50300
50300
|
};
|
|
50301
50301
|
}
|
|
50302
50302
|
|
|
50303
|
-
// src/hooks/
|
|
50303
|
+
// src/hooks/orchestrator/tool-execute-after.ts
|
|
50304
50304
|
init_logger();
|
|
50305
50305
|
|
|
50306
|
-
// src/hooks/
|
|
50306
|
+
// src/hooks/orchestrator/coder-path.ts
|
|
50307
50307
|
function isCoderPath(filePath) {
|
|
50308
50308
|
return /\.drizzy[/\\]/.test(filePath);
|
|
50309
50309
|
}
|
|
50310
50310
|
|
|
50311
|
-
// src/hooks/
|
|
50311
|
+
// src/hooks/orchestrator/subagent-session-id.ts
|
|
50312
50312
|
function extractSessionIdFromOutput(output) {
|
|
50313
50313
|
const match = output.match(/Session ID:\s*(ses_[a-zA-Z0-9]+)/);
|
|
50314
50314
|
return match?.[1] ?? "<session_id>";
|
|
50315
50315
|
}
|
|
50316
50316
|
|
|
50317
|
-
// src/hooks/
|
|
50317
|
+
// src/hooks/orchestrator/verification-reminders.ts
|
|
50318
50318
|
function buildCompletionGate(planName, sessionId) {
|
|
50319
50319
|
return `
|
|
50320
50320
|
**COMPLETION GATE \u2014 DO NOT PROCEED UNTIL THIS IS DONE**
|
|
@@ -50445,13 +50445,13 @@ If QA tasks exist in your todo list:
|
|
|
50445
50445
|
**NO TODO = NO TRACKING = INCOMPLETE WORK. Use todowrite aggressively.**`;
|
|
50446
50446
|
}
|
|
50447
50447
|
|
|
50448
|
-
// src/hooks/
|
|
50448
|
+
// src/hooks/orchestrator/write-edit-tool-policy.ts
|
|
50449
50449
|
var WRITE_EDIT_TOOLS = ["Write", "Edit", "write", "edit"];
|
|
50450
50450
|
function isWriteOrEditToolName(toolName) {
|
|
50451
50451
|
return WRITE_EDIT_TOOLS.includes(toolName);
|
|
50452
50452
|
}
|
|
50453
50453
|
|
|
50454
|
-
// src/hooks/
|
|
50454
|
+
// src/hooks/orchestrator/tool-execute-after.ts
|
|
50455
50455
|
function createToolExecuteAfterHandler2(input) {
|
|
50456
50456
|
const { ctx, pendingFilePaths, autoCommit } = input;
|
|
50457
50457
|
return async (toolInput, toolOutput) => {
|
|
@@ -50539,7 +50539,7 @@ ${buildStandaloneVerificationReminder(subagentSessionId)}
|
|
|
50539
50539
|
};
|
|
50540
50540
|
}
|
|
50541
50541
|
|
|
50542
|
-
// src/hooks/
|
|
50542
|
+
// src/hooks/orchestrator/tool-execute-before.ts
|
|
50543
50543
|
init_logger();
|
|
50544
50544
|
function createToolExecuteBeforeHandler2(input) {
|
|
50545
50545
|
const { ctx, pendingFilePaths } = input;
|
|
@@ -50576,8 +50576,8 @@ function createToolExecuteBeforeHandler2(input) {
|
|
|
50576
50576
|
};
|
|
50577
50577
|
}
|
|
50578
50578
|
|
|
50579
|
-
// src/hooks/
|
|
50580
|
-
function
|
|
50579
|
+
// src/hooks/orchestrator/orchestrator-hook.ts
|
|
50580
|
+
function createOrchestratorHook(ctx, options) {
|
|
50581
50581
|
const sessions = new Map;
|
|
50582
50582
|
const pendingFilePaths = new Map;
|
|
50583
50583
|
const autoCommit = options?.autoCommit ?? true;
|
|
@@ -50590,7 +50590,7 @@ function createAtlasHook(ctx, options) {
|
|
|
50590
50590
|
return state3;
|
|
50591
50591
|
}
|
|
50592
50592
|
return {
|
|
50593
|
-
handler:
|
|
50593
|
+
handler: createOrchestratorEventHandler({ ctx, options, sessions, getState }),
|
|
50594
50594
|
"tool.execute.before": createToolExecuteBeforeHandler2({ ctx, pendingFilePaths }),
|
|
50595
50595
|
"tool.execute.after": createToolExecuteAfterHandler2({ ctx, pendingFilePaths, autoCommit })
|
|
50596
50596
|
};
|
|
@@ -52103,7 +52103,7 @@ var AGENT_NAMES = [
|
|
|
52103
52103
|
"librarian",
|
|
52104
52104
|
"explore",
|
|
52105
52105
|
"planner",
|
|
52106
|
-
"
|
|
52106
|
+
"orchestrator",
|
|
52107
52107
|
"plan-consultant",
|
|
52108
52108
|
"plan-reviewer",
|
|
52109
52109
|
"gptcoder",
|
|
@@ -71449,7 +71449,7 @@ Status: ${task.status}`;
|
|
|
71449
71449
|
}
|
|
71450
71450
|
});
|
|
71451
71451
|
}
|
|
71452
|
-
// src/tools/call-
|
|
71452
|
+
// src/tools/call-drizzy-agent/constants.ts
|
|
71453
71453
|
var ALLOWED_AGENTS = [
|
|
71454
71454
|
"explore",
|
|
71455
71455
|
"librarian",
|
|
@@ -71459,7 +71459,7 @@ var ALLOWED_AGENTS = [
|
|
|
71459
71459
|
"plan-reviewer",
|
|
71460
71460
|
"multimodal-looker"
|
|
71461
71461
|
];
|
|
71462
|
-
var
|
|
71462
|
+
var CALL_DRIZZY_AGENT_DESCRIPTION = `Spawn explore/librarian agent. run_in_background REQUIRED (true=async with task_id, false=sync).
|
|
71463
71463
|
|
|
71464
71464
|
Available: {agents}
|
|
71465
71465
|
|
|
@@ -71523,14 +71523,14 @@ function buildFallbackChainFromModels(fallbackModels, contextProviderID, default
|
|
|
71523
71523
|
return;
|
|
71524
71524
|
return parsed;
|
|
71525
71525
|
}
|
|
71526
|
-
// src/tools/call-
|
|
71526
|
+
// src/tools/call-drizzy-agent/background-executor.ts
|
|
71527
71527
|
async function executeBackground(args, toolContext, manager, client2, fallbackChain) {
|
|
71528
71528
|
try {
|
|
71529
71529
|
const messageDir = getMessageDir(toolContext.sessionID);
|
|
71530
71530
|
const { prevMessage, firstMessageAgent } = await resolveMessageContext(toolContext.sessionID, client2, messageDir);
|
|
71531
71531
|
const sessionAgent = getSessionAgent(toolContext.sessionID);
|
|
71532
71532
|
const parentAgent = toolContext.agent ?? sessionAgent ?? firstMessageAgent ?? prevMessage?.agent;
|
|
71533
|
-
log("[
|
|
71533
|
+
log("[call_drizzy_agent] parentAgent resolution", {
|
|
71534
71534
|
sessionID: toolContext.sessionID,
|
|
71535
71535
|
messageDir,
|
|
71536
71536
|
ctxAgent: toolContext.agent,
|
|
@@ -71568,10 +71568,10 @@ Task ID: ${task.id}`;
|
|
|
71568
71568
|
await new Promise((resolve16) => setTimeout(resolve16, WAIT_FOR_SESSION_INTERVAL_MS));
|
|
71569
71569
|
sessionId = manager.getTask(task.id)?.sessionID;
|
|
71570
71570
|
}
|
|
71571
|
-
await toolContext.metadata?.({
|
|
71571
|
+
await Promise.resolve(toolContext.metadata?.({
|
|
71572
71572
|
title: args.description,
|
|
71573
71573
|
metadata: { sessionId: sessionId ?? "pending" }
|
|
71574
|
-
});
|
|
71574
|
+
}));
|
|
71575
71575
|
return `Background agent task launched successfully.
|
|
71576
71576
|
|
|
71577
71577
|
Task ID: ${task.id}
|
|
@@ -71590,9 +71590,9 @@ Use \`background_output\` tool with task_id="${task.id}" to check progress:
|
|
|
71590
71590
|
}
|
|
71591
71591
|
}
|
|
71592
71592
|
|
|
71593
|
-
// src/tools/call-
|
|
71593
|
+
// src/tools/call-drizzy-agent/completion-poller.ts
|
|
71594
71594
|
async function waitForCompletion(sessionID, toolContext, ctx) {
|
|
71595
|
-
log(`[
|
|
71595
|
+
log(`[call_drizzy_agent] Polling for completion...`);
|
|
71596
71596
|
const POLL_INTERVAL_MS = 500;
|
|
71597
71597
|
const MAX_POLL_TIME_MS = 5 * 60 * 1000;
|
|
71598
71598
|
const pollStart = Date.now();
|
|
@@ -71601,7 +71601,7 @@ async function waitForCompletion(sessionID, toolContext, ctx) {
|
|
|
71601
71601
|
const STABILITY_REQUIRED = 3;
|
|
71602
71602
|
while (Date.now() - pollStart < MAX_POLL_TIME_MS) {
|
|
71603
71603
|
if (toolContext.abort?.aborted) {
|
|
71604
|
-
log(`[
|
|
71604
|
+
log(`[call_drizzy_agent] Aborted by user`);
|
|
71605
71605
|
throw new Error("Task aborted.");
|
|
71606
71606
|
}
|
|
71607
71607
|
await new Promise((resolve16) => setTimeout(resolve16, POLL_INTERVAL_MS));
|
|
@@ -71621,7 +71621,7 @@ async function waitForCompletion(sessionID, toolContext, ctx) {
|
|
|
71621
71621
|
if (currentMsgCount > 0 && currentMsgCount === lastMsgCount) {
|
|
71622
71622
|
stablePolls++;
|
|
71623
71623
|
if (stablePolls >= STABILITY_REQUIRED) {
|
|
71624
|
-
log(`[
|
|
71624
|
+
log(`[call_drizzy_agent] Session complete, ${currentMsgCount} messages`);
|
|
71625
71625
|
break;
|
|
71626
71626
|
}
|
|
71627
71627
|
} else {
|
|
@@ -71630,29 +71630,29 @@ async function waitForCompletion(sessionID, toolContext, ctx) {
|
|
|
71630
71630
|
}
|
|
71631
71631
|
}
|
|
71632
71632
|
if (Date.now() - pollStart >= MAX_POLL_TIME_MS) {
|
|
71633
|
-
log(`[
|
|
71633
|
+
log(`[call_drizzy_agent] Timeout reached`);
|
|
71634
71634
|
throw new Error("Agent task timed out after 5 minutes.");
|
|
71635
71635
|
}
|
|
71636
71636
|
}
|
|
71637
71637
|
|
|
71638
|
-
// src/tools/call-
|
|
71638
|
+
// src/tools/call-drizzy-agent/message-processor.ts
|
|
71639
71639
|
async function processMessages(sessionID, ctx) {
|
|
71640
71640
|
const messagesResult = await ctx.client.session.messages({
|
|
71641
71641
|
path: { id: sessionID }
|
|
71642
71642
|
});
|
|
71643
71643
|
if (messagesResult.error) {
|
|
71644
|
-
log(`[
|
|
71644
|
+
log(`[call_drizzy_agent] Messages error:`, messagesResult.error);
|
|
71645
71645
|
throw new Error(`Failed to get messages: ${messagesResult.error}`);
|
|
71646
71646
|
}
|
|
71647
71647
|
const messages = messagesResult.data;
|
|
71648
|
-
log(`[
|
|
71648
|
+
log(`[call_drizzy_agent] Got ${messages.length} messages`);
|
|
71649
71649
|
const relevantMessages = messages.filter((m) => m.info?.role === "assistant" || m.info?.role === "tool");
|
|
71650
71650
|
if (relevantMessages.length === 0) {
|
|
71651
|
-
log(`[
|
|
71652
|
-
log(`[
|
|
71651
|
+
log(`[call_drizzy_agent] No assistant or tool messages found`);
|
|
71652
|
+
log(`[call_drizzy_agent] All messages:`, JSON.stringify(messages, null, 2));
|
|
71653
71653
|
throw new Error("No assistant or tool response found");
|
|
71654
71654
|
}
|
|
71655
|
-
log(`[
|
|
71655
|
+
log(`[call_drizzy_agent] Found ${relevantMessages.length} relevant messages`);
|
|
71656
71656
|
const sortedMessages = [...relevantMessages].sort((a, b) => {
|
|
71657
71657
|
const timeA = a.info?.time?.created ?? 0;
|
|
71658
71658
|
const timeB = b.info?.time?.created ?? 0;
|
|
@@ -71684,31 +71684,31 @@ async function processMessages(sessionID, ctx) {
|
|
|
71684
71684
|
const responseText = extractedContent.filter((text) => text.length > 0).join(`
|
|
71685
71685
|
|
|
71686
71686
|
`);
|
|
71687
|
-
log(`[
|
|
71687
|
+
log(`[call_drizzy_agent] Got response, length: ${responseText.length}`);
|
|
71688
71688
|
return responseText;
|
|
71689
71689
|
}
|
|
71690
71690
|
|
|
71691
|
-
// src/tools/call-
|
|
71691
|
+
// src/tools/call-drizzy-agent/session-creator.ts
|
|
71692
71692
|
async function createOrGetSession(args, toolContext, ctx) {
|
|
71693
71693
|
if (args.session_id) {
|
|
71694
|
-
log(`[
|
|
71694
|
+
log(`[call_drizzy_agent] Using existing session: ${args.session_id}`);
|
|
71695
71695
|
const sessionResult = await ctx.client.session.get({
|
|
71696
71696
|
path: { id: args.session_id }
|
|
71697
71697
|
});
|
|
71698
71698
|
if (sessionResult.error) {
|
|
71699
|
-
log(`[
|
|
71699
|
+
log(`[call_drizzy_agent] Session get error:`, sessionResult.error);
|
|
71700
71700
|
throw new Error(`Failed to get existing session: ${sessionResult.error}`);
|
|
71701
71701
|
}
|
|
71702
71702
|
return { sessionID: args.session_id, isNew: false };
|
|
71703
71703
|
} else {
|
|
71704
|
-
log(`[
|
|
71704
|
+
log(`[call_drizzy_agent] Creating new session with parent: ${toolContext.sessionID}`);
|
|
71705
71705
|
const parentSession = await ctx.client.session.get({
|
|
71706
71706
|
path: { id: toolContext.sessionID }
|
|
71707
71707
|
}).catch((err) => {
|
|
71708
|
-
log(`[
|
|
71708
|
+
log(`[call_drizzy_agent] Failed to get parent session:`, err);
|
|
71709
71709
|
return null;
|
|
71710
71710
|
});
|
|
71711
|
-
log(`[
|
|
71711
|
+
log(`[call_drizzy_agent] Parent session dir: ${parentSession?.data?.directory}, fallback: ${ctx.directory}`);
|
|
71712
71712
|
const parentDirectory = parentSession?.data?.directory ?? ctx.directory;
|
|
71713
71713
|
const createResult = await ctx.client.session.create({
|
|
71714
71714
|
body: {
|
|
@@ -71720,7 +71720,7 @@ async function createOrGetSession(args, toolContext, ctx) {
|
|
|
71720
71720
|
}
|
|
71721
71721
|
});
|
|
71722
71722
|
if (createResult.error) {
|
|
71723
|
-
log(`[
|
|
71723
|
+
log(`[call_drizzy_agent] Session create error:`, createResult.error);
|
|
71724
71724
|
const errorStr = String(createResult.error);
|
|
71725
71725
|
if (errorStr.toLowerCase().includes("unauthorized")) {
|
|
71726
71726
|
throw new Error(`Failed to create session (Unauthorized). This may be due to:
|
|
@@ -71735,14 +71735,14 @@ Original error: ${createResult.error}`);
|
|
|
71735
71735
|
throw new Error(`Failed to create session: ${createResult.error}`);
|
|
71736
71736
|
}
|
|
71737
71737
|
const sessionID = createResult.data.id;
|
|
71738
|
-
log(`[
|
|
71738
|
+
log(`[call_drizzy_agent] Created session: ${sessionID}`);
|
|
71739
71739
|
subagentSessions.add(sessionID);
|
|
71740
71740
|
syncSubagentSessions.add(sessionID);
|
|
71741
71741
|
return { sessionID, isNew: true };
|
|
71742
71742
|
}
|
|
71743
71743
|
}
|
|
71744
71744
|
|
|
71745
|
-
// src/tools/call-
|
|
71745
|
+
// src/tools/call-drizzy-agent/sync-executor.ts
|
|
71746
71746
|
var defaultDeps = {
|
|
71747
71747
|
createOrGetSession,
|
|
71748
71748
|
waitForCompletion,
|
|
@@ -71771,8 +71771,8 @@ async function executeSync(args, toolContext, ctx, deps = defaultDeps, fallbackC
|
|
|
71771
71771
|
title: args.description,
|
|
71772
71772
|
metadata: { sessionId: sessionID }
|
|
71773
71773
|
}));
|
|
71774
|
-
log(`[
|
|
71775
|
-
log(`[
|
|
71774
|
+
log(`[call_drizzy_agent] Sending prompt to session ${sessionID}`);
|
|
71775
|
+
log(`[call_drizzy_agent] Prompt text:`, args.prompt.substring(0, 100));
|
|
71776
71776
|
try {
|
|
71777
71777
|
await ctx.client.session.promptAsync({
|
|
71778
71778
|
path: { id: sessionID },
|
|
@@ -71788,7 +71788,7 @@ async function executeSync(args, toolContext, ctx, deps = defaultDeps, fallbackC
|
|
|
71788
71788
|
});
|
|
71789
71789
|
} catch (error92) {
|
|
71790
71790
|
const errorMessage = error92 instanceof Error ? error92.message : String(error92);
|
|
71791
|
-
log(`[
|
|
71791
|
+
log(`[call_drizzy_agent] Prompt error:`, errorMessage);
|
|
71792
71792
|
if (errorMessage.includes("agent.name") || errorMessage.includes("undefined")) {
|
|
71793
71793
|
return `Error: Agent "${args.subagent_type}" not found. Make sure the agent is registered in your opencode.json or provided by a plugin.
|
|
71794
71794
|
|
|
@@ -71822,8 +71822,8 @@ session_id: ${sessionID}
|
|
|
71822
71822
|
}
|
|
71823
71823
|
}
|
|
71824
71824
|
|
|
71825
|
-
// src/tools/call-
|
|
71826
|
-
function
|
|
71825
|
+
// src/tools/call-drizzy-agent/tools.ts
|
|
71826
|
+
function resolveFallbackChainForCallDrizzyAgent(args) {
|
|
71827
71827
|
const { subagentType, agentOverrides, userCategories } = args;
|
|
71828
71828
|
const agentConfigKey = getAgentConfigKey(subagentType);
|
|
71829
71829
|
const agentRequirement = AGENT_MODEL_REQUIREMENTS[agentConfigKey];
|
|
@@ -71833,10 +71833,10 @@ function resolveFallbackChainForCallOmoAgent(args) {
|
|
|
71833
71833
|
const configuredFallbackChain = buildFallbackChainFromModels(normalizedFallbackModels, defaultProviderID);
|
|
71834
71834
|
return configuredFallbackChain ?? agentRequirement?.fallbackChain;
|
|
71835
71835
|
}
|
|
71836
|
-
function
|
|
71836
|
+
function createCallDrizzyAgent(ctx, backgroundManager, disabledAgents = [], agentOverrides, userCategories) {
|
|
71837
71837
|
const agentDescriptions = ALLOWED_AGENTS.map((name) => `- ${name}: Specialized agent for ${name} tasks`).join(`
|
|
71838
71838
|
`);
|
|
71839
|
-
const description =
|
|
71839
|
+
const description = CALL_DRIZZY_AGENT_DESCRIPTION.replace("{agents}", agentDescriptions);
|
|
71840
71840
|
return tool({
|
|
71841
71841
|
description,
|
|
71842
71842
|
args: {
|
|
@@ -71848,7 +71848,7 @@ function createCallOmoAgent(ctx, backgroundManager, disabledAgents = [], agentOv
|
|
|
71848
71848
|
},
|
|
71849
71849
|
async execute(args, toolContext) {
|
|
71850
71850
|
const toolCtx = toolContext;
|
|
71851
|
-
log(`[
|
|
71851
|
+
log(`[call_drizzy_agent] Starting with agent: ${args.subagent_type}, background: ${args.run_in_background}`);
|
|
71852
71852
|
if (!ALLOWED_AGENTS.some((name) => name.toLowerCase() === args.subagent_type.toLowerCase())) {
|
|
71853
71853
|
return `Error: Invalid agent type "${args.subagent_type}". Only ${ALLOWED_AGENTS.join(", ")} are allowed.`;
|
|
71854
71854
|
}
|
|
@@ -71857,7 +71857,7 @@ function createCallOmoAgent(ctx, backgroundManager, disabledAgents = [], agentOv
|
|
|
71857
71857
|
if (disabledAgents.some((disabled) => disabled.toLowerCase() === normalizedAgent)) {
|
|
71858
71858
|
return `Error: Agent "${normalizedAgent}" is disabled via disabled_agents configuration. Remove it from disabled_agents in your drizzy-agent.json to use it.`;
|
|
71859
71859
|
}
|
|
71860
|
-
const fallbackChain =
|
|
71860
|
+
const fallbackChain = resolveFallbackChainForCallDrizzyAgent({
|
|
71861
71861
|
subagentType: args.subagent_type,
|
|
71862
71862
|
agentOverrides,
|
|
71863
71863
|
userCategories
|
|
@@ -72385,7 +72385,7 @@ Original error: ${createResult.error}`;
|
|
|
72385
72385
|
agent: MULTIMODAL_LOOKER_AGENT,
|
|
72386
72386
|
tools: {
|
|
72387
72387
|
task: false,
|
|
72388
|
-
|
|
72388
|
+
call_drizzy_agent: false,
|
|
72389
72389
|
look_at: false,
|
|
72390
72390
|
read: false
|
|
72391
72391
|
},
|
|
@@ -72737,8 +72737,8 @@ BEFORE you begin planning, you MUST first understand the user's request deeply.
|
|
|
72737
72737
|
|
|
72738
72738
|
MANDATORY CONTEXT GATHERING PROTOCOL:
|
|
72739
72739
|
1. Launch background agents to gather context:
|
|
72740
|
-
-
|
|
72741
|
-
-
|
|
72740
|
+
- call_drizzy_agent(description="Explore codebase patterns", subagent_type="explore", run_in_background=true, prompt="<search for relevant patterns, files, and implementations in the codebase related to user's request>")
|
|
72741
|
+
- call_drizzy_agent(description="Research documentation", subagent_type="librarian", run_in_background=true, prompt="<search for external documentation, examples, and best practices related to user's request>")
|
|
72742
72742
|
|
|
72743
72743
|
2. After gathering context, ALWAYS present:
|
|
72744
72744
|
- **User Request Summary**: Concise restatement of what the user is asking for
|
|
@@ -73601,7 +73601,7 @@ async function executeSyncContinuation(args, ctx, executorCtx, deps = syncContin
|
|
|
73601
73601
|
const tools = {
|
|
73602
73602
|
...resumeAgent ? getAgentToolRestrictions(resumeAgent) : {},
|
|
73603
73603
|
task: allowTask,
|
|
73604
|
-
|
|
73604
|
+
call_drizzy_agent: true,
|
|
73605
73605
|
question: false
|
|
73606
73606
|
};
|
|
73607
73607
|
setSessionTools(args.session_id, tools);
|
|
@@ -73975,7 +73975,7 @@ async function sendSyncPrompt(client2, input, deps = sendSyncPromptDeps) {
|
|
|
73975
73975
|
const effectivePrompt = buildTaskPrompt(input.args.prompt, input.agentToUse);
|
|
73976
73976
|
const tools = {
|
|
73977
73977
|
task: allowTask,
|
|
73978
|
-
|
|
73978
|
+
call_drizzy_agent: true,
|
|
73979
73979
|
question: false,
|
|
73980
73980
|
...getAgentToolRestrictions(input.agentToUse)
|
|
73981
73981
|
};
|
|
@@ -77278,7 +77278,7 @@ function createContinuationHooks(args) {
|
|
|
77278
77278
|
}
|
|
77279
77279
|
}
|
|
77280
77280
|
const backgroundNotificationHook = isHookEnabled("background-notification") ? safeHook("background-notification", () => createBackgroundNotificationHook(backgroundManager)) : null;
|
|
77281
|
-
const
|
|
77281
|
+
const orchestratorHook = isHookEnabled("orchestrator") ? safeHook("orchestrator", () => createOrchestratorHook(ctx, {
|
|
77282
77282
|
directory: ctx.directory,
|
|
77283
77283
|
backgroundManager,
|
|
77284
77284
|
isContinuationStopped: (sessionID) => stopContinuationGuard?.isStopped(sessionID) ?? false,
|
|
@@ -77294,7 +77294,7 @@ function createContinuationHooks(args) {
|
|
|
77294
77294
|
todoContinuationEnforcer,
|
|
77295
77295
|
unstableAgentBabysitter,
|
|
77296
77296
|
backgroundNotificationHook,
|
|
77297
|
-
|
|
77297
|
+
orchestratorHook
|
|
77298
77298
|
};
|
|
77299
77299
|
}
|
|
77300
77300
|
|
|
@@ -78426,7 +78426,7 @@ class BackgroundManager {
|
|
|
78426
78426
|
tools: (() => {
|
|
78427
78427
|
const tools = {
|
|
78428
78428
|
task: false,
|
|
78429
|
-
|
|
78429
|
+
call_drizzy_agent: true,
|
|
78430
78430
|
question: false,
|
|
78431
78431
|
...getAgentToolRestrictions(input.agent)
|
|
78432
78432
|
};
|
|
@@ -78637,7 +78637,7 @@ class BackgroundManager {
|
|
|
78637
78637
|
tools: (() => {
|
|
78638
78638
|
const tools = {
|
|
78639
78639
|
task: false,
|
|
78640
|
-
|
|
78640
|
+
call_drizzy_agent: true,
|
|
78641
78641
|
question: false,
|
|
78642
78642
|
...getAgentToolRestrictions(existingTask.agent)
|
|
78643
78643
|
};
|
|
@@ -87239,7 +87239,7 @@ function createCoderAgent(model, availableAgents, availableToolNames, availableS
|
|
|
87239
87239
|
color: "#00CED1",
|
|
87240
87240
|
permission: {
|
|
87241
87241
|
question: "allow",
|
|
87242
|
-
|
|
87242
|
+
call_drizzy_agent: "deny"
|
|
87243
87243
|
},
|
|
87244
87244
|
reasoningEffort: "medium"
|
|
87245
87245
|
};
|
|
@@ -87264,7 +87264,7 @@ ${buildGeminiVerificationOverride()}
|
|
|
87264
87264
|
}
|
|
87265
87265
|
const permission = {
|
|
87266
87266
|
question: "allow",
|
|
87267
|
-
|
|
87267
|
+
call_drizzy_agent: "deny"
|
|
87268
87268
|
};
|
|
87269
87269
|
const base = {
|
|
87270
87270
|
description: "Powerful AI orchestrator. Plans obsessively with todos, assesses search complexity before exploration, delegates strategically via category+skills combinations. Uses explore for internal code (parallel-friendly), librarian for external docs. (Coder - DrizzyAgent)",
|
|
@@ -87558,7 +87558,7 @@ function createLibrarianAgent(model) {
|
|
|
87558
87558
|
"edit",
|
|
87559
87559
|
"apply_patch",
|
|
87560
87560
|
"task",
|
|
87561
|
-
"
|
|
87561
|
+
"call_drizzy_agent"
|
|
87562
87562
|
]);
|
|
87563
87563
|
return {
|
|
87564
87564
|
description: "Specialized codebase understanding agent for multi-repository analysis, searching remote codebases, retrieving official documentation, and finding implementation examples using GitHub CLI, Context7, and Web Search. MUST BE USED when users ask to look up code in remote repositories, explain library internals, or find usage examples in open source. (Librarian - DrizzyAgent)",
|
|
@@ -87875,7 +87875,7 @@ function createExploreAgent(model) {
|
|
|
87875
87875
|
"edit",
|
|
87876
87876
|
"apply_patch",
|
|
87877
87877
|
"task",
|
|
87878
|
-
"
|
|
87878
|
+
"call_drizzy_agent"
|
|
87879
87879
|
]);
|
|
87880
87880
|
return {
|
|
87881
87881
|
description: 'Contextual grep for codebases. Answers "Where is X?", "Which file has Y?", "Find the code that does Z". Fire multiple in parallel for broad searches. Specify thoroughness: "quick" for basic, "medium" for moderate, "very thorough" for comprehensive analysis. (Explore - DrizzyAgent)',
|
|
@@ -88083,9 +88083,9 @@ Confirm:
|
|
|
88083
88083
|
\`\`\`
|
|
88084
88084
|
// Launch these explore agents FIRST
|
|
88085
88085
|
// Prompt structure: CONTEXT + GOAL + QUESTION + REQUEST
|
|
88086
|
-
|
|
88087
|
-
|
|
88088
|
-
|
|
88086
|
+
call_drizzy_agent(subagent_type="explore", prompt="I'm analyzing a new feature request and need to understand existing patterns before asking clarifying questions. Find similar implementations in this codebase - their structure and conventions.")
|
|
88087
|
+
call_drizzy_agent(subagent_type="explore", prompt="I'm planning to build [feature type] and want to ensure consistency with the project. Find how similar features are organized - file structure, naming patterns, and architectural approach.")
|
|
88088
|
+
call_drizzy_agent(subagent_type="librarian", prompt="I'm implementing [technology] and need to understand best practices before making recommendations. Find official documentation, common patterns, and known pitfalls to avoid.")
|
|
88089
88089
|
\`\`\`
|
|
88090
88090
|
|
|
88091
88091
|
**Questions to Ask** (AFTER exploration):
|
|
@@ -88196,9 +88196,9 @@ Task(
|
|
|
88196
88196
|
**Investigation Structure**:
|
|
88197
88197
|
\`\`\`
|
|
88198
88198
|
// Parallel probes - Prompt structure: CONTEXT + GOAL + QUESTION + REQUEST
|
|
88199
|
-
|
|
88200
|
-
|
|
88201
|
-
|
|
88199
|
+
call_drizzy_agent(subagent_type="explore", prompt="I'm researching how to implement [feature] and need to understand the current approach. Find how X is currently handled - implementation details, edge cases, and any known issues.")
|
|
88200
|
+
call_drizzy_agent(subagent_type="librarian", prompt="I'm implementing Y and need authoritative guidance. Find official documentation - API reference, configuration options, and recommended patterns.")
|
|
88201
|
+
call_drizzy_agent(subagent_type="librarian", prompt="I'm looking for proven implementations of Z. Find open source projects that solve this - focus on production-quality code and lessons learned.")
|
|
88202
88202
|
\`\`\`
|
|
88203
88203
|
|
|
88204
88204
|
**Directives for Planner**:
|
|
@@ -88330,12 +88330,12 @@ var planConsultantPromptMetadata = {
|
|
|
88330
88330
|
keyTrigger: "Ambiguous or complex request \u2192 consult Plan Consultant before Planner"
|
|
88331
88331
|
};
|
|
88332
88332
|
|
|
88333
|
-
// src/agents/
|
|
88334
|
-
var
|
|
88333
|
+
// src/agents/orchestrator/default.ts
|
|
88334
|
+
var ORCHESTRATOR_SYSTEM_PROMPT = `
|
|
88335
88335
|
<identity>
|
|
88336
|
-
You are
|
|
88336
|
+
You are Orchestrator - the Master Orchestrator from DrizzyAgent.
|
|
88337
88337
|
|
|
88338
|
-
In Greek mythology,
|
|
88338
|
+
In Greek mythology, Orchestrator holds up the celestial heavens. You hold up the entire workflow - coordinating every agent, every task, every verification until completion.
|
|
88339
88339
|
|
|
88340
88340
|
You are a conductor, not a musician. A general, not a soldier. You DELEGATE, COORDINATE, and VERIFY.
|
|
88341
88341
|
You never write code yourself. You orchestrate specialists who do.
|
|
@@ -88767,14 +88767,14 @@ After EVERY verified task() completion, you MUST:
|
|
|
88767
88767
|
This ensures accurate progress tracking. Skip this and you lose visibility into what remains.
|
|
88768
88768
|
</post_delegation_rule>
|
|
88769
88769
|
`;
|
|
88770
|
-
function
|
|
88771
|
-
return
|
|
88770
|
+
function getDefaultOrchestratorPrompt() {
|
|
88771
|
+
return ORCHESTRATOR_SYSTEM_PROMPT;
|
|
88772
88772
|
}
|
|
88773
88773
|
|
|
88774
|
-
// src/agents/
|
|
88775
|
-
var
|
|
88774
|
+
// src/agents/orchestrator/gpt.ts
|
|
88775
|
+
var ORCHESTRATOR_GPT_SYSTEM_PROMPT = `
|
|
88776
88776
|
<identity>
|
|
88777
|
-
You are
|
|
88777
|
+
You are Orchestrator - Master Orchestrator from DrizzyAgent.
|
|
88778
88778
|
Role: Conductor, not musician. General, not soldier.
|
|
88779
88779
|
You DELEGATE, COORDINATE, and VERIFY. You NEVER write code yourself.
|
|
88780
88780
|
</identity>
|
|
@@ -89181,14 +89181,14 @@ After EVERY verified task() completion, you MUST:
|
|
|
89181
89181
|
This ensures accurate progress tracking. Skip this and you lose visibility into what remains.
|
|
89182
89182
|
</post_delegation_rule>
|
|
89183
89183
|
`;
|
|
89184
|
-
function
|
|
89185
|
-
return
|
|
89184
|
+
function getGptOrchestratorPrompt() {
|
|
89185
|
+
return ORCHESTRATOR_GPT_SYSTEM_PROMPT;
|
|
89186
89186
|
}
|
|
89187
89187
|
|
|
89188
|
-
// src/agents/
|
|
89189
|
-
var
|
|
89188
|
+
// src/agents/orchestrator/gemini.ts
|
|
89189
|
+
var ORCHESTRATOR_GEMINI_SYSTEM_PROMPT = `
|
|
89190
89190
|
<identity>
|
|
89191
|
-
You are
|
|
89191
|
+
You are Orchestrator - Master Orchestrator from DrizzyAgent.
|
|
89192
89192
|
Role: Conductor, not musician. General, not soldier.
|
|
89193
89193
|
You DELEGATE, COORDINATE, and VERIFY. You NEVER write code yourself.
|
|
89194
89194
|
|
|
@@ -89592,11 +89592,11 @@ After EVERY verified task() completion, you MUST:
|
|
|
89592
89592
|
This ensures accurate progress tracking. Skip this and you lose visibility into what remains.
|
|
89593
89593
|
</post_delegation_rule>
|
|
89594
89594
|
`;
|
|
89595
|
-
function
|
|
89596
|
-
return
|
|
89595
|
+
function getGeminiOrchestratorPrompt() {
|
|
89596
|
+
return ORCHESTRATOR_GEMINI_SYSTEM_PROMPT;
|
|
89597
89597
|
}
|
|
89598
89598
|
|
|
89599
|
-
// src/agents/
|
|
89599
|
+
// src/agents/orchestrator/prompt-section-builder.ts
|
|
89600
89600
|
var getCategoryDescription = (name, userCategories) => userCategories?.[name]?.description ?? CATEGORY_DESCRIPTIONS[name] ?? "General tasks";
|
|
89601
89601
|
function buildAgentSelectionSection(agents) {
|
|
89602
89602
|
if (agents.length === 0) {
|
|
@@ -89680,9 +89680,9 @@ ${agentRows.join(`
|
|
|
89680
89680
|
**NEVER provide both category AND agent - they are mutually exclusive.**`;
|
|
89681
89681
|
}
|
|
89682
89682
|
|
|
89683
|
-
// src/agents/
|
|
89683
|
+
// src/agents/orchestrator/agent.ts
|
|
89684
89684
|
var MODE7 = "all";
|
|
89685
|
-
function
|
|
89685
|
+
function getOrchestratorPromptSource(model) {
|
|
89686
89686
|
if (model && isGptModel(model)) {
|
|
89687
89687
|
return "gpt";
|
|
89688
89688
|
}
|
|
@@ -89691,16 +89691,16 @@ function getAtlasPromptSource(model) {
|
|
|
89691
89691
|
}
|
|
89692
89692
|
return "default";
|
|
89693
89693
|
}
|
|
89694
|
-
function
|
|
89695
|
-
const source =
|
|
89694
|
+
function getOrchestratorPrompt(model) {
|
|
89695
|
+
const source = getOrchestratorPromptSource(model);
|
|
89696
89696
|
switch (source) {
|
|
89697
89697
|
case "gpt":
|
|
89698
|
-
return
|
|
89698
|
+
return getGptOrchestratorPrompt();
|
|
89699
89699
|
case "gemini":
|
|
89700
|
-
return
|
|
89700
|
+
return getGeminiOrchestratorPrompt();
|
|
89701
89701
|
case "default":
|
|
89702
89702
|
default:
|
|
89703
|
-
return
|
|
89703
|
+
return getDefaultOrchestratorPrompt();
|
|
89704
89704
|
}
|
|
89705
89705
|
}
|
|
89706
89706
|
function buildDynamicOrchestratorPrompt(ctx) {
|
|
@@ -89718,12 +89718,12 @@ function buildDynamicOrchestratorPrompt(ctx) {
|
|
|
89718
89718
|
const decisionMatrix = buildDecisionMatrix(agents, userCategories);
|
|
89719
89719
|
const skillsSection = buildSkillsSection(skills2);
|
|
89720
89720
|
const categorySkillsGuide = buildCategorySkillsDelegationGuide(availableCategories, skills2);
|
|
89721
|
-
const basePrompt =
|
|
89721
|
+
const basePrompt = getOrchestratorPrompt(model);
|
|
89722
89722
|
return basePrompt.replace("{CATEGORY_SECTION}", categorySection).replace("{AGENT_SECTION}", agentSection).replace("{DECISION_MATRIX}", decisionMatrix).replace("{SKILLS_SECTION}", skillsSection).replace("{{CATEGORY_SKILLS_DELEGATION_GUIDE}}", categorySkillsGuide);
|
|
89723
89723
|
}
|
|
89724
|
-
function
|
|
89724
|
+
function createOrchestratorAgent(ctx) {
|
|
89725
89725
|
const baseConfig = {
|
|
89726
|
-
description: "Orchestrates work via task() to complete ALL tasks in a todo list until fully done. (
|
|
89726
|
+
description: "Orchestrates work via task() to complete ALL tasks in a todo list until fully done. (Orchestrator - DrizzyAgent)",
|
|
89727
89727
|
mode: MODE7,
|
|
89728
89728
|
...ctx.model ? { model: ctx.model } : {},
|
|
89729
89729
|
temperature: 0.1,
|
|
@@ -89732,11 +89732,11 @@ function createAtlasAgent(ctx) {
|
|
|
89732
89732
|
};
|
|
89733
89733
|
return baseConfig;
|
|
89734
89734
|
}
|
|
89735
|
-
|
|
89736
|
-
var
|
|
89735
|
+
createOrchestratorAgent.mode = MODE7;
|
|
89736
|
+
var orchestratorPromptMetadata = {
|
|
89737
89737
|
category: "advisor",
|
|
89738
89738
|
cost: "EXPENSIVE",
|
|
89739
|
-
promptAlias: "
|
|
89739
|
+
promptAlias: "Orchestrator",
|
|
89740
89740
|
triggers: [
|
|
89741
89741
|
{
|
|
89742
89742
|
domain: "Todo list orchestration",
|
|
@@ -90819,7 +90819,7 @@ function createGptcoderAgent(model, availableAgents, availableToolNames, availab
|
|
|
90819
90819
|
color: "#D97706",
|
|
90820
90820
|
permission: {
|
|
90821
90821
|
question: "allow",
|
|
90822
|
-
|
|
90822
|
+
call_drizzy_agent: "deny"
|
|
90823
90823
|
},
|
|
90824
90824
|
reasoningEffort: "medium"
|
|
90825
90825
|
};
|
|
@@ -91239,7 +91239,7 @@ function createGptcoderAgent2(model, availableAgents, availableToolNames, availa
|
|
|
91239
91239
|
color: "#D97706",
|
|
91240
91240
|
permission: {
|
|
91241
91241
|
question: "allow",
|
|
91242
|
-
|
|
91242
|
+
call_drizzy_agent: "deny"
|
|
91243
91243
|
},
|
|
91244
91244
|
reasoningEffort: "medium"
|
|
91245
91245
|
};
|
|
@@ -91351,7 +91351,7 @@ When blocked: try a different approach \u2192 decompose the problem \u2192 chall
|
|
|
91351
91351
|
- Run verification (lint, tests, build) WITHOUT asking
|
|
91352
91352
|
- Make decisions. Course-correct only on CONCRETE failure
|
|
91353
91353
|
- Note assumptions in final message, not as questions mid-work
|
|
91354
|
-
- Need context? Fire explore/librarian via
|
|
91354
|
+
- Need context? Fire explore/librarian via call_drizzy_agent IMMEDIATELY \u2014 continue only with non-overlapping work while they search
|
|
91355
91355
|
|
|
91356
91356
|
## Scope Discipline
|
|
91357
91357
|
|
|
@@ -91369,7 +91369,7 @@ When blocked: try a different approach \u2192 decompose the problem \u2192 chall
|
|
|
91369
91369
|
|
|
91370
91370
|
<tool_usage_rules>
|
|
91371
91371
|
- Parallelize independent tool calls: multiple file reads, grep searches, agent fires \u2014 all at once
|
|
91372
|
-
- Explore/Librarian via
|
|
91372
|
+
- Explore/Librarian via call_drizzy_agent = background research. Fire them and continue only with non-overlapping work
|
|
91373
91373
|
- After any file edit: restate what changed, where, and what validation follows
|
|
91374
91374
|
- Prefer tools over guessing whenever you need specific data (files, configs, patterns)
|
|
91375
91375
|
- ALWAYS use tools over internal knowledge for file contents, project state, and verification
|
|
@@ -91489,7 +91489,7 @@ When blocked: try a different approach \u2192 decompose the problem \u2192 chall
|
|
|
91489
91489
|
- Run verification (lint, tests, build) WITHOUT asking
|
|
91490
91490
|
- Make decisions. Course-correct only on CONCRETE failure
|
|
91491
91491
|
- Note assumptions in final message, not as questions mid-work
|
|
91492
|
-
- Need context? Fire explore/librarian via
|
|
91492
|
+
- Need context? Fire explore/librarian via call_drizzy_agent IMMEDIATELY \u2014 continue only with non-overlapping work while they search
|
|
91493
91493
|
|
|
91494
91494
|
## Scope Discipline
|
|
91495
91495
|
|
|
@@ -91508,7 +91508,7 @@ When blocked: try a different approach \u2192 decompose the problem \u2192 chall
|
|
|
91508
91508
|
|
|
91509
91509
|
<tool_usage_rules>
|
|
91510
91510
|
- Parallelize independent tool calls: multiple file reads, grep searches, agent fires \u2014 all at once
|
|
91511
|
-
- Explore/Librarian via
|
|
91511
|
+
- Explore/Librarian via call_drizzy_agent = background research. Fire them and continue only with non-overlapping work
|
|
91512
91512
|
- After any file edit: restate what changed, where, and what validation follows
|
|
91513
91513
|
- Prefer tools over guessing whenever you need specific data (files, configs, patterns)
|
|
91514
91514
|
- ALWAYS use tools over internal knowledge for file contents, project state, and verification
|
|
@@ -91630,7 +91630,7 @@ When blocked: try a different approach \u2192 decompose the problem \u2192 chall
|
|
|
91630
91630
|
- Run verification (lint, tests, build) WITHOUT asking
|
|
91631
91631
|
- Make decisions. Course-correct only on CONCRETE failure
|
|
91632
91632
|
- Note assumptions in final message, not as questions mid-work
|
|
91633
|
-
- Need context? Fire explore/librarian via
|
|
91633
|
+
- Need context? Fire explore/librarian via call_drizzy_agent IMMEDIATELY \u2014 continue only with non-overlapping work while they search
|
|
91634
91634
|
|
|
91635
91635
|
## Scope Discipline
|
|
91636
91636
|
|
|
@@ -91648,7 +91648,7 @@ When blocked: try a different approach \u2192 decompose the problem \u2192 chall
|
|
|
91648
91648
|
|
|
91649
91649
|
<tool_usage_rules>
|
|
91650
91650
|
- Parallelize independent tool calls: multiple file reads, grep searches, agent fires \u2014 all at once
|
|
91651
|
-
- Explore/Librarian via
|
|
91651
|
+
- Explore/Librarian via call_drizzy_agent = background research. Fire them and continue only with non-overlapping work
|
|
91652
91652
|
- After any file edit: restate what changed, where, and what validation follows
|
|
91653
91653
|
- Prefer tools over guessing whenever you need specific data (files, configs, patterns)
|
|
91654
91654
|
- ALWAYS use tools over internal knowledge for file contents, project state, and verification
|
|
@@ -91784,7 +91784,7 @@ Before responding, ask yourself: What tools do I need to call? What am I assumin
|
|
|
91784
91784
|
- Run verification (lint, tests, build) WITHOUT asking
|
|
91785
91785
|
- Make decisions. Course-correct only on CONCRETE failure
|
|
91786
91786
|
- Note assumptions in final message, not as questions mid-work
|
|
91787
|
-
- Need context? Fire explore/librarian via
|
|
91787
|
+
- Need context? Fire explore/librarian via call_drizzy_agent IMMEDIATELY \u2014 continue only with non-overlapping work while they search
|
|
91788
91788
|
|
|
91789
91789
|
## Scope Discipline
|
|
91790
91790
|
|
|
@@ -91803,7 +91803,7 @@ Before responding, ask yourself: What tools do I need to call? What am I assumin
|
|
|
91803
91803
|
|
|
91804
91804
|
<tool_usage_rules>
|
|
91805
91805
|
- Parallelize independent tool calls: multiple file reads, grep searches, agent fires \u2014 all at once
|
|
91806
|
-
- Explore/Librarian via
|
|
91806
|
+
- Explore/Librarian via call_drizzy_agent = background research. Fire them and continue only with non-overlapping work
|
|
91807
91807
|
- After any file edit: restate what changed, where, and what validation follows
|
|
91808
91808
|
- Prefer tools over guessing whenever you need specific data (files, configs, patterns)
|
|
91809
91809
|
- ALWAYS use tools over internal knowledge for file contents, project state, and verification
|
|
@@ -91970,7 +91970,7 @@ function createCoderJuniorAgentWithOverrides(override, systemDefaultModel, useTa
|
|
|
91970
91970
|
for (const tool3 of BLOCKED_TOOLS3) {
|
|
91971
91971
|
merged[tool3] = "deny";
|
|
91972
91972
|
}
|
|
91973
|
-
merged.
|
|
91973
|
+
merged.call_drizzy_agent = "allow";
|
|
91974
91974
|
const toolsConfig = { permission: { ...merged, ...basePermission } };
|
|
91975
91975
|
const base = {
|
|
91976
91976
|
description: override?.description ?? "Focused task executor. Same discipline, no delegation. (Coder-Junior - DrizzyAgent)",
|
|
@@ -92350,7 +92350,7 @@ function createResearcherAgent(model) {
|
|
|
92350
92350
|
const restrictions = createAgentToolRestrictions([
|
|
92351
92351
|
"apply_patch",
|
|
92352
92352
|
"ast_grep_replace",
|
|
92353
|
-
"
|
|
92353
|
+
"call_drizzy_agent",
|
|
92354
92354
|
"interactive_bash",
|
|
92355
92355
|
"Bash",
|
|
92356
92356
|
"hashline_edit",
|
|
@@ -92508,7 +92508,7 @@ var createResearcherJuniorAgent = (model) => {
|
|
|
92508
92508
|
const restrictions = createAgentToolRestrictions([
|
|
92509
92509
|
"apply_patch",
|
|
92510
92510
|
"ast_grep_replace",
|
|
92511
|
-
"
|
|
92511
|
+
"call_drizzy_agent",
|
|
92512
92512
|
"interactive_bash",
|
|
92513
92513
|
"Bash",
|
|
92514
92514
|
"hashline_edit",
|
|
@@ -92715,7 +92715,7 @@ function collectPendingBuiltinAgents(input) {
|
|
|
92715
92715
|
continue;
|
|
92716
92716
|
if (agentName === "gptcoder")
|
|
92717
92717
|
continue;
|
|
92718
|
-
if (agentName === "
|
|
92718
|
+
if (agentName === "orchestrator")
|
|
92719
92719
|
continue;
|
|
92720
92720
|
if (agentName === "coder-junior")
|
|
92721
92721
|
continue;
|
|
@@ -92866,8 +92866,8 @@ function maybeCreateGptcoderConfig(input) {
|
|
|
92866
92866
|
return gptcoderConfig;
|
|
92867
92867
|
}
|
|
92868
92868
|
|
|
92869
|
-
// src/agents/builtin-agents/
|
|
92870
|
-
function
|
|
92869
|
+
// src/agents/builtin-agents/orchestrator-agent.ts
|
|
92870
|
+
function maybeCreateOrchestratorConfig(input) {
|
|
92871
92871
|
const {
|
|
92872
92872
|
disabledAgents,
|
|
92873
92873
|
agentOverrides,
|
|
@@ -92880,30 +92880,30 @@ function maybeCreateAtlasConfig(input) {
|
|
|
92880
92880
|
directory,
|
|
92881
92881
|
userCategories
|
|
92882
92882
|
} = input;
|
|
92883
|
-
if (disabledAgents.includes("
|
|
92883
|
+
if (disabledAgents.includes("orchestrator"))
|
|
92884
92884
|
return;
|
|
92885
|
-
const orchestratorOverride = getExplicitAgentOverride(agentOverrides, "
|
|
92886
|
-
const effectiveOrchestratorOverride = getEffectiveAgentOverride(agentOverrides, "
|
|
92887
|
-
const
|
|
92888
|
-
const
|
|
92885
|
+
const orchestratorOverride = getExplicitAgentOverride(agentOverrides, "orchestrator");
|
|
92886
|
+
const effectiveOrchestratorOverride = getEffectiveAgentOverride(agentOverrides, "orchestrator");
|
|
92887
|
+
const orchestratorRequirement = AGENT_MODEL_REQUIREMENTS["orchestrator"];
|
|
92888
|
+
const orchestratorResolution = applyModelResolution({
|
|
92889
92889
|
uiSelectedModel: effectiveOrchestratorOverride?.model ? undefined : uiSelectedModel,
|
|
92890
92890
|
userModel: effectiveOrchestratorOverride?.model,
|
|
92891
|
-
requirement:
|
|
92891
|
+
requirement: orchestratorRequirement,
|
|
92892
92892
|
availableModels,
|
|
92893
92893
|
systemDefaultModel
|
|
92894
92894
|
});
|
|
92895
|
-
if (!
|
|
92895
|
+
if (!orchestratorResolution)
|
|
92896
92896
|
return;
|
|
92897
|
-
const { model:
|
|
92898
|
-
let orchestratorConfig =
|
|
92899
|
-
model:
|
|
92897
|
+
const { model: orchestratorModel, variant: orchestratorResolvedVariant } = orchestratorResolution;
|
|
92898
|
+
let orchestratorConfig = createOrchestratorAgent({
|
|
92899
|
+
model: orchestratorModel,
|
|
92900
92900
|
availableAgents,
|
|
92901
92901
|
availableSkills,
|
|
92902
92902
|
userCategories
|
|
92903
92903
|
});
|
|
92904
|
-
const
|
|
92905
|
-
if (
|
|
92906
|
-
orchestratorConfig = { ...orchestratorConfig, variant:
|
|
92904
|
+
const orchestratorVariant = orchestratorOverride?.variant ?? effectiveOrchestratorOverride?.variant ?? orchestratorResolvedVariant;
|
|
92905
|
+
if (orchestratorVariant) {
|
|
92906
|
+
orchestratorConfig = { ...orchestratorConfig, variant: orchestratorVariant };
|
|
92907
92907
|
}
|
|
92908
92908
|
orchestratorConfig = applyOverrides(orchestratorConfig, orchestratorOverride, mergedCategories, directory);
|
|
92909
92909
|
return orchestratorConfig;
|
|
@@ -92965,7 +92965,7 @@ var agentSources = {
|
|
|
92965
92965
|
"multimodal-looker": createMultimodalLookerAgent,
|
|
92966
92966
|
"plan-consultant": createPlanConsultantAgent,
|
|
92967
92967
|
"plan-reviewer": createPlanReviewerAgent,
|
|
92968
|
-
|
|
92968
|
+
orchestrator: createOrchestratorAgent,
|
|
92969
92969
|
"coder-junior": createCoderJuniorAgentWithOverrides,
|
|
92970
92970
|
researcher: createResearcherAgent,
|
|
92971
92971
|
"researcher-junior": createResearcherJuniorAgent
|
|
@@ -92977,7 +92977,7 @@ var agentMetadata = {
|
|
|
92977
92977
|
"multimodal-looker": MULTIMODAL_LOOKER_PROMPT_METADATA,
|
|
92978
92978
|
"plan-consultant": planConsultantPromptMetadata,
|
|
92979
92979
|
"plan-reviewer": planReviewerPromptMetadata,
|
|
92980
|
-
|
|
92980
|
+
orchestrator: orchestratorPromptMetadata,
|
|
92981
92981
|
researcher: RESEARCHER_PROMPT_METADATA,
|
|
92982
92982
|
"researcher-junior": RESEARCHER_JUNIOR_PROMPT_METADATA
|
|
92983
92983
|
};
|
|
@@ -93068,7 +93068,7 @@ async function createBuiltinAgents(disabledAgents = [], agentOverrides = {}, dir
|
|
|
93068
93068
|
for (const [name, config4] of pendingAgentConfigs) {
|
|
93069
93069
|
result[name] = config4;
|
|
93070
93070
|
}
|
|
93071
|
-
const
|
|
93071
|
+
const orchestratorConfig = maybeCreateOrchestratorConfig({
|
|
93072
93072
|
disabledAgents,
|
|
93073
93073
|
agentOverrides,
|
|
93074
93074
|
uiSelectedModel,
|
|
@@ -93080,8 +93080,8 @@ async function createBuiltinAgents(disabledAgents = [], agentOverrides = {}, dir
|
|
|
93080
93080
|
directory,
|
|
93081
93081
|
userCategories: categories2
|
|
93082
93082
|
});
|
|
93083
|
-
if (
|
|
93084
|
-
result["
|
|
93083
|
+
if (orchestratorConfig) {
|
|
93084
|
+
result["orchestrator"] = orchestratorConfig;
|
|
93085
93085
|
}
|
|
93086
93086
|
return result;
|
|
93087
93087
|
}
|
|
@@ -93163,7 +93163,7 @@ var CORE_AGENT_ORDER = [
|
|
|
93163
93163
|
getAgentDisplayName("coder"),
|
|
93164
93164
|
getAgentDisplayName("gptcoder"),
|
|
93165
93165
|
getAgentDisplayName("planner"),
|
|
93166
|
-
getAgentDisplayName("
|
|
93166
|
+
getAgentDisplayName("orchestrator")
|
|
93167
93167
|
];
|
|
93168
93168
|
function reorderAgentsByPriority(agents) {
|
|
93169
93169
|
const ordered = {};
|
|
@@ -96049,12 +96049,12 @@ function applyToolConfig(params) {
|
|
|
96049
96049
|
if (looker) {
|
|
96050
96050
|
looker.permission = { ...looker.permission, task: "deny", look_at: "deny" };
|
|
96051
96051
|
}
|
|
96052
|
-
const
|
|
96053
|
-
if (
|
|
96054
|
-
|
|
96055
|
-
...
|
|
96052
|
+
const orchestrator = agentByKey(params.agentResult, "orchestrator");
|
|
96053
|
+
if (orchestrator) {
|
|
96054
|
+
orchestrator.permission = {
|
|
96055
|
+
...orchestrator.permission,
|
|
96056
96056
|
task: "allow",
|
|
96057
|
-
|
|
96057
|
+
call_drizzy_agent: "deny",
|
|
96058
96058
|
"task_*": "allow",
|
|
96059
96059
|
teammate: "allow",
|
|
96060
96060
|
...denyTodoTools
|
|
@@ -96064,7 +96064,7 @@ function applyToolConfig(params) {
|
|
|
96064
96064
|
if (coder2) {
|
|
96065
96065
|
coder2.permission = {
|
|
96066
96066
|
...coder2.permission,
|
|
96067
|
-
|
|
96067
|
+
call_drizzy_agent: "deny",
|
|
96068
96068
|
task: "allow",
|
|
96069
96069
|
question: questionPermission,
|
|
96070
96070
|
"task_*": "allow",
|
|
@@ -96076,7 +96076,7 @@ function applyToolConfig(params) {
|
|
|
96076
96076
|
if (gptcoder) {
|
|
96077
96077
|
gptcoder.permission = {
|
|
96078
96078
|
...gptcoder.permission,
|
|
96079
|
-
|
|
96079
|
+
call_drizzy_agent: "deny",
|
|
96080
96080
|
task: "allow",
|
|
96081
96081
|
question: questionPermission,
|
|
96082
96082
|
...denyTodoTools
|
|
@@ -96086,7 +96086,7 @@ function applyToolConfig(params) {
|
|
|
96086
96086
|
if (planner) {
|
|
96087
96087
|
planner.permission = {
|
|
96088
96088
|
...planner.permission,
|
|
96089
|
-
|
|
96089
|
+
call_drizzy_agent: "deny",
|
|
96090
96090
|
task: "allow",
|
|
96091
96091
|
question: questionPermission,
|
|
96092
96092
|
"task_*": "allow",
|
|
@@ -96315,7 +96315,7 @@ function normalizeToolArgSchemas(toolDefinition) {
|
|
|
96315
96315
|
function createToolRegistry(args) {
|
|
96316
96316
|
const { ctx, pluginConfig, managers, skillContext, availableCategories } = args;
|
|
96317
96317
|
const backgroundTools = createBackgroundTools(managers.backgroundManager, ctx.client);
|
|
96318
|
-
const
|
|
96318
|
+
const callDrizzyAgent = createCallDrizzyAgent(ctx, managers.backgroundManager, pluginConfig.disabled_agents ?? [], pluginConfig.agents, pluginConfig.categories);
|
|
96319
96319
|
const isMultimodalLookerEnabled = !(pluginConfig.disabled_agents ?? []).some((agent) => agent.toLowerCase() === "multimodal-looker");
|
|
96320
96320
|
const lookAt = isMultimodalLookerEnabled ? createLookAt(ctx) : null;
|
|
96321
96321
|
const delegateTask = createDelegateTask({
|
|
@@ -96382,7 +96382,7 @@ function createToolRegistry(args) {
|
|
|
96382
96382
|
...createAstGrepTools(ctx),
|
|
96383
96383
|
...createSessionManagerTools(ctx),
|
|
96384
96384
|
...backgroundTools,
|
|
96385
|
-
|
|
96385
|
+
call_drizzy_agent: callDrizzyAgent,
|
|
96386
96386
|
...lookAt ? { look_at: lookAt } : {},
|
|
96387
96387
|
task: delegateTask,
|
|
96388
96388
|
skill_mcp: skillMcpTool,
|
|
@@ -97123,7 +97123,7 @@ function createEventHandler2(args) {
|
|
|
97123
97123
|
await Promise.resolve(hooks2.compactionContextInjector?.event?.(input));
|
|
97124
97124
|
await Promise.resolve(hooks2.compactionTodoPreserver?.event?.(input));
|
|
97125
97125
|
await Promise.resolve(hooks2.writeExistingFileGuard?.event?.(input));
|
|
97126
|
-
await Promise.resolve(hooks2.
|
|
97126
|
+
await Promise.resolve(hooks2.orchestratorHook?.handler?.(input));
|
|
97127
97127
|
await Promise.resolve(hooks2.autoSlashCommand?.event?.(input));
|
|
97128
97128
|
};
|
|
97129
97129
|
const recentSyntheticIdles = new Map;
|
|
@@ -97425,7 +97425,7 @@ function createToolExecuteAfterHandler3(args) {
|
|
|
97425
97425
|
await hooks2.interactiveBashSession?.["tool.execute.after"]?.(input, output);
|
|
97426
97426
|
await hooks2.editErrorRecovery?.["tool.execute.after"]?.(input, output);
|
|
97427
97427
|
await hooks2.delegateTaskRetry?.["tool.execute.after"]?.(input, output);
|
|
97428
|
-
await hooks2.
|
|
97428
|
+
await hooks2.orchestratorHook?.["tool.execute.after"]?.(input, output);
|
|
97429
97429
|
await hooks2.taskResumeInfo?.["tool.execute.after"]?.(input, output);
|
|
97430
97430
|
await hooks2.readImageResizer?.["tool.execute.after"]?.(input, output);
|
|
97431
97431
|
await hooks2.hashlineReadEnhancer?.["tool.execute.after"]?.(input, output);
|
|
@@ -97493,7 +97493,7 @@ function createToolExecuteBeforeHandler3(args) {
|
|
|
97493
97493
|
await hooks2.tasksTodowriteDisabler?.["tool.execute.before"]?.(input, output);
|
|
97494
97494
|
await hooks2.plannerMdOnly?.["tool.execute.before"]?.(input, output);
|
|
97495
97495
|
await hooks2.coderJuniorNotepad?.["tool.execute.before"]?.(input, output);
|
|
97496
|
-
await hooks2.
|
|
97496
|
+
await hooks2.orchestratorHook?.["tool.execute.before"]?.(input, output);
|
|
97497
97497
|
const normalizedToolName = input.tool.toLowerCase();
|
|
97498
97498
|
if (normalizedToolName === "question" || normalizedToolName === "ask_user_question" || normalizedToolName === "askuserquestion") {
|
|
97499
97499
|
const sessionID = input.sessionID || getMainSessionID();
|