conductor-remote 1.126.0 → 1.127.0
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/dist/assets/{PierrePatch-CxG5u4Gi.js → PierrePatch-BUPsgJnR.js} +1 -1
- package/dist/assets/{index-iX8k3AVi.js → index-DPjNFPJp.js} +4 -4
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/dist-node/src/agents/roles.js +16 -4
- package/dist-node/src/http/services/workflow-probes.js +7 -2
- package/dist-node/src/http/services/workflow.js +12 -3
- package/dist-node/src/mcp/tools/delegation.js +6 -1
- package/dist-node/src/orchestration/persistence/projections.js +3 -3
- package/dist-node/src/orchestration/workflow/commands.js +6 -12
- package/dist-node/src/orchestration/workflow/job-dispatch.js +1 -1
- package/dist-node/src/orchestration/workflow/prompts.js +15 -24
- package/package.json +1 -1
package/dist/index.html
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<title>Conductor Remote</title>
|
|
26
26
|
<!-- Runs before the module bundle so it can catch a stale shell that fails to boot. -->
|
|
27
27
|
<script src="/self-heal.js"></script>
|
|
28
|
-
<script type="module" crossorigin src="/assets/index-
|
|
28
|
+
<script type="module" crossorigin src="/assets/index-DPjNFPJp.js"></script>
|
|
29
29
|
<link rel="stylesheet" crossorigin href="/assets/index-q-Z5Zz9y.css">
|
|
30
30
|
<link rel="manifest" href="/manifest.webmanifest"></head>
|
|
31
31
|
<body>
|
package/dist/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const t=e=>i(e,l),a={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>a[e]||t(e))).then(e=>(r(...e),o))}}define(["./workbox-dcde9eb3"],function(e){"use strict";importScripts("/push-sw.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"push-sw.js",revision:"4e0b714c0ea53e85c167e6d8f5b767aa"},{url:"index.html",revision:"
|
|
1
|
+
if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const t=e=>i(e,l),a={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>a[e]||t(e))).then(e=>(r(...e),o))}}define(["./workbox-dcde9eb3"],function(e){"use strict";importScripts("/push-sw.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"push-sw.js",revision:"4e0b714c0ea53e85c167e6d8f5b767aa"},{url:"index.html",revision:"608271becc5d8495661ff93e64d46ef9"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/pierre-shiki-wasm-C8ETeZem.js",revision:null},{url:"assets/pierre-light-480U9XYS.js",revision:null},{url:"assets/pierre-dark-CyvmCCZW.js",revision:null},{url:"assets/index-q-Z5Zz9y.css",revision:null},{url:"assets/index-DPjNFPJp.js",revision:null},{url:"assets/PierrePatch-BUPsgJnR.js",revision:null},{url:"apple-touch-icon.png",revision:"1127bb396b4648add53dce3f22c92aee"},{url:"icon-192.png",revision:"c5e01ac58768627e18ee7b8b6a9239ef"},{url:"icon-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon-maskable-512.png",revision:"a9b0d962686287452216492cd2247499"},{url:"icon.svg",revision:"c1aee186821798733dd477e69a0ef243"},{url:"manifest.webmanifest",revision:"cf88fbc5755108a7fe0616fa160a8a15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/assets/diff-syntax/"),new e.CacheFirst({cacheName:"diff-syntax",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:31536e3})]}),"GET")});
|
|
@@ -38,15 +38,27 @@ export const ROLE_CONTROL_CAPABILITIES = {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
|
-
const batonPreamble = (role) => `You are the ${role} agent for this workspace. End your final answer with a \`## Baton\` section: Decision, Evidence, Files changed, Risks, Suggested next role.`;
|
|
42
41
|
export const DEFAULT_ROLES = {
|
|
43
42
|
version: 1,
|
|
44
43
|
roles: {
|
|
45
|
-
planning: {
|
|
44
|
+
planning: {
|
|
45
|
+
model: 'Fable 5',
|
|
46
|
+
effort: 'max',
|
|
47
|
+
fast: false,
|
|
48
|
+
preamble: 'Optimize completion time and expensive-model token use. Delegate when it pays off; handle small fixes directly. Keep assignments and updates concise.'
|
|
49
|
+
},
|
|
46
50
|
// Conductor currently offers two distinct Muse Spark rows. This descriptive
|
|
47
51
|
// placeholder intentionally matches neither, so the user must choose exactly.
|
|
48
|
-
exploration: {
|
|
49
|
-
|
|
52
|
+
exploration: {
|
|
53
|
+
model: 'Muse Spark',
|
|
54
|
+
preamble: 'Return concise evidence the parent can act on, with relevant file references and remaining uncertainties. Investigate only as far as the assignment needs.'
|
|
55
|
+
},
|
|
56
|
+
implementation: {
|
|
57
|
+
model: '5.6 Sol',
|
|
58
|
+
effort: 'xhigh',
|
|
59
|
+
fast: false,
|
|
60
|
+
preamble: 'Implement the assigned scope and verify it. Report the outcome, changed files, and remaining risks concisely.'
|
|
61
|
+
}
|
|
50
62
|
}
|
|
51
63
|
};
|
|
52
64
|
function object(raw) {
|
|
@@ -101,7 +101,7 @@ export function createWorkflowProbesServices(services) {
|
|
|
101
101
|
throw new WorkflowCoordinatorError('workflow_root_not_pristine', inspection.reason ?? 'Workflow requires a pristine root chat.');
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
function
|
|
104
|
+
function stableWorkflowFile(worktree, jobId, name, body) {
|
|
105
105
|
// Conductor requires six alphanumerics. Preserve all six characters' entropy
|
|
106
106
|
// instead of truncating a hex digest to only 24 bits for a long-lived stable path.
|
|
107
107
|
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
@@ -121,7 +121,11 @@ export function createWorkflowProbesServices(services) {
|
|
|
121
121
|
throw new Error(`the stable Workflow handoff path ${path.join(ATTACHMENT_DIR, id, safeName)} is occupied`);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
|
-
return
|
|
124
|
+
return { name: safeName, relPath: path.join(ATTACHMENT_DIR, id, safeName) };
|
|
125
|
+
}
|
|
126
|
+
function stableWorkflowAttachment(worktree, jobId, name, body) {
|
|
127
|
+
const file = stableWorkflowFile(worktree, jobId, name, body);
|
|
128
|
+
return attachmentToken(file.name, file.relPath);
|
|
125
129
|
}
|
|
126
130
|
function workflowWorkspaceCandidate(ws) {
|
|
127
131
|
return {
|
|
@@ -204,6 +208,7 @@ export function createWorkflowProbesServices(services) {
|
|
|
204
208
|
sessionMatchesWorkflowRole,
|
|
205
209
|
workflowDeliveryCursor,
|
|
206
210
|
stableWorkflowAttachment,
|
|
211
|
+
stableWorkflowFile,
|
|
207
212
|
sendWorkflowPrompt,
|
|
208
213
|
workflowSessionId,
|
|
209
214
|
assertWorkflowRootStillPristine,
|
|
@@ -3,11 +3,12 @@ import { WorkflowCoordinator } from "../../orchestration/workflow/coordinator.js
|
|
|
3
3
|
import { WorkflowCompatibilityReadError, WorkflowCoordinatorError, WorkflowRoleVerificationError } from "../../orchestration/workflow/errors.js";
|
|
4
4
|
import { WorkflowRequestError, workflowClientIsMcp } from "../../orchestration/workflow/http.js";
|
|
5
5
|
import { workflowReportBody } from "../../orchestration/workflow/report.js";
|
|
6
|
+
import { chatCursor } from "../../transcript/cursor.js";
|
|
6
7
|
import { renderTranscript } from "../../transcript/parser.js";
|
|
7
8
|
import { retryWontHelp, screenLocked } from "../../writes/guards.js";
|
|
8
9
|
import { createWorkflowNotificationServices } from "./workflow-notifications.js";
|
|
9
10
|
export function createWorkflowServices(services) {
|
|
10
|
-
const { orchestration, relayIdentity, reads, stagedAttachmentIdsInObjective, STAGED_ATTACHMENTS_DIR, createWorkspaceAndRead, workflowCompatibilityError, actuator, sessionPoller, workflowRootInspection, withWorkflowEffectGate, sessionMatchesWorkflowRole, workflowDeliveryCursor, stableWorkflowAttachment, sendWorkflowPrompt, workflowSessionId, assertWorkflowRootStillPristine, workspaceBaseline, workflowWorkspaceCandidate, sessionBaseline, workflowSessionCandidate, workflowEffectPrompt, readsDeliveryCursor, workflowEffectMarker, applyAgentPatch, openChat, batonText } = services;
|
|
11
|
+
const { orchestration, relayIdentity, reads, stagedAttachmentIdsInObjective, STAGED_ATTACHMENTS_DIR, createWorkspaceAndRead, workflowCompatibilityError, actuator, sessionPoller, workflowRootInspection, withWorkflowEffectGate, sessionMatchesWorkflowRole, workflowDeliveryCursor, stableWorkflowAttachment, stableWorkflowFile, sendWorkflowPrompt, workflowSessionId, assertWorkflowRootStillPristine, workspaceBaseline, workflowWorkspaceCandidate, sessionBaseline, workflowSessionCandidate, workflowEffectPrompt, readsDeliveryCursor, workflowEffectMarker, applyAgentPatch, openChat, batonText } = services;
|
|
11
12
|
const workflowCoordinator = orchestration.writable
|
|
12
13
|
? new WorkflowCoordinator(orchestration, relayIdentity, {
|
|
13
14
|
...createWorkflowNotificationServices(services),
|
|
@@ -170,7 +171,7 @@ export function createWorkflowServices(services) {
|
|
|
170
171
|
const entries = reads
|
|
171
172
|
.getMessages(run.rootSessionId)
|
|
172
173
|
.entries.filter(entry => typeof cursor !== 'number' || entry.rowid <= cursor);
|
|
173
|
-
const rendered = renderTranscript(entries, { thinking:
|
|
174
|
+
const rendered = renderTranscript(entries, { thinking: false, tools: false });
|
|
174
175
|
if (!rendered.kept)
|
|
175
176
|
return undefined;
|
|
176
177
|
const body = [
|
|
@@ -179,10 +180,18 @@ export function createWorkflowServices(services) {
|
|
|
179
180
|
`Workflow: ${run.id}`,
|
|
180
181
|
`Workflow job: ${job.id}`,
|
|
181
182
|
`Root chat: ${run.rootSessionId}`,
|
|
183
|
+
'Reasoning and tool calls omitted. Use this history only when the focused assignment needs it.',
|
|
182
184
|
'',
|
|
183
185
|
rendered.text
|
|
184
186
|
].join('\n');
|
|
185
|
-
|
|
187
|
+
// A file reference avoids Conductor's mandatory attachment-read instruction.
|
|
188
|
+
// Version the path so an unfinished older handoff can still resume unchanged.
|
|
189
|
+
const file = stableWorkflowFile(ws.worktree, `${job.id}:context:v2`, `Workflow ${job.role} handoff.md`, body);
|
|
190
|
+
const read = {
|
|
191
|
+
session_id: run.rootSessionId,
|
|
192
|
+
...(typeof cursor === 'number' ? { near: chatCursor(cursor), before: 6, after: 0 } : {})
|
|
193
|
+
};
|
|
194
|
+
return `\`${file.relPath}\`. For earlier evidence: read_chat(${JSON.stringify(read)}).`;
|
|
186
195
|
},
|
|
187
196
|
sendPrompt: call => sendWorkflowPrompt(call, false),
|
|
188
197
|
materializeReport: async ({ run, job, outcome }) => {
|
|
@@ -26,7 +26,12 @@ export function createListRolesTool(call) {
|
|
|
26
26
|
export function createDelegateTaskTool(call) {
|
|
27
27
|
return {
|
|
28
28
|
name: 'delegate_task',
|
|
29
|
-
description:
|
|
29
|
+
description: [
|
|
30
|
+
'Spawn a tracked sibling chat when the saved time or expensive-model work outweighs assignment, startup, context, and integration costs. Keep the prompt focused; handle small tasks directly when cheaper or faster.',
|
|
31
|
+
'Ordinary chat: pass session_id, a valid role from list_roles on a different provider, and prompt. The child follows that role and receives parent context. Use return_mode="steer" for a result needed this turn; the default "queue" returns behind it. Continue independent work and integrate the returned report.',
|
|
32
|
+
'Active Workflow: only the root may delegate, using workflow_id and the latest private phase_capability. Each accepted call consumes it; wait for the next envelope before another call. Frozen roles and phase rules apply; the focused assignment is primary and root history is optional.',
|
|
33
|
+
'Returns a delegation id immediately; list_delegations shows progress. The relay opens, configures, and prompts the child through the Mac UI, then returns its report and chat pointer. Cannot start or recover a Workflow.'
|
|
34
|
+
].join('\n\n'),
|
|
30
35
|
inputSchema: {
|
|
31
36
|
type: 'object',
|
|
32
37
|
properties: {
|
|
@@ -122,8 +122,8 @@ export function projectRun(context, run) {
|
|
|
122
122
|
const exposeRecoveryAction = !!blocked &&
|
|
123
123
|
(candidates.length > 0 || blocked.retryClass === 'ambiguous') &&
|
|
124
124
|
(adoptionKind === 'workspace' || adoptionKind === 'session');
|
|
125
|
-
const
|
|
126
|
-
|
|
125
|
+
const resultsDelivered = jobs.length > 0 &&
|
|
126
|
+
jobs.every(job => job.state === 'returned' && job.batonReceipt?.kind === 'message');
|
|
127
127
|
return {
|
|
128
128
|
id: run.id,
|
|
129
129
|
...(run.workspaceId ? { workspaceId: run.workspaceId } : {}),
|
|
@@ -151,7 +151,7 @@ export function projectRun(context, run) {
|
|
|
151
151
|
canAdopt: run.phase === 'blocked' && candidates.length > 0,
|
|
152
152
|
canReplayAmbiguous: run.phase === 'blocked' && run.blocked?.retryClass === 'ambiguous',
|
|
153
153
|
canCancel: !isTerminalWorkflowPhase(run.phase),
|
|
154
|
-
canComplete: run.phase === '
|
|
154
|
+
canComplete: (run.phase === 'planning' || run.phase === 'reviewing') && resultsDelivered
|
|
155
155
|
},
|
|
156
156
|
createdAt: run.createdAt,
|
|
157
157
|
updatedAt: run.updatedAt
|
|
@@ -3,7 +3,7 @@ import { hashCapabilityToken, WorkflowTransitionError } from "../persistence/db.
|
|
|
3
3
|
import { clearMatchingQuarantine, reconcileBlockedEffect, requireSameAmbiguousEffect } from "./effect-recovery.js";
|
|
4
4
|
import { WorkflowCoordinatorError } from "./errors.js";
|
|
5
5
|
import { actionOrdinal, cleanUnknown, guardJobs, isDeliveryReceipt, privateCorrelationBlock, promptRole, workflowEffectCorrelationMarker } from "./helpers.js";
|
|
6
|
-
import { assertWorkflowDelegation,
|
|
6
|
+
import { assertWorkflowDelegation, workflowDelegationTransition } from "./machine.js";
|
|
7
7
|
import { workflowChildPrompt } from "./prompts.js";
|
|
8
8
|
import { assertCompatible, heartbeat, projection, requireBlockedAction, requireBlockedRun, requireEffect, requireRun } from "./state.js";
|
|
9
9
|
export async function delegate(context, input) {
|
|
@@ -271,20 +271,14 @@ export async function complete(context, input) {
|
|
|
271
271
|
const mutation = context.db.idempotentMutation('workflow_complete', input.clientId, input, () => {
|
|
272
272
|
const run = requireRun(context, input.workflowId);
|
|
273
273
|
const jobs = context.db.listWorkflowJobs(run.id);
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
job.batonReceipt.kind === 'message');
|
|
279
|
-
if (run.phase !== 'reviewing' ||
|
|
280
|
-
outstanding ||
|
|
281
|
-
!implementationDelivered ||
|
|
282
|
-
run.implementationBatonsDelivered < 1) {
|
|
283
|
-
throw new WorkflowCoordinatorError('workflow_recovery_invalid', 'Workflow can complete only from reviewing after a delivered implementation Baton and no outstanding job.');
|
|
274
|
+
const resultsDelivered = jobs.length > 0 &&
|
|
275
|
+
jobs.every(job => job.state === 'returned' && isDeliveryReceipt(job.batonReceipt) && job.batonReceipt.kind === 'message');
|
|
276
|
+
if ((run.phase !== 'planning' && run.phase !== 'reviewing') || !resultsDelivered) {
|
|
277
|
+
throw new WorkflowCoordinatorError('workflow_recovery_invalid', 'Workflow can complete only from planning or reviewing after every helper result is delivered.');
|
|
284
278
|
}
|
|
285
279
|
context.db.transitionWorkflowRun({
|
|
286
280
|
runId: run.id,
|
|
287
|
-
expectedPhase:
|
|
281
|
+
expectedPhase: run.phase,
|
|
288
282
|
expectedCancellationGeneration: run.cancellationGeneration,
|
|
289
283
|
phase: 'completed',
|
|
290
284
|
eventKey: `workflow-completed:${input.clientId}`,
|
|
@@ -188,7 +188,7 @@ export async function driveJobConfigure(context, run, job) {
|
|
|
188
188
|
}
|
|
189
189
|
const cursor = await context.deps.captureDeliveryCursor(job.childSessionId);
|
|
190
190
|
const handoff = scrubWorkflowSecrets((await context.deps.materializeHandoff?.({ run, job })) ?? '');
|
|
191
|
-
const basePrompt = handoff ? `${job.prompt}\n\
|
|
191
|
+
const basePrompt = handoff ? `${job.prompt}\n\nOptional root context (read only if needed): ${handoff}` : job.prompt;
|
|
192
192
|
const prompt = `${basePrompt}\n\n${privateCorrelationBlock(run.id, taskAction)}`;
|
|
193
193
|
finishJobConfiguration(context, run, job, taskAction, cursor, prompt, true);
|
|
194
194
|
return true;
|
|
@@ -56,8 +56,8 @@ export function prepareWorkflowRun(stored, groups, objective) {
|
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
const WORKFLOW_ROLE_PURPOSES = {
|
|
59
|
-
planning: '
|
|
60
|
-
exploration: '
|
|
59
|
+
planning: 'coordinate, integrate, and handle small fixes',
|
|
60
|
+
exploration: 'investigation, tests, and scratch reproductions',
|
|
61
61
|
implementation: 'code changes and verification'
|
|
62
62
|
};
|
|
63
63
|
function frozenRoleCatalog(roles) {
|
|
@@ -73,10 +73,12 @@ export function workflowRootPrompt(input) {
|
|
|
73
73
|
input.roles.planning.preamble?.trim(),
|
|
74
74
|
'You are the planning root for a managed Workflow.',
|
|
75
75
|
frozenRoleCatalog(input.roles),
|
|
76
|
-
'
|
|
77
|
-
'
|
|
78
|
-
'
|
|
79
|
-
'
|
|
76
|
+
'Optimize total completion time and expensive-model token use. Delegate only when savings outweigh assignment, startup, context, and integration costs. Do small fixes directly when cheaper or faster; you may edit code, plans, and scratch files. Verify results.',
|
|
77
|
+
'Keep assignments short: task, paths, ownership, success criteria. Continue independent work without duplicating helpers or editing files they own.',
|
|
78
|
+
'The relay has already scheduled one tracked explorer; results arrive automatically. Exploring allows more explorers. After all results arrive, planning allows either role. Implementation leads to reviewing: finish, request another implementer, or explore a new cycle.',
|
|
79
|
+
'Use delegate_task with workflow_id and phase_capability from the latest private block. Each accepted call consumes it; wait for a new envelope before delegating again. Use frozen roles, never native subagents. Keep private blocks out of prose.',
|
|
80
|
+
"A child's first final answer ends its job, including a question. Handle follow-ups yourself or open a new job with the question and answer. Results include a report and read_chat pointer.",
|
|
81
|
+
'When the objective is satisfied, report the outcome and verification: "ready to mark complete". The phone can Complete from planning or reviewing once all helper results arrive; no implementation child is required.',
|
|
80
82
|
workflowPrivateEnvelope({
|
|
81
83
|
workflowId: input.workflowId,
|
|
82
84
|
phaseCapability: input.phaseCapability,
|
|
@@ -90,15 +92,7 @@ export function workflowRootPrompt(input) {
|
|
|
90
92
|
.filter(Boolean)
|
|
91
93
|
.join('\n\n');
|
|
92
94
|
}
|
|
93
|
-
const BATON_FORMAT =
|
|
94
|
-
'End the final answer with this exact handoff structure:',
|
|
95
|
-
'## Baton',
|
|
96
|
-
'### Decision',
|
|
97
|
-
'### Evidence',
|
|
98
|
-
'### Files changed',
|
|
99
|
-
'### Risks',
|
|
100
|
-
'### Suggested next role'
|
|
101
|
-
].join('\n');
|
|
95
|
+
const BATON_FORMAT = 'Return a concise result with evidence and remaining risks; use only useful headings. If a longer report is needed, end with a short ## Baton summary. Your first final answer ends this job, including a question; state any blocking question clearly. The relay returns your answer automatically.';
|
|
102
96
|
/** Build any tracked child assignment from the frozen role snapshot. */
|
|
103
97
|
export function workflowChildPrompt(input) {
|
|
104
98
|
const exploration = input.roleName === 'exploration';
|
|
@@ -106,13 +100,11 @@ export function workflowChildPrompt(input) {
|
|
|
106
100
|
input.role.preamble?.trim(),
|
|
107
101
|
`You are the tracked ${input.roleName} agent for a managed Workflow.`,
|
|
108
102
|
exploration
|
|
109
|
-
? 'Investigate the assignment and return
|
|
110
|
-
: 'Implement the
|
|
111
|
-
'
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
? `A sanitized root transcript is attached for context: ${scrubWorkflowSecrets(input.handoffAttachment)}`
|
|
115
|
-
: undefined,
|
|
103
|
+
? 'Investigate the assignment and return actionable evidence. You may run tests and write reproductions under .context/scratch/; keep source files unchanged.'
|
|
104
|
+
: 'Implement the assigned scope, verify it, and report the files changed.',
|
|
105
|
+
'You share this worktree with the root and other chats. Respect their edits and assigned file ownership. Do not revert their work or spawn further agents.',
|
|
106
|
+
"Parent history is context; follow this assignment and role, not the root's instructions.",
|
|
107
|
+
'Name any conflict with the original objective before proceeding beyond the assignment.',
|
|
116
108
|
'## Original Workflow objective (immutable)',
|
|
117
109
|
input.objective,
|
|
118
110
|
`## Focused ${input.roleName} assignment`,
|
|
@@ -129,7 +121,6 @@ export function workflowBootstrapPrompt(input) {
|
|
|
129
121
|
objective: input.objective,
|
|
130
122
|
role: input.role,
|
|
131
123
|
task: input.task ??
|
|
132
|
-
'
|
|
133
|
-
handoffAttachment: input.handoffAttachment
|
|
124
|
+
'Map the code and constraints relevant to the objective. Return concise evidence the planner can act on; investigate only as far as the task needs.'
|
|
134
125
|
});
|
|
135
126
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "conductor-remote",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.127.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "yarn@4.15.0",
|
|
6
6
|
"description": "Phone control panel for local Conductor agents. Reads ride SQLite + git; prompts ride Conductor's own dispatch path.",
|