@grackle-ai/core 0.96.0 → 0.96.2

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.
@@ -29,6 +29,8 @@ export interface DispatchPhaseDeps {
29
29
  }) => Promise<string | undefined>;
30
30
  /** Check if an environment is connected. */
31
31
  isEnvironmentConnected: (environmentId: string) => boolean;
32
+ /** Resolve an environment for a task with no explicit environmentId. */
33
+ resolveEnvironment: (task: TaskRow) => string | undefined;
32
34
  }
33
35
  /**
34
36
  * Create a ReconciliationPhase that drains the dispatch queue.
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-phase.d.ts","sourceRoot":"","sources":["../src/dispatch-phase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,kBAAkB,EAAE,MAAM,gBAAgB,EAAE,CAAC;IAC7C,yDAAyD;IACzD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,4BAA4B;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IACjD,qEAAqE;IACrE,WAAW,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,2DAA2D;IAC3D,iBAAiB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,0EAA0E;IAC1E,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,mFAAmF;IACnF,gBAAgB,EAAE,CAChB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KACrE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjC,4CAA4C;IAC5C,sBAAsB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAyBhF"}
1
+ {"version":3,"file":"dispatch-phase.d.ts","sourceRoot":"","sources":["../src/dispatch-phase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,kBAAkB,EAAE,MAAM,gBAAgB,EAAE,CAAC;IAC7C,yDAAyD;IACzD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,4BAA4B;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IACjD,qEAAqE;IACrE,WAAW,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,2DAA2D;IAC3D,iBAAiB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,0EAA0E;IAC1E,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,mFAAmF;IACnF,gBAAgB,EAAE,CAChB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KACrE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjC,4CAA4C;IAC5C,sBAAsB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,wEAAwE;IACxE,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;CAC3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAyBhF"}
@@ -40,26 +40,36 @@ export function createDispatchPhase(deps) {
40
40
  }
41
41
  /** Process a single dispatch queue entry. */
