@wrongstack/core 0.264.0 → 0.267.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/{agent-bridge-D8sa1vtv.d.ts → agent-bridge-STJ3JwwK.d.ts} +1 -1
- package/dist/{agent-subagent-runner-c9DLkaas.d.ts → agent-subagent-runner-CzPGP3jA.d.ts} +131 -11
- package/dist/{brain-O1IdKPaK.d.ts → brain-Cdg77tVN.d.ts} +103 -2
- package/dist/{compactor-BBy0rCtB.d.ts → compactor-iMZ84CXq.d.ts} +19 -1
- package/dist/{config-Dz2F3H2K.d.ts → config-Du3pYYln.d.ts} +132 -13
- package/dist/{context-BGSpZNSE.d.ts → context-dT5Ueund.d.ts} +90 -12
- package/dist/coordination/index.d.ts +78 -22
- package/dist/coordination/index.js +695 -273
- package/dist/coordination/index.js.map +1 -1
- package/dist/{default-config-CXsDvOmP.d.ts → default-config-B0cj-Hry.d.ts} +11 -1
- package/dist/defaults/index.d.ts +28 -28
- package/dist/defaults/index.js +2327 -965
- package/dist/defaults/index.js.map +1 -1
- package/dist/execution/index.d.ts +16 -16
- package/dist/execution/index.js +1500 -371
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/prompt-enhancer.d.ts +2 -2
- package/dist/execution/prompt-enhancer.js +1 -1
- package/dist/execution/prompt-enhancer.js.map +1 -1
- package/dist/extension/index.d.ts +6 -6
- package/dist/{goal-preamble-DzjFuN3p.d.ts → goal-preamble-SulMTowG.d.ts} +33 -12
- package/dist/{goal-store-CxWmCGbH.d.ts → goal-store-CABDwdFE.d.ts} +1 -1
- package/dist/{index-CbLSI66_.d.ts → index-Bms0m4oy.d.ts} +5 -5
- package/dist/{index-CYIQrXVF.d.ts → index-DtCVWel4.d.ts} +8 -8
- package/dist/index-IEuxQd-E.d.ts +82 -0
- package/dist/index.d.ts +261 -57
- package/dist/index.js +4799 -2212
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +6 -6
- package/dist/infrastructure/index.js +84 -9
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/kernel/index.d.ts +9 -9
- package/dist/kernel/index.js +1 -1
- package/dist/kernel/index.js.map +1 -1
- package/dist/{mcp-servers-DC4QRPUI.d.ts → mcp-servers-C2cBTxUR.d.ts} +3 -3
- package/dist/models/index.d.ts +5 -5
- package/dist/models/index.js +104 -31
- package/dist/models/index.js.map +1 -1
- package/dist/{models-registry-B_siPxqN.d.ts → models-registry-BqGZNJQ-.d.ts} +1 -1
- package/dist/{multi-agent-coordinator-CK5Jdj9K.d.ts → multi-agent-coordinator-B8R43uPz.d.ts} +1 -1
- package/dist/{null-fleet-bus-DgvD4SCO.d.ts → null-fleet-bus-CnXa5oTH.d.ts} +14 -9
- package/dist/observability/index.d.ts +2 -2
- package/dist/{parallel-eternal-engine-bK0JQBR_.d.ts → parallel-eternal-engine-DdNnw9BQ.d.ts} +11 -9
- package/dist/{path-resolver-BPEDlN38.d.ts → path-resolver-COIMLCQL.d.ts} +3 -3
- package/dist/{permission-4yvGmMRB.d.ts → permission-B75JAi3-.d.ts} +1 -1
- package/dist/{permission-policy-C6XpsBOy.d.ts → permission-policy-DlR9eJAM.d.ts} +2 -2
- package/dist/{pipeline-CXCeMz8J.d.ts → pipeline-BfD2k1rT.d.ts} +3 -3
- package/dist/{plan-templates-BvzRBkJc.d.ts → plan-templates-DSIKCXZN.d.ts} +32 -8
- package/dist/provider-model-resolve-BNRsNuJx.d.ts +107 -0
- package/dist/{provider-runner-C5aQpDWE.d.ts → provider-runner-CX7iIvox.d.ts} +3 -3
- package/dist/{retry-policy-CFhdtRzz.d.ts → retry-policy-BilV1ujH.d.ts} +1 -1
- package/dist/sdd/index.d.ts +8 -8
- package/dist/sdd/index.js +286 -105
- package/dist/sdd/index.js.map +1 -1
- package/dist/secret-vault-BAKpgFw_.d.ts +57 -0
- package/dist/{secret-vault-CxiVLbt1.d.ts → secret-vault-gkvEZZfE.d.ts} +43 -4
- package/dist/security/index.d.ts +6 -68
- package/dist/security/index.js +296 -95
- package/dist/security/index.js.map +1 -1
- package/dist/{selector-gIuhRTkN.d.ts → selector-Bc7eWtT3.d.ts} +1 -1
- package/dist/{session-event-bridge-DkvvrpDt.d.ts → session-event-bridge-D-araDEz.d.ts} +1 -1
- package/dist/{session-reader-KdfVwkKP.d.ts → session-reader-D7Dapswh.d.ts} +1 -1
- package/dist/storage/index.d.ts +112 -15
- package/dist/storage/index.js +491 -156
- package/dist/storage/index.js.map +1 -1
- package/dist/tools/index.d.ts +4 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/types/index.d.ts +21 -21
- package/dist/types/index.js +1523 -450
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +455 -407
- package/dist/utils/index.js +2191 -1203
- package/dist/utils/index.js.map +1 -1
- package/dist/{wstack-paths-CJjEwPXn.d.ts → wstack-paths-hOpNLmvf.d.ts} +2 -0
- package/package.json +1 -1
- package/skills/api-design/SKILL.md +1 -1
- package/skills/audit-log/SKILL.md +6 -6
- package/skills/bug-hunter/SKILL.md +5 -5
- package/skills/chimera/SKILL.md +4 -4
- package/skills/docker-deploy/SKILL.md +1 -1
- package/skills/git-flow/SKILL.md +3 -3
- package/skills/multi-agent/SKILL.md +3 -3
- package/skills/node-modern/SKILL.md +1 -0
- package/skills/observability/SKILL.md +2 -2
- package/skills/output-standards/SKILL.md +51 -28
- package/skills/refactor-planner/SKILL.md +3 -3
- package/skills/security-scanner/SKILL.md +4 -3
- package/skills/tech-stack/SKILL.md +1 -2
- package/dist/llm-selector-DzxuZnNz.d.ts +0 -58
- package/dist/secret-vault-BJDY28ev.d.ts +0 -25
package/dist/models/index.js
CHANGED
|
@@ -842,12 +842,9 @@ function getCachedEstimate(key, compute) {
|
|
|
842
842
|
const existing = ESTIMATE_CACHE.get(key);
|
|
843
843
|
if (existing !== void 0) return existing;
|
|
844
844
|
if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {
|
|
845
|
-
let evicted = 0;
|
|
846
|
-
const maxEvict = Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4);
|
|
847
845
|
for (const k of ESTIMATE_CACHE.keys()) {
|
|
848
|
-
if (
|
|
846
|
+
if (ESTIMATE_CACHE.size <= Math.floor(ESTIMATE_CACHE_MAX_SIZE / 2)) break;
|
|
849
847
|
ESTIMATE_CACHE.delete(k);
|
|
850
|
-
evicted++;
|
|
851
848
|
}
|
|
852
849
|
}
|
|
853
850
|
const estimate = compute(key);
|
|
@@ -919,9 +916,9 @@ Rules:
|
|
|
919
916
|
- If unsure, keep rather than collapse (errors are more costly than waste)
|
|
920
917
|
|
|
921
918
|
Return ONLY the JSON object, no markdown, no explanation outside the JSON.`;
|
|
922
|
-
function formatMessages(messages,
|
|
919
|
+
function formatMessages(messages, maxTokens = 2048) {
|
|
923
920
|
const lines = [];
|
|
924
|
-
let
|
|
921
|
+
let usedTokens = 0;
|
|
925
922
|
for (let i = 0; i < messages.length; i++) {
|
|
926
923
|
const m = expectDefined(messages[i]);
|
|
927
924
|
const role = m.role.padEnd(10, " ");
|
|
@@ -933,13 +930,14 @@ function formatMessages(messages, maxChars = 8e3) {
|
|
|
933
930
|
text = content.filter(isTextBlock).map((b) => b.text).join(" ");
|
|
934
931
|
const toolUses = content.filter((b) => b.type === "tool_use");
|
|
935
932
|
if (toolUses.length > 0) {
|
|
936
|
-
text += ` [tools: ${toolUses.map((b) => b.name).join(", ")}]`;
|
|
933
|
+
text += ` [tools: ${toolUses.map((b) => b.name).filter(Boolean).join(", ")}]`;
|
|
937
934
|
}
|
|
938
935
|
}
|
|
939
936
|
const line = `[${i}][${role}]: ${text}`;
|
|
940
|
-
|
|
937
|
+
const lineTokens = estimateTextTokens(line);
|
|
938
|
+
if (usedTokens + lineTokens > maxTokens) break;
|
|
941
939
|
lines.push(line);
|
|
942
|
-
|
|
940
|
+
usedTokens += lineTokens;
|
|
943
941
|
}
|
|
944
942
|
return lines.join("\n");
|
|
945
943
|
}
|
|
@@ -948,20 +946,29 @@ var LLMSelector = class {
|
|
|
948
946
|
model;
|
|
949
947
|
maxContextTokens;
|
|
950
948
|
systemPrompt;
|
|
949
|
+
maxOutputTokens;
|
|
951
950
|
constructor(opts) {
|
|
952
951
|
this.provider = opts.provider;
|
|
953
952
|
this.model = opts.model ?? "unknown";
|
|
953
|
+
if (this.model === "unknown" && (process.env["NODE_ENV"] === "development" || process.env["WRONGSTACK_DEBUG"] === "1")) {
|
|
954
|
+
console.warn(
|
|
955
|
+
"[LLMSelector] model not set \u2014 selector will use the provider default. Set `model` explicitly in LLMSelectorOptions to silence this warning."
|
|
956
|
+
);
|
|
957
|
+
}
|
|
954
958
|
this.maxContextTokens = opts.maxContextTokens ?? 4e4;
|
|
955
959
|
this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;
|
|
960
|
+
this.maxOutputTokens = opts.maxOutputTokens ?? 1024;
|
|
956
961
|
}
|
|
957
962
|
async select(messages, maxToKeep) {
|
|
958
963
|
const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);
|
|
959
|
-
const historyText = formatMessages(messages);
|
|
960
964
|
const totalTokens = estimateMessageTokens(messages);
|
|
961
965
|
const systemText = `${this.systemPrompt}
|
|
962
966
|
|
|
963
967
|
Conversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):
|
|
964
968
|
`;
|
|
969
|
+
const systemTokens = estimateTextTokens(systemText);
|
|
970
|
+
const historyBudget = Math.max(512, effectiveBudget - systemTokens - this.maxOutputTokens);
|
|
971
|
+
const historyText = formatMessages(messages, historyBudget);
|
|
965
972
|
const budgetInstruction = totalTokens > effectiveBudget ? `
|
|
966
973
|
|
|
967
974
|
IMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.` : "";
|
|
@@ -969,18 +976,26 @@ IMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiv
|
|
|
969
976
|
model: this.model,
|
|
970
977
|
system: [{ type: "text", text: systemText + budgetInstruction }],
|
|
971
978
|
messages: [{ role: "user", content: historyText }],
|
|
972
|
-
maxTokens:
|
|
979
|
+
maxTokens: this.maxOutputTokens
|
|
973
980
|
};
|
|
974
981
|
let raw;
|
|
982
|
+
const ac = new AbortController();
|
|
975
983
|
try {
|
|
976
|
-
const
|
|
977
|
-
const res = await this.provider.complete(req, {
|
|
984
|
+
const timeoutSignal = AbortSignal.timeout(3e4);
|
|
985
|
+
const res = await this.provider.complete(req, {
|
|
986
|
+
signal: AbortSignal.any([ac.signal, timeoutSignal])
|
|
987
|
+
});
|
|
978
988
|
const textBlocks = res.content.filter(isTextBlock);
|
|
979
989
|
raw = textBlocks.map((b) => b.text).join("\n").trim();
|
|
980
|
-
} catch (
|
|
990
|
+
} catch (err) {
|
|
991
|
+
if (err instanceof Error) {
|
|
992
|
+
console.warn("[LLMSelector] selector call failed, using recency fallback:", err.message);
|
|
993
|
+
}
|
|
981
994
|
return this.fallbackSelect(messages, effectiveBudget);
|
|
995
|
+
} finally {
|
|
996
|
+
ac.abort();
|
|
982
997
|
}
|
|
983
|
-
return this.parseSelectorOutput(raw, messages
|
|
998
|
+
return this.parseSelectorOutput(raw, messages);
|
|
984
999
|
}
|
|
985
1000
|
fallbackSelect(messages, budget) {
|
|
986
1001
|
const toKeep = [];
|
|
@@ -1007,39 +1022,97 @@ IMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiv
|
|
|
1007
1022
|
reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`
|
|
1008
1023
|
};
|
|
1009
1024
|
}
|
|
1010
|
-
|
|
1025
|
+
/**
|
|
1026
|
+
* Parse and validate the raw LLM output into a SelectorResult.
|
|
1027
|
+
* Falls back to recency-based selection if the LLM output is malformed,
|
|
1028
|
+
* out-of-bounds, or internally inconsistent.
|
|
1029
|
+
*/
|
|
1030
|
+
parseSelectorOutput(raw, messages) {
|
|
1031
|
+
const messageCount = messages.length;
|
|
1032
|
+
if (messageCount === 0) {
|
|
1033
|
+
return { kept: [], collapsed: [], reasoning: "empty session" };
|
|
1034
|
+
}
|
|
1011
1035
|
const jsonStart = raw.indexOf("{");
|
|
1012
1036
|
const jsonEnd = raw.lastIndexOf("}");
|
|
1013
1037
|
if (jsonStart === -1 || jsonEnd === -1) {
|
|
1014
|
-
return this.fallbackSelect(
|
|
1015
|
-
Array.from({ length: messageCount }, () => ({ role: "user", content: "" })),
|
|
1016
|
-
this.maxContextTokens
|
|
1017
|
-
);
|
|
1038
|
+
return this.fallbackSelect(messages, this.maxContextTokens);
|
|
1018
1039
|
}
|
|
1019
1040
|
let parsed;
|
|
1020
1041
|
try {
|
|
1021
1042
|
parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));
|
|
1022
1043
|
} catch {
|
|
1023
|
-
return this.fallbackSelect(
|
|
1024
|
-
Array.from({ length: messageCount }, () => ({ role: "user", content: "" })),
|
|
1025
|
-
this.maxContextTokens
|
|
1026
|
-
);
|
|
1044
|
+
return this.fallbackSelect(messages, this.maxContextTokens);
|
|
1027
1045
|
}
|
|
1028
1046
|
const obj = parsed;
|
|
1029
|
-
const
|
|
1030
|
-
const
|
|
1031
|
-
|
|
1032
|
-
|
|
1047
|
+
const keptRaw = obj.kept ?? [];
|
|
1048
|
+
const collapsedRaw = obj.collapsed ?? [];
|
|
1049
|
+
const kept = [];
|
|
1050
|
+
for (const k of keptRaw) {
|
|
1051
|
+
if (typeof k.from !== "number" || typeof k.to !== "number" || k.from < 0 || k.to >= messageCount || k.from > k.to) {
|
|
1052
|
+
return this.fallbackSelect(messages, this.maxContextTokens);
|
|
1053
|
+
}
|
|
1054
|
+
kept.push({
|
|
1033
1055
|
from: k.from,
|
|
1034
1056
|
to: k.to,
|
|
1035
1057
|
importance: k.importance ?? "medium"
|
|
1036
|
-
})
|
|
1037
|
-
|
|
1058
|
+
});
|
|
1059
|
+
}
|
|
1060
|
+
const collapsed = [];
|
|
1061
|
+
for (const c of collapsedRaw) {
|
|
1062
|
+
if (typeof c.from !== "number" || typeof c.to !== "number" || c.from < 0 || c.to >= messageCount || c.from > c.to) {
|
|
1063
|
+
return this.fallbackSelect(messages, this.maxContextTokens);
|
|
1064
|
+
}
|
|
1065
|
+
collapsed.push({ from: c.from, to: c.to, summary: c.summary });
|
|
1066
|
+
}
|
|
1067
|
+
const allRanges = [...kept, ...collapsed];
|
|
1068
|
+
for (let i = 0; i < allRanges.length; i++) {
|
|
1069
|
+
const a = allRanges[i];
|
|
1070
|
+
if (!a) continue;
|
|
1071
|
+
for (let j = i + 1; j < allRanges.length; j++) {
|
|
1072
|
+
const b = allRanges[j];
|
|
1073
|
+
if (!b) continue;
|
|
1074
|
+
if (a.from <= b.to && a.to >= b.from) {
|
|
1075
|
+
return this.fallbackSelect(messages, this.maxContextTokens);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
return {
|
|
1080
|
+
kept,
|
|
1081
|
+
collapsed,
|
|
1038
1082
|
reasoning: typeof obj.reasoning === "string" ? obj.reasoning : ""
|
|
1039
1083
|
};
|
|
1040
1084
|
}
|
|
1041
1085
|
};
|
|
1042
1086
|
|
|
1087
|
+
// src/models/provider-model-resolve.ts
|
|
1088
|
+
function describeCatalogModel(m) {
|
|
1089
|
+
return {
|
|
1090
|
+
id: m.id,
|
|
1091
|
+
name: m.name,
|
|
1092
|
+
releaseDate: m.release_date,
|
|
1093
|
+
contextWindow: m.limit?.context,
|
|
1094
|
+
inputCost: m.cost?.input,
|
|
1095
|
+
outputCost: m.cost?.output,
|
|
1096
|
+
capabilities: [
|
|
1097
|
+
...m.tool_call ? ["tools"] : [],
|
|
1098
|
+
...m.reasoning ? ["reasoning"] : [],
|
|
1099
|
+
...m.modalities?.input?.includes("image") ? ["vision"] : [],
|
|
1100
|
+
...m.open_weights ? ["open_weights"] : []
|
|
1101
|
+
]
|
|
1102
|
+
};
|
|
1103
|
+
}
|
|
1104
|
+
function resolveProviderModelList(savedModels, catalog) {
|
|
1105
|
+
if (savedModels && savedModels.length > 0) {
|
|
1106
|
+
const byId = new Map((catalog?.models ?? []).map((m) => [m.id, m]));
|
|
1107
|
+
return savedModels.map((id) => {
|
|
1108
|
+
const hit = byId.get(id);
|
|
1109
|
+
return hit ? describeCatalogModel(hit) : { id, name: id, capabilities: [] };
|
|
1110
|
+
});
|
|
1111
|
+
}
|
|
1112
|
+
if (catalog) return catalog.models.map(describeCatalogModel);
|
|
1113
|
+
return [];
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1043
1116
|
// src/models/model-intelligence.ts
|
|
1044
1117
|
var MODEL_PROFILES = [
|
|
1045
1118
|
// ── Anthropic ──
|
|
@@ -1463,6 +1536,6 @@ var ModelRouter = class {
|
|
|
1463
1536
|
}
|
|
1464
1537
|
};
|
|
1465
1538
|
|
|
1466
|
-
export { DefaultModeStore, DefaultModelsRegistry, LLMSelector, MODEL_PROFILES, ModelRouter, TASK_TO_ROLE, classifyFamily, findModelProfile, inferTaskType, loadProjectModes, loadUserModes, scoreModelForTask };
|
|
1539
|
+
export { DefaultModeStore, DefaultModelsRegistry, LLMSelector, MODEL_PROFILES, ModelRouter, TASK_TO_ROLE, classifyFamily, describeCatalogModel, findModelProfile, inferTaskType, loadProjectModes, loadUserModes, resolveProviderModelList, scoreModelForTask };
|
|
1467
1540
|
//# sourceMappingURL=index.js.map
|
|
1468
1541
|
//# sourceMappingURL=index.js.map
|