@brainervirus/workit-codex 8.17.0 → 8.17.1

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.17.0",
3
+ "version": "8.17.1",
4
4
  "description": "Adaptive engineering workflow rails for Codex",
5
5
  "author": {
6
6
  "name": "BrainerVirus"
@@ -28817,6 +28817,18 @@ var WRITE_TOOLS = new Set([
28817
28817
  ]);
28818
28818
  // packages/workit-core/src/hooks/handle.ts
28819
28819
  var offered = new Set;
28820
+ // packages/workit-core/src/hooks/deadline.ts
28821
+ var QUIET = new Set([
28822
+ "stop",
28823
+ "subagent.stop",
28824
+ "shell.post",
28825
+ "compact.pre",
28826
+ "prompt.submit",
28827
+ null
28828
+ ]);
28829
+ var TIMED_OUT = Symbol("timed out");
28830
+ var PROCESS_START = performance.timeOrigin;
28831
+
28820
28832
  // packages/workit-core/src/hooks/hosts/claude-code.ts
28821
28833
  var SOURCES = new Set(["startup", "resume", "clear", "compact", "fork"]);
28822
28834
  var SHELL_TOOLS = new Set(["Bash", "PowerShell"]);
@@ -22228,6 +22228,112 @@ var dispatchHook = (adapter, raw, env = process.env) => {
22228
22228
  };
22229
22229
  }
22230
22230
  };
22231
+ // packages/workit-core/src/hooks/deadline.ts
22232
+ import { appendFileSync, mkdirSync as mkdirSync3 } from "node:fs";
22233
+ import path26 from "node:path";
22234
+ var HOOK_SKIP_TEXT = "workit context skipped: host under load";
22235
+ var HOOK_DEADLINE_MS = 8000;
22236
+ var HOST_DEADLINES = {
22237
+ claude_code: { "": 8000, SessionStart: 16000, Stop: 16000 },
22238
+ codex_cli: { "": 45000, Stop: 16000 },
22239
+ codex_desktop: { "": 45000, Stop: 16000 },
22240
+ cursor: { "": 45000 }
22241
+ };
22242
+ var HOOK_SKIPS_FILE = "hook-skips.jsonl";
22243
+ var override = (env) => {
22244
+ const value = Number(env.WORKIT_HOOK_DEADLINE_MS);
22245
+ return Number.isFinite(value) && value > 0 ? value : null;
22246
+ };
22247
+ var hookDeadlineMs = (env, host = "", native) => {
22248
+ const row = HOST_DEADLINES[host];
22249
+ return override(env) ?? (row ? native === undefined ? Math.min(...Object.values(row)) : row[native] ?? row[""] : HOOK_DEADLINE_MS);
22250
+ };
22251
+ var skipsFile = (stateDir) => path26.join(stateDir, HOOK_SKIPS_FILE);
22252
+ var recordHookSkip = (skip, stateDir = resolveStateDir()) => {
22253
+ try {
22254
+ mkdirSync3(stateDir, { recursive: true });
22255
+ appendFileSync(skipsFile(stateDir), `${JSON.stringify(skip)}
22256
+ `);
22257
+ } catch {}
22258
+ };
22259
+ var QUIET = new Set([
22260
+ "stop",
22261
+ "subagent.stop",
22262
+ "shell.post",
22263
+ "compact.pre",
22264
+ "prompt.submit",
22265
+ null
22266
+ ]);
22267
+ var skipDecision = (event) => QUIET.has(event) ? { kind: "none" } : { kind: "context", text: HOOK_SKIP_TEXT };
22268
+ var TIMED_OUT = Symbol("timed out");
22269
+ var within = async (work, ms) => {
22270
+ let timer;
22271
+ const expired = new Promise((resolve) => {
22272
+ timer = setTimeout(() => resolve(TIMED_OUT), Math.max(0, ms));
22273
+ timer.unref?.();
22274
+ });
22275
+ try {
22276
+ return await Promise.race([work, expired]);
22277
+ } finally {
22278
+ clearTimeout(timer);
22279
+ }
22280
+ };
22281
+ var isTimedOut = (value) => value === TIMED_OUT;
22282
+ var PROCESS_START = performance.timeOrigin;
22283
+ var hookBudget = (env, options = {}, host = "") => {
22284
+ const now = options.now ?? Date.now;
22285
+ return {
22286
+ now,
22287
+ record: options.record ?? ((skip) => recordHookSkip(skip)),
22288
+ startedAt: options.startedAt ?? now(),
22289
+ deadlineMs: options.deadlineMs ?? hookDeadlineMs(env, host),
22290
+ host: options.deadlineMs === undefined ? host : null
22291
+ };
22292
+ };
22293
+ var readWithin = async (stdin, budget) => {
22294
+ const read = (async () => {
22295
+ let text = "";
22296
+ for await (const chunk of stdin)
22297
+ text += String(chunk);
22298
+ return text;
22299
+ })();
22300
+ const text = await within(read, budget.startedAt + budget.deadlineMs - budget.now());
22301
+ return isTimedOut(text) ? null : text;
22302
+ };
22303
+ var note = (adapter, raw, env, budget, outcome, stage) => {
22304
+ const parsed = raw === undefined ? null : adapter.parse(raw, env);
22305
+ const event = parsed ? parsed.ok ? parsed.input.event.kind : parsed.event : null;
22306
+ budget.record({
22307
+ at: new Date(budget.now()).toISOString(),
22308
+ host: adapter.descriptor.host,
22309
+ event,
22310
+ outcome,
22311
+ stage,
22312
+ elapsedMs: Math.round(budget.now() - budget.startedAt)
22313
+ });
22314
+ return { native: parsed?.native ?? null, event };
22315
+ };
22316
+ var skippedHook = (adapter, raw, env, budget, stage) => {
22317
+ const { native, event } = note(adapter, raw, env, budget, "skip", stage);
22318
+ return {
22319
+ ...adapter.render(skipDecision(event), native),
22320
+ error: `${HOOK_SKIP_TEXT} (past the ${budget.deadlineMs} ms hook deadline)`,
22321
+ skipped: true
22322
+ };
22323
+ };
22324
+ var dispatchWithin = async (adapter, raw, env, budget, dispatch = dispatchHook) => {
22325
+ const native = raw?.hook_event_name;
22326
+ if (budget.host !== null && typeof native === "string")
22327
+ budget.deadlineMs = hookDeadlineMs(env, budget.host, native);
22328
+ const remaining = () => budget.startedAt + budget.deadlineMs - budget.now();
22329
+ const result = remaining() > 0 ? await within(Promise.resolve().then(() => dispatch(adapter, raw, env)), remaining()) : TIMED_OUT;
22330
+ if (isTimedOut(result))
22331
+ return skippedHook(adapter, raw, env, budget, "dispatch");
22332
+ if (remaining() < 0)
22333
+ note(adapter, raw, env, budget, "late", "done");
22334
+ return { ...result, skipped: false };
22335
+ };
22336
+
22231
22337
  // packages/workit-core/src/hooks/hosts/claude-code.ts
