@wrongstack/core 0.73.1 → 0.82.6

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 (79) hide show
  1. package/dist/{agent-bridge-C0Ze7Ldm.d.ts → agent-bridge-C9P_HPez.d.ts} +2 -2
  2. package/dist/{agent-subagent-runner-BmITbs1Q.d.ts → agent-subagent-runner-2Aq0jOSj.d.ts} +107 -102
  3. package/dist/{compactor-D_ExJajC.d.ts → compactor-CJq7LQev.d.ts} +3 -3
  4. package/dist/{config-Dy0CK_o6.d.ts → config-_DZ7dN-T.d.ts} +77 -75
  5. package/dist/{context-y87Jc5ei.d.ts → context-ToHAp4-U.d.ts} +119 -90
  6. package/dist/coordination/index.d.ts +16 -16
  7. package/dist/coordination/index.js +382 -43
  8. package/dist/coordination/index.js.map +1 -1
  9. package/dist/defaults/index.d.ts +31 -31
  10. package/dist/defaults/index.js +524 -110
  11. package/dist/defaults/index.js.map +1 -1
  12. package/dist/{director-state-BmYi3DGA.d.ts → director-state-CgIc30qi.d.ts} +19 -19
  13. package/dist/{events-BBAlxBuw.d.ts → events-DnRqXaZ3.d.ts} +77 -39
  14. package/dist/execution/index.d.ts +53 -53
  15. package/dist/execution/index.js +67 -23
  16. package/dist/execution/index.js.map +1 -1
  17. package/dist/extension/index.d.ts +9 -9
  18. package/dist/extension/index.js +8 -1
  19. package/dist/extension/index.js.map +1 -1
  20. package/dist/{goal-store-C7jcumEh.d.ts → goal-store-DvWLNu52.d.ts} +4 -4
  21. package/dist/{index-yQbZ2NQx.d.ts → index-BNOLadHw.d.ts} +28 -28
  22. package/dist/{index-BN6i2Nfg.d.ts → index-N0_c4bHQ.d.ts} +45 -45
  23. package/dist/index.d.ts +233 -160
  24. package/dist/index.js +825 -160
  25. package/dist/index.js.map +1 -1
  26. package/dist/infrastructure/index.d.ts +9 -9
  27. package/dist/infrastructure/index.js +29 -7
  28. package/dist/infrastructure/index.js.map +1 -1
  29. package/dist/kernel/index.d.ts +14 -14
  30. package/dist/kernel/index.js +7 -0
  31. package/dist/kernel/index.js.map +1 -1
  32. package/dist/logger-B72yyPc6.d.ts +12 -0
  33. package/dist/{logger-bOzkF5LL.d.ts → logger-C_27pj9i.d.ts} +12 -4
  34. package/dist/{mcp-servers-T0O6UN_w.d.ts → mcp-servers-Dck3T85_.d.ts} +20 -20
  35. package/dist/{mode-BO4SEUIv.d.ts → mode-CHo2XtHs.d.ts} +4 -4
  36. package/dist/models/index.d.ts +10 -10
  37. package/dist/models/index.js +8 -2
  38. package/dist/models/index.js.map +1 -1
  39. package/dist/{models-registry-BcYJDKLm.d.ts → models-registry-Be3osGt5.d.ts} +28 -28
  40. package/dist/{models-registry-Cuq1C8V9.d.ts → models-registry-Boz639EI.d.ts} +12 -12
  41. package/dist/{multi-agent-coordinator-BSBbZt0e.d.ts → multi-agent-coordinator-DllpCVkF.d.ts} +12 -12
  42. package/dist/{null-fleet-bus-BCIRT_nV.d.ts → null-fleet-bus-BY0AN-sr.d.ts} +129 -120
  43. package/dist/observability/index.d.ts +41 -41
  44. package/dist/observability/index.js.map +1 -1
  45. package/dist/{observability-BhnVLBLS.d.ts → observability-CoSNZdhX.d.ts} +4 -4
  46. package/dist/{parallel-eternal-engine-CjAYGaCw.d.ts → parallel-eternal-engine-D402RASp.d.ts} +49 -49
  47. package/dist/{path-resolver-BnqXa9Ze.d.ts → path-resolver-UPFTsDyD.d.ts} +6 -6
  48. package/dist/{permission-V5BLOrY6.d.ts → permission-14CChMmO.d.ts} +10 -8
  49. package/dist/{permission-policy-CBVx-d-8.d.ts → permission-policy-gW5htOo1.d.ts} +7 -7
  50. package/dist/{plan-templates-DBgrTGPu.d.ts → plan-templates-DRvPgkfZ.d.ts} +70 -32
  51. package/dist/{provider-runner-n3KkHT_w.d.ts → provider-runner-COAJM8tC.d.ts} +6 -6
  52. package/dist/{retry-policy-CG3qvH_e.d.ts → retry-policy-DSu6O6rD.d.ts} +4 -4
  53. package/dist/sdd/index.d.ts +47 -47
  54. package/dist/sdd/index.js +47 -22
  55. package/dist/sdd/index.js.map +1 -1
  56. package/dist/security/index.d.ts +6 -6
  57. package/dist/security/index.js +7 -1
  58. package/dist/security/index.js.map +1 -1
  59. package/dist/{selector-RvBR_YRW.d.ts → selector-11-fm95U.d.ts} +2 -2
  60. package/dist/{session-event-bridge-CDHxcmQU.d.ts → session-event-bridge-D0u-x576.d.ts} +7 -7
  61. package/dist/{session-reader-BIpwM60D.d.ts → session-reader-BQU-toaN.d.ts} +23 -23
  62. package/dist/{skill-CxuWrsKK.d.ts → skill-BJeF2DwY.d.ts} +1 -1
  63. package/dist/skills/index.d.ts +9 -9
  64. package/dist/skills/index.js +15 -3
  65. package/dist/skills/index.js.map +1 -1
  66. package/dist/storage/index.d.ts +15 -15
  67. package/dist/storage/index.js +398 -80
  68. package/dist/storage/index.js.map +1 -1
  69. package/dist/{system-prompt-CA11g6Jo.d.ts → system-prompt-C0rLCeyn.d.ts} +16 -11
  70. package/dist/{task-graph-D1YQbpxF.d.ts → task-graph-CikNdRTG.d.ts} +22 -22
  71. package/dist/types/index.d.ts +25 -25
  72. package/dist/types/index.js +61 -12
  73. package/dist/types/index.js.map +1 -1
  74. package/dist/utils/index.d.ts +46 -45
  75. package/dist/utils/index.js +64 -13
  76. package/dist/utils/index.js.map +1 -1
  77. package/dist/{wstack-paths-eMXnY1_X.d.ts → wstack-paths-BQMvEllz.d.ts} +10 -3
  78. package/package.json +1 -1
  79. package/dist/logger-DDd5C--Z.d.ts +0 -12
