blun-king-cli 9.1.587 → 9.1.588

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 (436) hide show
  1. package/CHANGELOG.md +11 -185
  2. package/LIESMICH.txt +51 -13
  3. package/README.md +44 -47
  4. package/agent-spine-plugin/.codex-plugin/plugin.json +16 -4
  5. package/agent-spine-plugin/CHANGELOG.md +37 -5
  6. package/agent-spine-plugin/README.md +3 -3
  7. package/agent-spine-plugin/blun.plugin.json +45 -10
  8. package/agent-spine-plugin/docs/artifact-evaluation.md +93 -0
  9. package/agent-spine-plugin/docs/host-integration.md +42 -27
  10. package/agent-spine-plugin/docs/preflight-recall.md +4 -2
  11. package/agent-spine-plugin/docs/session-timeline.md +97 -236
  12. package/agent-spine-plugin/docs/world-model.md +25 -0
  13. package/agent-spine-plugin/hooks/codex.json +1 -1
  14. package/agent-spine-plugin/hooks/hooks.json +1 -1
  15. package/agent-spine-plugin/package.json +1 -3
  16. package/agent-spine-plugin/scripts/check-hosts.js +3 -3
  17. package/agent-spine-plugin/scripts/release-check.js +10 -5
  18. package/agent-spine-plugin/scripts/run-checks.js +4 -1
  19. package/agent-spine-plugin/scripts/run-tests-hermetic.js +32 -6
  20. package/agent-spine-plugin/src/cli-learning.js +15 -0
  21. package/agent-spine-plugin/src/cli.js +2 -0
  22. package/agent-spine-plugin/src/hook.js +32 -32
  23. package/agent-spine-plugin/src/lib/action-lesson-recall.js +73 -8
  24. package/agent-spine-plugin/src/lib/briefing.js +146 -36
  25. package/agent-spine-plugin/src/lib/channel-continuity.js +19 -0
  26. package/agent-spine-plugin/src/lib/delivery-agent-usage.js +14 -7
  27. package/agent-spine-plugin/src/lib/gateway-group-response.js +128 -0
  28. package/agent-spine-plugin/src/lib/gateway-runs.js +24 -15
  29. package/agent-spine-plugin/src/lib/hook-briefing-use.js +13 -3
  30. package/agent-spine-plugin/src/lib/hook-context.js +16 -3
  31. package/agent-spine-plugin/src/lib/hook-output.js +129 -5
  32. package/agent-spine-plugin/src/lib/hook-timeline.js +5 -3
  33. package/agent-spine-plugin/src/lib/indexed-memory.js +2 -2
  34. package/agent-spine-plugin/src/lib/learning-artifact-evaluator.js +114 -0
  35. package/agent-spine-plugin/src/lib/learning-context.js +11 -4
  36. package/agent-spine-plugin/src/lib/learning-measurements.js +2 -2
  37. package/agent-spine-plugin/src/lib/mcp-runtime.js +89 -3
  38. package/agent-spine-plugin/src/lib/mcp-source-context.js +12 -2
  39. package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +91 -8
  40. package/agent-spine-plugin/src/lib/mcp-world-tools.js +2 -2
  41. package/agent-spine-plugin/src/lib/owned-file-lock.js +20 -1
  42. package/agent-spine-plugin/src/lib/persona-runtime.js +2 -2
  43. package/agent-spine-plugin/src/lib/preflight-delivery-id.js +27 -0
  44. package/agent-spine-plugin/src/lib/preflight.js +4 -4
  45. package/agent-spine-plugin/src/lib/session-timeline-codex.js +15 -0
  46. package/agent-spine-plugin/src/lib/session-timeline-contract.js +12 -4
  47. package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +36 -7
  48. package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +13 -10
  49. package/agent-spine-plugin/src/lib/session-timeline-invocation.js +1 -1
  50. package/agent-spine-plugin/src/lib/session-timeline-king.js +14 -0
  51. package/agent-spine-plugin/src/lib/session-timeline-prior.js +18 -12
  52. package/agent-spine-plugin/src/lib/session-timeline-provider.js +5 -0
  53. package/agent-spine-plugin/src/lib/session-timeline-query.js +2 -0
  54. package/agent-spine-plugin/src/lib/session-timeline-results.js +35 -10
  55. package/agent-spine-plugin/src/lib/session-timeline-source-open.js +30 -0
  56. package/agent-spine-plugin/src/lib/session-timeline.js +122 -75
  57. package/agent-spine-plugin/src/lib/source-roots.js +3 -2
  58. package/agent-spine-plugin/src/lib/task-knowledge-context.js +22 -1
  59. package/agent-spine-plugin/src/lib/timeline-continuation-update.js +100 -0
  60. package/agent-spine-plugin/src/lib/timeline-tool-guard.js +30 -7
  61. package/agent-spine-plugin/src/lib/timeline-user-feedback.js +217 -0
  62. package/agent-spine-plugin/src/lib/timeline-world-capture.js +233 -0
  63. package/agent-spine-plugin/src/lib/world-knowledge.js +59 -2
  64. package/agent-spine-plugin/src/lib/world-model.js +64 -9
  65. package/agent-spine-plugin/src/worker.js +13 -1
  66. package/bin/blun.js +43 -28
  67. package/bin/core-bootstrap.js +5 -4
  68. package/bin/king.js +43 -28
  69. package/bin/launcher-mode.js +1 -10
  70. package/bin/launcher-runtime.js +128 -295
  71. package/bin/managed-node.js +0 -0
  72. package/bin/managed-plugin-selection.cjs +0 -1
  73. package/bin/native-module-repair.js +0 -0
  74. package/bin/node-runtime.js +0 -0
  75. package/bin/node-version.js +0 -0
  76. package/bin/plugin-bootstrap.js +56 -120
  77. package/bin/private-paths.js +11 -34
  78. package/bin/standard-tools-bootstrap.js +34 -114
  79. package/bin/turn-thinking-policy.cjs +3 -11
  80. package/bin/update-copy.js +200 -0
  81. package/bin/update-lease.js +0 -0
  82. package/bin/update-notice.js +136 -289
  83. package/bin/verify-agent-behavior.cjs +122 -0
  84. package/bin/verify-agent-components.cjs +104 -0
  85. package/bin/verify-bundled-agent-sources.cjs +57 -0
  86. package/blun.mjs +143076 -135288
  87. package/bundled-agent-sources.json +701 -0
  88. package/package.json +12 -15
  89. package/standard-skills/translate-native/README.md +1293 -0
  90. package/standard-skills/translate-native/SKILL.md +172 -22
  91. package/standard-skills/translate-native/VERSION +1 -1
  92. package/standard-skills/translate-native/agents/openai.yaml +18 -0
  93. package/standard-skills/translate-native/assets/icon.svg +8 -0
  94. package/standard-skills/translate-native/docs/BLUN_CODE_INTEGRATION.md +76 -0
  95. package/standard-skills/translate-native/docs/PREMORTEM.md +489 -0
  96. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION.md +2035 -0
  97. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_API.md +1302 -0
  98. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_EVIDENCE_HTTP.md +136 -0
  99. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HEALTH_HTTP.md +130 -0
  100. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HTTP_PROVIDER.md +175 -0
  101. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_RECEIPT_VERIFIER_HTTP.md +86 -0
  102. package/standard-skills/translate-native/integrations/AGENT_RULES.md +32 -0
  103. package/standard-skills/translate-native/integrations/adapters/blun-code-language-guard.js +514 -0
  104. package/standard-skills/translate-native/integrations/adapters/node-language-guard.js +230 -0
  105. package/standard-skills/translate-native/integrations/audit_log.py +327 -0
  106. package/standard-skills/translate-native/integrations/claude_language_hook.js +1536 -0
  107. package/standard-skills/translate-native/integrations/commercial_localization_profile.py +42 -0
  108. package/standard-skills/translate-native/integrations/delivery-policy.example.json +28 -0
  109. package/standard-skills/translate-native/integrations/enforced_delivery.py +543 -0
  110. package/standard-skills/translate-native/integrations/guard_service.py +435 -0
  111. package/standard-skills/translate-native/integrations/language_gateway.py +67 -0
  112. package/standard-skills/translate-native/integrations/mcp_auth_headers.py +198 -0
  113. package/standard-skills/translate-native/integrations/mcp_http_gateway.py +429 -0
  114. package/standard-skills/translate-native/integrations/non_language_html_entities.js +1485 -0
  115. package/standard-skills/translate-native/integrations/pre_output_guard.py +65 -0
  116. package/standard-skills/translate-native/integrations/task_router.py +101 -0
  117. package/standard-skills/translate-native/integrations/website_localization.py +401 -0
  118. package/standard-skills/translate-native/integrations/website_localization_api.py +581 -0
  119. package/standard-skills/translate-native/integrations/website_localization_benchmark.py +1885 -0
  120. package/standard-skills/translate-native/integrations/website_localization_benchmark_campaign.py +1772 -0
  121. package/standard-skills/translate-native/integrations/website_localization_benchmark_candidate.py +506 -0
  122. package/standard-skills/translate-native/integrations/website_localization_benchmark_http.py +400 -0
  123. package/standard-skills/translate-native/integrations/website_localization_benchmark_review_store.py +781 -0
  124. package/standard-skills/translate-native/integrations/website_localization_benchmark_reviewer_http.py +500 -0
  125. package/standard-skills/translate-native/integrations/website_localization_benchmark_runtime.py +1107 -0
  126. package/standard-skills/translate-native/integrations/website_localization_benchmark_suite.py +463 -0
  127. package/standard-skills/translate-native/integrations/website_localization_cms.py +2835 -0
  128. package/standard-skills/translate-native/integrations/website_localization_cms_client.py +875 -0
  129. package/standard-skills/translate-native/integrations/website_localization_cms_dispatch.py +805 -0
  130. package/standard-skills/translate-native/integrations/website_localization_cms_http.py +588 -0
  131. package/standard-skills/translate-native/integrations/website_localization_cms_lifecycle_monitor.py +991 -0
  132. package/standard-skills/translate-native/integrations/website_localization_cms_receiver.py +1441 -0
  133. package/standard-skills/translate-native/integrations/website_localization_cms_receiver_runtime.py +414 -0
  134. package/standard-skills/translate-native/integrations/website_localization_cms_receiver_store.py +1073 -0
  135. package/standard-skills/translate-native/integrations/website_localization_cms_removal_dispatch.py +865 -0
  136. package/standard-skills/translate-native/integrations/website_localization_cms_source_client.py +583 -0
  137. package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery.py +964 -0
  138. package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery_runtime.py +665 -0
  139. package/standard-skills/translate-native/integrations/website_localization_cms_source_http.py +1153 -0
  140. package/standard-skills/translate-native/integrations/website_localization_cms_source_runtime.py +675 -0
  141. package/standard-skills/translate-native/integrations/website_localization_cms_source_service.py +1125 -0
  142. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification.py +674 -0
  143. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_http.py +444 -0
  144. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver.py +1469 -0
  145. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver_runtime.py +1142 -0
  146. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_processing_monitor.py +634 -0
  147. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_receiver_client.py +804 -0
  148. package/standard-skills/translate-native/integrations/website_localization_deepl_baseline.py +922 -0
  149. package/standard-skills/translate-native/integrations/website_localization_evidence_http.py +482 -0
  150. package/standard-skills/translate-native/integrations/website_localization_health.py +1541 -0
  151. package/standard-skills/translate-native/integrations/website_localization_health_http.py +372 -0
  152. package/standard-skills/translate-native/integrations/website_localization_http_provider.py +297 -0
  153. package/standard-skills/translate-native/integrations/website_localization_native_reference_http.py +479 -0
  154. package/standard-skills/translate-native/integrations/website_localization_native_reference_intake.py +363 -0
  155. package/standard-skills/translate-native/integrations/website_localization_native_reference_queue.py +1449 -0
  156. package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py +420 -0
  157. package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py +235 -0
  158. package/standard-skills/translate-native/integrations/website_localization_queue.py +671 -0
  159. package/standard-skills/translate-native/integrations/website_localization_receipt_verifier_http.py +516 -0
  160. package/standard-skills/translate-native/integrations/website_localization_release.py +928 -0
  161. package/standard-skills/translate-native/integrations/website_localization_release_coordinator.py +1008 -0
  162. package/standard-skills/translate-native/integrations/website_localization_runner.py +276 -0
  163. package/standard-skills/translate-native/integrations/website_localization_runtime.py +862 -0
  164. package/standard-skills/translate-native/integrations/website_localization_service.py +350 -0
  165. package/standard-skills/translate-native/integrations/website_localization_supervisor.py +511 -0
  166. package/standard-skills/translate-native/integrations/website_localization_worker.py +663 -0
  167. package/standard-skills/translate-native/provenance.json +3 -4
  168. package/standard-skills/translate-native/references/commercial-localization.md +177 -0
  169. package/standard-skills/translate-native/scripts/blun_language_guard.py +7 -1
  170. package/standard-skills/translate-native/scripts/check_commercial_review.py +80 -0
  171. package/standard-skills/translate-native/scripts/commercial_localization_profile.py +333 -0
  172. package/standard-tools/language-guard/LICENSE +21 -0
  173. package/standard-tools/language-guard/VERSION +1 -0
  174. package/standard-tools/language-guard/blun_language_guard.py +7 -1
  175. package/standard-tools/language-guard/check_commercial_review.py +80 -0
  176. package/standard-tools/language-guard/commercial_localization_profile.py +333 -0
  177. package/standard-tools/language-guard/language_gateway.py +62 -0
  178. package/standard-tools/language-guard/pre_output_guard.py +64 -0
  179. package/standard-tools/language-guard/provenance.json +4 -11
  180. package/standard-tools/manifest.json +34 -11
  181. package/telegram-plugin/commands/access.md +2 -10
  182. package/telegram-plugin/dist/bridge.mjs +64041 -687
  183. package/telegram-plugin/dist/mcp-server.mjs +72810 -9027
  184. package/telegram-plugin/dist/noise.mjs +28 -63511
  185. package/agent-spine-plugin/CONTRIBUTING.md +0 -52
  186. package/agent-spine-plugin/SECURITY.md +0 -47
  187. package/agent-spine-plugin/docs/assignment-continuation.md +0 -48
  188. package/agent-spine-plugin/docs/releasing.md +0 -85
  189. package/agent-spine-plugin/docs/structured-completion.md +0 -67
  190. package/bin/abort-listener-policy.cjs +0 -43
  191. package/bin/active-steer-priority-policy.cjs +0 -24
  192. package/bin/agent-api-http-adapter.mjs +0 -446
  193. package/bin/agent-api-private-http-server.mjs +0 -288
  194. package/bin/agent-api-runtime.mjs +0 -252
  195. package/bin/agent-api-service-environment.mjs +0 -236
  196. package/bin/agent-api-service-host.mjs +0 -209
  197. package/bin/agent-api-service-process.mjs +0 -171
  198. package/bin/agent-api-session-registry.mjs +0 -428
  199. package/bin/agent-api-tool-broker.cjs +0 -248
  200. package/bin/agent-api-turn-controller.mjs +0 -461
  201. package/bin/agent-api-usage-journal.cjs +0 -259
  202. package/bin/agent-resume-snapshot.cjs +0 -241
  203. package/bin/agentspine-king-goal-inbox.mjs +0 -111
  204. package/bin/agentspine-king-goal-intake.mjs +0 -106
  205. package/bin/approval-rejection-stop.cjs +0 -15
  206. package/bin/assistant-message-offload-policy.cjs +0 -284
  207. package/bin/baseline-skill-performance-policy.cjs +0 -39
  208. package/bin/bash-search-scope-policy.cjs +0 -49
  209. package/bin/codebase-search-runtime.cjs +0 -23
  210. package/bin/cognitive-action-checkpoint.cjs +0 -1104
  211. package/bin/cognitive-attention-delivery.cjs +0 -76
  212. package/bin/cognitive-attention-policy.cjs +0 -143
  213. package/bin/cognitive-attention-runtime.cjs +0 -91
  214. package/bin/cognitive-context-projection.cjs +0 -73
  215. package/bin/cognitive-cross-portal-acceptance.cjs +0 -443
  216. package/bin/cognitive-effective-view.cjs +0 -77
  217. package/bin/cognitive-focus-projection.cjs +0 -206
  218. package/bin/cognitive-focus-scope.cjs +0 -37
  219. package/bin/cognitive-goal-autostart-policy.cjs +0 -72
  220. package/bin/cognitive-goal-time-trigger-controller.cjs +0 -146
  221. package/bin/cognitive-memory-adapter.cjs +0 -282
  222. package/bin/cognitive-memory-command.cjs +0 -293
  223. package/bin/cognitive-memory-provider.cjs +0 -92
  224. package/bin/cognitive-salience-policy.cjs +0 -159
  225. package/bin/cognitive-state-store.cjs +0 -508
  226. package/bin/cognitive-turn-lifecycle.cjs +0 -624
  227. package/bin/cognitive-work-focus.cjs +0 -180
  228. package/bin/compaction-history-archive.cjs +0 -166
  229. package/bin/compaction-history-startup.cjs +0 -50
  230. package/bin/compaction-model-policy.cjs +0 -31
  231. package/bin/compaction-stage-policy.cjs +0 -21
  232. package/bin/compaction-transaction-policy.cjs +0 -122
  233. package/bin/config-write-dedup-policy.cjs +0 -27
  234. package/bin/context-budget-ledger.cjs +0 -31
  235. package/bin/context-doctor-policy.cjs +0 -70
  236. package/bin/context-insight-policy.cjs +0 -36
  237. package/bin/context-performance-policy.cjs +0 -19
  238. package/bin/context-pressure-policy.cjs +0 -20
  239. package/bin/cron-run-output.cjs +0 -45
  240. package/bin/cron-run-store.cjs +0 -145
  241. package/bin/curiosity-scout-policy.cjs +0 -49
  242. package/bin/default-model-output-budget-policy.cjs +0 -28
  243. package/bin/durable-task-resume-policy.cjs +0 -130
  244. package/bin/durable-task-resume-runtime.cjs +0 -117
  245. package/bin/durable-task-resume-store.cjs +0 -88
  246. package/bin/editable-tool-approval-policy.cjs +0 -540
  247. package/bin/editable-tool-approval-runtime.cjs +0 -99
  248. package/bin/effective-system-prompt-cache-policy.cjs +0 -33
  249. package/bin/error-memory-performance-policy.cjs +0 -113
  250. package/bin/file-observation-policy.cjs +0 -133
  251. package/bin/foreground-output-capture-policy.cjs +0 -41
  252. package/bin/generated-source-health.cjs +0 -142
  253. package/bin/glob-pattern-policy.cjs +0 -13
  254. package/bin/goal-completion-evidence-policy.cjs +0 -120
  255. package/bin/grep-output-limit-policy.cjs +0 -39
  256. package/bin/historical-media-projection-policy.cjs +0 -48
  257. package/bin/history-offload-pressure-policy.cjs +0 -33
  258. package/bin/html-to-research-markdown.cjs +0 -147
  259. package/bin/identity-context-policy.cjs +0 -764
  260. package/bin/identity-journal-policy.cjs +0 -107
  261. package/bin/input-draft-persistence.cjs +0 -77
  262. package/bin/king-tui-function-contract.json +0 -33
  263. package/bin/launcher-restart-policy.cjs +0 -150
  264. package/bin/live-response-repetition-guard.cjs +0 -196
  265. package/bin/llm-config-log-dedup-policy.cjs +0 -76
  266. package/bin/loop-event-record-policy.cjs +0 -174
  267. package/bin/managed-context-startup-policy.cjs +0 -27
  268. package/bin/media-activity-layout-policy.cjs +0 -34
  269. package/bin/media-auto-retrieval-policy.cjs +0 -90
  270. package/bin/media-result-policy.cjs +0 -59
  271. package/bin/micro-compaction-policy.cjs +0 -145
  272. package/bin/mistake-relevance-policy.cjs +0 -319
  273. package/bin/model-retry-progress-policy.cjs +0 -46
  274. package/bin/native-large-file-io.cjs +0 -42
  275. package/bin/native-runtime-cache.cjs +0 -76
  276. package/bin/natural-presence-policy.cjs +0 -28
  277. package/bin/noninteractive-shell-env-policy.cjs +0 -19
  278. package/bin/observer-hooks.cjs +0 -14
  279. package/bin/outbound-claim-provenance.cjs +0 -150
  280. package/bin/oversized-context-offload-policy.cjs +0 -86
  281. package/bin/pending-media-policy.cjs +0 -182
  282. package/bin/pending-token-estimate-policy.cjs +0 -41
  283. package/bin/personal-memory-consent-policy.cjs +0 -72
  284. package/bin/personal-memory-performance-policy.cjs +0 -12
  285. package/bin/personality-choice-policy.cjs +0 -101
  286. package/bin/personality-memory-adapter.cjs +0 -379
  287. package/bin/personality-mode.cjs +0 -46
  288. package/bin/personality-setup-policy.cjs +0 -197
  289. package/bin/proactive-compaction-policy.cjs +0 -25
  290. package/bin/profile-identity-resolution.cjs +0 -136
  291. package/bin/profile-runtime.cjs +0 -318
  292. package/bin/profile-tool-exclusion-policy.cjs +0 -37
  293. package/bin/programmatic-context-isolation.cjs +0 -25
  294. package/bin/programmatic-tool-runtime.mjs +0 -627
  295. package/bin/provider-idle-timeout-policy.cjs +0 -14
  296. package/bin/provider-model-refresh-deadline.cjs +0 -53
  297. package/bin/provider-model-refresh-policy.cjs +0 -107
  298. package/bin/rate-limit-recovery-policy.cjs +0 -47
  299. package/bin/read-batch-policy.cjs +0 -32
  300. package/bin/read-continuation-policy.cjs +0 -59
  301. package/bin/recurring-cron-history-policy.cjs +0 -124
  302. package/bin/relationship-continuity-policy.cjs +0 -143
  303. package/bin/relationship-curiosity-policy.cjs +0 -107
  304. package/bin/relationship-learning-policy.cjs +0 -168
  305. package/bin/release-artifact-freeze-policy.cjs +0 -30
  306. package/bin/reload-plugin-bootstrap.cjs +0 -18
  307. package/bin/reload-queue-policy.cjs +0 -38
  308. package/bin/repeated-assistant-response-policy.cjs +0 -232
  309. package/bin/repeated-injection-projection.cjs +0 -107
  310. package/bin/repeated-user-message-projection.cjs +0 -8
  311. package/bin/research-page-result.cjs +0 -74
  312. package/bin/retry-checkpoint-policy.cjs +0 -13
  313. package/bin/runtime-exit-ledger.cjs +0 -144
  314. package/bin/scoped-cron-run-policy.cjs +0 -358
  315. package/bin/session-checkpoint-policy.cjs +0 -25
  316. package/bin/session-compaction-policy.cjs +0 -84
  317. package/bin/session-replay-policy.cjs +0 -20
  318. package/bin/session-replay-window-policy.cjs +0 -40
  319. package/bin/session-resume-checkpoint.cjs +0 -254
  320. package/bin/session-scrollback-archive.cjs +0 -229
  321. package/bin/skill-activation-performance-policy.cjs +0 -69
  322. package/bin/skill-listing-performance-policy.cjs +0 -92
  323. package/bin/soul-organization-policy.cjs +0 -78
  324. package/bin/soul-preservation-policy.cjs +0 -20
  325. package/bin/startup-preferences.cjs +0 -131
  326. package/bin/streaming-flush-performance-policy.cjs +0 -28
  327. package/bin/structured-agent-swarm-output.cjs +0 -325
  328. package/bin/structured-subagent-output.cjs +0 -252
  329. package/bin/subagent-context-fork-policy.cjs +0 -155
  330. package/bin/subagent-max-tokens-handoff-policy.cjs +0 -69
  331. package/bin/subagent-parent-responsiveness.cjs +0 -19
  332. package/bin/subagent-skill-policy.cjs +0 -206
  333. package/bin/subagent-timeout-policy.cjs +0 -182
  334. package/bin/subagent-tool-policy.cjs +0 -60
  335. package/bin/subagent-usage-rollup-policy.cjs +0 -29
  336. package/bin/system-prompt-context-policy.cjs +0 -124
  337. package/bin/system-prompt-token-cache-policy.cjs +0 -60
  338. package/bin/telegram-addressed-focus.cjs +0 -55
  339. package/bin/telegram-addressed-priority.cjs +0 -12
  340. package/bin/telegram-approval-relay.cjs +0 -290
  341. package/bin/telegram-bot-priority.cjs +0 -17
  342. package/bin/telegram-console-status-policy.cjs +0 -174
  343. package/bin/telegram-context-projection-policy.cjs +0 -141
  344. package/bin/telegram-delivery-lifecycle.cjs +0 -125
  345. package/bin/telegram-direct-focus-policy.cjs +0 -273
  346. package/bin/telegram-mcp-compatibility.cjs +0 -49
  347. package/bin/telegram-media-delivery-policy.cjs +0 -42
  348. package/bin/telegram-private-conversation-policy.cjs +0 -185
  349. package/bin/telegram-queue-handoff-policy.cjs +0 -73
  350. package/bin/telegram-remote-status-policy.cjs +0 -120
  351. package/bin/telegram-session-queue-runtime.mjs +0 -306
  352. package/bin/telegram-text-chunk-policy.cjs +0 -63
  353. package/bin/telegram-truncated-reply-policy.cjs +0 -37
  354. package/bin/telegram-urgent-policy.cjs +0 -45
  355. package/bin/telemetry-spool-policy.cjs +0 -57
  356. package/bin/thinking-activity-status-policy.cjs +0 -132
  357. package/bin/thinking-only-guard.cjs +0 -80
  358. package/bin/todo-list-turn-policy.cjs +0 -131
  359. package/bin/tool-call-loop-policy.cjs +0 -51
  360. package/bin/tool-file-persistence.cjs +0 -141
  361. package/bin/tool-result-offload-policy.cjs +0 -359
  362. package/bin/tool-result-offload-telemetry.cjs +0 -12
  363. package/bin/tool-schema-token-cache-policy.cjs +0 -41
  364. package/bin/tool-stream-preview-policy.cjs +0 -9
  365. package/bin/tui-functional-contract.cjs +0 -55
  366. package/bin/turn-tool-performance-policy.cjs +0 -486
  367. package/bin/usage-cache-efficiency-policy.cjs +0 -26
  368. package/bin/user-home-path-policy.cjs +0 -13
  369. package/bin/user-message-offload-policy.cjs +0 -103
  370. package/bin/user-prompt-hook-origin-policy.cjs +0 -34
  371. package/bin/user-tool-record-policy.cjs +0 -7
  372. package/bin/validated-learning-insight-policy.cjs +0 -58
  373. package/bin/validated-learning-outcome-trace.cjs +0 -107
  374. package/bin/validated-learning-performance-policy.cjs +0 -53
  375. package/bin/validated-learning-signal.cjs +0 -463
  376. package/bin/windows-bash-dialect-policy.cjs +0 -25
  377. package/bin/windows-node-crash-dump.cjs +0 -110
  378. package/bin/write-continuation-policy.cjs +0 -69
  379. package/codebase-index/README.md +0 -82
  380. package/codebase-index/codebase_index.py +0 -470
  381. package/standard-skills/agent-browser/SKILL.md +0 -19
  382. package/standard-skills/agent-browser/references/runtime.md +0 -8
  383. package/standard-skills/blun-session-inspector/SKILL.md +0 -41
  384. package/standard-skills/blun-session-inspector/scripts/inspect-session.cjs +0 -437
  385. package/standard-skills/design-taste-frontend/SKILL.md +0 -1206
  386. package/standard-skills/full-output-enforcement/SKILL.md +0 -49
  387. package/standard-skills/high-end-visual-design/SKILL.md +0 -98
  388. package/standard-skills/image-to-code/SKILL.md +0 -1228
  389. package/standard-skills/industrial-brutalist-ui/SKILL.md +0 -92
  390. package/standard-skills/minimalist-ui/SKILL.md +0 -85
  391. package/standard-skills/motion-design-taste/SKILL.md +0 -74
  392. package/standard-skills/playwright-testing/SKILL.md +0 -19
  393. package/standard-skills/playwright-testing/references/runtime.md +0 -7
  394. package/standard-skills/premortem/SKILL.md +0 -148
  395. package/standard-skills/redesign-existing-projects/SKILL.md +0 -178
  396. package/standard-skills/research-evidence/SKILL.md +0 -39
  397. package/standard-skills/research-evidence/references/evidence-format.md +0 -104
  398. package/standard-skills/research-evidence/scripts/evidence-collection.cjs +0 -260
  399. package/standard-skills/research-evidence/scripts/score-report.cjs +0 -130
  400. package/standard-skills/screenshot-lesen/SKILL.md +0 -52
  401. package/standard-skills/stitch-design-taste/DESIGN.md +0 -121
  402. package/standard-skills/stitch-design-taste/SKILL.md +0 -184
  403. package/standard-skills/telegram-channel/SKILL.md +0 -18
  404. package/standard-skills/telegram-channel/references/runtime.md +0 -7
  405. package/standard-skills/venture-flywheel/SKILL.md +0 -32
  406. package/standard-skills/venture-flywheel/identity/project-identity.cjs +0 -146
  407. package/standard-skills/venture-flywheel/policy/capability-engine.cjs +0 -114
  408. package/standard-skills/venture-flywheel/policy/repository-trust.cjs +0 -229
  409. package/standard-skills/venture-flywheel/references/BEISPIELE-phase0.md +0 -146
  410. package/standard-skills/venture-flywheel/references/CAPABILITY-MAP.md +0 -34
  411. package/standard-skills/venture-flywheel/references/SPEC-phase0-identity-trust.md +0 -77
  412. package/standard-skills/venture-flywheel/references/SPEC-phase0-state-events.md +0 -93
  413. package/standard-skills/venture-flywheel/schemas/capability-decision.schema.json +0 -13
  414. package/standard-skills/venture-flywheel/schemas/execution-event.schema.json +0 -44
  415. package/standard-skills/venture-flywheel/schemas/project-identity.schema.json +0 -32
  416. package/standard-skills/venture-flywheel/schemas/repository-trust.schema.json +0 -57
  417. package/standard-skills/venture-flywheel/schemas/run-transition.schema.json +0 -59
  418. package/standard-skills/venture-flywheel/state/execution-event.cjs +0 -191
  419. package/standard-skills/venture-flywheel/state/task-state-machine.cjs +0 -190
  420. package/standard-skills/web-lesen/SKILL.md +0 -73
  421. package/standard-skills/web-lesen/scripts/crawl_public.py +0 -379
  422. package/standard-skills/windows-mcp/SKILL.md +0 -19
  423. package/standard-skills/windows-mcp/references/runtime.md +0 -9
  424. package/telegram-plugin/DELIVERY.md +0 -36
  425. package/telegram-plugin/bin/telegram-approval-relay.cjs +0 -290
  426. package/telegram-plugin/bin/telegram-console-status-policy.cjs +0 -175
  427. package/telegram-plugin/bin/telegram-delivery-lifecycle.cjs +0 -125
  428. package/telegram-plugin/bin/telegram-direct-reply-policy.cjs +0 -48
  429. package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +0 -122
  430. package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +0 -186
  431. package/telegram-plugin/bin/telegram-remote-status-policy.cjs +0 -121
  432. package/telegram-plugin/bin/telegram-reply-parts.cjs +0 -149
  433. package/telegram-plugin/bin/telegram-text-chunk-policy.cjs +0 -63
  434. package/telegram-plugin/bin/telegram-typing-keepalive.cjs +0 -89
  435. package/telegram-plugin/compat/mcp-server-fa511cd1.mjs +0 -73825
  436. /package/{bin → scripts}/fix-node-pty-perms.js +0 -0
