@brainervirus/workit-codex 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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workit",
3
- "version": "8.27.0",
3
+ "version": "8.28.0",
4
4
  "description": "Adaptive engineering workflow rails for Codex",
5
5
  "author": {
6
6
  "name": "BrainerVirus"
@@ -28202,6 +28202,96 @@ var WRITE_TOOLS = new Set([
28202
28202
  ]);
28203
28203
  // packages/workit-core/src/hooks/standing.ts
28204
28204
  var sinceStart = new Map;
28205
+ // packages/workit-core/src/core/role-models.ts
28206
+ var MODEL_ROLES = [
28207
+ "decider",
28208
+ "implementer",
28209
+ "verifier",
28210
+ "reviewer",
28211
+ "explore",
28212
+ "babysit"
28213
+ ];
28214
+ var MODEL_TIERS = ["mundane", "standard", "hard"];
28215
+ var HOST_KEYS = new Set([
28216
+ "claude_code",
28217
+ "opencode",
28218
+ "codex",
28219
+ "codex_cli",
28220
+ "codex_desktop",
28221
+ "cursor",
28222
+ "pi",
28223
+ "default"
28224
+ ]);
28225
+ var BUILT_IN_CLAUDE_CODE = {
28226
+ decider: { model: "fable", effort: "high" },
28227
+ "implementer.hard": { model: "opus" },
28228
+ "implementer.standard": { model: "sonnet" },
28229
+ "implementer.mundane": { model: "haiku" },
28230
+ verifier: { model: "sonnet" },
28231
+ reviewer: { model: "opus" },
28232
+ explore: { model: "haiku" },
28233
+ babysit: { model: "haiku" }
28234
+ };
28235
+ var isObject7 = (value) => !!value && typeof value === "object" && !Array.isArray(value);
28236
+ var name = (value) => typeof value === "string" && value.trim() ? value.trim() : null;
28237
+ var leaf = (value) => {
28238
+ const text = name(value);
28239
+ if (text)
28240
+ return { model: text, effort: null };
28241
+ if (!isObject7(value))
28242
+ return null;
28243
+ const model = name(value.model);
28244
+ return model ? { model, effort: name(value.effort) } : null;
28245
+ };
28246
+ var isFlat = (value) => typeof value === "string" || isObject7(value) && Object.hasOwn(value, "model");
28247
+ var forHost = (value, host) => {
28248
+ if (isFlat(value))
28249
+ return leaf(value);
28250
+ if (!isObject7(value))
28251
+ return null;
28252
+ const family = host ? hostFamily(host) : null;
28253
+ for (const key of [family, host, "default"])
28254
+ if (key && Object.hasOwn(value, key)) {
28255
+ const found = leaf(value[key]);
28256
+ if (found)
28257
+ return found;
28258
+ }
28259
+ return null;
28260
+ };
28261
+ var rolesOf = (models) => isObject7(models) && isObject7(models.roles) ? models.roles : null;
28262
+ var resolveRoleModel = (cwd, selector, host, dir) => {
28263
+ const { role, tier } = selector;
28264
+ for (const source of modelSources(cwd, dir)) {
28265
+ const where = source.global ? "the global default" : `workspace ${source.name}`;
28266
+ const roles = rolesOf(source.models);
28267
+ const configured = roles && Object.hasOwn(roles, role) ? roles[role] : undefined;
28268
+ const fromRoles = role === "implementer" ? tier && isObject7(configured) && Object.hasOwn(configured, tier) ? forHost(configured[tier], host) : null : forHost(configured, host);
28269
+ if (fromRoles)
28270
+ return { ...fromRoles, source: `models.roles in ${where}` };
28271
+ if (role === "implementer" && tier && isObject7(source.tierModels)) {
28272
+ const fromTiers = Object.hasOwn(source.tierModels, tier) ? forHost(source.tierModels[tier], host) : null;
28273
+ if (fromTiers)
28274
+ return { model: fromTiers.model, effort: null, source: `fanout.tierModels in ${where}` };
28275
+ }
28276
+ }
28277
+ if (host && hostFamily(host) === "claude_code") {
28278
+ const builtIn = BUILT_IN_CLAUDE_CODE[tier ? `${role}.${tier}` : role];
28279
+ if (builtIn)
28280
+ return { model: builtIn.model, effort: builtIn.effort ?? null, source: "built-in" };
28281
+ }
28282
+ return null;
28283
+ };
28284
+ var uniformImplementerModel = (cwd, host, dir) => {
28285
+ const tiers = MODEL_TIERS.map((tier) => resolveRoleModel(cwd, { role: "implementer", tier }, host, dir));
28286
+ const [first] = tiers;
28287
+ return first && tiers.every((t) => t?.model === first.model && t.effort === first.effort) ? first : null;
28288
+ };
28289
+ var ROLE_SELECTORS = MODEL_ROLES.flatMap((role) => role === "implementer" ? MODEL_TIERS.map((tier) => ({ role, tier })) : [{ role }]);
28290
+
28291
+ // packages/workit-core/src/hooks/agent-model.ts
28292
+ var MODELS = new Set(["sonnet", "opus", "haiku", "fable"]);
28293
+ var EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]);
28294
+
28205
28295
  // packages/workit-core/src/hooks/cwd-normalize.ts