42
42
  async function dispatchEntry(deps, entry) {
43
- // Entries with no environmentId are waiting for auto-resolution (#927).
44
- // Skip them for now — they'll be dispatched once environment resolution is implemented.
45
- if (!entry.environmentId) {
46
- return;
43
+ // Resolve environment if not explicitly set (auto-resolution cascade)
44
+ let environmentId = entry.environmentId;
45
+ if (!environmentId) {
46
+ const task = deps.getTask(entry.taskId);
47
+ if (!task) {
48
+ deps.dequeueEntry(entry.taskId);
49
+ logger.debug({ taskId: entry.taskId }, "Dispatch: dequeued stale entry (task deleted, pre-resolve)");
50
+ return;
51
+ }
52
+ environmentId = deps.resolveEnvironment(task) || "";
53
+ if (!environmentId) {
54
+ // No environment available — stay queued for retry next tick
55
+ return;
56
+ }
47
57
  }
48
58
  // Dequeue entries whose environment has been removed entirely (not just disconnected)
49
- if (!deps.environmentExists(entry.environmentId)) {
59
+ if (!deps.environmentExists(environmentId)) {
50
60
  deps.dequeueEntry(entry.taskId);
51
- logger.debug({ taskId: entry.taskId, environmentId: entry.environmentId }, "Dispatch: dequeued orphan (environment removed)");
61
+ logger.debug({ taskId: entry.taskId, environmentId }, "Dispatch: dequeued orphan (environment removed)");
52
62
  return;
53
63
  }
54
64
  // Skip if environment is disconnected (may reconnect later)
55
- if (!deps.isEnvironmentConnected(entry.environmentId)) {
65
+ if (!deps.isEnvironmentConnected(environmentId)) {
56
66
  return;
57
67
  }
58
68
  // Skip if environment is at capacity
59
- if (!deps.hasCapacity(entry.environmentId)) {
69
+ if (!deps.hasCapacity(environmentId)) {
60
70
  return;
61
71
  }
62
- // Look up the task (may have been deleted since enqueue)
72
+ // Look up the task (may have been deleted since enqueue — check again after resolution)
63
73
  const task = deps.getTask(entry.taskId);
64
74
  if (!task) {
65
75
  deps.dequeueEntry(entry.taskId);
@@ -72,18 +82,18 @@ async function dispatchEntry(deps, entry) {
72
82
  return;
73
83
  }
74
84
  const error = await deps.startTaskSession(task, {
75
- environmentId: entry.environmentId,
85
+ environmentId,
76
86
  personaId: entry.personaId,
77
87
  notes: entry.notes,
78
88
  });
79
89
  if (error) {
80
- logger.warn({ taskId: entry.taskId, environmentId: entry.environmentId, error }, "Dispatch: session start failed — entry stays queued for retry");
90
+ logger.warn({ taskId: entry.taskId, environmentId, error }, "Dispatch: session start failed — entry stays queued for retry");
81
91
  }
82
92
  else {
83
93
  // Dequeue only after successful start to avoid losing tasks on transient failures.
84
94
  // startTaskSession already emits "task.started" so we don't emit it here.
85
95
  deps.dequeueEntry(entry.taskId);
86
- logger.info({ taskId: entry.taskId, environmentId: entry.environmentId }, "Dispatch: task started");
96
+ logger.info({ taskId: entry.taskId, environmentId }, "Dispatch: task started");
87
97
  }
88
98
  }
89
99
  //# sourceMappingURL=dispatch-phase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-phase.js","sourceRoot":"","sources":["../src/dispatch-phase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch-phase.js","sourceRoot":"","sources":["../src/dispatch-phase.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -26,9 +26,12 @@ export { createOrphanPhase } from "./orphan-phase.js";
26
26
  export type { OrphanPhaseDeps } from "./orphan-phase.js";
27
27
  export { createDispatchPhase } from "./dispatch-phase.js";
28
28
  export type { DispatchPhaseDeps } from "./dispatch-phase.js";
29
+ export { resolveDispatchEnvironment } from "./resolve-dispatch-environment.js";
30
+ export type { ResolveEnvironmentDeps } from "./resolve-dispatch-environment.js";
29
31
  export { hasCapacity, getEffectiveLimit } from "./concurrency.js";
30
32
  export type { ConcurrencyDeps } from "./concurrency.js";
31
33
  export { findFirstConnectedEnvironment } from "./find-connected-environment.js";
34
+ export { resolveAncestorEnvironmentId } from "./grpc-shared.js";
32
35
  export { createRootTaskBootSubscriber } from "./root-task-boot.js";
33
36
  export type { RootTaskBootDeps } from "./root-task-boot.js";
34
37
  export { validateExpression, computeNextRunAt } from "./schedule-expression.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG7E,OAAO,EACL,eAAe,EAAE,UAAU,EAC3B,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAC/D,cAAc,EAAE,aAAa,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGjD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAC/G,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAG/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAG1G,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -27,8 +27,10 @@ export { ReconciliationManager } from "./reconciliation-manager.js";
27
27
  export { createCronPhase } from "./cron-phase.js";
28
28
  export { createOrphanPhase } from "./orphan-phase.js";
29
29
  export { createDispatchPhase } from "./dispatch-phase.js";
30
+ export { resolveDispatchEnvironment } from "./resolve-dispatch-environment.js";
30
31
  export { hasCapacity, getEffectiveLimit } from "./concurrency.js";
31
32
  export { findFirstConnectedEnvironment } from "./find-connected-environment.js";
33
+ export { resolveAncestorEnvironmentId } from "./grpc-shared.js";
32
34
  export { createRootTaskBootSubscriber } from "./root-task-boot.js";
33
35
  export { validateExpression, computeNextRunAt } from "./schedule-expression.js";
34
36
  export { lifecycleCleanupPhase } from "./lifecycle-cleanup.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,8DAA8D;AAC9D,OAAO,EACL,eAAe,EAAE,UAAU,EAC3B,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAC/D,cAAc,EAAE,aAAa,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,8DAA8D;AAC9D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKjD,6DAA6D;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,+DAA+D;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,8DAA8D;AAC9D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAG/G,6DAA6D;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AAGvF,6DAA6D;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAE/F,8DAA8D;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAE1G,8DAA8D;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,8DAA8D;AAC9D,OAAO,EACL,eAAe,EAAE,UAAU,EAC3B,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAC/D,cAAc,EAAE,aAAa,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,8DAA8D;AAC9D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKjD,6DAA6D;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,+DAA+D;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,8DAA8D;AAC9D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAG/G,6DAA6D;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AAGvF,6DAA6D;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAE/F,8DAA8D;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAE1G,8DAA8D;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Automatic environment resolution for the dispatch phase.
3
+ *
4
+ * When a queued task has no explicit environmentId, this function resolves
5
+ * one using a priority cascade: ancestor session → workspace legacy env →
6
+ * workspace linked envs (load balanced) → global fallback.
7
+ *
8
+ * This module is side-effect-free; logging is left to the caller.
9
+ */
10
+ /** Dependencies for environment resolution, injected for testability. */
11
+ export interface ResolveEnvironmentDeps {
12
+ /** Walk the parent task chain for an ancestor with a session environment. */
13
+ resolveAncestorEnvironmentId: (parentTaskId: string) => string;
14
+ /** Look up a workspace by ID. */
15
+ getWorkspace: (id: string) => {
16
+ environmentId: string;
17
+ } | undefined;
18
+ /** Get all environment IDs linked to a workspace (#814). */
19
+ getLinkedEnvironmentIds: (workspaceId: string) => string[];
20
+ /** Check if an environment is connected. */
21
+ isEnvironmentConnected: (id: string) => boolean;
22
+ /** Count active (pending/running/idle) sessions for an environment. */
23
+ countActiveForEnvironment: (id: string) => number;
24
+ /** Global fallback: find any connected environment (prefers local). */
25
+ findFirstConnectedEnvironment: () => {
26
+ id: string;
27
+ } | undefined;
28
+ }
29
+ /**
30
+ * Resolve an environment for a task that has no explicit environmentId.
31
+ *
32
+ * Cascade:
33
+ * 1. Ancestor task's session environment (parent chain walk)
34
+ * 2. Workspace's legacy `environmentId` field (if connected)
35
+ * 3. Workspace's linked environments (pick connected with fewest active sessions)
36
+ * 4. Global fallback (`findFirstConnectedEnvironment`)
37
+ *
38
+ * @returns The resolved environment ID, or `undefined` if none available.
39
+ */
40
+ export declare function resolveDispatchEnvironment(task: {
41
+ workspaceId: string | null;
42
+ parentTaskId: string;
43
+ }, deps: ResolveEnvironmentDeps): string | undefined;
44
+ //# sourceMappingURL=resolve-dispatch-environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-dispatch-environment.d.ts","sourceRoot":"","sources":["../src/resolve-dispatch-environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,4BAA4B,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/D,iCAAiC;IACjC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACpE,4DAA4D;IAC5D,uBAAuB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAC3D,4CAA4C;IAC5C,sBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,uEAAuE;IACvE,yBAAyB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,uEAAuE;IACvE,6BAA6B,EAAE,MAAM;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAExC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAC1D,IAAI,EAAE,sBAAsB,GAC3B,MAAM,GAAG,SAAS,CAkDpB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Automatic environment resolution for the dispatch phase.
3
+ *
4
+ * When a queued task has no explicit environmentId, this function resolves
5
+ * one using a priority cascade: ancestor session → workspace legacy env →
6
+ * workspace linked envs (load balanced) → global fallback.
7
+ *
8
+ * This module is side-effect-free; logging is left to the caller.
9
+ */
10
+ /**
11
+ * Resolve an environment for a task that has no explicit environmentId.
12
+ *
13
+ * Cascade:
14
+ * 1. Ancestor task's session environment (parent chain walk)
15
+ * 2. Workspace's legacy `environmentId` field (if connected)
16
+ * 3. Workspace's linked environments (pick connected with fewest active sessions)
17
+ * 4. Global fallback (`findFirstConnectedEnvironment`)
18
+ *
19
+ * @returns The resolved environment ID, or `undefined` if none available.
20
+ */
21
+ export function resolveDispatchEnvironment(
22
+ // eslint-disable-next-line @rushstack/no-new-null
23
+ task, deps) {
24
+ // 1. Ancestor environment — inherit from parent chain
25
+ if (task.parentTaskId) {
26
+ const ancestorEnvId = deps.resolveAncestorEnvironmentId(task.parentTaskId);
27
+ if (ancestorEnvId && deps.isEnvironmentConnected(ancestorEnvId)) {
28
+ return ancestorEnvId;
29
+ }
30
+ }
31
+ // 2 & 3. Workspace-scoped resolution (only if task has a workspace)
32
+ if (task.workspaceId) {
33
+ const workspace = deps.getWorkspace(task.workspaceId);
34
+ // 2. Workspace legacy environmentId
35
+ if (workspace?.environmentId && deps.isEnvironmentConnected(workspace.environmentId)) {
36
+ return workspace.environmentId;
37
+ }
38
+ // 3. Workspace linked environments — pick connected with fewest active sessions
39
+ const linkedIds = deps.getLinkedEnvironmentIds(task.workspaceId);
40
+ const connectedLinked = linkedIds.filter((id) => deps.isEnvironmentConnected(id));
41
+ if (connectedLinked.length > 0) {
42
+ // Precompute active session counts once to avoid repeated DB hits during sort.
43
+ const activeCounts = new Map();
44
+ for (const id of connectedLinked) {
45
+ activeCounts.set(id, deps.countActiveForEnvironment(id));
46
+ }
47
+ // Sort by active session count ascending (load balance), with deterministic tie-breaker.
48
+ connectedLinked.sort((a, b) => {
49
+ const countA = activeCounts.get(a);
50
+ const countB = activeCounts.get(b);
51
+ if (countA !== countB) {
52
+ return countA - countB;
53
+ }
54
+ // Tie-break on ID to keep ordering deterministic when counts are equal.
55
+ return a.localeCompare(b);
56
+ });
57
+ return connectedLinked[0];
58
+ }
59
+ }
60
+ // 4. Global fallback — any connected environment
61
+ const fallback = deps.findFirstConnectedEnvironment();
62
+ if (fallback) {
63
+ return fallback.id;
64
+ }
65
+ // 5. No environment available
66
+ return undefined;
67
+ }
68
+ //# sourceMappingURL=resolve-dispatch-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-dispatch-environment.js","sourceRoot":"","sources":["../src/resolve-dispatch-environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,0BAA0B;AACxC,kDAAkD;AAClD,IAA0D,EAC1D,IAA4B;IAE5B,sDAAsD;IACtD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3E,IAAI,aAAa,IAAI,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,CAAC;YAChE,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEtD,oCAAoC;QACpC,IAAI,SAAS,EAAE,aAAa,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YACrF,OAAO,SAAS,CAAC,aAAa,CAAC;QACjC,CAAC;QAED,gFAAgF;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,+EAA+E;YAC/E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC/C,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;gBACjC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;YAED,yFAAyF;YACzF,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;gBACpC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,OAAO,MAAM,GAAG,MAAM,CAAC;gBACzB,CAAC;gBACD,wEAAwE;gBACxE,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,OAAO,eAAe,CAAC,CAAC,CAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAED,8BAA8B;IAC9B,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/core",
3
- "version": "0.96.0",
3
+ "version": "0.96.2",
4
4
  "description": "Core gRPC business logic for Grackle — RPC handlers, event system, streaming, session lifecycle",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,13 +36,13 @@
36
36
  "pino": "^10.3.1",
37
37
  "ulid": "^2.3.0",
38
38
  "uuid": "^11.0.0",
39
- "@grackle-ai/adapter-sdk": "0.96.0",
40
- "@grackle-ai/auth": "0.96.0",
41
- "@grackle-ai/common": "0.96.0",
42
- "@grackle-ai/plugin-sdk": "0.96.0",
43
- "@grackle-ai/database": "0.96.0",
44
- "@grackle-ai/knowledge": "0.96.0",
45
- "@grackle-ai/prompt": "0.96.0"
39
+ "@grackle-ai/adapter-sdk": "0.96.2",
40
+ "@grackle-ai/auth": "0.96.2",
41
+ "@grackle-ai/database": "0.96.2",
42
+ "@grackle-ai/plugin-sdk": "0.96.2",
43
+ "@grackle-ai/common": "0.96.2",
44
+ "@grackle-ai/knowledge": "0.96.2",
45
+ "@grackle-ai/prompt": "0.96.2"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@rushstack/heft": "1.2.7",