@@ -7,6 +7,12 @@ import * as os from 'os';
7
7
  import { EventEmitter } from 'events';
8
8
 
9
9
  // src/utils/token-estimate.ts
10
+ function expectDefined(value) {
11
+ if (value === null || value === void 0) {
12
+ throw new Error("Expected value to be defined");
13
+ }
14
+ return value;
15
+ }
10
16
  var RoughTokenEstimate = (text, charsPerToken = 3.5) => Math.max(1, Math.ceil(text.length / charsPerToken));
11
17
  var ESTIMATE_CACHE = /* @__PURE__ */ new Map();
12
18
  var ESTIMATE_CACHE_MAX_SIZE = 1e4;
@@ -16,7 +22,7 @@ function getCachedEstimate(key, compute) {
16
22
  if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {
17
23
  const keys = [...ESTIMATE_CACHE.keys()];
18
24
  for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {
19
- ESTIMATE_CACHE.delete(keys[i]);
25
+ ESTIMATE_CACHE.delete(expectDefined(keys[i]));
20
26
  }
21
27
  }
22
28
  const estimate = compute();
@@ -94,6 +100,12 @@ function estimateRequestTokensCalibrated(messages, systemPrompt, tools) {
94
100
  }
95
101
 
96
102
  // src/utils/message-invariants.ts
103
+ function expectDefined2(value) {
104
+ if (value === null || value === void 0) {
105
+ throw new Error("Expected value to be defined");
106
+ }
107
+ return value;
108
+ }
97
109
  function repairToolUseAdjacency(messages) {
98
110
  const removedToolUses = [];
99
111
  const removedToolResults = [];
@@ -101,7 +113,7 @@ function repairToolUseAdjacency(messages) {
101
113
  let changed = false;
102
114
  const out = [];
103
115
  for (let i = 0; i < messages.length; i++) {
104
- const original = messages[i];
116
+ const original = expectDefined2(messages[i]);
105
117
  let msg = original;
106
118
  if (hasToolUse(msg)) {
107
119
  const nextIds = toolResultIds(messages[i + 1]);
@@ -498,7 +510,7 @@ var IntelligentCompactor = class {
498
510
  maxTokens: 1024
499
511
  };
500
512
  const ac = ctx.signal ? void 0 : new AbortController();
501
- const signal = ctx.signal ?? ac.signal;
513
+ const signal = ctx.signal ?? ac?.signal;
502
514
  const res = await this.provider.complete(req, { signal });
503
515
  const textBlocks = res.content.filter(isTextBlock);
504
516
  return textBlocks.map((b) => b.text).join("\n").trim() || "(empty summary)";
@@ -601,6 +613,12 @@ var IntelligentCompactor = class {
601
613
  };
602
614
 
603
615
  // src/models/llm-selector.ts
616
+ function expectDefined3(value) {
617
+ if (value === null || value === void 0) {
618
+ throw new Error("Expected value to be defined");
619
+ }
620
+ return value;
621
+ }
604
622
  var DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.
605
623
 
606
624
  Output a JSON object with this structure:
@@ -641,7 +659,7 @@ function formatMessages(messages, maxChars = 8e3) {
641
659
  const lines = [];
642
660
  let used = 0;
643
661
  for (let i = 0; i < messages.length; i++) {
644
- const m = messages[i];
662
+ const m = expectDefined3(messages[i]);
645
663
  const role = m.role.padEnd(10, " ");
646
664
  let text;
647
665
  if (typeof m.content === "string") {
@@ -706,7 +724,7 @@ IMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiv
706
724
  let tokenCount = 0;
707
725
  let startIdx = 0;
708
726
  for (let i = messages.length - 1; i >= 0; i--) {
709
- const m = messages[i];
727
+ const m = expectDefined3(messages[i]);
710
728
  const cost = typeof m.content === "string" ? Math.ceil(m.content.length / 4) : m.content.reduce(
711
729
  (acc, b) => acc + (b.type === "text" ? Math.ceil(b.text.length / 4) : Math.ceil(JSON.stringify(b).length / 4)),
712
730
  0
@@ -917,6 +935,7 @@ Summarize the following message range:`;
917
935
  let boundary = preserveIdx;
918
936
  for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {
919
937
  const m = messages[i];
938
+ if (!m) continue;
920
939
  if (m.role === "user" && this.hasTextContent(m)) {
921
940
  boundary = i;
922
941
  break;
@@ -1438,6 +1457,12 @@ function createToolOutputSerializer(opts = {}) {
1438
1457
  }
1439
1458
 
1440
1459
  // src/execution/tool-executor.ts
1460
+ function expectDefined4(value) {
1461
+ if (value === null || value === void 0) {
1462
+ throw new Error("Expected value to be defined");
1463
+ }
1464
+ return value;
1465
+ }
1441
1466
  var ToolExecutor = class {
1442
1467
  constructor(registry, opts) {
1443
1468
  this.registry = registry;
@@ -1726,6 +1751,9 @@ ${post.additionalContext}` };
1726
1751
  async runStreamedTool(tool, input, ctx, signal, toolUseId) {
1727
1752
  let finalOutput;
1728
1753
  let sawFinal = false;
1754
+ if (!tool.executeStream) {
1755
+ throw new Error(`Tool "${tool.name}" does not support streaming execution`);
1756
+ }
1729
1757
  const stream = tool.executeStream(input, ctx, { signal });
1730
1758
  for await (const ev of stream) {
1731
1759
  if (ev.type === "final") {
@@ -1830,7 +1858,7 @@ function hasMalformedArguments(input) {
1830
1858
  function extractMalformedRaw(input) {
1831
1859
  if (!hasMalformedArguments(input)) return void 0;
1832
1860
  const obj = input;
1833
- const value = obj[Object.keys(obj)[0]];
1861
+ const value = obj[expectDefined4(Object.keys(obj)[0])];
1834
1862
  if (value === void 0 || value === null) return void 0;
1835
1863
  if (typeof value === "string") return value;
1836
1864
  try {
@@ -2887,16 +2915,16 @@ var SubagentBudget = class _SubagentBudget {
2887
2915
  }
2888
2916
  if (exceeded.length === 0) return [];
2889
2917
  if (!this._onThreshold) {
2890
- const first2 = exceeded[0];
2918
+ const first2 = exceeded[0] ?? { kind: "iterations", limit: 0, used: 0 };
2891
2919
  throw new BudgetExceededError(first2.kind, first2.limit, first2.used);
2892
2920
  }
2893
2921
  if (this._mode === "sync") {
2894
- const first2 = exceeded[0];
2922
+ const first2 = exceeded[0] ?? { kind: "iterations", limit: 0, used: 0 };
2895
2923
  throw new BudgetExceededError(first2.kind, first2.limit, first2.used);
2896
2924
  }
2897
2925
  const bus = this._events;
2898
2926
  if (!bus || !bus.hasListenerFor("budget.threshold_reached")) {
2899
- const first2 = exceeded[0];
2927
+ const first2 = exceeded[0] ?? { kind: "iterations", limit: 0, used: 0 };
2900
2928
  throw new BudgetExceededError(first2.kind, first2.limit, first2.used);
2901
2929
  }
2902
2930
  for (const entry of exceeded) {
@@ -2904,8 +2932,9 @@ var SubagentBudget = class _SubagentBudget {
2904
2932
  const decision2 = this._negotiateExtension(entry.kind, exceeded);
2905
2933
  this._pendingNegotiations.set(entry.kind, decision2);
2906
2934
  }
2907
- const first = exceeded[0];
2935
+ const first = exceeded[0] ?? { kind: "iterations", limit: 0, used: 0 };
2908
2936
  const decision = this._pendingNegotiations.get(first.kind);
2937
+ if (!decision) throw new Error(`No pending negotiation for ${first.kind}`);
2909
2938
  throw new BudgetThresholdSignal(first.kind, first.limit, first.used, decision);
2910
2939
  }
2911
2940
  /**
@@ -2927,8 +2956,11 @@ var SubagentBudget = class _SubagentBudget {
2927
2956
  * a fresh signal.
2928
2957
  */
2929
2958
  async _negotiateExtension(kind, exceeded) {
2959
+ if (!this._onThreshold) {
2960
+ return "stop";
2961
+ }
2930
2962
  try {
2931
- const first = exceeded[0];
2963
+ const first = exceeded[0] ?? { kind: "iterations", limit: 0, used: 0 };
2932
2964
  const result = this._onThreshold({
2933
2965
  kind: first.kind,
2934
2966
  used: first.used,
@@ -5397,6 +5429,11 @@ var AGENT_CATALOG = (() => {
5397
5429
 
5398
5430
  // src/coordination/dispatcher.ts
5399
5431
  var DEFAULT_DISPATCH_ROLE = "executor";
5432
+ var FALLBACK_DEFINITION = {
5433
+ config: { role: "unknown", name: "Unknown Agent" },
5434
+ budget: {},
5435
+ capability: { phase: "meta", summary: "", keywords: [] }
5436
+ };
5400
5437
  function normalize(text) {
5401
5438
  return ` ${text.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim()} `;
5402
5439
  }
@@ -5424,7 +5461,7 @@ function scoreAgents(task, catalog = AGENT_CATALOG) {
5424
5461
  }
5425
5462
  function heuristicConfidence(candidates) {
5426
5463
  if (candidates.length === 0) return 0;
5427
- const top = candidates[0].score;
5464
+ const top = candidates[0]?.score ?? 0;
5428
5465
  const second = candidates[1]?.score ?? 0;
5429
5466
  const strength = Math.min(1, top / 3);
5430
5467
  const margin = (top - second + 1) / (top + 1);
@@ -5440,7 +5477,7 @@ async function dispatchAgent(task, opts = {}) {
5440
5477
  if (top && confidence >= threshold) {
5441
5478
  return {
5442
5479
  role: top.role,
5443
- definition: catalog[top.role],
5480
+ definition: catalog[top.role] ?? FALLBACK_DEFINITION,
5444
5481
  confidence,
5445
5482
  method: "heuristic",
5446
5483
  reason: `Matched keywords: ${top.matched.slice(0, 4).join(", ")}`,
@@ -5448,7 +5485,7 @@ async function dispatchAgent(task, opts = {}) {
5448
5485
  };
5449
5486
  }
5450
5487
  if (opts.classifier) {
5451
- const pool = (candidates.length > 0 ? candidates.slice(0, maxCandidates).map((c) => catalog[c.role]) : ALL_AGENT_DEFINITIONS).map((d) => ({
5488
+ const pool = (candidates.length > 0 ? candidates.slice(0, maxCandidates).map((c) => catalog[c.role] ?? FALLBACK_DEFINITION) : ALL_AGENT_DEFINITIONS).map((d) => ({
5452
5489
  role: d.config.role,
5453
5490
  name: d.config.name,
5454
5491
  summary: d.capability.summary
@@ -5458,7 +5495,7 @@ async function dispatchAgent(task, opts = {}) {
5458
5495
  if (choice && catalog[choice.role]) {
5459
5496
  return {
5460
5497
  role: choice.role,
5461
- definition: catalog[choice.role],
5498
+ definition: catalog[choice.role] ?? FALLBACK_DEFINITION,
5462
5499
  confidence: 1,
5463
5500
  method: "llm",
5464
5501
  reason: choice.reason ?? "Selected by LLM classifier",
@@ -5471,17 +5508,17 @@ async function dispatchAgent(task, opts = {}) {
5471
5508
  if (top) {
5472
5509
  return {
5473
5510
  role: top.role,
5474
- definition: catalog[top.role],
5511
+ definition: catalog[top.role] ?? FALLBACK_DEFINITION,
5475
5512
  confidence,
5476
5513
  method: "heuristic",
5477
5514
  reason: `Weak match (${top.matched.slice(0, 3).join(", ") || "low signal"})`,
5478
5515
  alternatives: candidates.slice(1, maxCandidates)
5479
5516
  };
5480
5517
  }
5481
- const fallbackRole = catalog[DEFAULT_DISPATCH_ROLE] ? DEFAULT_DISPATCH_ROLE : Object.keys(catalog)[0];
5518
+ const fallbackRole = catalog[DEFAULT_DISPATCH_ROLE] ? DEFAULT_DISPATCH_ROLE : Object.keys(catalog)[0] ?? DEFAULT_DISPATCH_ROLE;
5482
5519
  return {
5483
5520
  role: fallbackRole,
5484
- definition: catalog[fallbackRole],
5521
+ definition: catalog[fallbackRole] ?? FALLBACK_DEFINITION,
5485
5522
  confidence: 0,
5486
5523
  method: "fallback",
5487
5524
  reason: "No keyword signal; defaulting to the generalist Executor",
@@ -6123,6 +6160,7 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6123
6160
  takeNextDispatchableTask() {
6124
6161
  for (let i = 0; i < this.pendingTasks.length; i++) {
6125
6162
  const task = this.pendingTasks[i];
6163
+ if (!task) continue;
6126
6164
  const subagentId = task.subagentId ? this.isIdleSubagent(task.subagentId) ? task.subagentId : null : this.findIdleSubagent();
6127
6165
  if (!subagentId) continue;
6128
6166
  this.pendingTasks.splice(i, 1);
@@ -6314,14 +6352,14 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6314
6352
  const idleExceeded = idleLimit !== void 0 && budget.idleMs() >= idleLimit;
6315
6353
  if (idleExceeded && !wallExceeded) {
6316
6354
  this.subagents.get(ctx.subagentId)?.abortController.abort();
6317
- reject(new BudgetExceededError("timeout", idleLimit, budget.idleMs()));
6355
+ reject(new BudgetExceededError("timeout", idleLimit ?? 0, budget.idleMs()));
6318
6356
  return;
6319
6357
  }
6320
6358
  if (!wallExceeded) {
6321
6359
  scheduleNext();
6322
6360
  return;
6323
6361
  }
6324
- const limit = wallLimit;
6362
+ const limit = wallLimit ?? 0;
6325
6363
  if (!budget.onThreshold) {
6326
6364
  this.subagents.get(ctx.subagentId)?.abortController.abort();
6327
6365
  reject(new BudgetExceededError("timeout", limit, elapsed));
@@ -6480,6 +6518,12 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
6480
6518
  };
6481
6519
 
6482
6520
  // src/execution/parallel-eternal-engine.ts
6521
+ function expectDefined5(value) {
6522
+ if (value === null || value === void 0) {
6523
+ throw new Error("Expected value to be defined");
6524
+ }
6525
+ return value;
6526
+ }
6483
6527
  function sleep2(ms) {
6484
6528
  return new Promise((resolve2) => setTimeout(resolve2, ms));
6485
6529
  }
@@ -6638,7 +6682,7 @@ var ParallelEternalEngine = class {
6638
6682
  // Fan-out
6639
6683
  // -------------------------------------------------------------------------
6640
6684
  async fanOut(goal, tasks) {
6641
- const coordinator = this.coordinator;
6685
+ const coordinator = expectDefined5(this.coordinator);
6642
6686
  const slotCount = Math.min(this.slots, tasks.length);
6643
6687
  const routes = this.dispatchEnabled ? await Promise.all(
6644
6688
  tasks.slice(0, slotCount).map(
@@ -6670,7 +6714,7 @@ ${recentJournal}` : "No prior iterations.",
6670
6714
  const routeInfo = [];
6671
6715
  const spawnPromises = [];
6672
6716
  for (let i = 0; i < slotCount; i++) {
6673
- const task = tasks[i];
6717
+ const task = expectDefined5(tasks[i]);
6674
6718
  const route = routes[i] ?? null;
6675
6719
  const subagentId = `parallel-${this.iterations}-${i}`;
6676
6720
  const taskId = randomUUID();
@@ -7256,7 +7300,7 @@ function parseDescription(raw) {
7256
7300
  const scope = [];
7257
7301
  const coversMatch = /(?:covers|for|including)\s+([^.]+)/i.exec(desc);
7258
7302
  if (coversMatch) {
7259
- const items = coversMatch[1].replace(/[·•]/g, ",").split(",").map((s) => s.trim()).filter(Boolean);
7303
+ const items = coversMatch[1] ?? "".replace(/[·•]/g, ",").split(",").map((s) => s.trim()).filter(Boolean);
7260
7304
  scope.push(...items);
7261
7305
  }
7262
7306
  return { trigger, scope };