28206
28296
  var DIR = String.raw`[A-Za-z0-9_./@%+:,=-]+|'[^'$${"`"}\\\n]*'|"[^"$${"`"}\\!\n]*"`;
28207
28297
  var COMPOUND = new RegExp(String.raw`^\s*cd\s+(${DIR})\s*&&\s*(workit(?:\s[\s\S]*)?)$`, "u");
@@ -28375,92 +28465,6 @@ var codexCapabilities = (host, availability = {}) => capabilitiesFor(codexDescri
28375
28465
  if (false)
28376
28466
  ;
28377
28467
 
28378
- // packages/workit-core/src/core/role-models.ts
28379
- var MODEL_ROLES = [
28380
- "decider",
28381
- "implementer",
28382
- "verifier",
28383
- "reviewer",
28384
- "explore",
28385
- "babysit"
28386
- ];
28387
- var MODEL_TIERS = ["mundane", "standard", "hard"];
28388
- var HOST_KEYS = new Set([
28389
- "claude_code",
28390
- "opencode",
28391
- "codex",
28392
- "codex_cli",
28393
- "codex_desktop",
28394
- "cursor",
28395
- "pi",
28396
- "default"
28397
- ]);
28398
- var BUILT_IN_CLAUDE_CODE = {
28399
- decider: { model: "fable", effort: "high" },
28400
- "implementer.hard": { model: "opus" },
28401
- "implementer.standard": { model: "sonnet" },
28402
- "implementer.mundane": { model: "haiku" },
28403
- verifier: { model: "sonnet" },
28404
- reviewer: { model: "opus" },
28405
- explore: { model: "haiku" },
28406
- babysit: { model: "haiku" }
28407
- };
28408
- var isObject7 = (value) => !!value && typeof value === "object" && !Array.isArray(value);
28409
- var name = (value) => typeof value === "string" && value.trim() ? value.trim() : null;
28410
- var leaf = (value) => {
28411
- const text = name(value);
28412
- if (text)
28413
- return { model: text, effort: null };
28414
- if (!isObject7(value))
28415
- return null;
28416
- const model = name(value.model);
28417
- return model ? { model, effort: name(value.effort) } : null;
28418
- };
28419
- var isFlat = (value) => typeof value === "string" || isObject7(value) && Object.hasOwn(value, "model");
28420
- var forHost = (value, host) => {
28421
- if (isFlat(value))
28422
- return leaf(value);
28423
- if (!isObject7(value))
28424
- return null;
28425
- const family = host ? hostFamily(host) : null;
28426
- for (const key of [family, host, "default"])
28427
- if (key && Object.hasOwn(value, key)) {
28428
- const found = leaf(value[key]);
28429
- if (found)
28430
- return found;
28431
- }
28432
- return null;
28433
- };
28434
- var rolesOf = (models) => isObject7(models) && isObject7(models.roles) ? models.roles : null;
28435
- var resolveRoleModel = (cwd, selector, host, dir) => {
28436
- const { role, tier } = selector;
28437
- for (const source of modelSources(cwd, dir)) {
28438
- const where = source.global ? "the global default" : `workspace ${source.name}`;
28439
- const roles = rolesOf(source.models);
28440
- const configured = roles && Object.hasOwn(roles, role) ? roles[role] : undefined;
28441
- const fromRoles = role === "implementer" ? tier && isObject7(configured) && Object.hasOwn(configured, tier) ? forHost(configured[tier], host) : null : forHost(configured, host);
28442
- if (fromRoles)
28443
- return { ...fromRoles, source: `models.roles in ${where}` };
28444
- if (role === "implementer" && tier && isObject7(source.tierModels)) {
28445
- const fromTiers = Object.hasOwn(source.tierModels, tier) ? forHost(source.tierModels[tier], host) : null;
28446
- if (fromTiers)
28447
- return { model: fromTiers.model, effort: null, source: `fanout.tierModels in ${where}` };
28448
- }
28449
- }
28450
- if (host && hostFamily(host) === "claude_code") {
28451
- const builtIn = BUILT_IN_CLAUDE_CODE[tier ? `${role}.${tier}` : role];
28452
- if (builtIn)
28453
- return { model: builtIn.model, effort: builtIn.effort ?? null, source: "built-in" };
28454
- }
28455
- return null;
28456
- };
28457
- var uniformImplementerModel = (cwd, host, dir) => {
28458
- const tiers = MODEL_TIERS.map((tier) => resolveRoleModel(cwd, { role: "implementer", tier }, host, dir));
28459
- const [first] = tiers;
28460
- return first && tiers.every((t) => t?.model === first.model && t.effort === first.effort) ? first : null;
28461
- };
28462
- var ROLE_SELECTORS = MODEL_ROLES.flatMap((role) => role === "implementer" ? MODEL_TIERS.map((tier) => ({ role, tier })) : [{ role }]);
28463
-
28464
28468
  // packages/workit-codex/scripts/agents.ts
28465
28469
  import {
28466
28470
  existsSync as existsSync10,
@@ -8814,6 +8814,34 @@ var workspaceTrailers = (cwd, dir) => {
8814
8814
  };
8815
8815
  };
8816
8816
  var workspaceLiveSessionGuard = (cwd, dir) => inheritedSetting(cwd, dir, (entry) => typeof entry.liveSessionGuard === "boolean")?.source?.liveSessionGuard !== false;
8817
+ var modelSources = (cwd, dir) => {
8818
+ const out = [];
8819
+ try {
8820
+ const matched = matchRuntimeWorkspace(cwd, dir);
8821
+ if (matched) {
8822
+ const enclosing = matched.matches.filter((entry) => entry !== matched.selected).toSorted((a, b) => globSpecificity(b.glob) - globSpecificity(a.glob));
8823
+ for (const entry of [matched.selected, ...enclosing])
8824
+ out.push({
8825
+ name: entry.name,
8826
+ global: false,
8827
+ models: entry.models,
8828
+ tierModels: entry.fanout?.tierModels
8829
+ });
8830
+ }
8831
+ } catch {}
8832
+ try {
8833
+ const document = JSON.parse(readFileSync2(path6.join(dir ?? configDir(), "workspaces.json"), "utf8"));
8834
+ if (document && typeof document === "object" && !Array.isArray(document))
8835
+ out.push({
8836
+ name: "global",
8837
+ global: true,
8838
+ models: document.models,
8839
+ tierModels: undefined
8840
+ });
8841
+ } catch {}
8842
+ return out;
8843
+ };
8844
+ var hostFamily = (host) => host.replace(/_(?:cli|desktop)$/u, "");
8817
8845
  var TIER_KEYS = new Set(["mundane", "standard", "hard"]);
8818
8846
  var TIER_HOSTS = new Set([
8819
8847
  "claude_code",
@@ -21921,6 +21949,133 @@ var standingDelta = (input) => {
21921
21949
  }
21922
21950
  };
21923
21951
  var sinceStart = new Map;
21952
+ // packages/workit-core/src/core/role-models.ts
21953
+ var MODEL_ROLES = [
21954
+ "decider",
21955
+ "implementer",
21956
+ "verifier",
21957
+ "reviewer",
21958
+ "explore",
21959
+ "babysit"
21960
+ ];
21961
+ var MODEL_TIERS = ["mundane", "standard", "hard"];
21962
+ var HOST_KEYS = new Set([
21963
+ "claude_code",
21964
+ "opencode",
21965
+ "codex",
21966
+ "codex_cli",
21967
+ "codex_desktop",
21968
+ "cursor",
21969
+ "pi",
21970
+ "default"
21971
+ ]);
21972
+ var BUILT_IN_CLAUDE_CODE = {
21973
+ decider: { model: "fable", effort: "high" },
21974
+ "implementer.hard": { model: "opus" },
21975
+ "implementer.standard": { model: "sonnet" },
21976
+ "implementer.mundane": { model: "haiku" },
21977
+ verifier: { model: "sonnet" },
21978
+ reviewer: { model: "opus" },
21979
+ explore: { model: "haiku" },
21980
+ babysit: { model: "haiku" }
21981
+ };
21982
+ var isObject7 = (value) => !!value && typeof value === "object" && !Array.isArray(value);
21983
+ var name = (value) => typeof value === "string" && value.trim() ? value.trim() : null;
21984
+ var leaf = (value) => {
21985
+ const text = name(value);
21986
+ if (text)
21987
+ return { model: text, effort: null };
21988
+ if (!isObject7(value))
21989
+ return null;
21990
+ const model = name(value.model);
21991
+ return model ? { model, effort: name(value.effort) } : null;
21992
+ };
21993
+ var isFlat = (value) => typeof value === "string" || isObject7(value) && Object.hasOwn(value, "model");
21994
+ var forHost = (value, host) => {
21995
+ if (isFlat(value))
21996
+ return leaf(value);
21997
+ if (!isObject7(value))
21998
+ return null;
21999
+ const family = host ? hostFamily(host) : null;
22000
+ for (const key of [family, host, "default"])
22001
+ if (key && Object.hasOwn(value, key)) {
22002
+ const found = leaf(value[key]);
22003
+ if (found)
22004
+ return found;
22005
+ }
22006
+ return null;
22007
+ };
22008
+ var rolesOf = (models) => isObject7(models) && isObject7(models.roles) ? models.roles : null;
22009
+ var resolveRoleModel = (cwd, selector, host, dir) => {
22010
+ const { role, tier } = selector;
22011
+ for (const source of modelSources(cwd, dir)) {
22012
+ const where = source.global ? "the global default" : `workspace ${source.name}`;
22013
+ const roles = rolesOf(source.models);
22014
+ const configured = roles && Object.hasOwn(roles, role) ? roles[role] : undefined;
22015
+ const fromRoles = role === "implementer" ? tier && isObject7(configured) && Object.hasOwn(configured, tier) ? forHost(configured[tier], host) : null : forHost(configured, host);
22016
+ if (fromRoles)
22017
+ return { ...fromRoles, source: `models.roles in ${where}` };
22018
+ if (role === "implementer" && tier && isObject7(source.tierModels)) {
22019
+ const fromTiers = Object.hasOwn(source.tierModels, tier) ? forHost(source.tierModels[tier], host) : null;
22020
+ if (fromTiers)
22021
+ return { model: fromTiers.model, effort: null, source: `fanout.tierModels in ${where}` };
22022
+ }
22023
+ }
22024
+ if (host && hostFamily(host) === "claude_code") {
22025
+ const builtIn = BUILT_IN_CLAUDE_CODE[tier ? `${role}.${tier}` : role];
22026
+ if (builtIn)
22027
+ return { model: builtIn.model, effort: builtIn.effort ?? null, source: "built-in" };
22028
+ }
22029
+ return null;
22030
+ };
22031
+ var ROLE_SELECTORS = MODEL_ROLES.flatMap((role) => role === "implementer" ? MODEL_TIERS.map((tier) => ({ role, tier })) : [{ role }]);
22032
+ var roleForAgentType = (agentType, prompt) => {
22033
+ switch (agentType) {
22034
+ case "workit:implementer": {
22035
+ const tier = typeof prompt === "string" ? /^[ \t]*TIER:[ \t]*(mundane|standard|hard)\b/im.exec(prompt)?.[1] : undefined;
22036
+ return { role: "implementer", tier: tier?.toLowerCase() ?? "standard" };
22037
+ }
22038
+ case "workit:verifier":
22039
+ return { role: "verifier" };
22040
+ case "workit:reviewer":
22041
+ return { role: "reviewer" };
22042
+ case "Explore":
22043
+ return { role: "explore" };
22044
+ default:
22045
+ return null;
22046
+ }
22047
+ };
22048
+
22049
+ // packages/workit-core/src/hooks/agent-model.ts
22050
+ var MODELS = new Set(["sonnet", "opus", "haiku", "fable"]);
22051
+ var EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]);
22052
+ var given = (value) => typeof value === "string" && value.trim() !== "";
22053
+ var agentModelDecision = (cwd, tool, env = process.env) => {
22054
+ if (given(tool.model) || env.CLAUDE_CODE_SUBAGENT_MODEL_FORCE)
22055
+ return { kind: "none" };
22056
+ const selector = roleForAgentType(tool.subagent_type, tool.prompt);
22057
+ if (!selector)
22058
+ return { kind: "none" };
22059
+ const resolved = resolveRoleModel(cwd, selector, "claude_code");
22060
+ if (!resolved)
22061
+ return { kind: "none" };
22062
+ const model = resolved.model.toLowerCase();
22063
+ const effort = resolved.effort?.toLowerCase() ?? null;
22064
+ const input = { ...tool };
22065
+ if (MODELS.has(model))
22066
+ input.model = model;
22067
+ if (effort && EFFORTS.has(effort) && !given(tool.effort))
22068
+ input.effort = effort;
22069
+ if (input.model === undefined && input.effort === tool.effort)
22070
+ return { kind: "none" };
22071
+ const label = selector.tier ? `${selector.role} ${selector.tier}` : selector.role;
22072
+ return {
22073
+ kind: "update-input",
22074
+ input,
22075
+ 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.`
22076
+ };
22077
+ };
22078
+
21924
22079
  // packages/workit-core/src/hooks/cwd-normalize.ts
21925
22080
  var DIR = String.raw`[A-Za-z0-9_./@%+:,=-]+|'[^'$${"`"}\\\n]*'|"[^"$${"`"}\\!\n]*"`;
21926
22081
  var COMPOUND = new RegExp(String.raw`^\s*cd\s+(${DIR})\s*&&\s*(workit(?:\s[\s\S]*)?)$`, "u");
@@ -22284,7 +22439,7 @@ function handleHook(input, deps) {
22284
22439
  const delta = standingDelta(input);
22285
22440
  if (!delta)
22286
22441
  return decision;
22287
- return decision.kind === "rewrite" ? { ...decision, text: [decision.text, delta].filter(Boolean).join(`
22442
+ return decision.kind === "rewrite" || decision.kind === "update-input" ? { ...decision, text: [decision.text, delta].filter(Boolean).join(`
22288
22443
  `) } : withContextLine(decision, delta);
22289
22444
  }
22290
22445
  function decide(input, deps) {
@@ -22397,6 +22552,8 @@ function decide(input, deps) {
22397
22552
  case "tool.pre":
22398
22553
  if (event.skill)
22399
22554
  recordSkillLoad(input, event.skill, "tool");
22555
+ if (event.agentInput && input.host === "claude_code")
22556
+ return agentModelDecision(input.cwd, event.agentInput);
22400
22557
  return NONE6;
22401
22558
  case "stop":
22402
22559
  return usable2(descriptor.events.stop.support) ? stopDecision(input, descriptor) : NONE6;
@@ -22680,6 +22837,16 @@ var eventOf = (name, value) => {
22680
22837
  skill: isRecord5(value.tool_input) ? optionalText(value.tool_input.skill) : null
22681
22838
  }
22682
22839
  };
22840
+ if (value.tool_name === "Agent" || value.tool_name === "Task")
22841
+ return {
22842
+ ok: true,
22843
+ event: {
22844
+ kind: "tool.pre",
22845
+ tool: value.tool_name,
22846
+ toolUseId,
22847
+ ...isRecord5(value.tool_input) ? { agentInput: value.tool_input } : {}
22848
+ }
22849
+ };
22683
22850
  if (!SHELL_TOOLS.has(value.tool_name))
22684
22851
  return { ok: true, event: { kind: "tool.pre", tool: value.tool_name, toolUseId } };
22685
22852
  const command = toolCommand(value);
@@ -22756,7 +22923,7 @@ var CONTEXT_EVENTS = new Set([
22756
22923
  "PostToolUse"
22757
22924
  ]);
22758
22925
  var render = (decision, native) => {
22759
- if (decision.kind === "rewrite" && native === "PreToolUse" && decision.input)
22926
+ if ((decision.kind === "rewrite" || decision.kind === "update-input") && native === "PreToolUse" && decision.input)
22760
22927
  return {
22761
22928
  json: {
22762
22929
  hookSpecificOutput: {
@@ -49,6 +49,6 @@ if (quiet)
49
49
  process.stdout.write(`${JSON.stringify({ hookSpecificOutput: { hookEventName: quiet } })}
50
50
  `);
51
51
  else {
52
- const { runCodexHook } = await import("./workit-hook-sza2zvq6.js");
52
+ const { runCodexHook } = await import("./workit-hook-ahdnhfdm.js");
53
53
  await runCodexHook([payload]);
54
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainervirus/workit-codex",
3
- "version": "8.27.0",
3
+ "version": "8.28.0",
4
4
  "private": false,
5
5
  "description": "Workit Codex CLI/desktop plugin — shared MCP transport, hooks, method skills, and verifier/reviewer/implementer agents",
6
6
  "keywords": [
@@ -39,8 +39,8 @@
39
39
  "build": "bun scripts/build.ts"
40
40
  },
41
41
  "devDependencies": {
42
- "@brainervirus/workit-core": "^8.27.0",
43
- "@brainervirus/workit-mcp": "^8.27.0"
42
+ "@brainervirus/workit-core": "^8.28.0",
43
+ "@brainervirus/workit-mcp": "^8.28.0"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=24"