@dv.nghiem/flowdeck 0.5.1 → 0.5.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAkHjD,QAAA,MAAM,MAAM,EAAE,MAqSb,CAAA;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAkHjD,QAAA,MAAM,MAAM,EAAE,MAuSb,CAAA;AAED,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -5857,6 +5857,9 @@ function resolveDelegationBudgetConfig(config) {
5857
5857
  };
5858
5858
  }
5859
5859
  function init(runId, config) {
5860
+ const existing = budgets.get(runId);
5861
+ if (existing)
5862
+ return existing;
5860
5863
  const resolved = resolveDelegationBudgetConfig(config);
5861
5864
  const budget = {
5862
5865
  runId,
@@ -5896,6 +5899,15 @@ function recordDelegation(parentRunId, childRunId) {
5896
5899
  budgets.set(childRunId, child);
5897
5900
  return child.currentDepth <= child.config.maxDepth;
5898
5901
  }
5902
+ function releaseDelegation(parentRunId, childRunId) {
5903
+ const child = budgets.get(childRunId);
5904
+ if (!child)
5905
+ return false;
5906
+ const parent = budgets.get(parentRunId);
5907
+ child.currentDepth = parent?.currentDepth ?? 0;
5908
+ budgets.set(childRunId, child);
5909
+ return true;
5910
+ }
5899
5911
  function incrementSameStepRetry(runId) {
5900
5912
  const budget = budgets.get(runId);
5901
5913
  if (!budget)
@@ -5918,9 +5930,12 @@ function toSnapshot(budget) {
5918
5930
 
5919
5931
  // src/tools/delegate.ts
5920
5932
  var DEFAULT_TIMEOUT_MS = 120000;
5933
+ var MAX_TIMEOUT_MS = 600000;
5921
5934
  function normalizeMode(mode) {
5922
5935
  if (mode === "council" || mode === "pipeline")
5923
5936
  return mode;
5937
+ if (typeof mode === "string" && mode.length > 0)
5938
+ return mode;
5924
5939
  return "direct";
5925
5940
  }
5926
5941
  function validateCouncilContext(context) {
@@ -5948,10 +5963,7 @@ function validatePipelineContext(context) {
5948
5963
  function isRegisteredAgent(agent) {
5949
5964
  return AGENT_NAMES.includes(agent);
5950
5965
  }
5951
- function isTextPart2(part) {
5952
- return part.type === "text";
5953
- }
5954
- function createDelegateTool(client, statePersistence) {
5966
+ function createDelegateTool(client, statePersistence, ensureRunContext) {
5955
5967
  return tool13({
5956
5968
  description: "Delegate work to another FlowDeck agent. Use this instead of raw @agent references for any work requiring write/edit/bash or specialist knowledge. " + "Modes: direct (single agent), council (fan out the same task to multiple agents in parallel), pipeline (sequential stages where each stage's output is passed to the next via context.previousOutput). " + "For council mode, provide context.agents (non-empty string array). For pipeline mode, provide context.stages (non-empty array of { agent, task? }).",
5957
5969
  args: {
@@ -5965,15 +5977,13 @@ function createDelegateTool(client, statePersistence) {
5965
5977
  const directory = ctx.directory;
5966
5978
  const sessionID = ctx.sessionID;
5967
5979
  const resolvedMode = normalizeMode(mode);
5968
- const runCtx = statePersistence.getRunContext(sessionID);
5980
+ let runCtx = statePersistence.getRunContext(sessionID);
5969
5981
  if (!runCtx) {
5970
- return {
5971
- span_id: "",
5972
- run_id: "",
5973
- status: "blocked",
5974
- output: "",
5975
- error: "No active run context for this session. Start a command first."
5976
- };
5982
+ runCtx = ensureRunContext({
5983
+ sessionID,
5984
+ description: task,
5985
+ agent
5986
+ });
5977
5987
  }
5978
5988
  if (!getBudget(runCtx.runId)) {
5979
5989
  init(runCtx.runId);
@@ -6002,8 +6012,15 @@ function createDelegateTool(client, statePersistence) {
6002
6012
  };
6003
6013
  }
6004
6014
  const span = statePersistence.openAgentSpan(runCtx, runCtx.currentSpanId, agent, task, runCtx.currentStage ?? "execute");
6005
- const result = await executeDirectDelegation(client, ctx, agent, task, span, runCtx, statePersistence, context);
6006
- statePersistence.closeAgentSpan(span.span_id, result.status === "blocked" ? "blocked" : "complete", {
6015
+ let result;
6016
+ try {
6017
+ result = await executeDirectDelegation(client, ctx, agent, task, span, runCtx, statePersistence, context);
6018
+ } catch (error) {
6019
+ const message = error instanceof Error ? error.message : String(error);
6020
+ result = { status: "failed", output: "", error: message };
6021
+ }
6022
+ const spanStatus = result.status === "blocked" ? "blocked" : result.status === "failed" ? "failed" : "complete";
6023
+ statePersistence.closeAgentSpan(span.span_id, spanStatus, {
6007
6024
  output_valid: result.status === "complete"
6008
6025
  });
6009
6026
  return {
@@ -6127,7 +6144,7 @@ ${r.error ? `ERROR: ${r.error}` : r.output}`).join(`
6127
6144
  run_id: runCtx.runId,
6128
6145
  status: "blocked",
6129
6146
  output: "",
6130
- error: `Delegation mode "${resolvedMode}" is not supported.`
6147
+ error: `Delegation mode "${resolvedMode}" is not supported by this version of FlowDeck. Use mode: "direct" for now. For multi-stage work, make sequential "direct" delegate calls from the orchestrator and pass each stage's output via context.previousOutput.`
6131
6148
  };
6132
6149
  } catch (error) {
6133
6150
  const message = error instanceof Error ? error.message : String(error);
@@ -6138,10 +6155,64 @@ ${r.error ? `ERROR: ${r.error}` : r.output}`).join(`
6138
6155
  output: "",
6139
6156
  error: message
6140
6157
  };
6158
+ } finally {
6159
+ releaseDelegation(runCtx.runId, childRunId);
6141
6160
  }
6142
6161
  }
6143
6162
  });
6144
6163
  }
6164
+ function collectTextFromParts(parts) {
6165
+ if (!Array.isArray(parts))
6166
+ return "";
6167
+ return parts.filter((part) => {
6168
+ if (!part || typeof part !== "object")
6169
+ return false;
6170
+ const type = "type" in part ? part.type : undefined;
6171
+ return type === "text" || type === "step-finish";
6172
+ }).map((part) => {
6173
+ const text = "text" in part && typeof part.text === "string" ? part.text : undefined;
6174
+ const content = "content" in part && typeof part.content === "string" ? part.content : undefined;
6175
+ return text ?? content ?? "";
6176
+ }).filter((text) => text.length > 0).join(`
6177
+ `);
6178
+ }
6179
+ function extractTextOutput(promptRes) {
6180
+ const data = promptRes?.data;
6181
+ for (const parts of [data?.parts, data?.message?.parts, data?.info?.message?.parts]) {
6182
+ const output = collectTextFromParts(parts);
6183
+ if (output)
6184
+ return output;
6185
+ }
6186
+ return "";
6187
+ }
6188
+ function extractMessageContent(message) {
6189
+ if (!message || typeof message !== "object")
6190
+ return "";
6191
+ if ("content" in message && typeof message.content === "string")
6192
+ return message.content;
6193
+ if ("parts" in message)
6194
+ return collectTextFromParts(message.parts);
6195
+ return "";
6196
+ }
6197
+ async function fetchFallbackOutput(client, childId) {
6198
+ const sessionClient = client.session;
6199
+ if (typeof sessionClient.messages !== "function")
6200
+ return "";
6201
+ const messageRes = await sessionClient.messages({ path: { id: childId } }).catch(() => null);
6202
+ const data = messageRes?.data;
6203
+ const messages = Array.isArray(data) ? data : Array.isArray(data?.messages) ? data.messages : [];
6204
+ for (let index = messages.length - 1;index >= 0; index -= 1) {
6205
+ const message = messages[index];
6206
+ if (!message || typeof message !== "object")
6207
+ continue;
6208
+ const role = "role" in message ? message.role : undefined;
6209
+ const author = "author" in message ? message.author : undefined;
6210
+ if (role === "assistant" || author === "assistant") {
6211
+ return extractMessageContent(message);
6212
+ }
6213
+ }
6214
+ return "";
6215
+ }
6145
6216
  function extractErrorMessage(error) {
6146
6217
  if (error instanceof Error)
6147
6218
  return error.message;
@@ -6164,6 +6235,7 @@ async function executeDirectDelegation(client, ctx, agent, task, span, runCtx, s
6164
6235
  };
6165
6236
  }
6166
6237
  const childId = createRes.data.id;
6238
+ const timeoutMs = Math.min(typeof context?.timeoutMs === "number" ? context.timeoutMs : DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS);
6167
6239
  statePersistence.updateRunContext({
6168
6240
  ...runCtx,
6169
6241
  sessionID: childId,
@@ -6172,14 +6244,32 @@ async function executeDirectDelegation(client, ctx, agent, task, span, runCtx, s
6172
6244
  const parts = [
6173
6245
  { type: "text", text: buildDelegatePrompt(agent, task, context) }
6174
6246
  ];
6175
- const promptRes = await Promise.race([
6176
- client.session.prompt({
6177
- path: { id: childId },
6178
- body: { agent, parts },
6179
- query: { directory: ctx.directory }
6180
- }),
6181
- new Promise((_, reject) => setTimeout(() => reject(new Error("Delegate session timed out")), DEFAULT_TIMEOUT_MS))
6182
- ]);
6247
+ let promptRes;
6248
+ try {
6249
+ promptRes = await Promise.race([
6250
+ client.session.prompt({
6251
+ path: { id: childId },
6252
+ body: { agent, parts },
6253
+ query: { directory: ctx.directory }
6254
+ }),
6255
+ new Promise((_, reject) => setTimeout(() => reject(new Error("Delegate session timed out")), timeoutMs))
6256
+ ]);
6257
+ } catch (error) {
6258
+ if (error instanceof Error && error.message === "Delegate session timed out") {
6259
+ const sessionClient = client.session;
6260
+ await sessionClient.abort?.({ path: { id: childId } }).catch(() => {});
6261
+ return {
6262
+ status: "failed",
6263
+ output: "",
6264
+ error: `Delegate session ${childId} (agent: ${agent}) timed out after ${timeoutMs}ms.`
6265
+ };
6266
+ }
6267
+ throw error;
6268
+ }
6269
+ if (process.env.FLOWDECK_DEBUG_DELEGATE) {
6270
+ console.error("[flowdeck delegate] prompt data keys", Object.keys(promptRes.data ?? {}));
6271
+ console.error("[flowdeck delegate] prompt data", JSON.stringify(promptRes.data));
6272
+ }
6183
6273
  if (promptRes.error) {
6184
6274
  return {
6185
6275
  status: "failed",
@@ -6187,11 +6277,17 @@ async function executeDirectDelegation(client, ctx, agent, task, span, runCtx, s
6187
6277
  error: extractErrorMessage(promptRes.error)
6188
6278
  };
6189
6279
  }
6190
- const output = (promptRes.data?.parts ?? []).filter(isTextPart2).map((p) => p.text).join(`
6191
- `);
6280
+ const output = extractTextOutput(promptRes) || await fetchFallbackOutput(client, childId);
6281
+ if (!output) {
6282
+ return {
6283
+ status: "failed",
6284
+ output: "",
6285
+ error: `Subagent session ${childId} (agent: ${agent}) produced no text output after prompt + message fetch. This may indicate the subagent ended without a text summary, or the SDK response shape changed — check FLOWDECK_DEBUG_DELEGATE logs.`
6286
+ };
6287
+ }
6192
6288
  return {
6193
6289
  status: "complete",
6194
- output: output || "(no output)"
6290
+ output
6195
6291
  };
6196
6292
  }
6197
6293
  function buildDelegatePrompt(agent, task, context) {
@@ -11440,13 +11536,46 @@ function createHarnessController(config) {
11440
11536
  function log(msg) {
11441
11537
  appLog(msg);
11442
11538
  }
11443
- function getRunCtxOrThrow(sessionID) {
11539
+ function getRunCtxStrict(sessionID) {
11444
11540
  const ctx = statePersistence.getRunContext(sessionID);
11445
11541
  if (!ctx) {
11446
11542
  throw new Error(`No active run context for session ${sessionID}`);
11447
11543
  }
11448
11544
  return ctx;
11449
11545
  }
11546
+ const ensureRunContext = (input) => {
11547
+ const { sessionID, command = "auto", description, agent } = input;
11548
+ const existing = statePersistence.getRunContext(sessionID);
11549
+ if (existing) {
11550
+ return existing;
11551
+ }
11552
+ const route = buildAdaptiveWorkflow(description);
11553
+ state.currentWorkflowClass = route.workflowClass ?? route.taskType;
11554
+ const currentStage = route.stageSequence[0]?.name ?? "discuss";
11555
+ const runCtx = statePersistence.startRun(command, { arguments: description, agent }, sessionID);
11556
+ const assembledContext = contextIngress.assemble({
11557
+ runId: runCtx.runId,
11558
+ sessionId: sessionID,
11559
+ projectRoot: directory,
11560
+ command,
11561
+ description,
11562
+ currentStage
11563
+ });
11564
+ const budget = assembledContext.tokenBudget;
11565
+ log(`[context-ingress] run=${sessionID} trivial=${assembledContext.isTrivialChat} ` + `tokens=${budget.usedTokens}/${budget.limitTokens} (${budget.component})`);
11566
+ const ctxWithWorkflow = {
11567
+ ...runCtx,
11568
+ workflowClass: state.currentWorkflowClass,
11569
+ currentStage
11570
+ };
11571
+ statePersistence.updateRunContext(ctxWithWorkflow);
11572
+ statePersistence.recordObservation(ctxWithWorkflow, "workflow", JSON.stringify({
11573
+ workflowClass: state.currentWorkflowClass,
11574
+ currentStage,
11575
+ stageSequence: route.stageSequence.map((s) => s.name)
11576
+ }));
11577
+ return ctxWithWorkflow;
11578
+ };
11450
11579
  function buildCommandAuditEntry(req, runCtx) {
11451
11580
  return {
11452
11581
  id: randomUUID8(),
@@ -11511,31 +11640,12 @@ function createHarnessController(config) {
11511
11640
  state.lastCommandOutput = null;
11512
11641
  state.lastActiveSessionID = req.sessionID;
11513
11642
  const description = `${req.command} ${req.arguments ?? ""}`.trim();
11514
- const route = buildAdaptiveWorkflow(description);
11515
- state.currentWorkflowClass = route.workflowClass ?? route.taskType;
11516
- const currentStage = route.stageSequence[0]?.name ?? "discuss";
11517
- const runCtx = statePersistence.startRun(req.command, { arguments: req.arguments }, req.sessionID);
11518
- const assembledContext = contextIngress.assemble({
11519
- runId: runCtx.runId,
11520
- sessionId: req.sessionID,
11521
- projectRoot: directory,
11643
+ const ctxWithWorkflow = ensureRunContext({
11644
+ sessionID: req.sessionID,
11522
11645
  command: req.command,
11523
11646
  description,
11524
- currentStage
11647
+ agent: req.agent
11525
11648
  });
11526
- const budget = assembledContext.tokenBudget;
11527
- log(`[context-ingress] run=${req.sessionID} trivial=${assembledContext.isTrivialChat} ` + `tokens=${budget.usedTokens}/${budget.limitTokens} (${budget.component})`);
11528
- const ctxWithWorkflow = {
11529
- ...runCtx,
11530
- workflowClass: state.currentWorkflowClass,
11531
- currentStage
11532
- };
11533
- statePersistence.updateRunContext(ctxWithWorkflow);
11534
- statePersistence.recordObservation(ctxWithWorkflow, "workflow", JSON.stringify({
11535
- workflowClass: state.currentWorkflowClass,
11536
- currentStage,
11537
- stageSequence: route.stageSequence.map((s) => s.name)
11538
- }));
11539
11649
  try {
11540
11650
  auditLog.append(buildCommandAuditEntry(req, ctxWithWorkflow));
11541
11651
  } catch (error) {
@@ -11545,7 +11655,11 @@ function createHarnessController(config) {
11545
11655
  return ctxWithWorkflow;
11546
11656
  },
11547
11657
  evaluateToolCall(req) {
11548
- const runCtx = getRunCtxOrThrow(req.sessionID);
11658
+ const runCtx = statePersistence.getRunContext(req.sessionID) ?? ensureRunContext({
11659
+ sessionID: req.sessionID,
11660
+ description: `${req.tool} ${JSON.stringify(req.args)} auto-invoked`,
11661
+ agent: req.agent
11662
+ });
11549
11663
  state.lastActiveSessionID = req.sessionID;
11550
11664
  const agent = req.agent ?? "orchestrator";
11551
11665
  try {
@@ -11617,6 +11731,7 @@ function createHarnessController(config) {
11617
11731
  return contextIngress.getAssembledContext(sessionID);
11618
11732
  },
11619
11733
  endRun,
11734
+ ensureRunContext,
11620
11735
  getCurrentStage(sessionID) {
11621
11736
  const sid = sessionID ?? state.lastActiveSessionID;
11622
11737
  if (!sid)
@@ -11693,7 +11808,7 @@ var plugin = async (input, _options) => {
11693
11808
  contextIngress
11694
11809
  });
11695
11810
  harness.init();
11696
- const delegateTool = createDelegateTool(client, harness.getStatePersistence());
11811
+ const delegateTool = createDelegateTool(client, harness.getStatePersistence(), (input2) => harness.ensureRunContext(input2));
11697
11812
  const contextMonitor = harness.getContextMonitor();
11698
11813
  const shellEnvHook = createShellEnvHook({ directory, worktree });
11699
11814
  const todoHook = createTodoHook(client);
@@ -41,6 +41,7 @@ export declare function init(runId: string, config?: FlowDeckConfig): Delegation
41
41
  export declare function getBudget(runId: string): DelegationBudgetSnapshot | null;
42
42
  export declare function checkSpend(runId: string, _toolName?: string): PolicyDecision;
43
43
  export declare function recordDelegation(parentRunId: string, childRunId: string): boolean;
44
+ export declare function releaseDelegation(parentRunId: string, childRunId: string): boolean;
44
45
  export declare function incrementSameStepRetry(runId: string): boolean;
45
46
  export declare function resetSameStepRetry(runId: string): void;
46
47
  export declare function toSnapshot(budget: DelegationBudget): DelegationBudgetSnapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"delegation-budget.d.ts","sourceRoot":"","sources":["../../src/services/delegation-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,iBAAiB,CAAA;AAGpE,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,sBAAsB,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AA6BD,wBAAgB,6BAA6B,CAC3C,MAAM,CAAC,EAAE,cAAc,GACtB,sBAAsB,CAQxB;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAW7E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAIxE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAe5E;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAYjF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAK7D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,wBAAwB,CAW7E;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAMlE;AAED,8CAA8C;AAC9C,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAOlE;AAED,qDAAqD;AACrD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
1
+ {"version":3,"file":"delegation-budget.d.ts","sourceRoot":"","sources":["../../src/services/delegation-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,iBAAiB,CAAA;AAGpE,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,sBAAsB,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AA6BD,wBAAgB,6BAA6B,CAC3C,MAAM,CAAC,EAAE,cAAc,GACtB,sBAAsB,CAQxB;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAc7E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAIxE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAe5E;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAYjF;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQlF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAK7D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,wBAAwB,CAW7E;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAMlE;AAED,8CAA8C;AAC9C,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAOlE;AAED,qDAAqD;AACrD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -11,6 +11,7 @@ import type { AssembledContext, RunContext } from "./harness-types";
11
11
  import { type ContextIngressService } from "./context-ingress";
12
12
  import { type StatePersistenceService } from "./state-persistence";
13
13
  import { createContextWindowMonitorHook } from "../hooks/context-window-monitor";
14
+ import type { EnsureRunContext } from "./harness-types";
14
15
  import { type VerificationLayer } from "./verification-layer";
15
16
  import { type RecoveryLayer } from "./recovery-layer";
16
17
  export interface HarnessControllerConfig {
@@ -43,6 +44,7 @@ export interface SessionEvent {
43
44
  export interface HarnessController {
44
45
  init(): void;
45
46
  onCommandBefore(req: CommandRequest): RunContext;
47
+ ensureRunContext: EnsureRunContext;
46
48
  evaluateToolCall(req: ToolCallRequest): PolicyDecision;
47
49
  recordToolOutcome(req: ToolCallRequest, output: unknown, status: "success" | "error" | "blocked"): void;
48
50
  onSessionEvent(evt: SessionEvent): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"harness-controller.d.ts","sourceRoot":"","sources":["../../src/services/harness-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-controller.d.ts","sourceRoot":"","sources":["../../src/services/harness-controller.ts"],"names":[],"mappings":"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"}
@@ -106,6 +106,13 @@ export interface RunContext {
106
106
  workflowClass?: string;
107
107
  currentStage?: string;
108
108
  }
109
+ /** Lazy, idempotent run-context initializer used by tools and auto-routers. */
110
+ export type EnsureRunContext = (input: {
111
+ sessionID: string;
112
+ command?: string;
113
+ description: string;
114
+ agent?: string;
115
+ }) => RunContext;
109
116
  /** Possible recovery actions when a run is stuck or fails. */
110
117
  export type RecoveryAction = "retry" | "fallback-agent" | "escalate" | "stop";
111
118
  /** Arguments accepted by the delegate tool. */
@@ -120,6 +127,7 @@ export interface DelegateToolArgs {
120
127
  task?: string;
121
128
  }>;
122
129
  previousOutput?: string;
130
+ timeoutMs?: number;
123
131
  };
124
132
  }
125
133
  /** Progress entry for a single pipeline stage. */
@@ -1 +1 @@
1
- {"version":3,"file":"harness-types.d.ts","sourceRoot":"","sources":["../../src/services/harness-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-types.d.ts","sourceRoot":"","sources":["../../src/services/harness-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEhE,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;CACf;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,YAAY,EAAE,SAAS,EAAE,CAAA;IACzB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,WAAW,EAAE,mBAAmB,CAAA;CACjC;AAED,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AAElF,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAA;IACf,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,wDAAwD;IACxD,YAAY,EAAE,OAAO,CAAA;IACrB,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,wCAAwC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;CACd;AAED,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAA;IACvD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,KAAK,UAAU,CAAA;AAEhB,8DAA8D;AAC9D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,gBAAgB,GAAG,UAAU,GAAG,MAAM,CAAA;AAE7E,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAA;IACxC,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;QACjB,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAChD,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAA;IACrD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAA;CAC5C;AAED,iCAAiC;AACjC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;AAEpD,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,aAAa,CAAA;IACtB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC;AAED,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B"}
@@ -10,7 +10,7 @@
10
10
  import { type ToolDefinition } from "@opencode-ai/plugin";
11
11
  import type { OpencodeClient } from "@opencode-ai/sdk";
12
12
  import type { StatePersistenceService } from "../services/state-persistence";
13
- import type { DelegateResult, DelegateToolArgs } from "../services/harness-types";
13
+ import type { DelegateResult, DelegateToolArgs, EnsureRunContext } from "../services/harness-types";
14
14
  export type { DelegateResult, DelegateToolArgs };
15
- export declare function createDelegateTool(client: OpencodeClient, statePersistence: StatePersistenceService): ToolDefinition;
15
+ export declare function createDelegateTool(client: OpencodeClient, statePersistence: StatePersistenceService, ensureRunContext: EnsureRunContext): ToolDefinition;
16
16
  //# sourceMappingURL=delegate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/tools/delegate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAA;AAGtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAc,MAAM,2BAA2B,CAAA;AAK7F,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AA6ChD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,gBAAgB,EAAE,uBAAuB,GACxC,cAAc,CAsPhB"}
1
+ {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/tools/delegate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAA;AAGtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAc,MAAM,2BAA2B,CAAA;AAK/G,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AA+ChD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,gBAAgB,EAAE,uBAAuB,EACzC,gBAAgB,EAAE,gBAAgB,GACjC,cAAc,CA6PhB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dv.nghiem/flowdeck",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "FlowDeck — structured planning and execution workflows for OpenCode",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",