@wrongstack/core 0.87.0 → 0.89.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.
Files changed (83) hide show
  1. package/dist/{agent-bridge-C9P_HPez.d.ts → agent-bridge-DbVe1dHT.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-2Aq0jOSj.d.ts → agent-subagent-runner-C6eqID1t.d.ts} +477 -476
  3. package/dist/{events-DnRqXaZ3.d.ts → brain-s9DyD_Vf.d.ts} +185 -92
  4. package/dist/{compactor-CJq7LQev.d.ts → compactor-DXLxLcmU.d.ts} +2 -2
  5. package/dist/{config-_DZ7dN-T.d.ts → config-84VaZpH6.d.ts} +45 -38
  6. package/dist/{context-ToHAp4-U.d.ts → context-CNRYfhUv.d.ts} +1 -1
  7. package/dist/coordination/index.d.ts +16 -17
  8. package/dist/coordination/index.js +208 -93
  9. package/dist/coordination/index.js.map +1 -1
  10. package/dist/{default-config-DEXI4jsl.d.ts → default-config-CXsDvOmP.d.ts} +3 -1
  11. package/dist/defaults/index.d.ts +32 -34
  12. package/dist/defaults/index.js +744 -274
  13. package/dist/defaults/index.js.map +1 -1
  14. package/dist/{director-state-CgIc30qi.d.ts → director-state-BfeCUbmk.d.ts} +1 -1
  15. package/dist/execution/index.d.ts +18 -19
  16. package/dist/execution/index.js +79 -64
  17. package/dist/execution/index.js.map +1 -1
  18. package/dist/extension/index.d.ts +9 -10
  19. package/dist/extension/index.js +8 -6
  20. package/dist/extension/index.js.map +1 -1
  21. package/dist/{index-BNOLadHw.d.ts → index-CqrroYcU.d.ts} +13 -15
  22. package/dist/{index-N0_c4bHQ.d.ts → index-D3Nax3YU.d.ts} +11 -10
  23. package/dist/index.d.ts +191 -178
  24. package/dist/index.js +1419 -526
  25. package/dist/index.js.map +1 -1
  26. package/dist/infrastructure/index.d.ts +9 -9
  27. package/dist/infrastructure/index.js +16 -5
  28. package/dist/infrastructure/index.js.map +1 -1
  29. package/dist/kernel/index.d.ts +14 -16
  30. package/dist/kernel/index.js +17 -0
  31. package/dist/kernel/index.js.map +1 -1
  32. package/dist/{logger-B72yyPc6.d.ts → logger-B63L5bTg.d.ts} +1 -1
  33. package/dist/{logger-C_27pj9i.d.ts → logger-B9J5puGM.d.ts} +1 -1
  34. package/dist/{mcp-servers-Dck3T85_.d.ts → mcp-servers-D3E5ixAR.d.ts} +3 -3
  35. package/dist/{mode-CHo2XtHs.d.ts → mode-ARA3HrkY.d.ts} +1 -1
  36. package/dist/models/index.d.ts +5 -5
  37. package/dist/models/index.js +8 -6
  38. package/dist/models/index.js.map +1 -1
  39. package/dist/{models-registry-Be3osGt5.d.ts → models-registry-B6_KfS65.d.ts} +1 -1
  40. package/dist/{models-registry-Boz639EI.d.ts → models-registry-DU64QxQa.d.ts} +1 -1
  41. package/dist/{multi-agent-coordinator-DllpCVkF.d.ts → multi-agent-coordinator-DHNrjPaA.d.ts} +2 -2
  42. package/dist/{null-fleet-bus-BY0AN-sr.d.ts → null-fleet-bus-BzzciAc4.d.ts} +39 -32
  43. package/dist/observability/index.d.ts +3 -3
  44. package/dist/{observability-CoSNZdhX.d.ts → observability-D-HZN_mF.d.ts} +1 -1
  45. package/dist/{parallel-eternal-engine-D402RASp.d.ts → parallel-eternal-engine-CTpcrb9O.d.ts} +34 -33
  46. package/dist/{path-resolver-UPFTsDyD.d.ts → path-resolver-B7hgMAVe.d.ts} +3 -3
  47. package/dist/{permission-14CChMmO.d.ts → permission-BDv7z0mk.d.ts} +7 -2
  48. package/dist/{permission-policy-gW5htOo1.d.ts → permission-policy-dF74EpDp.d.ts} +2 -2
  49. package/dist/{system-prompt-C0rLCeyn.d.ts → pipeline-C1Ad9OjI.d.ts} +73 -73
  50. package/dist/{plan-templates-DRvPgkfZ.d.ts → plan-templates-CNphsz0n.d.ts} +79 -11
  51. package/dist/{provider-runner-COAJM8tC.d.ts → provider-runner-cqvlB_oS.d.ts} +5 -5
  52. package/dist/{retry-policy-DSu6O6rD.d.ts → retry-policy-BcmuT_V0.d.ts} +2 -2
  53. package/dist/sdd/index.d.ts +12 -33
  54. package/dist/sdd/index.js +110 -50
  55. package/dist/sdd/index.js.map +1 -1
  56. package/dist/{secret-scrubber-yGBFQYju.d.ts → secret-vault-DrOhc2i5.d.ts} +7 -7
  57. package/dist/security/index.d.ts +4 -5
  58. package/dist/security/index.js +22 -4
  59. package/dist/security/index.js.map +1 -1
  60. package/dist/{selector-11-fm95U.d.ts → selector-C7wcdqMA.d.ts} +1 -1
  61. package/dist/{session-event-bridge-D0u-x576.d.ts → session-event-bridge-IVzs2GpE.d.ts} +1 -1
  62. package/dist/{session-reader-BQU-toaN.d.ts → session-reader-DDz1Ek4V.d.ts} +2 -2
  63. package/dist/{skill-BJeF2DwY.d.ts → skill-BJxzIyyN.d.ts} +1 -1
  64. package/dist/skills/index.d.ts +1 -1
  65. package/dist/skills/index.js +3 -9
  66. package/dist/skills/index.js.map +1 -1
  67. package/dist/storage/index.d.ts +134 -14
  68. package/dist/storage/index.js +982 -248
  69. package/dist/storage/index.js.map +1 -1
  70. package/dist/{task-graph-CikNdRTG.d.ts → task-graph-DJBqO0EY.d.ts} +1 -1
  71. package/dist/types/index.d.ts +26 -28
  72. package/dist/types/index.js +62 -37
  73. package/dist/types/index.js.map +1 -1
  74. package/dist/utils/expect-defined.d.ts +7 -0
  75. package/dist/utils/expect-defined.js +11 -0
  76. package/dist/utils/expect-defined.js.map +1 -0
  77. package/dist/utils/index.d.ts +11 -20
  78. package/dist/utils/index.js +61 -43
  79. package/dist/utils/index.js.map +1 -1
  80. package/dist/{wstack-paths-BQMvEllz.d.ts → wstack-paths-_lqjzErq.d.ts} +1 -1
  81. package/package.json +5 -1
  82. package/dist/memory-CEXuo7sz.d.ts +0 -16
  83. package/dist/secret-scrubber-3MHDDAtm.d.ts +0 -6
