@tickernelz/paperclip-pro-adapter-codex-local 2026.925.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.
Files changed (268) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +218 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/quota-probe.d.ts +3 -0
  11. package/dist/cli/quota-probe.d.ts.map +1 -0
  12. package/dist/cli/quota-probe.js +104 -0
  13. package/dist/cli/quota-probe.js.map +1 -0
  14. package/dist/index.d.ts +21 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +155 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.test.d.ts +2 -0
  19. package/dist/index.test.d.ts.map +1 -0
  20. package/dist/index.test.js +58 -0
  21. package/dist/index.test.js.map +1 -0
  22. package/dist/server/acp.d.ts +30 -0
  23. package/dist/server/acp.d.ts.map +1 -0
  24. package/dist/server/acp.js +532 -0
  25. package/dist/server/acp.js.map +1 -0
  26. package/dist/server/acp.test.d.ts +2 -0
  27. package/dist/server/acp.test.d.ts.map +1 -0
  28. package/dist/server/acp.test.js +1087 -0
  29. package/dist/server/acp.test.js.map +1 -0
  30. package/dist/server/adapter-auth-promotion.d.ts +102 -0
  31. package/dist/server/adapter-auth-promotion.d.ts.map +1 -0
  32. package/dist/server/adapter-auth-promotion.js +210 -0
  33. package/dist/server/adapter-auth-promotion.js.map +1 -0
  34. package/dist/server/adapter-auth-promotion.test.d.ts +2 -0
  35. package/dist/server/adapter-auth-promotion.test.d.ts.map +1 -0
  36. package/dist/server/adapter-auth-promotion.test.js +658 -0
  37. package/dist/server/adapter-auth-promotion.test.js.map +1 -0
  38. package/dist/server/auth-check.d.ts +8 -0
  39. package/dist/server/auth-check.d.ts.map +1 -0
  40. package/dist/server/auth-check.js +8 -0
  41. package/dist/server/auth-check.js.map +1 -0
  42. package/dist/server/auth-precedence.d.ts +16 -0
  43. package/dist/server/auth-precedence.d.ts.map +1 -0
  44. package/dist/server/auth-precedence.js +20 -0
  45. package/dist/server/auth-precedence.js.map +1 -0
  46. package/dist/server/auth-precedence.test.d.ts +2 -0
  47. package/dist/server/auth-precedence.test.d.ts.map +1 -0
  48. package/dist/server/auth-precedence.test.js +100 -0
  49. package/dist/server/auth-precedence.test.js.map +1 -0
  50. package/dist/server/codex-args.d.ts +13 -0
  51. package/dist/server/codex-args.d.ts.map +1 -0
  52. package/dist/server/codex-args.js +76 -0
  53. package/dist/server/codex-args.js.map +1 -0
  54. package/dist/server/codex-args.test.d.ts +2 -0
  55. package/dist/server/codex-args.test.d.ts.map +1 -0
  56. package/dist/server/codex-args.test.js +243 -0
  57. package/dist/server/codex-args.test.js.map +1 -0
  58. package/dist/server/codex-auth-cache.d.ts +206 -0
  59. package/dist/server/codex-auth-cache.d.ts.map +1 -0
  60. package/dist/server/codex-auth-cache.js +501 -0
  61. package/dist/server/codex-auth-cache.js.map +1 -0
  62. package/dist/server/codex-auth-cache.test.d.ts +2 -0
  63. package/dist/server/codex-auth-cache.test.d.ts.map +1 -0
  64. package/dist/server/codex-auth-cache.test.js +497 -0
  65. package/dist/server/codex-auth-cache.test.js.map +1 -0
  66. package/dist/server/codex-auth-copyback.d.ts +53 -0
  67. package/dist/server/codex-auth-copyback.d.ts.map +1 -0
  68. package/dist/server/codex-auth-copyback.js +123 -0
  69. package/dist/server/codex-auth-copyback.js.map +1 -0
  70. package/dist/server/codex-auth-copyback.test.d.ts +2 -0
  71. package/dist/server/codex-auth-copyback.test.d.ts.map +1 -0
  72. package/dist/server/codex-auth-copyback.test.js +507 -0
  73. package/dist/server/codex-auth-copyback.test.js.map +1 -0
  74. package/dist/server/codex-auth-merge-decision.cjs +170 -0
  75. package/dist/server/codex-auth-merge-decision.d.ts +22 -0
  76. package/dist/server/codex-auth-merge-decision.d.ts.map +1 -0
  77. package/dist/server/codex-auth-merge-decision.js +58 -0
  78. package/dist/server/codex-auth-merge-decision.js.map +1 -0
  79. package/dist/server/codex-auth-merge-decision.test.d.ts +2 -0
  80. package/dist/server/codex-auth-merge-decision.test.d.ts.map +1 -0
  81. package/dist/server/codex-auth-merge-decision.test.js +230 -0
  82. package/dist/server/codex-auth-merge-decision.test.js.map +1 -0
  83. package/dist/server/codex-auth-merge-extract.sh +73 -0
  84. package/dist/server/codex-auth-merge-scripts.d.ts +21 -0
  85. package/dist/server/codex-auth-merge-scripts.d.ts.map +1 -0
  86. package/dist/server/codex-auth-merge-scripts.js +40 -0
  87. package/dist/server/codex-auth-merge-scripts.js.map +1 -0
  88. package/dist/server/codex-auth-merge.test.d.ts +2 -0
  89. package/dist/server/codex-auth-merge.test.d.ts.map +1 -0
  90. package/dist/server/codex-auth-merge.test.js +714 -0
  91. package/dist/server/codex-auth-merge.test.js.map +1 -0
  92. package/dist/server/codex-auth-seed-write.d.ts +30 -0
  93. package/dist/server/codex-auth-seed-write.d.ts.map +1 -0
  94. package/dist/server/codex-auth-seed-write.js +41 -0
  95. package/dist/server/codex-auth-seed-write.js.map +1 -0
  96. package/dist/server/codex-home.d.ts +162 -0
  97. package/dist/server/codex-home.d.ts.map +1 -0
  98. package/dist/server/codex-home.js +771 -0
  99. package/dist/server/codex-home.js.map +1 -0
  100. package/dist/server/codex-home.test.d.ts +2 -0
  101. package/dist/server/codex-home.test.d.ts.map +1 -0
  102. package/dist/server/codex-home.test.js +1183 -0
  103. package/dist/server/codex-home.test.js.map +1 -0
  104. package/dist/server/config-schema.d.ts +3 -0
  105. package/dist/server/config-schema.d.ts.map +1 -0
  106. package/dist/server/config-schema.js +67 -0
  107. package/dist/server/config-schema.js.map +1 -0
  108. package/dist/server/device-login-export.d.ts +56 -0
  109. package/dist/server/device-login-export.d.ts.map +1 -0
  110. package/dist/server/device-login-export.js +230 -0
  111. package/dist/server/device-login-export.js.map +1 -0
  112. package/dist/server/device-login-export.test.d.ts +2 -0
  113. package/dist/server/device-login-export.test.d.ts.map +1 -0
  114. package/dist/server/device-login-export.test.js +245 -0
  115. package/dist/server/device-login-export.test.js.map +1 -0
  116. package/dist/server/device-login-parse.d.ts +20 -0
  117. package/dist/server/device-login-parse.d.ts.map +1 -0
  118. package/dist/server/device-login-parse.js +155 -0
  119. package/dist/server/device-login-parse.js.map +1 -0
  120. package/dist/server/device-login-parse.test.d.ts +2 -0
  121. package/dist/server/device-login-parse.test.d.ts.map +1 -0
  122. package/dist/server/device-login-parse.test.js +269 -0
  123. package/dist/server/device-login-parse.test.js.map +1 -0
  124. package/dist/server/device-login-runner.d.ts +69 -0
  125. package/dist/server/device-login-runner.d.ts.map +1 -0
  126. package/dist/server/device-login-runner.js +109 -0
  127. package/dist/server/device-login-runner.js.map +1 -0
  128. package/dist/server/device-login-runner.test.d.ts +2 -0
  129. package/dist/server/device-login-runner.test.d.ts.map +1 -0
  130. package/dist/server/device-login-runner.test.js +201 -0
  131. package/dist/server/device-login-runner.test.js.map +1 -0
  132. package/dist/server/engine-availability.test.d.ts +2 -0
  133. package/dist/server/engine-availability.test.d.ts.map +1 -0
  134. package/dist/server/engine-availability.test.js +41 -0
  135. package/dist/server/engine-availability.test.js.map +1 -0
  136. package/dist/server/execute.acp-fallback.test.d.ts +2 -0
  137. package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
  138. package/dist/server/execute.acp-fallback.test.js +123 -0
  139. package/dist/server/execute.acp-fallback.test.js.map +1 -0
  140. package/dist/server/execute.auth-precedence.test.d.ts +2 -0
  141. package/dist/server/execute.auth-precedence.test.d.ts.map +1 -0
  142. package/dist/server/execute.auth-precedence.test.js +137 -0
  143. package/dist/server/execute.auth-precedence.test.js.map +1 -0
  144. package/dist/server/execute.auth.test.d.ts +2 -0
  145. package/dist/server/execute.auth.test.d.ts.map +1 -0
  146. package/dist/server/execute.auth.test.js +197 -0
  147. package/dist/server/execute.auth.test.js.map +1 -0
  148. package/dist/server/execute.d.ts +40 -0
  149. package/dist/server/execute.d.ts.map +1 -0
  150. package/dist/server/execute.js +1290 -0
  151. package/dist/server/execute.js.map +1 -0
  152. package/dist/server/execute.remote.test.d.ts +2 -0
  153. package/dist/server/execute.remote.test.d.ts.map +1 -0
  154. package/dist/server/execute.remote.test.js +556 -0
  155. package/dist/server/execute.remote.test.js.map +1 -0
  156. package/dist/server/execute.stderr-error.test.d.ts +2 -0
  157. package/dist/server/execute.stderr-error.test.d.ts.map +1 -0
  158. package/dist/server/execute.stderr-error.test.js +142 -0
  159. package/dist/server/execute.stderr-error.test.js.map +1 -0
  160. package/dist/server/execute.test.d.ts +2 -0
  161. package/dist/server/execute.test.d.ts.map +1 -0
  162. package/dist/server/execute.test.js +240 -0
  163. package/dist/server/execute.test.js.map +1 -0
  164. package/dist/server/index.d.ts +18 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +71 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/output-inactivity-monitor.d.ts +62 -0
  169. package/dist/server/output-inactivity-monitor.d.ts.map +1 -0
  170. package/dist/server/output-inactivity-monitor.integration.test.d.ts +2 -0
  171. package/dist/server/output-inactivity-monitor.integration.test.d.ts.map +1 -0
  172. package/dist/server/output-inactivity-monitor.integration.test.js +136 -0
  173. package/dist/server/output-inactivity-monitor.integration.test.js.map +1 -0
  174. package/dist/server/output-inactivity-monitor.js +112 -0
  175. package/dist/server/output-inactivity-monitor.js.map +1 -0
  176. package/dist/server/output-inactivity-monitor.test.d.ts +2 -0
  177. package/dist/server/output-inactivity-monitor.test.d.ts.map +1 -0
  178. package/dist/server/output-inactivity-monitor.test.js +284 -0
  179. package/dist/server/output-inactivity-monitor.test.js.map +1 -0
  180. package/dist/server/parse.d.ts +51 -0
  181. package/dist/server/parse.d.ts.map +1 -0
  182. package/dist/server/parse.js +261 -0
  183. package/dist/server/parse.js.map +1 -0
  184. package/dist/server/parse.test.d.ts +2 -0
  185. package/dist/server/parse.test.d.ts.map +1 -0
  186. package/dist/server/parse.test.js +186 -0
  187. package/dist/server/parse.test.js.map +1 -0
  188. package/dist/server/process-activity-monitor.d.ts +21 -0
  189. package/dist/server/process-activity-monitor.d.ts.map +1 -0
  190. package/dist/server/process-activity-monitor.js +103 -0
  191. package/dist/server/process-activity-monitor.js.map +1 -0
  192. package/dist/server/process-activity-monitor.test.d.ts +2 -0
  193. package/dist/server/process-activity-monitor.test.d.ts.map +1 -0
  194. package/dist/server/process-activity-monitor.test.js +82 -0
  195. package/dist/server/process-activity-monitor.test.js.map +1 -0
  196. package/dist/server/quota-spawn-error.test.d.ts +2 -0
  197. package/dist/server/quota-spawn-error.test.d.ts.map +1 -0
  198. package/dist/server/quota-spawn-error.test.js +174 -0
  199. package/dist/server/quota-spawn-error.test.js.map +1 -0
  200. package/dist/server/quota.d.ts +66 -0
  201. package/dist/server/quota.d.ts.map +1 -0
  202. package/dist/server/quota.js +511 -0
  203. package/dist/server/quota.js.map +1 -0
  204. package/dist/server/runtime-config.d.ts +11 -0
  205. package/dist/server/runtime-config.d.ts.map +1 -0
  206. package/dist/server/runtime-config.js +380 -0
  207. package/dist/server/runtime-config.js.map +1 -0
  208. package/dist/server/runtime-config.test.d.ts +2 -0
  209. package/dist/server/runtime-config.test.d.ts.map +1 -0
  210. package/dist/server/runtime-config.test.js +367 -0
  211. package/dist/server/runtime-config.test.js.map +1 -0
  212. package/dist/server/skills.d.ts +8 -0
  213. package/dist/server/skills.d.ts.map +1 -0
  214. package/dist/server/skills.js +26 -0
  215. package/dist/server/skills.js.map +1 -0
  216. package/dist/server/test.d.ts +3 -0
  217. package/dist/server/test.d.ts.map +1 -0
  218. package/dist/server/test.js +458 -0
  219. package/dist/server/test.js.map +1 -0
  220. package/dist/server/test.remote.test.d.ts +2 -0
  221. package/dist/server/test.remote.test.d.ts.map +1 -0
  222. package/dist/server/test.remote.test.js +396 -0
  223. package/dist/server/test.remote.test.js.map +1 -0
  224. package/dist/ui/build-config.d.ts +5 -0
  225. package/dist/ui/build-config.d.ts.map +1 -0
  226. package/dist/ui/build-config.js +229 -0
  227. package/dist/ui/build-config.js.map +1 -0
  228. package/dist/ui/build-config.test.d.ts +2 -0
  229. package/dist/ui/build-config.test.d.ts.map +1 -0
  230. package/dist/ui/build-config.test.js +272 -0
  231. package/dist/ui/build-config.test.js.map +1 -0
  232. package/dist/ui/index.d.ts +4 -0
  233. package/dist/ui/index.d.ts.map +1 -0
  234. package/dist/ui/index.js +8 -0
  235. package/dist/ui/index.js.map +1 -0
  236. package/dist/ui/parse-stdout.d.ts +3 -0
  237. package/dist/ui/parse-stdout.d.ts.map +1 -0
  238. package/dist/ui/parse-stdout.js +265 -0
  239. package/dist/ui/parse-stdout.js.map +1 -0
  240. package/dist/ui/parse-stdout.test.d.ts +2 -0
  241. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  242. package/dist/ui/parse-stdout.test.js +77 -0
  243. package/dist/ui/parse-stdout.test.js.map +1 -0
  244. package/package.json +61 -0
  245. package/skills/agentmail/SKILL.md +70 -0
  246. package/skills/paperclip/SKILL.md +712 -0
  247. package/skills/paperclip/references/api-reference.md +1675 -0
  248. package/skills/paperclip/references/artifacts.md +158 -0
  249. package/skills/paperclip/references/cases.md +295 -0
  250. package/skills/paperclip/references/company-skills.md +266 -0
  251. package/skills/paperclip/references/issue-workspaces.md +80 -0
  252. package/skills/paperclip/references/routines.md +231 -0
  253. package/skills/paperclip/references/workflows.md +141 -0
  254. package/skills/paperclip/scripts/paperclip-upload-artifact.sh +592 -0
  255. package/skills/paperclip-board/SKILL.md +619 -0
  256. package/skills/paperclip-converting-plans-to-tasks/SKILL.md +60 -0
  257. package/skills/paperclip-create-agent/SKILL.md +179 -0
  258. package/skills/paperclip-create-agent/references/agent-instruction-templates.md +123 -0
  259. package/skills/paperclip-create-agent/references/agents/coder.md +64 -0
  260. package/skills/paperclip-create-agent/references/agents/qa.md +88 -0
  261. package/skills/paperclip-create-agent/references/agents/securityengineer.md +135 -0
  262. package/skills/paperclip-create-agent/references/agents/uxdesigner.md +115 -0
  263. package/skills/paperclip-create-agent/references/api-reference.md +110 -0
  264. package/skills/paperclip-create-agent/references/baseline-role-guide.md +168 -0
  265. package/skills/paperclip-create-agent/references/draft-review-checklist.md +95 -0
  266. package/skills/para-memory-files/SKILL.md +100 -0
  267. package/skills/para-memory-files/references/schemas.md +35 -0
  268. package/skills/slack/SKILL.md +65 -0
