@brainervirus/workit-pi 8.27.0 → 8.28.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/workit.js +135 -87
- package/package.json +1 -1
package/dist/workit.js
CHANGED
|
@@ -23839,6 +23839,138 @@ var standingDelta = (input) => {
|
|
|
23839
23839
|
}
|
|
23840
23840
|
};
|
|
23841
23841
|
var sinceStart = new Map;
|
|
23842
|
+
// packages/workit-core/src/core/role-models.ts
|
|
23843
|
+
var MODEL_ROLES = [
|
|
23844
|
+
"decider",
|
|
23845
|
+
"implementer",
|
|
23846
|
+
"verifier",
|
|
23847
|
+
"reviewer",
|
|
23848
|
+
"explore",
|
|
23849
|
+
"babysit"
|
|
23850
|
+
];
|
|
23851
|
+
var MODEL_TIERS = ["mundane", "standard", "hard"];
|
|
23852
|
+
var HOST_KEYS = new Set([
|
|
23853
|
+
"claude_code",
|
|
23854
|
+
"opencode",
|
|
23855
|
+
"codex",
|
|
23856
|
+
"codex_cli",
|
|
23857
|
+
"codex_desktop",
|
|
23858
|
+
"cursor",
|
|
23859
|
+
"pi",
|
|
23860
|
+
"default"
|
|
23861
|
+
]);
|
|
23862
|
+
var BUILT_IN_CLAUDE_CODE = {
|
|
23863
|
+
decider: { model: "fable", effort: "high" },
|
|
23864
|
+
"implementer.hard": { model: "opus" },
|
|
23865
|
+
"implementer.standard": { model: "sonnet" },
|
|
23866
|
+
"implementer.mundane": { model: "haiku" },
|
|
23867
|
+
verifier: { model: "sonnet" },
|
|
23868
|
+
reviewer: { model: "opus" },
|
|
23869
|
+
explore: { model: "haiku" },
|
|
23870
|
+
babysit: { model: "haiku" }
|
|
23871
|
+
};
|
|
23872
|
+
var isObject7 = (value) => !!value && typeof value === "object" && !Array.isArray(value);
|
|
23873
|
+
var name = (value) => typeof value === "string" && value.trim() ? value.trim() : null;
|
|
23874
|
+
var leaf = (value) => {
|
|
23875
|
+
const text = name(value);
|
|
23876
|
+
if (text)
|
|
23877
|
+
return { model: text, effort: null };
|
|
23878
|
+
if (!isObject7(value))
|
|
23879
|
+
return null;
|
|
23880
|
+
const model = name(value.model);
|
|
23881
|
+
return model ? { model, effort: name(value.effort) } : null;
|
|
23882
|
+
};
|
|
23883
|
+
var isFlat = (value) => typeof value === "string" || isObject7(value) && Object.hasOwn(value, "model");
|
|
23884
|
+
var forHost = (value, host) => {
|
|
23885
|
+
if (isFlat(value))
|
|
23886
|
+
return leaf(value);
|
|
23887
|
+
if (!isObject7(value))
|
|
23888
|
+
return null;
|
|
23889
|
+
const family = host ? hostFamily(host) : null;
|
|
23890
|
+
for (const key of [family, host, "default"])
|
|
23891
|
+
if (key && Object.hasOwn(value, key)) {
|
|
23892
|
+
const found = leaf(value[key]);
|
|
23893
|
+
if (found)
|
|
23894
|
+
return found;
|
|
23895
|
+
}
|
|
23896
|
+
return null;
|
|
23897
|
+
};
|
|
23898
|
+
var rolesOf = (models) => isObject7(models) && isObject7(models.roles) ? models.roles : null;
|
|
23899
|
+
var resolveRoleModel = (cwd, selector, host, dir) => {
|
|
23900
|
+
const { role, tier } = selector;
|
|
23901
|
+
for (const source of modelSources(cwd, dir)) {
|
|
23902
|
+
const where = source.global ? "the global default" : `workspace ${source.name}`;
|
|
23903
|
+
const roles = rolesOf(source.models);
|
|
23904
|
+
const configured = roles && Object.hasOwn(roles, role) ? roles[role] : undefined;
|
|
23905
|
+
const fromRoles = role === "implementer" ? tier && isObject7(configured) && Object.hasOwn(configured, tier) ? forHost(configured[tier], host) : null : forHost(configured, host);
|
|
23906
|
+
if (fromRoles)
|
|
23907
|
+
return { ...fromRoles, source: `models.roles in ${where}` };
|
|
23908
|
+
if (role === "implementer" && tier && isObject7(source.tierModels)) {
|
|
23909
|
+
const fromTiers = Object.hasOwn(source.tierModels, tier) ? forHost(source.tierModels[tier], host) : null;
|
|
23910
|
+
if (fromTiers)
|
|
23911
|
+
return { model: fromTiers.model, effort: null, source: `fanout.tierModels in ${where}` };
|
|
23912
|
+
}
|
|
23913
|
+
}
|
|
23914
|
+
if (host && hostFamily(host) === "claude_code") {
|
|
23915
|
+
const builtIn = BUILT_IN_CLAUDE_CODE[tier ? `${role}.${tier}` : role];
|
|
23916
|
+
if (builtIn)
|
|
23917
|
+
return { model: builtIn.model, effort: builtIn.effort ?? null, source: "built-in" };
|
|
23918
|
+
}
|
|
23919
|
+
return null;
|
|
23920
|
+
};
|
|
23921
|
+
var uniformImplementerModel = (cwd, host, dir) => {
|
|
23922
|
+
const tiers = MODEL_TIERS.map((tier) => resolveRoleModel(cwd, { role: "implementer", tier }, host, dir));
|
|
23923
|
+
const [first] = tiers;
|
|
23924
|
+
return first && tiers.every((t) => t?.model === first.model && t.effort === first.effort) ? first : null;
|
|
23925
|
+
};
|
|
23926
|
+
var ROLE_SELECTORS = MODEL_ROLES.flatMap((role) => role === "implementer" ? MODEL_TIERS.map((tier) => ({ role, tier })) : [{ role }]);
|
|
23927
|
+
var roleForAgentType = (agentType, prompt) => {
|
|
23928
|
+
switch (agentType) {
|
|
23929
|
+
case "workit:implementer": {
|
|
23930
|
+
const tier = typeof prompt === "string" ? /^[ \t]*TIER:[ \t]*(mundane|standard|hard)\b/im.exec(prompt)?.[1] : undefined;
|
|
23931
|
+
return { role: "implementer", tier: tier?.toLowerCase() ?? "standard" };
|
|
23932
|
+
}
|
|
23933
|
+
case "workit:verifier":
|
|
23934
|
+
return { role: "verifier" };
|
|
23935
|
+
case "workit:reviewer":
|
|
23936
|
+
return { role: "reviewer" };
|
|
23937
|
+
case "Explore":
|
|
23938
|
+
return { role: "explore" };
|
|
23939
|
+
default:
|
|
23940
|
+
return null;
|
|
23941
|
+
}
|
|
23942
|
+
};
|
|
23943
|
+
|
|
23944
|
+
// packages/workit-core/src/hooks/agent-model.ts
|
|
23945
|
+
var MODELS = new Set(["sonnet", "opus", "haiku", "fable"]);
|
|
23946
|
+
var EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]);
|
|
23947
|
+
var given = (value) => typeof value === "string" && value.trim() !== "";
|
|
23948
|
+
var agentModelDecision = (cwd, tool, env = process.env) => {
|
|
23949
|
+
if (given(tool.model) || env.CLAUDE_CODE_SUBAGENT_MODEL_FORCE)
|
|
23950
|
+
return { kind: "none" };
|
|
23951
|
+
const selector = roleForAgentType(tool.subagent_type, tool.prompt);
|
|
23952
|
+
if (!selector)
|
|
23953
|
+
return { kind: "none" };
|
|
23954
|
+
const resolved = resolveRoleModel(cwd, selector, "claude_code");
|
|
23955
|
+
if (!resolved)
|
|
23956
|
+
return { kind: "none" };
|
|
23957
|
+
const model = resolved.model.toLowerCase();
|
|
23958
|
+
const effort = resolved.effort?.toLowerCase() ?? null;
|
|
23959
|
+
const input = { ...tool };
|
|
23960
|
+
if (MODELS.has(model))
|
|
23961
|
+
input.model = model;
|
|
23962
|
+
if (effort && EFFORTS.has(effort) && !given(tool.effort))
|
|
23963
|
+
input.effort = effort;
|
|
23964
|
+
if (input.model === undefined && input.effort === tool.effort)
|
|
23965
|
+
return { kind: "none" };
|
|
23966
|
+
const label = selector.tier ? `${selector.role} ${selector.tier}` : selector.role;
|
|
23967
|
+
return {
|
|
23968
|
+
kind: "update-input",
|
|
23969
|
+
input,
|
|
23970
|
+
text: `Workit set ${String(input.model ?? "no model")}${input.effort !== tool.effort ? ` (effort ${String(input.effort)})` : ""} on this ${String(tool.subagent_type)} spawn: role ${label}, ${resolved.source}. Name a model to choose another.`
|
|
23971
|
+
};
|
|
23972
|
+
};
|
|
23973
|
+
|
|
23842
23974
|
// packages/workit-core/src/hooks/cwd-normalize.ts
|
|
23843
23975
|
var DIR = String.raw`[A-Za-z0-9_./@%+:,=-]+|'[^'$${"`"}\\\n]*'|"[^"$${"`"}\\!\n]*"`;
|
|
23844
23976
|
var COMPOUND = new RegExp(String.raw`^\s*cd\s+(${DIR})\s*&&\s*(workit(?:\s[\s\S]*)?)$`, "u");
|
|
@@ -24202,7 +24334,7 @@ function handleHook(input, deps) {
|
|
|
24202
24334
|
const delta = standingDelta(input);
|
|
24203
24335
|
if (!delta)
|
|
24204
24336
|
return decision;
|
|
24205
|
-
return decision.kind === "rewrite" ? { ...decision, text: [decision.text, delta].filter(Boolean).join(`
|
|
24337
|
+
return decision.kind === "rewrite" || decision.kind === "update-input" ? { ...decision, text: [decision.text, delta].filter(Boolean).join(`
|
|
24206
24338
|
`) } : withContextLine(decision, delta);
|
|
24207
24339
|
}
|
|
24208
24340
|
function decide(input, deps) {
|
|
@@ -24315,6 +24447,8 @@ function decide(input, deps) {
|
|
|
24315
24447
|
case "tool.pre":
|
|
24316
24448
|
if (event.skill)
|
|
24317
24449
|
recordSkillLoad(input, event.skill, "tool");
|
|
24450
|
+
if (event.agentInput && input.host === "claude_code")
|
|
24451
|
+
return agentModelDecision(input.cwd, event.agentInput);
|
|
24318
24452
|
return NONE6;
|
|
24319
24453
|
case "stop":
|
|
24320
24454
|
return usable2(descriptor.events.stop.support) ? stopDecision(input, descriptor) : NONE6;
|
|
@@ -24697,92 +24831,6 @@ var cancelHint = (workerId) => `cancel it first: workit_worker {"action":"cancel
|
|
|
24697
24831
|
import { spawn as nodeSpawn } from "node:child_process";
|
|
24698
24832
|
import { randomUUID as randomUUID4 } from "node:crypto";
|
|
24699
24833
|
|
|
24700
|
-
// packages/workit-core/src/core/role-models.ts
|
|
24701
|
-
var MODEL_ROLES = [
|
|
24702
|
-
"decider",
|
|
24703
|
-
"implementer",
|
|
24704
|
-
"verifier",
|
|
24705
|
-
"reviewer",
|
|
24706
|
-
"explore",
|
|
24707
|
-
"babysit"
|
|
24708
|
-
];
|
|
24709
|
-
var MODEL_TIERS = ["mundane", "standard", "hard"];
|
|
24710
|
-
var HOST_KEYS = new Set([
|
|
24711
|
-
"claude_code",
|
|
24712
|
-
"opencode",
|
|
24713
|
-
"codex",
|
|
24714
|
-
"codex_cli",
|
|
24715
|
-
"codex_desktop",
|
|
24716
|
-
"cursor",
|
|
24717
|
-
"pi",
|
|
24718
|
-
"default"
|
|
24719
|
-
]);
|
|
24720
|
-
var BUILT_IN_CLAUDE_CODE = {
|
|
24721
|
-
decider: { model: "fable", effort: "high" },
|
|
24722
|
-
"implementer.hard": { model: "opus" },
|
|
24723
|
-
"implementer.standard": { model: "sonnet" },
|
|
24724
|
-
"implementer.mundane": { model: "haiku" },
|
|
24725
|
-
verifier: { model: "sonnet" },
|
|
24726
|
-
reviewer: { model: "opus" },
|
|
24727
|
-
explore: { model: "haiku" },
|
|
24728
|
-
babysit: { model: "haiku" }
|
|
24729
|
-
};
|
|
24730
|
-
var isObject7 = (value) => !!value && typeof value === "object" && !Array.isArray(value);
|
|
24731
|
-
var name = (value) => typeof value === "string" && value.trim() ? value.trim() : null;
|
|
24732
|
-
var leaf = (value) => {
|
|
24733
|
-
const text = name(value);
|
|
24734
|
-
if (text)
|
|
24735
|
-
return { model: text, effort: null };
|
|
24736
|
-
if (!isObject7(value))
|
|
24737
|
-
return null;
|
|
24738
|
-
const model = name(value.model);
|
|
24739
|
-
return model ? { model, effort: name(value.effort) } : null;
|
|
24740
|
-
};
|
|
24741
|
-
var isFlat = (value) => typeof value === "string" || isObject7(value) && Object.hasOwn(value, "model");
|
|
24742
|
-
var forHost = (value, host) => {
|
|
24743
|
-
if (isFlat(value))
|
|
24744
|
-
return leaf(value);
|
|
24745
|
-
if (!isObject7(value))
|
|
24746
|
-
return null;
|
|
24747
|
-
const family = host ? hostFamily(host) : null;
|
|
24748
|
-
for (const key of [family, host, "default"])
|
|
24749
|
-
if (key && Object.hasOwn(value, key)) {
|
|
24750
|
-
const found = leaf(value[key]);
|
|
24751
|
-
if (found)
|
|
24752
|
-
return found;
|
|
24753
|
-
}
|
|
24754
|
-
return null;
|
|
24755
|
-
};
|
|
24756
|
-
var rolesOf = (models) => isObject7(models) && isObject7(models.roles) ? models.roles : null;
|
|
24757
|
-
var resolveRoleModel = (cwd, selector, host, dir) => {
|
|
24758
|
-
const { role, tier } = selector;
|
|
24759
|
-
for (const source of modelSources(cwd, dir)) {
|
|
24760
|
-
const where = source.global ? "the global default" : `workspace ${source.name}`;
|
|
24761
|
-
const roles = rolesOf(source.models);
|
|
24762
|
-
const configured = roles && Object.hasOwn(roles, role) ? roles[role] : undefined;
|
|
24763
|
-
const fromRoles = role === "implementer" ? tier && isObject7(configured) && Object.hasOwn(configured, tier) ? forHost(configured[tier], host) : null : forHost(configured, host);
|
|
24764
|
-
if (fromRoles)
|
|
24765
|
-
return { ...fromRoles, source: `models.roles in ${where}` };
|
|
24766
|
-
if (role === "implementer" && tier && isObject7(source.tierModels)) {
|
|
24767
|
-
const fromTiers = Object.hasOwn(source.tierModels, tier) ? forHost(source.tierModels[tier], host) : null;
|
|
24768
|
-
if (fromTiers)
|
|
24769
|
-
return { model: fromTiers.model, effort: null, source: `fanout.tierModels in ${where}` };
|
|
24770
|
-
}
|
|
24771
|
-
}
|
|
24772
|
-
if (host && hostFamily(host) === "claude_code") {
|
|
24773
|
-
const builtIn = BUILT_IN_CLAUDE_CODE[tier ? `${role}.${tier}` : role];
|
|
24774
|
-
if (builtIn)
|
|
24775
|
-
return { model: builtIn.model, effort: builtIn.effort ?? null, source: "built-in" };
|
|
24776
|
-
}
|
|
24777
|
-
return null;
|
|
24778
|
-
};
|
|
24779
|
-
var uniformImplementerModel = (cwd, host, dir) => {
|
|
24780
|
-
const tiers = MODEL_TIERS.map((tier) => resolveRoleModel(cwd, { role: "implementer", tier }, host, dir));
|
|
24781
|
-
const [first] = tiers;
|
|
24782
|
-
return first && tiers.every((t) => t?.model === first.model && t.effort === first.effort) ? first : null;
|
|
24783
|
-
};
|
|
24784
|
-
var ROLE_SELECTORS = MODEL_ROLES.flatMap((role) => role === "implementer" ? MODEL_TIERS.map((tier) => ({ role, tier })) : [{ role }]);
|
|
24785
|
-
|
|
24786
24834
|
// packages/workit-pi/src/worker-protocol.ts
|
|
24787
24835
|
var MAX_WORKER_LINE_BYTES = 64 * 1024;
|
|
24788
24836
|
var MAX_WORKER_STDERR_BYTES = 64 * 1024;
|