package/dist/sdd/index.js CHANGED
@@ -17,7 +17,8 @@ var __export = (target, all) => {
17
17
  var atomic_write_exports = {};
18
18
  __export(atomic_write_exports, {
19
19
  atomicWrite: () => atomicWrite,
20
- ensureDir: () => ensureDir
20
+ ensureDir: () => ensureDir,
21
+ withFileLock: () => withFileLock
21
22
  });
22
23
  async function atomicWrite(targetPath, content, opts = {}) {
23
24
  const dir = path.dirname(targetPath);
@@ -60,6 +61,49 @@ async function atomicWrite(targetPath, content, opts = {}) {
60
61
  async function ensureDir(dir) {
61
62
  await fs.mkdir(dir, { recursive: true });
62
63
  }
64
+ async function withFileLock(targetPath, fn, opts = {}) {
65
+ const dir = path.dirname(targetPath);
66
+ await fs.mkdir(dir, { recursive: true });
67
+ const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);
68
+ const timeoutMs = opts.timeoutMs ?? 5e3;
69
+ const staleMs = opts.staleMs ?? 3e4;
70
+ const started = Date.now();
71
+ let handle;
72
+ for (; ; ) {
73
+ try {
74
+ handle = await fs.open(lockPath, "wx");
75
+ await handle.writeFile(`${process.pid}:${Date.now()}`);
76
+ break;
77
+ } catch (err) {
78
+ if (err.code !== "EEXIST") throw err;
79
+ try {
80
+ const stat2 = await fs.stat(lockPath);
81
+ if (Date.now() - stat2.mtimeMs > staleMs) {
82
+ await fs.unlink(lockPath);
83
+ continue;
84
+ }
85
+ } catch {
86
+ continue;
87
+ }
88
+ if (Date.now() - started >= timeoutMs) {
89
+ throw new Error(`Timed out waiting for file lock: ${targetPath}`);
90
+ }
91
+ await new Promise((resolve) => setTimeout(resolve, 25));
92
+ }
93
+ }
94
+ try {
95
+ return await fn();
96
+ } finally {
97
+ try {
98
+ await handle?.close();
99
+ } catch {
100
+ }
101
+ try {
102
+ await fs.unlink(lockPath);
103
+ } catch {
104
+ }
105
+ }
106
+ }
63
107
  async function renameWithRetry(from, to) {
64
108
  if (process.platform !== "win32") {
65
109
  await fs.rename(from, to);
@@ -1199,13 +1243,15 @@ var TaskGraphStore = class {
1199
1243
  }
1200
1244
  };
1201
1245
 
1202
- // src/sdd/spec-builder.ts
1203
- function expectDefined(value) {
1246
+ // src/utils/expect-defined.ts
1247
+ function expectDefined(value, label) {
1204
1248
  if (value === null || value === void 0) {
1205
1249
  throw new Error("Expected value to be defined");
1206
1250
  }
1207
1251
  return value;
1208
1252
  }
1253
+
1254
+ // src/sdd/spec-builder.ts
1209
1255
  function buildQuestioningPrompt(session, min, max) {
1210
1256
  const answered = session.answers.length;
1211
1257
  const remaining = Math.max(0, min - answered);
@@ -1993,12 +2039,6 @@ function truncate(str, maxLen) {
1993
2039
  }
1994
2040
 
1995
2041
  // src/sdd/critical-path.ts
1996
- function expectDefined2(value) {
1997
- if (value === null || value === void 0) {
1998
- throw new Error("Expected value to be defined");
1999
- }
2000
- return value;
2001
- }
2002
2042
  function analyzeCriticalPath(graph) {
2003
2043
  const nodes = Array.from(graph.nodes.values());
2004
2044
  const topoOrder = topologicalSort(graph);
@@ -2074,7 +2114,7 @@ function getTransitiveBlocked(_graph, taskId, blocksMap) {
2074
2114
  const visited = /* @__PURE__ */ new Set();
2075
2115
  const queue = [taskId];
2076
2116
  while (queue.length > 0) {
2077
- const current = expectDefined2(queue.shift());
2117
+ const current = expectDefined(queue.shift());
2078
2118
  const blocked = blocksMap.get(current);
2079
2119
  if (!blocked) continue;
2080
2120
  for (const id of blocked) {
@@ -2120,7 +2160,7 @@ function computeCriticalPath(graph, _topoOrder, blockedByMap) {
2120
2160
  if (!changed) break;
2121
2161
  }
2122
2162
  let maxDist = 0;
2123
- let maxId = expectDefined2(allIds[0]);
2163
+ let maxId = expectDefined(allIds[0]);
2124
2164
  for (const id of allIds) {
2125
2165
  const d = dist.get(id) ?? 0;
2126
2166
  if (d > maxDist) {
@@ -2591,6 +2631,7 @@ var SddTaskDecomposer = class {
2591
2631
  };
2592
2632
 
2593
2633
  // src/coordination/subagent-budget.ts
2634
+ var TIMEOUT_PREEMPT_FRACTION = 0.85;
2594
2635
  var BudgetExceededError = class extends Error {
2595
2636
  kind;
2596
2637
  limit;
@@ -2946,15 +2987,7 @@ function makeAgentSubagentRunner(opts) {
2946
2987
  let budgetError = null;
2947
2988
  const onBudgetError = (err) => {
2948
2989
  if (err instanceof BudgetThresholdSignal) {
2949
- err.decision.then((decision) => {
2950
- if (decision === "stop") {
2951
- budgetError = new BudgetExceededError(err.kind, err.limit, err.used);
2952
- aborter.abort();
2953
- }
2954
- }).catch(() => {
2955
- budgetError = new BudgetExceededError(err.kind, err.limit, err.used);
2956
- aborter.abort();
2957
- });
2990
+ budgetError = err;
2958
2991
  return;
2959
2992
  }
2960
2993
  aborter.abort();
@@ -3062,15 +3095,23 @@ function makeAgentSubagentRunner(opts) {
3062
3095
  }
3063
3096
  if (budgetError) {
3064
3097
  if ("decision" in budgetError) {
3065
- const decision = await budgetError.decision;
3066
- if (decision === "stop") {
3098
+ try {
3099
+ const decision = await budgetError.decision;
3100
+ if (decision === "stop") {
3101
+ budgetError = new BudgetExceededError(
3102
+ budgetError.kind,
3103
+ budgetError.limit,
3104
+ budgetError.used
3105
+ );
3106
+ } else {
3107
+ budgetError = null;
3108
+ }
3109
+ } catch {
3067
3110
  budgetError = new BudgetExceededError(
3068
3111
  budgetError.kind,
3069
3112
  budgetError.limit,
3070
3113
  budgetError.used
3071
3114
  );
3072
- } else {
3073
- budgetError = null;
3074
3115
  }
3075
3116
  }
3076
3117
  if (budgetError) throw budgetError;
@@ -6110,15 +6151,38 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6110
6151
  }
6111
6152
  const start = Date.now();
6112
6153
  let timer = null;
6154
+ let preemptedForLimit = null;
6113
6155
  const timeoutPromise = new Promise((_, reject) => {
6114
6156
  const armFor = (ms) => {
6115
6157
  if (timer) clearTimeout(timer);
6116
6158
  timer = setTimeout(onTick, Math.max(0, ms));
6117
6159
  };
6118
6160
  const scheduleNext = () => {
6119
- const wallRemaining = initialTimeoutMs === void 0 ? Number.POSITIVE_INFINITY : (budget.limits.timeoutMs ?? initialTimeoutMs) - (Date.now() - start);
6161
+ const wallLimit = budget.limits.timeoutMs ?? initialTimeoutMs;
6162
+ const wallRemaining = initialTimeoutMs === void 0 ? Number.POSITIVE_INFINITY : wallLimit - (Date.now() - start);
6120
6163
  const idleRemaining = idleLimitMs === void 0 ? Number.POSITIVE_INFINITY : (budget.limits.idleTimeoutMs ?? idleLimitMs) - budget.idleMs();
6121
- armFor(Math.max(25, Math.min(wallRemaining, idleRemaining)));
6164
+ const preemptRemaining = initialTimeoutMs === void 0 || preemptedForLimit === wallLimit ? Number.POSITIVE_INFINITY : wallLimit * TIMEOUT_PREEMPT_FRACTION - (Date.now() - start);
6165
+ armFor(Math.max(25, Math.min(wallRemaining, idleRemaining, preemptRemaining)));
6166
+ };
6167
+ const negotiateTimeout = async (used, limit) => {
6168
+ const handler = budget.onThreshold;
6169
+ if (!handler) return "stop";
6170
+ const result = handler({
6171
+ kind: "timeout",
6172
+ used,
6173
+ limit,
6174
+ requestDecision: () => new Promise((resolveDecision) => {
6175
+ budget._events?.emit("budget.threshold_reached", {
6176
+ kind: "timeout",
6177
+ used,
6178
+ limit,
6179
+ timeoutMs: 6e4,
6180
+ extend: (extra) => resolveDecision({ extend: extra }),
6181
+ deny: () => resolveDecision("stop")
6182
+ });
6183
+ })
6184
+ });
6185
+ return typeof result === "string" ? result : await result;
6122
6186
  };
6123
6187
  const onTick = async () => {
6124
6188
  const elapsed = Date.now() - start;
@@ -6131,6 +6195,21 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6131
6195
  reject(new BudgetExceededError("timeout", idleLimit ?? 0, budget.idleMs()));
6132
6196
  return;
6133
6197
  }
6198
+ if (wallLimit !== void 0 && !wallExceeded && budget.onThreshold && preemptedForLimit !== wallLimit && elapsed >= wallLimit * TIMEOUT_PREEMPT_FRACTION) {
6199
+ try {
6200
+ const decision = await negotiateTimeout(elapsed, wallLimit);
6201
+ if (typeof decision !== "string" && decision.extend.timeoutMs !== void 0) {
6202
+ budget.limits.timeoutMs = decision.extend.timeoutMs;
6203
+ preemptedForLimit = null;
6204
+ } else {
6205
+ preemptedForLimit = wallLimit;
6206
+ }
6207
+ } catch {
6208
+ preemptedForLimit = wallLimit;
6209
+ }
6210
+ scheduleNext();
6211
+ return;
6212
+ }
6134
6213
  if (!wallExceeded) {
6135
6214
  scheduleNext();
6136
6215
  return;
@@ -6142,28 +6221,15 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6142
6221
  return;
6143
6222
  }
6144
6223
  try {
6145
- const result = budget.onThreshold({
6146
- kind: "timeout",
6147
- used: elapsed,
6148
- limit,
6149
- requestDecision: () => new Promise((resolveDecision) => {
6150
- budget._events?.emit("budget.threshold_reached", {
6151
- kind: "timeout",
6152
- used: elapsed,
6153
- limit,
6154
- timeoutMs: 6e4,
6155
- extend: (extra) => resolveDecision({ extend: extra }),
6156
- deny: () => resolveDecision("stop")
6157
- });
6158
- })
6159
- });
6160
- const decision = typeof result === "string" ? result : await result;
6224
+ const decision = await negotiateTimeout(elapsed, limit);
6161
6225
  if (decision === "continue" || decision === "throw" || decision === "stop") {
6226
+ preemptedForLimit = null;
6162
6227
  armFor(Math.max(1e3, limit));
6163
6228
  return;
6164
6229
  }
6165
6230
  if (decision.extend.timeoutMs !== void 0) {
6166
6231
  budget.limits.timeoutMs = decision.extend.timeoutMs;
6232
+ preemptedForLimit = null;
6167
6233
  scheduleNext();
6168
6234
  return;
6169
6235
  }
@@ -6294,12 +6360,6 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6294
6360
  };
6295
6361
 
6296
6362
  // src/sdd/sdd-parallel-run.ts
6297
- function expectDefined3(value) {
6298
- if (value === null || value === void 0) {
6299
- throw new Error("Expected value to be defined");
6300
- }
6301
- return value;
6302
- }
6303
6363
  var SddParallelRun = class {
6304
6364
  constructor(opts) {
6305
6365
  this.opts = opts;
@@ -6448,8 +6508,8 @@ var SddParallelRun = class {
6448
6508
  const successCount = results.filter((r) => r.status === "success").length;
6449
6509
  const failCount = results.length - successCount;
6450
6510
  for (let i = 0; i < results.length; i++) {
6451
- const result = expectDefined3(results[i]);
6452
- const taskId = expectDefined3(taskIds[i]);
6511
+ const result = expectDefined(results[i]);
6512
+ const taskId = expectDefined(taskIds[i]);
6453
6513
  if (result.status === "success") {
6454
6514
  this.opts.tracker.updateNodeStatus(taskId, "completed");
6455
6515
  } else {