@@ -1,13 +0,0 @@
1
- 'use strict';
2
-
3
- async function persistRetrySchedule(input = {}) {
4
- const { dispatchRetrying, flush, event, signal } = input;
5
- if (typeof dispatchRetrying !== 'function') throw new TypeError('persistRetrySchedule requires dispatchRetrying');
6
- if (typeof flush !== 'function') throw new TypeError('persistRetrySchedule requires flush');
7
- signal?.throwIfAborted?.();
8
- await dispatchRetrying(event);
9
- await flush();
10
- signal?.throwIfAborted?.();
11
- }
12
-
13
- module.exports = { persistRetrySchedule };
@@ -1,144 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('node:fs');
4
- const os = require('node:os');
5
- const path = require('node:path');
6
-
7
- const DEFAULT_MAX_BYTES = 1024 * 1024;
8
- const DEFAULT_RETAIN_BYTES = 512 * 1024;
9
- const MAX_MESSAGE_CHARS = 2048;
10
- const MAX_STACK_CHARS = 8192;
11
- const MAX_DETAIL_CHARS = 2048;
12
-
13
- function runtimeExitLedgerPath(homeDir) {
14
- return path.join(homeDir, 'diagnostics', 'runtime-exits.jsonl');
15
- }
16
-
17
- function replaceAllLiteral(value, needle, replacement) {
18
- if (!needle) return value;
19
- const lowerValue = process.platform === 'win32' ? value.toLowerCase() : value;
20
- const lowerNeedle = process.platform === 'win32' ? needle.toLowerCase() : needle;
21
- let result = '';
22
- let cursor = 0;
23
- for (;;) {
24
- const index = lowerValue.indexOf(lowerNeedle, cursor);
25
- if (index === -1) return `${result}${value.slice(cursor)}`;
26
- result += `${value.slice(cursor, index)}${replacement}`;
27
- cursor = index + needle.length;
28
- }
29
- }
30
-
31
- function sanitizeExitText(input, maxChars = MAX_DETAIL_CHARS) {
32
- let value = String(input ?? '');
33
- const homes = new Set([
34
- os.homedir(),
35
- process.env.USERPROFILE,
36
- process.env.HOME,
37
- ].filter((entry) => typeof entry === 'string' && entry.length > 2));
38
- for (const home of homes) {
39
- value = replaceAllLiteral(value, path.normalize(home), '$HOME');
40
- value = replaceAllLiteral(value, home.replaceAll('\\', '/'), '$HOME');
41
- }
42
- value = value
43
- .replace(/[A-Za-z]:\\Users\\[^\\\s"']+/giu, '$HOME')
44
- .replace(/\/home\/[^/\s"']+/gu, '$HOME')
45
- .replace(/(Authorization\s*:\s*Bearer\s+)[^\s,;]+/giu, '$1<redacted>')
46
- .replace(/\bsk-[A-Za-z0-9_-]{10,}\b/gu, '<redacted>')
47
- .replace(/\b\d{6,}:[A-Za-z0-9_-]{20,}\b/gu, '<redacted>')
48
- .replace(/((?:api[_-]?key|access[_-]?token|refresh[_-]?token|token|secret|password)\s*[=:]\s*)[^\s,;}]+/giu, '$1<redacted>')
49
- .replace(/(https?:\/\/[^\s/:@]+:)[^\s/@]+@/giu, '$1<redacted>@');
50
- return value.length <= maxChars ? value : `${value.slice(0, maxChars)}...[truncated]`;
51
- }
52
-
53
- function normalizedError(error) {
54
- if (error === undefined || error === null) return undefined;
55
- if (error instanceof Error) {
56
- return {
57
- name: sanitizeExitText(error.name || error.constructor?.name || 'Error', 160),
58
- message: sanitizeExitText(error.message || String(error), MAX_MESSAGE_CHARS),
59
- stack: sanitizeExitText(error.stack || '', MAX_STACK_CHARS),
60
- };
61
- }
62
- return {
63
- name: typeof error === 'object' && typeof error.name === 'string'
64
- ? sanitizeExitText(error.name, 160)
65
- : 'NonErrorRejection',
66
- message: sanitizeExitText(error, MAX_MESSAGE_CHARS),
67
- };
68
- }
69
-
70
- function finiteInteger(value) {
71
- return Number.isInteger(value) ? value : undefined;
72
- }
73
-
74
- function buildRuntimeExitRecord(input) {
75
- const now = typeof input.now === 'function' ? input.now() : new Date();
76
- const record = {
77
- schemaVersion: 1,
78
- ts: (now instanceof Date ? now : new Date(now)).toISOString(),
79
- source: sanitizeExitText(input.source || 'unknown', 80),
80
- kind: sanitizeExitText(input.kind || 'unknown', 120),
81
- exitCode: finiteInteger(input.exitCode),
82
- signal: input.signal ? sanitizeExitText(input.signal, 40) : undefined,
83
- phase: input.phase ? sanitizeExitText(input.phase, 80) : undefined,
84
- cliVersion: input.cliVersion ? sanitizeExitText(input.cliVersion, 80) : undefined,
85
- profile: input.profile ? sanitizeExitText(input.profile, 120) : undefined,
86
- sessionId: input.sessionId ? sanitizeExitText(input.sessionId, 240) : undefined,
87
- lastTool: input.lastTool ? sanitizeExitText(input.lastTool, 240) : undefined,
88
- pid: finiteInteger(input.pid ?? process.pid),
89
- ppid: finiteInteger(input.ppid ?? process.ppid),
90
- childPid: finiteInteger(input.childPid),
91
- loaded: typeof input.loaded === 'boolean' ? input.loaded : undefined,
92
- detail: input.detail ? sanitizeExitText(input.detail, MAX_DETAIL_CHARS) : undefined,
93
- error: normalizedError(input.error),
94
- };
95
- return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined && value !== ''));
96
- }
97
-
98
- function trimLedger(filePath, maxBytes, retainBytes, incomingBytes) {
99
- let size;
100
- try {
101
- size = fs.statSync(filePath).size;
102
- } catch {
103
- return;
104
- }
105
- if (size + incomingBytes <= maxBytes) return;
106
- const contents = fs.readFileSync(filePath);
107
- const keepFrom = Math.max(0, contents.length - Math.min(retainBytes, maxBytes - incomingBytes));
108
- let lineStart = keepFrom;
109
- if (lineStart > 0) {
110
- const nextNewline = contents.indexOf(0x0a, lineStart);
111
- lineStart = nextNewline === -1 ? contents.length : nextNewline + 1;
112
- }
113
- fs.writeFileSync(filePath, contents.subarray(lineStart), { mode: 0o600 });
114
- }
115
-
116
- function recordRuntimeExit(input = {}) {
117
- try {
118
- const homeDir = typeof input.homeDir === 'string' ? input.homeDir.trim() : '';
119
- if (!homeDir) return false;
120
- const filePath = runtimeExitLedgerPath(homeDir);
121
- fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
122
- const line = `${JSON.stringify(buildRuntimeExitRecord(input))}\n`;
123
- const incomingBytes = Buffer.byteLength(line);
124
- const maxBytes = Math.max(1024, finiteInteger(input.maxBytes) ?? DEFAULT_MAX_BYTES);
125
- const retainBytes = Math.max(0, finiteInteger(input.retainBytes) ?? DEFAULT_RETAIN_BYTES);
126
- trimLedger(filePath, maxBytes, retainBytes, incomingBytes);
127
- fs.appendFileSync(filePath, line, { encoding: 'utf8', mode: 0o600 });
128
- try {
129
- fs.chmodSync(filePath, 0o600);
130
- } catch {}
131
- return true;
132
- } catch {
133
- return false;
134
- }
135
- }
136
-
137
- module.exports = {
138
- DEFAULT_MAX_BYTES,
139
- DEFAULT_RETAIN_BYTES,
140
- buildRuntimeExitRecord,
141
- recordRuntimeExit,
142
- runtimeExitLedgerPath,
143
- sanitizeExitText,
144
- };
@@ -1,358 +0,0 @@
1
- 'use strict';
2
-
3
- const crypto = require('node:crypto');
4
- const path = require('node:path');
5
-
6
- const MAX_ALLOWED_TOOLS = 64;
7
- const MAX_TOOL_NAME_BYTES = 160;
8
- const MAX_RECEIPT_TOOL_NAMES = 64;
9
- const MAX_RECEIPT_OUTPUTS = 32;
10
- const MAX_LIST_LIMIT = 100;
11
- const TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled', 'lost']);
12
- const ALL_STATUSES = new Set(['buffered', 'running', ...TERMINAL_STATUSES]);
13
- const TRANSITIONS = new Map([
14
- ['buffered', new Set(['running', 'failed', 'cancelled', 'lost'])],
15
- ['running', new Set(['completed', 'failed', 'cancelled', 'lost'])],
16
- ]);
17
- const ERROR_CATEGORIES = new Set(['executor', 'provider', 'policy', 'unknown']);
18
-
19
- class ScopedCronRunError extends TypeError {
20
- constructor(code, message) {
21
- super(message);
22
- this.name = 'ScopedCronRunError';
23
- this.code = code;
24
- }
25
- }
26
-
27
- function fail(code, message) {
28
- throw new ScopedCronRunError(code, message);
29
- }
30
-
31
- function clone(value) {
32
- return JSON.parse(JSON.stringify(value));
33
- }
34
-
35
- function deepFreeze(value) {
36
- if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value;
37
- for (const child of Object.values(value)) deepFreeze(child);
38
- return Object.freeze(value);
39
- }
40
-
41
- function assertOpaqueId(value, field) {
42
- if (typeof value !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u.test(value)) {
43
- fail('CRON_RUN_INVALID_ID', `${field} must be a bounded opaque identifier`);
44
- }
45
- return value;
46
- }
47
-
48
- function canonicalToolName(value, field) {
49
- if (
50
- typeof value !== 'string'
51
- || value.length === 0
52
- || Buffer.byteLength(value, 'utf8') > MAX_TOOL_NAME_BYTES
53
- || /[*?[\]{}]/u.test(value)
54
- || !/^[A-Za-z0-9][A-Za-z0-9._:/-]*$/u.test(value)
55
- ) {
56
- fail('CRON_SCOPE_INVALID_TOOL', `${field} must be an exact canonical tool name`);
57
- }
58
- return value;
59
- }
60
-
61
- function canonicalToolNames(tools, field = 'tools') {
62
- if (!Array.isArray(tools)) fail('CRON_SCOPE_INVALID_CATALOG', `${field} must be an array`);
63
- const names = tools.map((entry) => canonicalToolName(
64
- typeof entry === 'string' ? entry : entry && entry.name,
65
- field,
66
- ));
67
- return [...new Set(names)];
68
- }
69
-
70
- function cronToolScopeDigest(names) {
71
- return `sha256:${crypto.createHash('sha256').update(JSON.stringify(names)).digest('hex')}`;
72
- }
73
-
74
- function normalizeCronAllowedTools(input, effectiveTools) {
75
- if (input === undefined) return Object.freeze({mode: 'legacy', names: null, digest: null});
76
- if (!Array.isArray(input)) fail('CRON_SCOPE_NOT_ARRAY', 'allowed_tools must be an array');
77
- if (input.length > MAX_ALLOWED_TOOLS) {
78
- fail('CRON_SCOPE_TOO_MANY_TOOLS', `allowed_tools supports at most ${MAX_ALLOWED_TOOLS} entries`);
79
- }
80
- const catalog = new Set(canonicalToolNames(effectiveTools, 'effective tools'));
81
- const names = [];
82
- const seen = new Set();
83
- for (const rawName of input) {
84
- const name = canonicalToolName(rawName, 'allowed_tools entry');
85
- if (!catalog.has(name)) fail('CRON_SCOPE_UNKNOWN_TOOL', `Unknown current tool: ${name}`);
86
- if (seen.has(name)) continue;
87
- seen.add(name);
88
- names.push(name);
89
- }
90
- return deepFreeze({mode: 'scoped', names, digest: cronToolScopeDigest(names)});
91
- }
92
-
93
- function cronToolScopeForTask(task) {
94
- if (!task || task.allowedTools === undefined) {
95
- return Object.freeze({mode: 'legacy', names: null, digest: null});
96
- }
97
- if (!Array.isArray(task.allowedTools)) fail('CRON_SCOPE_INVALID_TASK', 'Persisted allowedTools must be an array');
98
- const names = canonicalToolNames(task.allowedTools, 'persisted allowedTools');
99
- const digest = cronToolScopeDigest(names);
100
- if (task.toolScopeDigest !== digest) fail('CRON_SCOPE_DIGEST_MISMATCH', 'Persisted tool scope digest does not match');
101
- return deepFreeze({mode: 'scoped', names, digest});
102
- }
103
-
104
- function isCronToolScope(value) {
105
- if (!value || value.mode !== 'scoped' || !Array.isArray(value.names)) return false;
106
- try {
107
- const names = canonicalToolNames(value.names, 'tool scope');
108
- return names.length === value.names.length && value.digest === cronToolScopeDigest(names);
109
- } catch {
110
- return false;
111
- }
112
- }
113
-
114
- function filterToolsForCronScope(tools, scope) {
115
- if (!Array.isArray(tools)) fail('CRON_SCOPE_INVALID_CATALOG', 'tools must be an array');
116
- if (!scope || scope.mode === 'legacy') return tools;
117
- if (!isCronToolScope(scope)) fail('CRON_SCOPE_INVALID_ORIGIN', 'Invalid cron tool scope');
118
- const allowed = new Set(scope.names);
119
- return tools.filter((tool) => tool && allowed.has(tool.name));
120
- }
121
-
122
- function inheritedCronToolScope(parentScope) {
123
- if (!parentScope || parentScope.mode === 'legacy') return undefined;
124
- if (!isCronToolScope(parentScope)) fail('CRON_SCOPE_INVALID_ORIGIN', 'Invalid inherited cron tool scope');
125
- return deepFreeze({mode: 'scoped', names: [...parentScope.names], digest: parentScope.digest});
126
- }
127
-
128
- function isoTimestamp(value, field) {
129
- if (typeof value !== 'string' || !Number.isFinite(Date.parse(value))) {
130
- fail('CRON_RUN_INVALID_TIME', `${field} must be an ISO timestamp`);
131
- }
132
- return value;
133
- }
134
-
135
- function createCronRunReceipt(input) {
136
- const digest = input.toolScopeDigest;
137
- if (digest !== null && (typeof digest !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(digest))) {
138
- fail('CRON_RUN_INVALID_DIGEST', 'toolScopeDigest is invalid');
139
- }
140
- if (!Number.isSafeInteger(input.coalescedCount) || input.coalescedCount < 1) {
141
- fail('CRON_RUN_INVALID_COALESCE', 'coalescedCount must be a positive integer');
142
- }
143
- return deepFreeze({
144
- runId: assertOpaqueId(input.runId, 'runId'),
145
- jobId: assertOpaqueId(input.jobId, 'jobId'),
146
- jobDeleted: false,
147
- cron: String(input.cron),
148
- recurring: input.recurring === true,
149
- stale: input.stale === true,
150
- coalescedCount: input.coalescedCount,
151
- toolScopeDigest: digest,
152
- status: 'buffered',
153
- firedAt: isoTimestamp(input.firedAt, 'firedAt'),
154
- startedAt: null,
155
- endedAt: null,
156
- turnId: null,
157
- toolSummary: {calls: 0, errors: 0, names: [], excessNames: 0},
158
- outputs: [],
159
- finalMessageRef: null,
160
- });
161
- }
162
-
163
- function summarizeCronToolCalls(toolCalls) {
164
- if (!Array.isArray(toolCalls)) fail('CRON_RUN_INVALID_TOOLS', 'toolCalls must be an array');
165
- const names = new Set();
166
- let errors = 0;
167
- for (const call of toolCalls) {
168
- canonicalToolName(call && call.name, 'tool call name');
169
- names.add(call.name);
170
- if (call.isError === true) errors += 1;
171
- }
172
- const sorted = [...names].sort((left, right) => left.localeCompare(right));
173
- return deepFreeze({
174
- calls: toolCalls.length,
175
- errors,
176
- names: sorted.slice(0, MAX_RECEIPT_TOOL_NAMES),
177
- excessNames: Math.max(0, sorted.length - MAX_RECEIPT_TOOL_NAMES),
178
- });
179
- }
180
-
181
- function normalizeRelativeFilePath(value) {
182
- if (typeof value !== 'string' || value.length === 0 || value.includes('\0')) return null;
183
- const normalized = value.replaceAll('\\', '/');
184
- if (normalized.startsWith('/') || /^[A-Za-z]:\//u.test(normalized) || normalized.startsWith('//')) return null;
185
- const posix = path.posix.normalize(normalized);
186
- if (posix === '.' || posix === '..' || posix.startsWith('../')) return null;
187
- return posix;
188
- }
189
-
190
- function rootRelativeFile(absolutePath, root, rootRef, pathApi) {
191
- const relative = pathApi.relative(pathApi.resolve(root), pathApi.resolve(absolutePath));
192
- if (relative === '' || relative === '..' || relative.startsWith(`..${pathApi.sep}`) || pathApi.isAbsolute(relative)) return null;
193
- const relativePath = normalizeRelativeFilePath(relative);
194
- return relativePath === null ? null : {rootRef, relativePath};
195
- }
196
-
197
- function buildCronFileCandidate({toolName, toolCallId, display, workspaceRoot, additionalRoots = [], pathExists}) {
198
- if (!['Write', 'Edit'].includes(toolName)) return null;
199
- if (!display || display.kind !== 'file_io' || typeof display.path !== 'string') return null;
200
- assertOpaqueId(toolCallId, 'toolCallId');
201
- const pathApi = process.platform === 'win32' || /^[A-Za-z]:[\\/]/u.test(display.path) ? path.win32 : path;
202
- let located = rootRelativeFile(display.path, workspaceRoot, 'root:workspace', pathApi);
203
- if (located === null) {
204
- for (let index = 0; index < additionalRoots.length; index += 1) {
205
- located = rootRelativeFile(display.path, additionalRoots[index], `root:additional:${String(index + 1)}`, pathApi);
206
- if (located !== null) break;
207
- }
208
- }
209
- if (located === null) return null;
210
- return deepFreeze({
211
- ...located,
212
- change: toolName === 'Edit' || pathExists === true ? 'modified' : 'created',
213
- toolCallId,
214
- kind: 'file',
215
- });
216
- }
217
-
218
- function normalizeCronOutputs(outputs) {
219
- if (!Array.isArray(outputs)) fail('CRON_RUN_INVALID_OUTPUTS', 'outputs must be an array');
220
- const safe = [];
221
- for (const output of outputs) {
222
- if (safe.length >= MAX_RECEIPT_OUTPUTS) break;
223
- if (!output || output.kind !== 'file') continue;
224
- if (!/^root:(workspace|additional:[1-9][0-9]*)$/u.test(output.rootRef)) continue;
225
- const relativePath = normalizeRelativeFilePath(output.relativePath);
226
- if (relativePath === null || !['created', 'modified'].includes(output.change)) continue;
227
- safe.push({
228
- rootRef: output.rootRef,
229
- relativePath,
230
- change: output.change,
231
- toolCallId: assertOpaqueId(output.toolCallId, 'toolCallId'),
232
- kind: 'file',
233
- });
234
- }
235
- return deepFreeze(safe);
236
- }
237
-
238
- function safeCronRunError(status, error) {
239
- if (status !== 'failed') return undefined;
240
- const category = error && ERROR_CATEGORIES.has(error.category) ? error.category : 'unknown';
241
- const rawCode = error && typeof error.code === 'string' ? error.code : 'unspecified';
242
- const code = /^[A-Za-z0-9._-]{1,64}$/u.test(rawCode) ? rawCode : 'redacted';
243
- return {category, code};
244
- }
245
-
246
- function transitionCronRunReceipt(receipt, status, details = {}) {
247
- const allowed = receipt && TRANSITIONS.get(receipt.status);
248
- if (!allowed || !allowed.has(status)) {
249
- fail('CRON_RUN_INVALID_TRANSITION', `Invalid cron run transition: ${String(receipt && receipt.status)} -> ${status}`);
250
- }
251
- if (status === 'running') {
252
- if (!Number.isSafeInteger(details.turnId) || details.turnId < 0) {
253
- fail('CRON_RUN_INVALID_TURN', 'turnId must be a non-negative integer');
254
- }
255
- return deepFreeze({
256
- ...clone(receipt),
257
- status,
258
- startedAt: isoTimestamp(details.startedAt, 'startedAt'),
259
- turnId: details.turnId,
260
- });
261
- }
262
- const terminal = {
263
- ...clone(receipt),
264
- status,
265
- endedAt: isoTimestamp(details.endedAt, 'endedAt'),
266
- toolSummary: summarizeCronToolCalls(details.toolCalls || []),
267
- outputs: normalizeCronOutputs(details.outputs || []),
268
- finalMessageRef: typeof details.finalStepId === 'string' && details.finalStepId.length > 0
269
- ? {stepId: assertOpaqueId(details.finalStepId, 'finalStepId')}
270
- : null,
271
- };
272
- const error = safeCronRunError(status, details.error);
273
- if (error !== undefined) terminal.error = error;
274
- return deepFreeze(terminal);
275
- }
276
-
277
- function markCronJobDeleted(receipt) {
278
- return deepFreeze({...clone(receipt), jobDeleted: true});
279
- }
280
-
281
- function isValidCronRunReceipt(value) {
282
- if (!value || typeof value !== 'object') return false;
283
- try {
284
- assertOpaqueId(value.runId, 'runId');
285
- assertOpaqueId(value.jobId, 'jobId');
286
- isoTimestamp(value.firedAt, 'firedAt');
287
- if (!ALL_STATUSES.has(value.status)) return false;
288
- if (!Array.isArray(value.outputs) || !value.toolSummary || typeof value.toolSummary.calls !== 'number') return false;
289
- if (value.status === 'running' && (!Number.isSafeInteger(value.turnId) || value.startedAt === null)) return false;
290
- if (TERMINAL_STATUSES.has(value.status) && value.endedAt === null) return false;
291
- return assertCronRunReceiptPrivacy(value);
292
- } catch {
293
- return false;
294
- }
295
- }
296
-
297
- function publicCronRunList(receipts, {jobId, status, limit = 20} = {}) {
298
- if (!Array.isArray(receipts)) fail('CRON_RUN_INVALID_LIST', 'receipts must be an array');
299
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_LIST_LIMIT) {
300
- fail('CRON_RUN_INVALID_LIMIT', `limit must be between 1 and ${MAX_LIST_LIMIT}`);
301
- }
302
- if (status !== undefined && !ALL_STATUSES.has(status)) fail('CRON_RUN_INVALID_STATUS', 'Unknown cron run status');
303
- return receipts
304
- .filter((receipt) => jobId === undefined || receipt.jobId === jobId)
305
- .filter((receipt) => status === undefined || receipt.status === status)
306
- .sort((left, right) => Date.parse(right.firedAt) - Date.parse(left.firedAt))
307
- .slice(0, limit)
308
- .map((receipt) => ({
309
- runId: receipt.runId,
310
- jobId: receipt.jobId,
311
- status: receipt.status,
312
- firedAt: receipt.firedAt,
313
- startedAt: receipt.startedAt,
314
- endedAt: receipt.endedAt,
315
- coalescedCount: receipt.coalescedCount,
316
- toolCalls: receipt.toolSummary.calls,
317
- toolErrors: receipt.toolSummary.errors,
318
- outputCount: receipt.outputs.length,
319
- finalMessageAvailable: receipt.finalMessageRef !== null,
320
- }));
321
- }
322
-
323
- function assertCronRunReceiptPrivacy(receipt, canaries = []) {
324
- const serialized = JSON.stringify(receipt);
325
- const forbidden = ['thoughts', 'reasoning', 'prompt', 'arguments', 'results', 'headers', 'approvalFeedback', 'rawError'];
326
- for (const key of forbidden) {
327
- if (new RegExp(`"${key}"\\s*:`, 'u').test(serialized)) {
328
- fail('CRON_RUN_PRIVATE_FIELD', `Forbidden cron receipt field: ${key}`);
329
- }
330
- }
331
- for (const canary of canaries) {
332
- if (typeof canary === 'string' && canary.length > 0 && serialized.includes(canary)) {
333
- fail('CRON_RUN_SECRET_LEAK', 'Cron receipt contains a secret canary');
334
- }
335
- }
336
- return true;
337
- }
338
-
339
- module.exports = {
340
- MAX_ALLOWED_TOOLS,
341
- MAX_LIST_LIMIT,
342
- MAX_RECEIPT_OUTPUTS,
343
- ScopedCronRunError,
344
- assertCronRunReceiptPrivacy,
345
- buildCronFileCandidate,
346
- createCronRunReceipt,
347
- cronToolScopeDigest,
348
- cronToolScopeForTask,
349
- filterToolsForCronScope,
350
- inheritedCronToolScope,
351
- isCronToolScope,
352
- isValidCronRunReceipt,
353
- markCronJobDeleted,
354
- normalizeCronAllowedTools,
355
- publicCronRunList,
356
- summarizeCronToolCalls,
357
- transitionCronRunReceipt,
358
- };
@@ -1,25 +0,0 @@
1
- 'use strict';
2
-
3
- const TOOL_ABORTED_BEFORE_DISPATCH = 'TOOL_ABORTED_BEFORE_DISPATCH';
4
-
5
- async function checkpointBeforeExternalSideEffect(options = {}) {
6
- const flush = options.flush;
7
- const signal = options.signal;
8
- if (typeof flush !== 'function') {
9
- throw new TypeError('checkpointBeforeExternalSideEffect requires flush');
10
- }
11
- await flush();
12
- if (signal?.aborted === true) {
13
- return {
14
- allowed: false,
15
- code: TOOL_ABORTED_BEFORE_DISPATCH,
16
- error: 'Tool call aborted before dispatch while its durable checkpoint was being written.',
17
- };
18
- }
19
- return { allowed: true };
20
- }
21
-
22
- module.exports = {
23
- TOOL_ABORTED_BEFORE_DISPATCH,
24
- checkpointBeforeExternalSideEffect,
25
- };
@@ -1,84 +0,0 @@
1
- 'use strict';
2
-
3
- const MAX_SESSION_COMPACTION_FAILURES = 2;
4
- const CRON_COALESCE_WARNING_THRESHOLD = 3;
5
- const COMPACTION_RECOVERY_PROMPT_TIMEOUT_MS = 30_000;
6
- const DEFERRED_ACTIVE_SLASH_COMMANDS = new Set(['/clear', '/reload']);
7
-
8
- function boundedCount(value) {
9
- return Number.isSafeInteger(value) ? Math.max(0, value) : 0;
10
- }
11
-
12
- function slashCommandDeliveryMode(text, activeTurn = false) {
13
- if (typeof text !== 'string') return 'normal';
14
- const trimmed = text.trimStart();
15
- if (!trimmed.startsWith('/')) return 'normal';
16
- const command = trimmed.split(/\s+/u, 1)[0].toLowerCase();
17
- return activeTurn && DEFERRED_ACTIVE_SLASH_COMMANDS.has(command) ? 'deferred' : 'immediate';
18
- }
19
-
20
- function compactionFailureReason(error) {
21
- const value = error && typeof error === 'object' ? error : {};
22
- const details = value.details && typeof value.details === 'object' ? value.details : {};
23
- const declared = String(details.reason ?? '');
24
- const code = String(value.code ?? '');
25
- const message = error instanceof Error ? error.message : String(error ?? '');
26
- if (code === 'compaction.stalled' || declared === 'no_provider_data') return 'provider_stall';
27
- if (declared === 'no_reduction' || /did not reduce/u.test(message)) return 'no_reduction';
28
- if (details.statusCode === 402 || details.action === 'switch_model_and_retry') return 'provider_rejected';
29
- return 'other';
30
- }
31
-
32
- function recordCompactionFailure(previousCount, error) {
33
- const failures = boundedCount(previousCount) + 1;
34
- const stopped = failures >= MAX_SESSION_COMPACTION_FAILURES;
35
- const cause = error instanceof Error ? error.message : String(error || 'unknown failure');
36
- return {
37
- failures,
38
- stopped,
39
- reason: compactionFailureReason(error),
40
- cause,
41
- action: stopped ? 'Start a fresh session after saving any pending work.' : 'Retry compaction once.',
42
- };
43
- }
44
-
45
- function resetCompactionFailures() {
46
- return { failures: 0, stopped: false, reason: null, cause: null, action: null };
47
- }
48
-
49
- function pendingHistoryLimit(pendingTokens, maxContextTokens) {
50
- const pending = Number.isFinite(pendingTokens) ? Math.max(0, Math.floor(pendingTokens)) : 0;
51
- const maximum = Number.isFinite(maxContextTokens) ? Math.max(0, Math.floor(maxContextTokens)) : 0;
52
- return {
53
- pendingTokens: pending,
54
- maxContextTokens: maximum,
55
- exceeded: maximum > 0 && pending >= maximum,
56
- };
57
- }
58
-
59
- function cronCompactionDecision(input = {}) {
60
- const coalescedCount = Math.max(1, boundedCount(input.coalescedCount));
61
- const history = pendingHistoryLimit(input.pendingTokens, input.maxContextTokens);
62
- const stopped = input.sessionStopped === true || history.exceeded;
63
- const warning = coalescedCount > CRON_COALESCE_WARNING_THRESHOLD
64
- ? `Cron warning: ${coalescedCount} scheduled runs were coalesced. Check the session before continuing.`
65
- : null;
66
- const reason = input.sessionStopped === true
67
- ? 'Cron stopped because compaction failed twice in this session. Start a fresh session after saving pending work.'
68
- : history.exceeded
69
- ? `Cron stopped because pending history reached the ${history.maxContextTokens} token context limit. Start a fresh session after saving pending work.`
70
- : null;
71
- return { allow: !stopped, stopped, warning, reason, history, coalescedCount };
72
- }
73
-
74
- module.exports = {
75
- COMPACTION_RECOVERY_PROMPT_TIMEOUT_MS,
76
- CRON_COALESCE_WARNING_THRESHOLD,
77
- MAX_SESSION_COMPACTION_FAILURES,
78
- compactionFailureReason,
79
- cronCompactionDecision,
80
- pendingHistoryLimit,
81
- recordCompactionFailure,
82
- resetCompactionFailures,
83
- slashCommandDeliveryMode,
84
- };
@@ -1,20 +0,0 @@
1
- 'use strict';
2
-
3
- const SESSION_REPLAY_BATCH_RECORDS = 30;
4
-
5
- function shouldYieldSessionReplay(renderedRecords, totalRecords) {
6
- if (!Number.isSafeInteger(renderedRecords) || renderedRecords < 1) return false;
7
- if (!Number.isSafeInteger(totalRecords) || totalRecords < 1) return false;
8
- return renderedRecords < totalRecords
9
- && renderedRecords % SESSION_REPLAY_BATCH_RECORDS === 0;
10
- }
11
-
12
- function yieldSessionReplayControl(schedule = setImmediate) {
13
- return new Promise((resolve) => schedule(resolve));
14
- }
15
-
16
- module.exports = {
17
- SESSION_REPLAY_BATCH_RECORDS,
18
- shouldYieldSessionReplay,
19
- yieldSessionReplayControl,
20
- };
@@ -1,40 +0,0 @@
1
- 'use strict';
2
-
3
- function replayWindowStartIndex(records, activeTurnCount, startsTurn) {
4
- if (
5
- !Array.isArray(records)
6
- || !Number.isSafeInteger(activeTurnCount)
7
- || activeTurnCount <= 0
8
- || typeof startsTurn !== 'function'
9
- ) {
10
- return 0;
11
- }
12
-
13
- let remainingTurns = activeTurnCount;
14
- for (let index = records.length - 1; index >= 0; index -= 1) {
15
- if (!startsTurn(records[index])) continue;
16
- remainingTurns -= 1;
17
- if (remainingTurns === 0) return index;
18
- }
19
- return 0;
20
- }
21
-
22
- function resolveReplayActiveTurnCount(options = {}) {
23
- const savedActiveTurnCount = options.activeTurnCount;
24
- if (
25
- options.loadedExisting === true
26
- && Number.isSafeInteger(options.totalLines)
27
- && options.totalLines > 0
28
- && Number.isSafeInteger(savedActiveTurnCount)
29
- && savedActiveTurnCount > 0
30
- ) {
31
- return savedActiveTurnCount;
32
- }
33
-
34
- const fallbackTurnCount = options.fallbackTurnCount;
35
- return Number.isSafeInteger(fallbackTurnCount) && fallbackTurnCount > 0
36
- ? fallbackTurnCount
37
- : undefined;
38
- }
39
-
40
- module.exports = { replayWindowStartIndex, resolveReplayActiveTurnCount };