@@ -0,0 +1,261 @@
1
+ import { asString, asNumber, parseObject, parseJson, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
2
+ const CODEX_TRANSIENT_UPSTREAM_RE = /(?:we(?:'|’)re\s+currently\s+experiencing\s+high\s+demand|temporary\s+errors|rate[-\s]?limit(?:ed)?|too\s+many\s+requests|\b429\b|server\s+overloaded|service\s+unavailable|try\s+again\s+later)/i;
3
+ const CODEX_REMOTE_COMPACTION_RE = /remote\s+compact\s+task/i;
4
+ const CODEX_USAGE_LIMIT_RE = /you(?:'|’)ve hit your usage limit for .+\.\s+switch to another model now,\s+or try again at\s+([^.!\n]+)(?:[.!]|\n|$)/i;
5
+ const CODEX_PROVIDER_QUOTA_RE = /(?:you(?:'|’)ve hit your usage limit|usage limit|model (?:is )?at capacity|at capacity for this model|capacity limit)/i;
6
+ const CODEX_REFRESH_TOKEN_REUSED_RE = /(?:refresh[_\s-]?token[_\s-]?reused|refresh token (?:has )?already been used|token reuse detected)/i;
7
+ const CODEX_REFRESH_TOKEN_EXPIRED_RE = /(?:refresh[_\s-]?token[_\s-]?expired|refresh token (?:has )?expired|expired refresh token)/i;
8
+ const CODEX_REFRESH_TOKEN_INVALIDATED_RE = /(?:refresh[_\s-]?token[_\s-]?(?:invalidated|revoked|invalid)|refresh token (?:has been )?(?:invalidated|revoked|invalid)|invalid refresh token|missing bearer)/i;
9
+ const CODEX_OAUTH_INVALID_GRANT_RE = /\binvalid_grant\b/i;
10
+ const CODEX_CONTEXTUAL_REFRESH_AUTH_INVALIDATED_RE = /(?:(?:oauth|refresh|access[_\s-]?token|bearer|credential).{0,80}(?:\b401\b|unauthori[sz]ed|\binvalid[\s-]grant\b)|(?:\b401\b|unauthori[sz]ed|\binvalid[\s-]grant\b).{0,80}(?:oauth|refresh|access[_\s-]?token|bearer|credential))/i;
11
+ export function parseCodexJsonl(stdout) {
12
+ let sessionId = null;
13
+ let finalMessage = null;
14
+ let errorMessage = null;
15
+ let sawProtocolEvent = false;
16
+ let sawProtocolTerminalEvent = false;
17
+ const usage = {
18
+ inputTokens: 0,
19
+ cachedInputTokens: 0,
20
+ outputTokens: 0,
21
+ };
22
+ for (const rawLine of stdout.split(/\r?\n/)) {
23
+ const line = rawLine.trim();
24
+ if (!line)
25
+ continue;
26
+ const event = parseJson(line);
27
+ if (!event)
28
+ continue;
29
+ const type = asString(event.type, "");
30
+ if (type)
31
+ sawProtocolEvent = true;
32
+ if (type === "error" || type === "turn.completed" || type === "turn.failed") {
33
+ sawProtocolTerminalEvent = true;
34
+ }
35
+ if (type === "thread.started") {
36
+ sessionId = asString(event.thread_id, sessionId ?? "") || sessionId;
37
+ continue;
38
+ }
39
+ if (type === "error") {
40
+ const msg = asString(event.message, "").trim();
41
+ if (msg)
42
+ errorMessage = msg;
43
+ continue;
44
+ }
45
+ if (type === "item.completed") {
46
+ const item = parseObject(event.item);
47
+ if (asString(item.type, "") === "agent_message") {
48
+ const text = asString(item.text, "");
49
+ if (text)
50
+ finalMessage = text;
51
+ }
52
+ continue;
53
+ }
54
+ if (type === "turn.completed") {
55
+ const usageObj = parseObject(event.usage);
56
+ usage.inputTokens = asNumber(usageObj.input_tokens, usage.inputTokens);
57
+ usage.cachedInputTokens = asNumber(usageObj.cached_input_tokens, usage.cachedInputTokens);
58
+ usage.outputTokens = asNumber(usageObj.output_tokens, usage.outputTokens);
59
+ continue;
60
+ }
61
+ if (type === "turn.failed") {
62
+ const err = parseObject(event.error);
63
+ const msg = asString(err.message, "").trim();
64
+ if (msg)
65
+ errorMessage = msg;
66
+ }
67
+ }
68
+ return {
69
+ sessionId,
70
+ summary: finalMessage?.trim() ?? "",
71
+ usage,
72
+ usageBasis: "per_run",
73
+ errorMessage,
74
+ sawProtocolEvent,
75
+ sawProtocolTerminalEvent,
76
+ };
77
+ }
78
+ /**
79
+ * Structural crash detection: the codex CLI can only report an agent-level
80
+ * failure through the JSONL protocol (an `error` event, `turn.failed`, or a
81
+ * finished `turn.completed` followed by a nonzero exit). A nonzero exit after
82
+ * the protocol stream started but before any terminal event means the process
83
+ * died out from under the agent (MCP transport crash, worker panic, killed
84
+ * tool server) — retriable infrastructure, not agent behavior. This
85
+ * deliberately does not match error text: transport failure strings vary, and
86
+ * stdout/stderr can quote agent output that merely discusses network errors.
87
+ */
88
+ export function isCodexHarnessCrash(input) {
89
+ if ((input.exitCode ?? 0) === 0)
90
+ return false;
91
+ return input.sawProtocolEvent && !input.sawProtocolTerminalEvent;
92
+ }
93
+ export function isCodexUnknownSessionError(stdout, stderr) {
94
+ const haystack = `${stdout}\n${stderr}`
95
+ .split(/\r?\n/)
96
+ .map((line) => line.trim())
97
+ .filter(Boolean)
98
+ .join("\n");
99
+ return /unknown (session|thread)|session .* not found|thread .* not found|conversation .* not found|missing rollout path for thread|state db missing rollout path|state db returned stale rollout path|no rollout found for thread id/i.test(haystack);
100
+ }
101
+ function buildCodexErrorHaystack(input) {
102
+ return [
103
+ input.errorMessage ?? "",
104
+ input.stdout ?? "",
105
+ input.stderr ?? "",
106
+ ]
107
+ .join("\n")
108
+ .split(/\r?\n/)
109
+ .map((line) => line.trim())
110
+ .filter(Boolean)
111
+ .join("\n");
112
+ }
113
+ export function classifyCodexAuthRefreshFailure(input) {
114
+ const haystack = buildCodexErrorHaystack(input);
115
+ if (CODEX_REFRESH_TOKEN_REUSED_RE.test(haystack))
116
+ return "refresh_token_reused";
117
+ if (CODEX_REFRESH_TOKEN_EXPIRED_RE.test(haystack))
118
+ return "refresh_token_expired";
119
+ if (CODEX_REFRESH_TOKEN_INVALIDATED_RE.test(haystack))
120
+ return "refresh_token_invalidated";
121
+ if (CODEX_OAUTH_INVALID_GRANT_RE.test(haystack))
122
+ return "refresh_token_invalidated";
123
+ if (CODEX_CONTEXTUAL_REFRESH_AUTH_INVALIDATED_RE.test(haystack))
124
+ return "refresh_token_invalidated";
125
+ return null;
126
+ }
127
+ function readTimeZoneParts(date, timeZone) {
128
+ const values = new Map(new Intl.DateTimeFormat("en-US", {
129
+ timeZone,
130
+ hourCycle: "h23",
131
+ year: "numeric",
132
+ month: "2-digit",
133
+ day: "2-digit",
134
+ hour: "2-digit",
135
+ minute: "2-digit",
136
+ }).formatToParts(date).map((part) => [part.type, part.value]));
137
+ return {
138
+ year: Number.parseInt(values.get("year") ?? "", 10),
139
+ month: Number.parseInt(values.get("month") ?? "", 10),
140
+ day: Number.parseInt(values.get("day") ?? "", 10),
141
+ hour: Number.parseInt(values.get("hour") ?? "", 10),
142
+ minute: Number.parseInt(values.get("minute") ?? "", 10),
143
+ };
144
+ }
145
+ function normalizeResetTimeZone(timeZoneHint) {
146
+ const normalized = timeZoneHint?.trim();
147
+ if (!normalized)
148
+ return null;
149
+ if (/^(?:utc|gmt)$/i.test(normalized))
150
+ return "UTC";
151
+ try {
152
+ new Intl.DateTimeFormat("en-US", { timeZone: normalized }).format(new Date(0));
153
+ return normalized;
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ function dateFromTimeZoneWallClock(input) {
160
+ let candidate = new Date(Date.UTC(input.year, input.month - 1, input.day, input.hour, input.minute, 0, 0));
161
+ const targetUtc = Date.UTC(input.year, input.month - 1, input.day, input.hour, input.minute, 0, 0);
162
+ for (let attempt = 0; attempt < 4; attempt += 1) {
163
+ const actual = readTimeZoneParts(candidate, input.timeZone);
164
+ const actualUtc = Date.UTC(actual.year, actual.month - 1, actual.day, actual.hour, actual.minute, 0, 0);
165
+ const offsetMs = targetUtc - actualUtc;
166
+ if (offsetMs === 0)
167
+ break;
168
+ candidate = new Date(candidate.getTime() + offsetMs);
169
+ }
170
+ const verified = readTimeZoneParts(candidate, input.timeZone);
171
+ if (verified.year !== input.year ||
172
+ verified.month !== input.month ||
173
+ verified.day !== input.day ||
174
+ verified.hour !== input.hour ||
175
+ verified.minute !== input.minute) {
176
+ return null;
177
+ }
178
+ return candidate;
179
+ }
180
+ function nextClockTimeInTimeZone(input) {
181
+ const timeZone = normalizeResetTimeZone(input.timeZoneHint);
182
+ if (!timeZone)
183
+ return null;
184
+ const nowParts = readTimeZoneParts(input.now, timeZone);
185
+ let retryAt = dateFromTimeZoneWallClock({
186
+ year: nowParts.year,
187
+ month: nowParts.month,
188
+ day: nowParts.day,
189
+ hour: input.hour,
190
+ minute: input.minute,
191
+ timeZone,
192
+ });
193
+ if (!retryAt)
194
+ return null;
195
+ if (retryAt.getTime() <= input.now.getTime()) {
196
+ const nextDay = new Date(Date.UTC(nowParts.year, nowParts.month - 1, nowParts.day + 1, 0, 0, 0, 0));
197
+ retryAt = dateFromTimeZoneWallClock({
198
+ year: nextDay.getUTCFullYear(),
199
+ month: nextDay.getUTCMonth() + 1,
200
+ day: nextDay.getUTCDate(),
201
+ hour: input.hour,
202
+ minute: input.minute,
203
+ timeZone,
204
+ });
205
+ }
206
+ return retryAt;
207
+ }
208
+ function parseLocalClockTime(clockText, now) {
209
+ const normalized = clockText.trim();
210
+ const match = normalized.match(/^(\d{1,2})(?::(\d{2}))?\s*([ap])\.?\s*m\.?(?:\s*\(([^)]+)\)|\s+([A-Z]{2,5}))?$/i);
211
+ if (!match)
212
+ return null;
213
+ const hour12 = Number.parseInt(match[1] ?? "", 10);
214
+ const minute = Number.parseInt(match[2] ?? "0", 10);
215
+ if (!Number.isInteger(hour12) || hour12 < 1 || hour12 > 12)
216
+ return null;
217
+ if (!Number.isInteger(minute) || minute < 0 || minute > 59)
218
+ return null;
219
+ let hour24 = hour12 % 12;
220
+ if ((match[3] ?? "").toLowerCase() === "p")
221
+ hour24 += 12;
222
+ const timeZoneHint = match[4] ?? match[5];
223
+ if (timeZoneHint) {
224
+ const explicitRetryAt = nextClockTimeInTimeZone({
225
+ now,
226
+ hour: hour24,
227
+ minute,
228
+ timeZoneHint,
229
+ });
230
+ if (explicitRetryAt)
231
+ return explicitRetryAt;
232
+ }
233
+ const retryAt = new Date(now);
234
+ retryAt.setHours(hour24, minute, 0, 0);
235
+ if (retryAt.getTime() <= now.getTime()) {
236
+ retryAt.setDate(retryAt.getDate() + 1);
237
+ }
238
+ return retryAt;
239
+ }
240
+ export function extractCodexRetryNotBefore(input, now = new Date()) {
241
+ const haystack = buildCodexErrorHaystack(input);
242
+ const usageLimitMatch = haystack.match(CODEX_USAGE_LIMIT_RE);
243
+ if (!usageLimitMatch)
244
+ return null;
245
+ return parseLocalClockTime(usageLimitMatch[1] ?? "", now);
246
+ }
247
+ export function isCodexTransientUpstreamError(input) {
248
+ const haystack = buildCodexErrorHaystack(input);
249
+ if (isCodexProviderQuotaError(input))
250
+ return false;
251
+ if (!CODEX_TRANSIENT_UPSTREAM_RE.test(haystack))
252
+ return false;
253
+ // Keep automatic retries scoped to the observed remote-compaction/high-demand
254
+ // failure shape.
255
+ return CODEX_REMOTE_COMPACTION_RE.test(haystack) || /high\s+demand|temporary\s+errors/i.test(haystack);
256
+ }
257
+ export function isCodexProviderQuotaError(input) {
258
+ const haystack = buildCodexErrorHaystack(input);
259
+ return CODEX_PROVIDER_QUOTA_RE.test(haystack) || extractCodexRetryNotBefore(input) != null;
260
+ }
261
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,186 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { classifyCodexAuthRefreshFailure, extractCodexRetryNotBefore, isCodexHarnessCrash, isCodexProviderQuotaError, isCodexTransientUpstreamError, isCodexUnknownSessionError, parseCodexJsonl, } from "./parse.js";
3
+ describe("parseCodexJsonl", () => {
4
+ it("captures session id, assistant summary, usage, and error message", () => {
5
+ const stdout = [
6
+ JSON.stringify({ type: "thread.started", thread_id: "thread_123" }),
7
+ JSON.stringify({
8
+ type: "item.completed",
9
+ item: { type: "agent_message", text: "Recovered response" },
10
+ }),
11
+ JSON.stringify({
12
+ type: "turn.completed",
13
+ usage: { input_tokens: 10, cached_input_tokens: 2, output_tokens: 4 },
14
+ }),
15
+ JSON.stringify({ type: "turn.failed", error: { message: "resume failed" } }),
16
+ ].join("\n");
17
+ expect(parseCodexJsonl(stdout)).toEqual({
18
+ sessionId: "thread_123",
19
+ summary: "Recovered response",
20
+ usage: {
21
+ inputTokens: 10,
22
+ cachedInputTokens: 2,
23
+ outputTokens: 4,
24
+ },
25
+ usageBasis: "per_run",
26
+ errorMessage: "resume failed",
27
+ sawProtocolEvent: true,
28
+ sawProtocolTerminalEvent: true,
29
+ });
30
+ });
31
+ it("uses the last agent message as the summary when commentary updates precede the final answer", () => {
32
+ const stdout = [
33
+ JSON.stringify({ type: "thread.started", thread_id: "thread_123" }),
34
+ JSON.stringify({
35
+ type: "item.completed",
36
+ item: { type: "reasoning", text: "Checking the heartbeat procedure" },
37
+ }),
38
+ JSON.stringify({
39
+ type: "item.completed",
40
+ item: { type: "agent_message", text: "I’m checking out the issue and reading the docs now." },
41
+ }),
42
+ JSON.stringify({
43
+ type: "item.completed",
44
+ item: { type: "agent_message", text: "Fixed the issue and verified the targeted tests pass." },
45
+ }),
46
+ JSON.stringify({
47
+ type: "turn.completed",
48
+ usage: { input_tokens: 10, cached_input_tokens: 2, output_tokens: 4 },
49
+ }),
50
+ ].join("\n");
51
+ expect(parseCodexJsonl(stdout)).toEqual({
52
+ sessionId: "thread_123",
53
+ summary: "Fixed the issue and verified the targeted tests pass.",
54
+ usage: {
55
+ inputTokens: 10,
56
+ cachedInputTokens: 2,
57
+ outputTokens: 4,
58
+ },
59
+ usageBasis: "per_run",
60
+ errorMessage: null,
61
+ sawProtocolEvent: true,
62
+ sawProtocolTerminalEvent: true,
63
+ });
64
+ });
65
+ });
66
+ describe("isCodexHarnessCrash", () => {
67
+ const crashedMidTurnStream = [
68
+ JSON.stringify({ type: "thread.started", thread_id: "thread_123" }),
69
+ JSON.stringify({
70
+ type: "item.completed",
71
+ item: { type: "agent_message", text: "Checking out the issue now." },
72
+ }),
73
+ JSON.stringify({ type: "item.started", item: { type: "command_execution" } }),
74
+ ].join("\n");
75
+ it("classifies a nonzero exit with no protocol-terminal event as a harness crash", () => {
76
+ const parsed = parseCodexJsonl(crashedMidTurnStream);
77
+ expect(parsed.sawProtocolEvent).toBe(true);
78
+ expect(parsed.sawProtocolTerminalEvent).toBe(false);
79
+ expect(isCodexHarnessCrash({ exitCode: 1, ...parsed })).toBe(true);
80
+ });
81
+ it("does not classify runs whose turn reached a protocol-terminal event", () => {
82
+ const failedInProtocol = parseCodexJsonl([
83
+ JSON.stringify({ type: "thread.started", thread_id: "thread_123" }),
84
+ JSON.stringify({ type: "turn.failed", error: { message: "the model rejected the request" } }),
85
+ ].join("\n"));
86
+ expect(isCodexHarnessCrash({ exitCode: 1, ...failedInProtocol })).toBe(false);
87
+ const completedThenFailedExit = parseCodexJsonl([
88
+ JSON.stringify({ type: "thread.started", thread_id: "thread_123" }),
89
+ JSON.stringify({
90
+ type: "turn.completed",
91
+ usage: { input_tokens: 10, cached_input_tokens: 2, output_tokens: 4 },
92
+ }),
93
+ ].join("\n"));
94
+ expect(isCodexHarnessCrash({ exitCode: 1, ...completedThenFailedExit })).toBe(false);
95
+ });
96
+ it("does not classify successful exits or streams that never spoke the protocol", () => {
97
+ expect(isCodexHarnessCrash({ exitCode: 0, ...parseCodexJsonl(crashedMidTurnStream) })).toBe(false);
98
+ expect(isCodexHarnessCrash({ exitCode: null, ...parseCodexJsonl(crashedMidTurnStream) })).toBe(false);
99
+ const neverStarted = parseCodexJsonl("error: unexpected argument '--bogus-flag'\n");
100
+ expect(neverStarted.sawProtocolEvent).toBe(false);
101
+ expect(isCodexHarnessCrash({ exitCode: 2, ...neverStarted })).toBe(false);
102
+ });
103
+ it("stays structural: agent output discussing network errors does not affect classification", () => {
104
+ const parsed = parseCodexJsonl([
105
+ JSON.stringify({ type: "thread.started", thread_id: "thread_123" }),
106
+ JSON.stringify({
107
+ type: "item.completed",
108
+ item: { type: "agent_message", text: "The deploy failed with connection reset by peer; investigating." },
109
+ }),
110
+ JSON.stringify({ type: "turn.failed", error: { message: "agent gave up" } }),
111
+ ].join("\n"));
112
+ expect(isCodexHarnessCrash({ exitCode: 1, ...parsed })).toBe(false);
113
+ expect(isCodexTransientUpstreamError({
114
+ stdout: "connection reset by peer while running the deploy",
115
+ errorMessage: "agent gave up",
116
+ })).toBe(false);
117
+ });
118
+ });
119
+ describe("classifyCodexAuthRefreshFailure", () => {
120
+ it("classifies explicit refresh-token failure messages", () => {
121
+ expect(classifyCodexAuthRefreshFailure({ errorMessage: "provider error: refresh_token_reused" })).toBe("refresh_token_reused");
122
+ expect(classifyCodexAuthRefreshFailure({ stderr: "OAuth failed: refresh token has expired" })).toBe("refresh_token_expired");
123
+ expect(classifyCodexAuthRefreshFailure({ stdout: "OAuth failed: invalid_grant" })).toBe("refresh_token_invalidated");
124
+ expect(classifyCodexAuthRefreshFailure({ errorMessage: "credential refresh returned 401 Unauthorized" })).toBe("refresh_token_invalidated");
125
+ });
126
+ it("does not classify bare 401 or quota messages as auth-refresh failures", () => {
127
+ expect(classifyCodexAuthRefreshFailure({ errorMessage: "chatgpt wham api returned 401" })).toBeNull();
128
+ expect(classifyCodexAuthRefreshFailure({ errorMessage: "You've hit your usage limit for GPT-5." })).toBeNull();
129
+ });
130
+ });
131
+ describe("isCodexUnknownSessionError", () => {
132
+ it("detects the current missing-rollout thread error", () => {
133
+ expect(isCodexUnknownSessionError("", "Error: thread/resume: thread/resume failed: no rollout found for thread id d448e715-7607-4bcc-91fc-7a3c0c5a9632")).toBe(true);
134
+ });
135
+ it("still detects existing stale-session wordings", () => {
136
+ expect(isCodexUnknownSessionError("unknown thread id", "")).toBe(true);
137
+ expect(isCodexUnknownSessionError("", "state db missing rollout path for thread abc")).toBe(true);
138
+ expect(isCodexUnknownSessionError("", "state db returned stale rollout path for thread abc")).toBe(true);
139
+ });
140
+ it("does not classify unrelated Codex failures as stale sessions", () => {
141
+ expect(isCodexUnknownSessionError("", "model overloaded")).toBe(false);
142
+ });
143
+ });
144
+ describe("isCodexTransientUpstreamError", () => {
145
+ it("classifies the remote-compaction high-demand failure as transient upstream", () => {
146
+ expect(isCodexTransientUpstreamError({
147
+ errorMessage: "Error running remote compact task: We're currently experiencing high demand, which may cause temporary errors.",
148
+ })).toBe(true);
149
+ expect(isCodexTransientUpstreamError({
150
+ stderr: "We're currently experiencing high demand, which may cause temporary errors.",
151
+ })).toBe(true);
152
+ });
153
+ it("classifies usage-limit windows as provider quota and extracts the retry time", () => {
154
+ const errorMessage = "You've hit your usage limit for GPT-5.3-Codex-Spark. Switch to another model now, or try again at 11:31 PM.";
155
+ const now = new Date(2026, 3, 22, 22, 29, 2);
156
+ expect(isCodexProviderQuotaError({ errorMessage })).toBe(true);
157
+ expect(isCodexTransientUpstreamError({ errorMessage })).toBe(false);
158
+ expect(extractCodexRetryNotBefore({ errorMessage }, now)?.getTime()).toBe(new Date(2026, 3, 22, 23, 31, 0, 0).getTime());
159
+ });
160
+ it("classifies model-capacity messages as provider quota without reset metadata", () => {
161
+ const errorMessage = "The requested model is at capacity. Please try again later.";
162
+ expect(isCodexProviderQuotaError({ errorMessage })).toBe(true);
163
+ expect(isCodexTransientUpstreamError({ errorMessage })).toBe(false);
164
+ expect(extractCodexRetryNotBefore({ errorMessage })).toBeNull();
165
+ });
166
+ it("parses explicit timezone hints on usage-limit retry windows", () => {
167
+ const errorMessage = "You've hit your usage limit for GPT-5.3-Codex-Spark. Switch to another model now, or try again at 11:31 PM (America/Chicago).";
168
+ const now = new Date("2026-04-23T03:29:02.000Z");
169
+ expect(extractCodexRetryNotBefore({ errorMessage }, now)?.toISOString()).toBe("2026-04-23T04:31:00.000Z");
170
+ });
171
+ it("does not classify deterministic compaction errors as transient", () => {
172
+ expect(isCodexTransientUpstreamError({
173
+ errorMessage: [
174
+ "Error running remote compact task: {",
175
+ ' "error": {',
176
+ ' "message": "Unknown parameter: \'prompt_cache_retention\'.",',
177
+ ' "type": "invalid_request_error",',
178
+ ' "param": "prompt_cache_retention",',
179
+ ' "code": "unknown_parameter"',
180
+ " }",
181
+ "}",
182
+ ].join("\n"),
183
+ })).toBe(false);
184
+ });
185
+ });
186
+ //# sourceMappingURL=parse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const CODEX_PROCESS_ACTIVITY_POLL_INTERVAL_MS = 15000;
2
+ export interface CodexProcessActivitySnapshot {
3
+ cpuTicks: number;
4
+ ioBytes: number;
5
+ processIds: string;
6
+ }
7
+ export interface CodexProcessActivityMonitorOptions {
8
+ pid: number;
9
+ processGroupId: number | null;
10
+ onActivity: () => void;
11
+ intervalMs?: number;
12
+ sample?: () => Promise<CodexProcessActivitySnapshot | null>;
13
+ setTimer?: (cb: () => void, ms: number) => unknown;
14
+ clearTimer?: (handle: unknown) => void;
15
+ }
16
+ export interface CodexProcessActivityMonitorHandle {
17
+ stop(): void;
18
+ }
19
+ export declare function sampleCodexProcessActivity(pid: number, processGroupId: number | null): Promise<CodexProcessActivitySnapshot | null>;
20
+ export declare function createCodexProcessActivityMonitor(options: CodexProcessActivityMonitorOptions): CodexProcessActivityMonitorHandle;
21
+ //# sourceMappingURL=process-activity-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-activity-monitor.d.ts","sourceRoot":"","sources":["../../src/server/process-activity-monitor.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uCAAuC,QAAS,CAAC;AAE9D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kCAAkC;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,iCAAiC;IAChD,IAAI,IAAI,IAAI,CAAC;CACd;AAsBD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CA6B9C;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,kCAAkC,GAC1C,iCAAiC,CAgDnC"}
@@ -0,0 +1,103 @@
1
+ import fs from "node:fs/promises";
2
+ export const CODEX_PROCESS_ACTIVITY_POLL_INTERVAL_MS = 15_000;
3
+ function parseProcStat(stat) {
4
+ const commandEnd = stat.lastIndexOf(")");
5
+ if (commandEnd < 0)
6
+ return null;
7
+ const fields = stat.slice(commandEnd + 2).trim().split(/\s+/);
8
+ const processGroupId = Number(fields[2]);
9
+ const userTicks = Number(fields[11]);
10
+ const systemTicks = Number(fields[12]);
11
+ if (![processGroupId, userTicks, systemTicks].every(Number.isFinite))
12
+ return null;
13
+ return { processGroupId, cpuTicks: userTicks + systemTicks };
14
+ }
15
+ function parseProcIo(io) {
16
+ let bytes = 0;
17
+ for (const line of io.split("\n")) {
18
+ const match = /^(?:read_bytes|write_bytes):\s+(\d+)$/.exec(line.trim());
19
+ if (match)
20
+ bytes += Number(match[1]);
21
+ }
22
+ return bytes;
23
+ }
24
+ export async function sampleCodexProcessActivity(pid, processGroupId) {
25
+ if (process.platform !== "linux")
26
+ return null;
27
+ const targetProcessGroupId = processGroupId && processGroupId > 0 ? processGroupId : null;
28
+ const entries = targetProcessGroupId ? await fs.readdir("/proc") : [String(pid)];
29
+ const processIds = [];
30
+ let cpuTicks = 0;
31
+ let ioBytes = 0;
32
+ await Promise.all(entries.map(async (entry) => {
33
+ if (!/^\d+$/.test(entry))
34
+ return;
35
+ try {
36
+ const parsed = parseProcStat(await fs.readFile(`/proc/${entry}/stat`, "utf8"));
37
+ if (!parsed)
38
+ return;
39
+ if (targetProcessGroupId !== null && parsed.processGroupId !== targetProcessGroupId)
40
+ return;
41
+ if (targetProcessGroupId === null && Number(entry) !== pid)
42
+ return;
43
+ const io = await fs.readFile(`/proc/${entry}/io`, "utf8").catch(() => "");
44
+ processIds.push(Number(entry));
45
+ cpuTicks += parsed.cpuTicks;
46
+ ioBytes += parseProcIo(io);
47
+ }
48
+ catch {
49
+ // Processes can exit between listing /proc and reading their stat file.
50
+ }
51
+ }));
52
+ if (processIds.length === 0)
53
+ return null;
54
+ processIds.sort((left, right) => left - right);
55
+ return { cpuTicks, ioBytes, processIds: processIds.join(",") };
56
+ }
57
+ export function createCodexProcessActivityMonitor(options) {
58
+ const intervalMs = options.intervalMs ?? CODEX_PROCESS_ACTIVITY_POLL_INTERVAL_MS;
59
+ const sample = options.sample ?? (() => sampleCodexProcessActivity(options.pid, options.processGroupId));
60
+ const setTimer = options.setTimer ?? ((cb, ms) => setTimeout(cb, ms));
61
+ const clearTimer = options.clearTimer ?? ((handle) => clearTimeout(handle));
62
+ const minimumCpuTickDelta = Math.max(1, Math.floor(intervalMs / 1_000));
63
+ let previous = null;
64
+ let timer = null;
65
+ let stopped = false;
66
+ const schedule = () => {
67
+ if (stopped)
68
+ return;
69
+ timer = setTimer(() => {
70
+ void poll();
71
+ }, intervalMs);
72
+ if (typeof timer.unref === "function") {
73
+ timer.unref();
74
+ }
75
+ };
76
+ const poll = async () => {
77
+ if (stopped)
78
+ return;
79
+ const current = await sample().catch(() => null);
80
+ if (stopped)
81
+ return;
82
+ if (current &&
83
+ previous &&
84
+ (current.cpuTicks - previous.cpuTicks >= minimumCpuTickDelta ||
85
+ current.ioBytes > previous.ioBytes ||
86
+ current.processIds !== previous.processIds)) {
87
+ options.onActivity();
88
+ }
89
+ previous = current;
90
+ schedule();
91
+ };
92
+ void poll();
93
+ return {
94
+ stop() {
95
+ stopped = true;
96
+ if (timer != null) {
97
+ clearTimer(timer);
98
+ timer = null;
99
+ }
100
+ },
101
+ };
102
+ }
103
+ //# sourceMappingURL=process-activity-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-activity-monitor.js","sourceRoot":"","sources":["../../src/server/process-activity-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,MAAM,CAAC,MAAM,uCAAuC,GAAG,MAAM,CAAC;AAsB9D,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAClF,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,GAAG,WAAW,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,KAAK;YAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAW,EACX,cAA6B;IAE7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,oBAAoB,GAAG,cAAc,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,MAAM,OAAO,GAAG,oBAAoB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,KAAK,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,IAAI,oBAAoB,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,KAAK,oBAAoB;gBAAE,OAAO;YAC5F,IAAI,oBAAoB,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG;gBAAE,OAAO;YACnE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/B,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;YAC5B,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAA2C;IAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,uCAAuC,CAAC;IACjF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAuC,CAAC,CAAC,CAAC;IAC7G,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IACxE,IAAI,QAAQ,GAAwC,IAAI,CAAC;IACzD,IAAI,KAAK,GAAY,IAAI,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,OAAO;YAAE,OAAO;QACpB,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE;YACpB,KAAK,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,IAAI,OAAQ,KAAgC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACjE,KAA+B,CAAC,KAAK,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,OAAO,GAAG,MAAM,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,OAAO;YAAE,OAAO;QACpB,IACE,OAAO;YACP,QAAQ;YACR,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,mBAAmB;gBAC1D,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO;gBAClC,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAAC,EAC7C,CAAC;YACD,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;QACD,QAAQ,GAAG,OAAO,CAAC;QACnB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,KAAK,IAAI,EAAE,CAAC;IAEZ,OAAO;QACL,IAAI;YACF,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-activity-monitor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-activity-monitor.test.d.ts","sourceRoot":"","sources":["../../src/server/process-activity-monitor.test.ts"],"names":[],"mappings":""}