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,107 +0,0 @@
1
- 'use strict';
2
-
3
- const path = require('node:path');
4
- const { isDeepStrictEqual } = require('node:util');
5
- const providerId = 'managed:blun';
6
- const serviceKeys = ['blunSearch', 'blunFetch', 'blunMedia'];
7
- const writers = new Map();
8
- const jsonCopy = (value) => JSON.parse(JSON.stringify(value));
9
- const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
10
-
11
- function providerModelRefreshSnapshot(config) {
12
- return jsonCopy({
13
- provider: config.providers?.[providerId] ?? null,
14
- models: Object.fromEntries(Object.entries(config.models ?? {}).filter(([, model]) => model?.provider === providerId)),
15
- defaultModel: config.defaultModel ?? null,
16
- thinkingEnabled: config.thinking?.enabled ?? null,
17
- services: Object.fromEntries(serviceKeys.map((key) => [key, config.services?.[key] ?? null])),
18
- });
19
- }
20
-
21
- function exactKeys(value, keys) {
22
- return record(value) && isDeepStrictEqual(Object.keys(value).sort(), [...keys].sort());
23
- }
24
-
25
- function checkCredentials(value) {
26
- if (value?.oauth != null && (value.apiKey?.trim() || value.apiKeyFile?.trim())) {
27
- throw new Error('Provider refresh cannot combine OAuth and API key credentials.');
28
- }
29
- }
30
-
31
- function checkSnapshot(value) {
32
- if (!exactKeys(value, ['provider', 'models', 'defaultModel', 'thinkingEnabled', 'services']) ||
33
- !record(value.provider) || value.provider.type !== 'blun' || !record(value.models) ||
34
- !(value.defaultModel === null || typeof value.defaultModel === 'string') ||
35
- !(value.thinkingEnabled === null || typeof value.thinkingEnabled === 'boolean') ||
36
- !exactKeys(value.services, serviceKeys)) throw new Error('Invalid provider refresh snapshot.');
37
- checkCredentials(value.provider);
38
- for (const [alias, model] of Object.entries(value.models)) {
39
- if (['__proto__', 'prototype', 'constructor'].includes(alias) || !record(model) || model.provider !== providerId) {
40
- throw new Error('Provider refresh contains a foreign or invalid model alias.');
41
- }
42
- }
43
- for (const service of Object.values(value.services)) {
44
- if (service !== null && !record(service)) throw new Error('Invalid provider refresh service.');
45
- checkCredentials(service);
46
- }
47
- }
48
-
49
- function applyProviderModelRefresh(config, envelope) {
50
- if (!exactKeys(envelope, ['providerModelRefresh'])) throw new Error('Provider refresh cannot be combined with a config patch.');
51
- const request = envelope.providerModelRefresh;
52
- if (!exactKeys(request, ['version', 'before', 'after']) || request.version !== 1) throw new Error('Invalid provider refresh request.');
53
- const { before, after } = request;
54
- checkSnapshot(before);
55
- checkSnapshot(after);
56
- if (!Object.hasOwn(after.models, 'blun/king')) throw new Error('Provider refresh must retain the BLUN King model.');
57
- const current = providerModelRefreshSnapshot(config);
58
- if (!isDeepStrictEqual(current.provider, before.provider) || !isDeepStrictEqual(current.models, before.models)) {
59
- throw new Error('Provider or models changed during refresh; existing configuration retained.');
60
- }
61
- const next = structuredClone(config);
62
- next.providers[providerId] = jsonCopy(after.provider);
63
- next.models ??= {};
64
- // The TOML writer otherwise revives omitted fields from these old raw tables.
65
- if (record(next.raw?.providers)) delete next.raw.providers[providerId];
66
- for (const alias of new Set([...Object.keys(current.models), ...Object.keys(after.models)])) {
67
- const existing = next.models[alias];
68
- if (existing !== undefined && existing.provider !== providerId) throw new Error('Provider refresh conflicts with another provider model.');
69
- delete next.models[alias];
70
- if (record(next.raw?.models)) delete next.raw.models[alias];
71
- }
72
- Object.assign(next.models, jsonCopy(after.models));
73
- if (current.defaultModel === before.defaultModel) {
74
- if (after.defaultModel === null) delete next.defaultModel;
75
- else next.defaultModel = after.defaultModel;
76
- }
77
- if (next.defaultModel !== undefined && !Object.hasOwn(next.models, next.defaultModel)) throw new Error('Provider refresh would invalidate the selected default model.');
78
- if (current.defaultModel === before.defaultModel && current.thinkingEnabled === before.thinkingEnabled) {
79
- if (after.thinkingEnabled === null) {
80
- if (next.thinking) delete next.thinking.enabled;
81
- if (record(next.raw?.thinking)) delete next.raw.thinking.enabled;
82
- } else next.thinking = { ...next.thinking, enabled: after.thinkingEnabled };
83
- }
84
- for (const key of serviceKeys) {
85
- if (!isDeepStrictEqual(current.services[key], before.services[key])) continue;
86
- if (after.services[key] === null) {
87
- if (next.services) delete next.services[key];
88
- } else {
89
- next.services ??= {};
90
- next.services[key] = jsonCopy(after.services[key]);
91
- }
92
- }
93
- return next;
94
- }
95
-
96
- // Share one read-modify-write queue across Core instances using the same file.
97
- function withProviderConfigWrite(filePath, operation) {
98
- const resolved = path.resolve(filePath);
99
- const key = process.platform === 'win32' ? resolved.toLowerCase() : resolved;
100
- const run = (writers.get(key) ?? Promise.resolve()).then(operation);
101
- const tail = run.then(() => undefined, () => undefined);
102
- writers.set(key, tail);
103
- void tail.then(() => { if (writers.get(key) === tail) writers.delete(key); });
104
- return run;
105
- }
106
-
107
- module.exports = { providerModelRefreshSnapshot, applyProviderModelRefresh, withProviderConfigWrite };
@@ -1,47 +0,0 @@
1
- "use strict";
2
-
3
- const MAX_AUTOMATIC_RATE_LIMIT_RESUMES = 3;
4
- const MAX_EXPLICIT_RATE_LIMIT_RETRIES = 2;
5
- const RATE_LIMIT_RETRY_BASE_MS = 60_000;
6
- const RATE_LIMIT_COMPACTION_THRESHOLD_TOKENS = 64_000;
7
-
8
- function isImmediateGenerateRetryAllowed(statusCode) {
9
- return statusCode !== 429 && [500, 502, 503, 504].includes(statusCode);
10
- }
11
-
12
- function resolveTransportRetryBudget(configuredMaxRetries, statusCode, shouldRetryHeader) {
13
- if (!Number.isInteger(configuredMaxRetries) || configuredMaxRetries < 0) {
14
- throw new Error("configuredMaxRetries must be a non-negative integer.");
15
- }
16
- const explicitRetry = typeof shouldRetryHeader === "string"
17
- && shouldRetryHeader.trim().toLowerCase() === "true";
18
- if (statusCode !== 429 || !explicitRetry) return configuredMaxRetries;
19
- return Math.max(configuredMaxRetries, MAX_EXPLICIT_RATE_LIMIT_RETRIES);
20
- }
21
-
22
- function rateLimitRetryDelayMs(retryCount) {
23
- if (!Number.isInteger(retryCount) || retryCount < 1) {
24
- throw new Error("retryCount must be a positive integer.");
25
- }
26
- return RATE_LIMIT_RETRY_BASE_MS * (2 ** (retryCount - 1));
27
- }
28
-
29
- function shouldStopAutomaticRateLimitResume(retryCount) {
30
- return retryCount >= MAX_AUTOMATIC_RATE_LIMIT_RESUMES;
31
- }
32
-
33
- function shouldCompactBeforeRateLimitResume(estimatedRequestTokens) {
34
- return Number.isFinite(estimatedRequestTokens)
35
- && estimatedRequestTokens >= RATE_LIMIT_COMPACTION_THRESHOLD_TOKENS;
36
- }
37
-
38
- module.exports = {
39
- MAX_AUTOMATIC_RATE_LIMIT_RESUMES,
40
- MAX_EXPLICIT_RATE_LIMIT_RETRIES,
41
- RATE_LIMIT_RETRY_BASE_MS,
42
- isImmediateGenerateRetryAllowed,
43
- rateLimitRetryDelayMs,
44
- resolveTransportRetryBudget,
45
- shouldCompactBeforeRateLimitResume,
46
- shouldStopAutomaticRateLimitResume,
47
- };
@@ -1,32 +0,0 @@
1
- 'use strict';
2
-
3
- const MAX_READ_BATCH_REQUESTS = 12;
4
-
5
- function readBatchAllFailed(results) {
6
- return results.length === 0 || results.every((result) => result?.isError === true);
7
- }
8
-
9
- function renderReadBatchOutput(requests, results) {
10
- return requests.map((request, index) => {
11
- const result = results[index] ?? {
12
- isError: true,
13
- output: 'ReadBatch did not receive a result for this request.',
14
- };
15
- const range = [
16
- request.line_offset === undefined ? null : `line_offset=${String(request.line_offset)}`,
17
- request.n_lines === undefined ? null : `n_lines=${String(request.n_lines)}`,
18
- ].filter(Boolean);
19
- const rangeSuffix = range.length === 0 ? '' : ` [${range.join(', ')}]`;
20
- const status = result.isError === true ? 'error' : 'ok';
21
- return [
22
- `--- Read ${String(index + 1)}/${String(requests.length)}: ${JSON.stringify(request.path)}${rangeSuffix} (${status}) ---`,
23
- String(result.output ?? ''),
24
- ].join('\n');
25
- }).join('\n\n');
26
- }
27
-
28
- module.exports = {
29
- MAX_READ_BATCH_REQUESTS,
30
- readBatchAllFailed,
31
- renderReadBatchOutput,
32
- };
@@ -1,59 +0,0 @@
1
- "use strict";
2
-
3
- const READ_PRESSURE_RATIO = 0.75;
4
- const READ_PRESSURE_CHUNK_BYTES = 10 * 1024;
5
- const READ_PRESSURE_LINE_CAP = 1000;
6
- const READ_ESTIMATED_BYTES_PER_TOKEN = 4;
7
-
8
- function availableReadContextTokens(input = {}) {
9
- const contextTokens = Number(input.contextTokens);
10
- const maxContextTokens = Number(input.maxContextTokens);
11
- if (!Number.isFinite(contextTokens) || contextTokens < 0) return undefined;
12
- if (!Number.isFinite(maxContextTokens) || maxContextTokens <= 0) return undefined;
13
-
14
- const pressureTokens = Math.floor(maxContextTokens * READ_PRESSURE_RATIO);
15
- return Math.max(0, pressureTokens - contextTokens);
16
- }
17
-
18
- function readModelVisibleBytes(input = {}) {
19
- const availableTokens = availableReadContextTokens(input);
20
- if (availableTokens === undefined) return READ_PRESSURE_CHUNK_BYTES;
21
- const availableBytes = Math.min(
22
- Number.MAX_SAFE_INTEGER,
23
- availableTokens * READ_ESTIMATED_BYTES_PER_TOKEN,
24
- );
25
- return Math.max(READ_PRESSURE_CHUNK_BYTES, availableBytes);
26
- }
27
-
28
- function readModelVisibleLines(input = {}) {
29
- const availableTokens = availableReadContextTokens(input);
30
- if (availableTokens === undefined) return READ_PRESSURE_LINE_CAP;
31
- return Math.max(READ_PRESSURE_LINE_CAP, availableTokens);
32
- }
33
-
34
- function readContinuationNotice(input) {
35
- if (!Number.isSafeInteger(input.lineOffset) || input.lineOffset < 1) return undefined;
36
- let readLines;
37
- if (input?.maxBytesReached === true) {
38
- if (!Number.isSafeInteger(input.renderedLineCount) || input.renderedLineCount < 1) return undefined;
39
- readLines = input.renderedLineCount;
40
- } else if (input?.maxLinesReached === true) {
41
- if (!Number.isSafeInteger(input.effectiveLimit) || input.effectiveLimit < input.maxLines) return undefined;
42
- readLines = input.effectiveLimit;
43
- } else {
44
- return undefined;
45
- }
46
-
47
- const nextLineOffset = input.lineOffset + readLines;
48
- if (!Number.isSafeInteger(nextLineOffset)) return undefined;
49
- return `Continue reading with line_offset=${String(nextLineOffset)}. Do not assume you have reached the end of the file.`;
50
- }
51
-
52
- module.exports = {
53
- READ_PRESSURE_RATIO,
54
- READ_PRESSURE_CHUNK_BYTES,
55
- READ_PRESSURE_LINE_CAP,
56
- readModelVisibleBytes,
57
- readModelVisibleLines,
58
- readContinuationNotice,
59
- };
@@ -1,124 +0,0 @@
1
- 'use strict';
2
-
3
- const RECURRING_CRON_CONTEXT_MAX_MESSAGES = 24;
4
- const RECURRING_CRON_CONTEXT_MAX_CHARS = 48_000;
5
- const TRUNCATED_CONTEXT_MARKER = '\n[...context truncated...]';
6
-
7
- function recurringCronJobId(message) {
8
- if (message?.role !== 'user') return null;
9
- if (message.origin?.kind !== 'cron_job' || message.origin.recurring !== true) return null;
10
- const jobId = String(message.origin.jobId || '').trim();
11
- return jobId || null;
12
- }
13
-
14
- function messageTextChars(message) {
15
- if (!Array.isArray(message?.content)) return 0;
16
- return message.content.reduce((total, part) => (
17
- total + (part?.type === 'text' && typeof part.text === 'string' ? part.text.length : 0)
18
- ), 0);
19
- }
20
-
21
- function splitIntoUserSegments(messages) {
22
- const segments = [];
23
- let current = [];
24
- for (const message of messages) {
25
- if (message?.role === 'user' && current.length > 0) {
26
- segments.push(current);
27
- current = [];
28
- }
29
- current.push(message);
30
- }
31
- if (current.length > 0) segments.push(current);
32
- return segments;
33
- }
34
-
35
- function segmentTextChars(segment) {
36
- return segment.reduce((total, message) => total + messageTextChars(message), 0);
37
- }
38
-
39
- function isCompactionSummarySegment(segment) {
40
- return segment[0]?.role === 'user' && segment[0]?.origin?.kind === 'compaction_summary';
41
- }
42
-
43
- function isRecurringCronSegment(segment) {
44
- return recurringCronJobId(segment[0]) !== null;
45
- }
46
-
47
- function projectSegmentInstruction(segment, maxChars) {
48
- const message = segment[0];
49
- if (message?.role !== 'user' || !Array.isArray(message.content) || maxChars <= 0) return null;
50
- let remaining = maxChars;
51
- const content = [];
52
- for (const part of message.content) {
53
- if (part?.type !== 'text' || typeof part.text !== 'string' || remaining <= 0) continue;
54
- if (part.text.length <= remaining) {
55
- content.push(part);
56
- remaining -= part.text.length;
57
- continue;
58
- }
59
- const marker = remaining > TRUNCATED_CONTEXT_MARKER.length
60
- ? TRUNCATED_CONTEXT_MARKER
61
- : '';
62
- const text = `${part.text.slice(0, remaining - marker.length)}${marker}`;
63
- if (text.length > 0) content.push({ ...part, text });
64
- remaining = 0;
65
- }
66
- return content.length === 0 ? null : { ...message, content };
67
- }
68
-
69
- function projectRecurringCronHistory(history, jobId) {
70
- if (!Array.isArray(history) || history.length === 0) return history;
71
- const normalizedJobId = String(jobId || '').trim();
72
- if (!normalizedJobId) return history;
73
-
74
- let wakeupIndex = -1;
75
- for (let index = history.length - 1; index >= 0; index -= 1) {
76
- if (recurringCronJobId(history[index]) === normalizedJobId) {
77
- wakeupIndex = index;
78
- break;
79
- }
80
- }
81
- if (wakeupIndex < 0) return history;
82
-
83
- const currentSegment = history.slice(wakeupIndex);
84
- const priorSegments = splitIntoUserSegments(history.slice(0, wakeupIndex));
85
- const summaryIndex = priorSegments.findLastIndex(isCompactionSummarySegment);
86
- const summary = summaryIndex >= 0 ? priorSegments[summaryIndex] : [];
87
- const candidates = priorSegments.filter((segment, index) => (
88
- index !== summaryIndex && !isRecurringCronSegment(segment)
89
- ));
90
-
91
- const selected = [];
92
- let selectedMessages = summary.length + currentSegment.length;
93
- let selectedChars = segmentTextChars(summary) + segmentTextChars(currentSegment);
94
- for (let index = candidates.length - 1; index >= 0; index -= 1) {
95
- const segment = candidates[index];
96
- const nextMessages = selectedMessages + segment.length;
97
- const nextChars = selectedChars + segmentTextChars(segment);
98
- if (
99
- nextMessages > RECURRING_CRON_CONTEXT_MAX_MESSAGES
100
- || nextChars > RECURRING_CRON_CONTEXT_MAX_CHARS
101
- ) {
102
- if (selected.length === 0 && selectedMessages < RECURRING_CRON_CONTEXT_MAX_MESSAGES) {
103
- const instruction = projectSegmentInstruction(
104
- segment,
105
- RECURRING_CRON_CONTEXT_MAX_CHARS - selectedChars,
106
- );
107
- if (instruction !== null) selected.unshift([instruction]);
108
- }
109
- break;
110
- }
111
- selected.unshift(segment);
112
- selectedMessages = nextMessages;
113
- selectedChars = nextChars;
114
- }
115
-
116
- return [...summary, ...selected.flat(), ...currentSegment];
117
- }
118
-
119
- module.exports = {
120
- RECURRING_CRON_CONTEXT_MAX_CHARS,
121
- RECURRING_CRON_CONTEXT_MAX_MESSAGES,
122
- projectRecurringCronHistory,
123
- recurringCronJobId,
124
- };
@@ -1,143 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('node:fs');
4
- const path = require('node:path');
5
-
6
- const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
7
- const MAX_FILE_BYTES = 64 * 1024;
8
- const MAX_ENTRIES = 6;
9
- const MAX_RECENT_CONTEXT = 2;
10
- const MAX_TEXT_CHARS = 240;
11
- const LONG_GAP_MS = 7 * 24 * 60 * 60 * 1000;
12
- const ATTENTION_COOLDOWN_MS = 30 * 24 * 60 * 60 * 1000;
13
-
14
- function safeId(value) {
15
- const normalized = String(value ?? '').trim();
16
- return SAFE_ID_RE.test(normalized) ? normalized : '';
17
- }
18
-
19
- function isInside(root, target) {
20
- const relative = path.relative(root, target);
21
- return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
22
- }
23
-
24
- function trustedTimestamp(value) {
25
- const text = String(value ?? '').trim();
26
- return text && !Number.isNaN(Date.parse(text)) ? new Date(text).toISOString() : '';
27
- }
28
-
29
- function redactSecrets(value) {
30
- return String(value ?? '')
31
- .replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu, '[REDACTED]')
32
- .replace(/\b(?:token|password|passwort|secret|api[_ -]?key)\s*[:=]\s*\S+/giu, '$1=[REDACTED]')
33
- .replace(/[\u0000-\u001f\u007f]+/gu, ' ')
34
- .replace(/\s+/gu, ' ')
35
- .trim()
36
- .slice(0, MAX_TEXT_CHARS);
37
- }
38
-
39
- function readJson(root, target) {
40
- if (!isInside(root, target)) return undefined;
41
- try {
42
- const stat = fs.lstatSync(target);
43
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_FILE_BYTES) return undefined;
44
- const value = JSON.parse(fs.readFileSync(target, 'utf8'));
45
- return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
46
- } catch {
47
- return undefined;
48
- }
49
- }
50
-
51
- function writeJsonAtomic(root, target, value) {
52
- if (!isInside(root, target)) return false;
53
- const parent = path.dirname(target);
54
- let temporary;
55
- try {
56
- fs.mkdirSync(parent, { recursive: true });
57
- if (!isInside(root, fs.realpathSync(parent))) return false;
58
- if (fs.existsSync(target) && fs.lstatSync(target).isSymbolicLink()) return false;
59
- temporary = `${target}.tmp-${process.pid}-${Date.now()}`;
60
- fs.writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
61
- fs.renameSync(temporary, target);
62
- return true;
63
- } catch {
64
- if (temporary) {
65
- try { fs.unlinkSync(temporary); } catch {}
66
- }
67
- return false;
68
- }
69
- }
70
-
71
- function attentionForReturn({ root, agentId, actorId, previousAt, currentAt }) {
72
- if (!previousAt || Date.parse(currentAt) - Date.parse(previousAt) < LONG_GAP_MS) return undefined;
73
- const target = path.resolve(root, 'attention', `${actorId}.json`);
74
- const existing = readJson(root, target);
75
- const lastNoticeAt = trustedTimestamp(existing?.noticed_at);
76
- if (lastNoticeAt && Date.parse(currentAt) - Date.parse(lastNoticeAt) < ATTENTION_COOLDOWN_MS) return undefined;
77
- const attention = {
78
- status: 'noticed_on_return',
79
- subject_type: 'human',
80
- actor_id: actorId,
81
- responsible_agent: agentId,
82
- noticed_at: currentAt,
83
- previous_interaction_at: previousAt,
84
- message: 'A reliable long gap is visible in direct history. Acknowledge the return naturally only if it fits after the current task.',
85
- };
86
- return writeJsonAtomic(root, target, attention) ? attention : undefined;
87
- }
88
-
89
- function normalizedJournalEntries(value) {
90
- if (!Array.isArray(value)) return [];
91
- const entries = [];
92
- const seen = new Set();
93
- for (const entry of value) {
94
- const occurredAt = trustedTimestamp(entry?.occurred_at);
95
- const text = redactSecrets(entry?.text);
96
- if (!occurredAt || !text) continue;
97
- const key = `${occurredAt}\0${text}`;
98
- if (seen.has(key)) continue;
99
- seen.add(key);
100
- entries.push({ occurred_at: occurredAt, text });
101
- }
102
- return entries.slice(-MAX_ENTRIES);
103
- }
104
-
105
- function prepareRelationshipTurn(input = {}) {
106
- const root = path.resolve(String(input.root ?? ''));
107
- const agentId = safeId(input.agentId);
108
- const actorId = safeId(input.actorId);
109
- const groupId = safeId(input.groupId);
110
- const occurredAt = trustedTimestamp(input.occurredAt);
111
- if (!agentId || !actorId || !occurredAt || !fs.existsSync(root)) return { recent: [], attention: undefined };
112
- if (groupId) return { recent: [], attention: undefined };
113
-
114
- const text = redactSecrets(input.text);
115
- const target = path.resolve(root, 'agents', agentId, 'journal', 'recent', `${actorId}.json`);
116
- const existing = readJson(root, target);
117
- const rawEntries = Array.isArray(existing?.entries) ? existing.entries.slice(-MAX_ENTRIES) : [];
118
- const entries = normalizedJournalEntries(rawEntries);
119
- const currentKey = text ? `${occurredAt}\0${text}` : '';
120
- const historical = currentKey
121
- ? entries.filter((entry) => `${entry.occurred_at}\0${entry.text}` !== currentKey)
122
- : entries;
123
- const previous = historical.at(-1);
124
- const recent = historical.slice(-MAX_RECENT_CONTEXT);
125
- const attention = attentionForReturn({
126
- root,
127
- agentId,
128
- actorId,
129
- previousAt: trustedTimestamp(previous?.occurred_at),
130
- currentAt: occurredAt,
131
- });
132
-
133
- if (text) {
134
- const alreadyStored = entries.some((entry) => `${entry.occurred_at}\0${entry.text}` === currentKey);
135
- const next = alreadyStored ? entries : [...entries, { occurred_at: occurredAt, text }].slice(-MAX_ENTRIES);
136
- if (JSON.stringify(next) !== JSON.stringify(rawEntries)) {
137
- writeJsonAtomic(root, target, { version: 1, actor_id: actorId, entries: next });
138
- }
139
- }
140
- return { recent, attention };
141
- }
142
-
143
- module.exports = { prepareRelationshipTurn };
@@ -1,107 +0,0 @@
1
- 'use strict';
2
-
3
- const crypto = require('node:crypto');
4
- const { createPersonalityMemoryAdapter } = require('./personality-memory-adapter.cjs');
5
-
6
- const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
7
- const COOLDOWN_MS = 30 * 24 * 60 * 60 * 1000;
8
- const WORK_OR_STRESS_RE = /(?:\b(?:auftrag|bauen|build|deploy|dringend|error|fehler|fix|funktioniert\s+nicht|problem|release|reparier|task|ticket|update|urgent)\b|https?:\/\/|[A-Za-z]:\\|```)/iu;
9
- const CUES = [
10
- { topic: 'pets', sensitivity: 'low', pattern: /\b(?:dog|dogs|hund|hunde|katze|katzen|pet|pets|haustier|haustiere)\b/iu },
11
- { topic: 'family', sensitivity: 'medium', pattern: /\b(?:child|children|daughter|family|familie|kind|kinder|sohn|tochter)\b/iu },
12
- { topic: 'relationship', sensitivity: 'medium', pattern: /\b(?:beziehung|married|partner|partnerin|relationship|verheiratet)\b/iu },
13
- { topic: 'birthday', sensitivity: 'medium', pattern: /\b(?:birthday|geburtstag)\b/iu },
14
- { topic: 'personal_goals', sensitivity: 'low', pattern: /\b(?:in\s+einem\s+jahr|langfristig(?:es|e|en)?\s+ziel|long[- ]term\s+goal|personal\s+goal)\b/iu },
15
- ];
16
- const RELAXED_FIRST_CONTACT_RE = /^(?:hallo|hey|hi|guten\s+(?:morgen|abend|tag)|moin|servus|wie\s+geht(?:'s|\s+es)?\s+dir|hello|how\s+are\s+you)[\s,.!?-]*.*$/iu;
17
-
18
- function safeId(value) {
19
- const normalized = String(value ?? '').trim();
20
- return SAFE_ID_RE.test(normalized) ? normalized : '';
21
- }
22
-
23
- function normalizedText(value) {
24
- return String(value ?? '')
25
- .replace(/[\u0000-\u001f\u007f]+/gu, ' ')
26
- .replace(/\s+/gu, ' ')
27
- .trim()
28
- .slice(0, 500);
29
- }
30
-
31
- function trustedTimestamp(value) {
32
- const text = String(value ?? '').trim();
33
- return text && !Number.isNaN(Date.parse(text)) ? new Date(text).toISOString() : '';
34
- }
35
-
36
- function digestId(prefix, values) {
37
- return `${prefix}-${crypto.createHash('sha256').update(values.join('\0')).digest('hex').slice(0, 40)}`;
38
- }
39
-
40
- function curiosityCue(value) {
41
- const text = normalizedText(value);
42
- if (!text || WORK_OR_STRESS_RE.test(text)) return undefined;
43
- for (const cue of CUES) {
44
- if (cue.pattern.test(text)) return cue;
45
- }
46
- return RELAXED_FIRST_CONTACT_RE.test(text)
47
- ? { topic: 'getting_to_know_person', sensitivity: 'low' }
48
- : undefined;
49
- }
50
-
51
- function opportunity(cue, idempotent = false) {
52
- return {
53
- topic: cue.topic,
54
- sensitivity: cue.sensitivity,
55
- source: 'direct_message_cue',
56
- requires_question: false,
57
- ...(idempotent ? { idempotent: true } : {}),
58
- };
59
- }
60
-
61
- function prepareCuriosityOpportunity(input = {}) {
62
- if (input.groupId) return undefined;
63
- const tenantId = safeId(input.tenantId);
64
- const agentId = safeId(input.agentId);
65
- const actorId = safeId(input.actorId);
66
- const occurredAt = trustedTimestamp(input.occurredAt);
67
- const receivedAt = trustedTimestamp(input.receivedAt);
68
- const sourcePortal = safeId(input.sourcePortal) || 'telegram';
69
- const sourceChannel = safeId(input.sourceChannel) || 'direct';
70
- const conversationId = safeId(input.conversationId) || digestId('conversation', [actorId]);
71
- const cue = curiosityCue(input.text);
72
- if (!tenantId || !agentId || !actorId || !occurredAt || !receivedAt || !cue) return undefined;
73
- const messageId = safeId(input.messageId) || digestId('message', [
74
- sourcePortal, sourceChannel, conversationId, actorId, occurredAt, normalizedText(input.text),
75
- ]);
76
- let memory = input.memoryAdapter;
77
- let ownsMemory = false;
78
- try {
79
- if (!memory) {
80
- memory = createPersonalityMemoryAdapter({ identityRoot: input.root });
81
- ownsMemory = true;
82
- }
83
- const result = memory.claimCuriosityPresentation({
84
- tenantId,
85
- agentId,
86
- actorId,
87
- sourcePortal,
88
- sourceChannel,
89
- conversationId,
90
- messageId,
91
- occurredAt,
92
- receivedAt,
93
- topic: cue.topic,
94
- sensitivity: cue.sensitivity,
95
- cooldownMs: COOLDOWN_MS,
96
- });
97
- return result?.claimed === true ? opportunity(cue, result.idempotent === true) : undefined;
98
- } catch {
99
- return undefined;
100
- } finally {
101
- if (ownsMemory) {
102
- try { memory.close(); } catch {}
103
- }
104
- }
105
- }
106
-
107
- module.exports = { COOLDOWN_MS, prepareCuriosityOpportunity };