22232
22338
  var CLAUDE_CODE_DESCRIPTOR = {
22233
22339
  host: "claude_code",
@@ -22787,7 +22893,7 @@ var codexAdapter = {
22787
22893
 
22788
22894
  // packages/workit-core/src/hooks/hosts/cursor.ts
22789
22895
  import fs19 from "node:fs";
22790
- import path26 from "node:path";
22896
+ import path27 from "node:path";
22791
22897
  var undocumented = { support: "undocumented", native: null };
22792
22898
  var none = { support: "none", native: null };
22793
22899
  var CURSOR_DESCRIPTOR = {
@@ -22984,7 +23090,7 @@ var protocolEvent2 = (input) => {
22984
23090
  };
22985
23091
  var TRANSCRIPT_TAIL_BYTES = 256 * 1024;
22986
23092
  var lastAssistantText = (file) => {
22987
- if (!file || !path26.isAbsolute(file))
23093
+ if (!file || !path27.isAbsolute(file))
22988
23094
  return null;
22989
23095
  try {
22990
23096
  const size = fs19.statSync(file).size;
@@ -23021,7 +23127,7 @@ var lastAssistantText = (file) => {
23021
23127
  return null;
23022
23128
  }
23023
23129
  };
23024
- var within = (root, dir) => dir === root || dir.startsWith(root.endsWith(path26.sep) ? root : `${root}${path26.sep}`);
23130
+ var within2 = (root, dir) => dir === root || dir.startsWith(root.endsWith(path27.sep) ? root : `${root}${path27.sep}`);
23025
23131
  var hookCwd = (input) => {
23026
23132
  const cwd = existingDirectory(input.cwd);
23027
23133
  if (cwd && input.hook_event_name === "beforeShellExecution")
@@ -23030,7 +23136,7 @@ var hookCwd = (input) => {
23030
23136
  };
23031
23137
  var cursorWorkspaceRoot = (input) => {
23032
23138
  const cwd = existingDirectory(input.cwd);
23033
- return cwd && input.workspace_roots.find((root) => within(root, cwd)) || input.workspace_roots[0];
23139
+ return cwd && input.workspace_roots.find((root) => within2(root, cwd)) || input.workspace_roots[0];
23034
23140
  };
23035
23141
  var cursorDeny = (reason) => ({
23036
23142
  permission: "deny",
@@ -23095,19 +23201,21 @@ var HOOK_ADAPTERS = {
23095
23201
  codex_desktop: codexAdapter,
23096
23202
  cursor: cursorAdapter
23097
23203
  };
23098
- async function runHookProcess(host, stdin, stdout, stderr = process.stderr, env = process.env) {
23204
+ async function runHookProcess(host, stdin, stdout, stderr = process.stderr, env = process.env, deadline = {}) {
23099
23205
  const adapter = typeof host === "string" ? HOOK_ADAPTERS[host] : host;
23100
- let text = "";
23101
- for await (const chunk of stdin)
23102
- text += String(chunk);
23206
+ const budget = hookBudget(env, deadline, adapter.descriptor.host);
23207
+ const text = await readWithin(stdin, budget);
23103
23208
  let raw;
23104
23209
  try {
23105
- raw = JSON.parse(text || "{}");
23210
+ raw = text === null ? undefined : JSON.parse(text || "{}");
23106
23211
  } catch {
23107
23212
  raw = undefined;
23108
23213
  }
23109
- const result = dispatchHook(adapter, raw, env);
23110
- if (raw === undefined || result.error)
23214
+ const result = text === null ? skippedHook(adapter, undefined, env, budget, "input") : await dispatchWithin(adapter, raw, env, budget, deadline.dispatch);
23215
+ if (result.skipped)
23216
+ stderr.write(`[workit] ${result.error}
23217
+ `);
23218
+ else if (raw === undefined || result.error)
23111
23219
  stderr.write(`[workit] hook input rejected: ${raw === undefined ? "invalid JSON hook input" : result.error}
23112
23220
  `);
23113
23221
  stdout.write(`${JSON.stringify(result.json)}
@@ -23124,7 +23232,7 @@ function warnOnSurfaceFallback(env = process.env) {
23124
23232
  }
23125
23233
  var runCodexHook = async (stdin = process.stdin) => {
23126
23234
  warnOnSurfaceFallback();
23127
- process.exitCode = await runHookProcess(detectCodexSurface(process.env), stdin, process.stdout);
23235
+ process.exitCode = await runHookProcess(detectCodexSurface(process.env), stdin, process.stdout, process.stderr, process.env, { startedAt: PROCESS_START });
23128
23236
  };
23129
23237
  if (false)
23130
23238
  ;
@@ -39,6 +39,6 @@ if (quiet)
39
39
  process.stdout.write(`${JSON.stringify({ hookSpecificOutput: { hookEventName: quiet } })}
40
40
  `);
41
41
  else {
42
- const { runCodexHook } = await import("./workit-hook-23t8ttjv.js");
42
+ const { runCodexHook } = await import("./workit-hook-5g0b5ywj.js");
43
43
  await runCodexHook([payload]);
44
44
  }
package/hooks/hooks.json CHANGED
@@ -32,7 +32,7 @@
32
32
  "Stop": [
33
33
  {
34
34
  "hooks": [
35
- { "type": "command", "command": "node ${PLUGIN_ROOT}/dist/workit-hook.js", "timeout": 10 }
35
+ { "type": "command", "command": "node ${PLUGIN_ROOT}/dist/workit-hook.js", "timeout": 20 }
36
36
  ]
37
37
  }
38
38
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainervirus/workit-codex",
3
- "version": "8.17.0",
3
+ "version": "8.17.1",
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.17.0",
43
- "@brainervirus/workit-mcp": "^8.17.0"
42
+ "@brainervirus/workit-core": "^8.17.1",
43
+ "@brainervirus/workit-mcp": "^8.17.1"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=24"