@wrongstack/core 0.313.0 → 0.316.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/dist/chronicle/index.js +84 -6391
  2. package/dist/chronicle/legacy-journal-import.d.ts +0 -6
  3. package/dist/chronicle/metrics-ingest.d.ts +14 -0
  4. package/dist/chronicle/metrics-schema.d.ts +10 -1
  5. package/dist/chronicle/metrics-store.d.ts +20 -2
  6. package/dist/chronicle/project-server.js +98 -4874
  7. package/dist/chronicle/sink.d.ts +13 -0
  8. package/dist/chronicle/sqlite-journal.d.ts +20 -2
  9. package/dist/chunk-25LSLC3G.js +334 -0
  10. package/dist/chunk-27QIURLN.js +1073 -0
  11. package/dist/chunk-2FK4WTFF.js +207 -0
  12. package/dist/chunk-2YU4WVBW.js +134 -0
  13. package/dist/chunk-3AGWVSS7.js +4608 -0
  14. package/dist/chunk-3BDV7RL3.js +211 -0
  15. package/dist/chunk-3ECENVHL.js +325 -0
  16. package/dist/chunk-3XPVB7BA.js +135 -0
  17. package/dist/chunk-45WI72ZB.js +16884 -0
  18. package/dist/chunk-4BMVPOHO.js +3748 -0
  19. package/dist/chunk-4I7HGVVA.js +363 -0
  20. package/dist/chunk-4LCZVJVF.js +317 -0
  21. package/dist/chunk-4SJNS7OB.js +217 -0
  22. package/dist/chunk-4VWO3ZXL.js +342 -0
  23. package/dist/chunk-57GEWK5X.js +26 -0
  24. package/dist/chunk-5BMIE7QG.js +46 -0
  25. package/dist/chunk-5S437PRC.js +50 -0
  26. package/dist/chunk-5XDUGTKN.js +511 -0
  27. package/dist/chunk-5YPSXQXM.js +1443 -0
  28. package/dist/chunk-6FHWXLPT.js +10 -0
  29. package/dist/chunk-6H5GEOET.js +2406 -0
  30. package/dist/chunk-6NWEVFEL.js +151 -0
  31. package/dist/chunk-AYW5YINX.js +58 -0
  32. package/dist/chunk-B4AMLZPB.js +9 -0
  33. package/dist/chunk-B7F4WVP4.js +65 -0
  34. package/dist/chunk-BJHVULHO.js +55 -0
  35. package/dist/chunk-BPBKKBUK.js +2085 -0
  36. package/dist/chunk-BYD345OX.js +589 -0
  37. package/dist/chunk-C27KDLOX.js +279 -0
  38. package/dist/chunk-CU546ESW.js +597 -0
  39. package/dist/chunk-DLHHXUAM.js +172 -0
  40. package/dist/chunk-DOTHQSJ2.js +429 -0
  41. package/dist/chunk-DYLPMV4Q.js +711 -0
  42. package/dist/chunk-EODDVJBM.js +82 -0
  43. package/dist/chunk-F3JWNST7.js +361 -0
  44. package/dist/chunk-FC2ZGRF3.js +140 -0
  45. package/dist/chunk-FCBTO76Z.js +5786 -0
  46. package/dist/chunk-FHZVFYSL.js +396 -0
  47. package/dist/chunk-FNXVT7HF.js +52 -0
  48. package/dist/chunk-FWNLEZYG.js +259 -0
  49. package/dist/chunk-FXQLIX3K.js +211 -0
  50. package/dist/chunk-G5S3S5ZN.js +38 -0
  51. package/dist/chunk-GDQ7CZRQ.js +116 -0
  52. package/dist/chunk-GJJGJB2R.js +1374 -0
  53. package/dist/chunk-GTCU6DZ3.js +1 -0
  54. package/dist/chunk-HA4ZYA6T.js +178 -0
  55. package/dist/chunk-HI3JGZR2.js +188 -0
  56. package/dist/chunk-HMLIGAU7.js +395 -0
  57. package/dist/chunk-HXKZ7OBQ.js +303 -0
  58. package/dist/chunk-I7DALG7J.js +292 -0
  59. package/dist/chunk-IRUTEHCE.js +960 -0
  60. package/dist/chunk-IYFBFX34.js +86 -0
  61. package/dist/chunk-J2WRWR37.js +1104 -0
  62. package/dist/chunk-JFPJ6LLQ.js +129 -0
  63. package/dist/chunk-JMULFFLN.js +9 -0
  64. package/dist/chunk-JO4MGB6Z.js +1264 -0
  65. package/dist/chunk-JVKB2TBL.js +48 -0
  66. package/dist/chunk-JX7VBZDK.js +31 -0
  67. package/dist/chunk-K6BXGITA.js +931 -0
  68. package/dist/chunk-KDQJCT2J.js +45 -0
  69. package/dist/chunk-KJ2ZTQSL.js +47 -0
  70. package/dist/chunk-KZMSZV32.js +187 -0
  71. package/dist/chunk-LA7CLDRW.js +129 -0
  72. package/dist/chunk-LHOA5DWA.js +28 -0
  73. package/dist/chunk-LSMMOS2Z.js +119 -0
  74. package/dist/chunk-LX5QWLBL.js +27 -0
  75. package/dist/chunk-LXWCMQNJ.js +789 -0
  76. package/dist/chunk-M27LIEKV.js +2829 -0
  77. package/dist/chunk-MJPHJRAL.js +663 -0
  78. package/dist/chunk-MTL4O5YR.js +228 -0
  79. package/dist/chunk-NDBIPFNY.js +102 -0
  80. package/dist/chunk-NEMIWEXC.js +1199 -0
  81. package/dist/chunk-NHJ75HXY.js +1 -0
  82. package/dist/chunk-NIOAGFPB.js +1510 -0
  83. package/dist/chunk-NS52ISWS.js +355 -0
  84. package/dist/chunk-NSOFPKGT.js +5352 -0
  85. package/dist/chunk-NVIZG63R.js +757 -0
  86. package/dist/chunk-O37BQ65S.js +21 -0
  87. package/dist/chunk-OOYZPOXM.js +308 -0
  88. package/dist/chunk-OSGLYW5J.js +28 -0
  89. package/dist/chunk-PFCMSSUF.js +1640 -0
  90. package/dist/chunk-PFZO3C6H.js +14 -0
  91. package/dist/chunk-PGRVXIMY.js +158 -0
  92. package/dist/chunk-PHH7LD45.js +113 -0
  93. package/dist/chunk-PISBFBJN.js +109 -0
  94. package/dist/chunk-POOOIWE5.js +9 -0
  95. package/dist/chunk-PQNS3U7Z.js +1240 -0
  96. package/dist/chunk-QSTSJOCK.js +402 -0
  97. package/dist/chunk-RFQMOKWK.js +282 -0
  98. package/dist/chunk-RJIZEJ42.js +30 -0
  99. package/dist/chunk-RTOTNK3P.js +484 -0
  100. package/dist/chunk-RXKSDUAU.js +1172 -0
  101. package/dist/chunk-S45JPKQN.js +3317 -0
  102. package/dist/chunk-SAFHACFA.js +152 -0
  103. package/dist/chunk-SQJVFEBV.js +41 -0
  104. package/dist/chunk-SVT4RNTR.js +49 -0
  105. package/dist/chunk-SWUFN7XM.js +43 -0
  106. package/dist/chunk-SXMVYC5H.js +174 -0
  107. package/dist/chunk-SZ6AYUIZ.js +23 -0
  108. package/dist/chunk-TBRL2RCC.js +9 -0
  109. package/dist/chunk-TCCHINEF.js +655 -0
  110. package/dist/chunk-THEGTRAG.js +316 -0
  111. package/dist/chunk-TR4LQE7L.js +2256 -0
  112. package/dist/chunk-TRT2HRWZ.js +18 -0
  113. package/dist/chunk-TWJMGXCI.js +900 -0
  114. package/dist/chunk-U45AXT5D.js +1023 -0
  115. package/dist/chunk-U4FWBSO3.js +509 -0
  116. package/dist/chunk-UBGDX6FI.js +147 -0
  117. package/dist/chunk-UJILKYES.js +75 -0
  118. package/dist/chunk-ULMAQV3T.js +234 -0
  119. package/dist/chunk-VVBP6KGT.js +9 -0
  120. package/dist/chunk-W5VITDM2.js +168 -0
  121. package/dist/chunk-WAHQVNWT.js +194 -0
  122. package/dist/chunk-WBPVKEEE.js +227 -0
  123. package/dist/chunk-WGGYRBXH.js +5434 -0
  124. package/dist/chunk-WLYKU45P.js +5770 -0
  125. package/dist/chunk-WP7BVANJ.js +53 -0
  126. package/dist/chunk-WQQON3SV.js +473 -0
  127. package/dist/chunk-WQTOVMGV.js +119 -0
  128. package/dist/chunk-XBDP4QPW.js +7 -0
  129. package/dist/chunk-XEBHSJLT.js +103 -0
  130. package/dist/chunk-XF4VUMKW.js +231 -0
  131. package/dist/chunk-XQ2ECNK3.js +1 -0
  132. package/dist/chunk-Y5YXDM7D.js +74 -0
  133. package/dist/chunk-YOPAUVU4.js +2588 -0
  134. package/dist/chunk-YPT4A46F.js +362 -0
  135. package/dist/chunk-YWXT3JNM.js +425 -0
  136. package/dist/chunk-YY6APYUM.js +49 -0
  137. package/dist/chunk-Z2IJUO45.js +691 -0
  138. package/dist/chunk-ZHZ2Y2DH.js +1643 -0
  139. package/dist/chunk-ZT7JNIGX.js +152 -0
  140. package/dist/coordination/agent-monitor.d.ts +9 -1
  141. package/dist/coordination/agent-subagent-runner.d.ts +1 -1
  142. package/dist/coordination/agents/agent-prompts.d.ts +8 -0
  143. package/dist/coordination/agents/index.d.ts +33 -1
  144. package/dist/coordination/agents/index.js +184 -6269
  145. package/dist/coordination/agents/phase3-wave1-platform.d.ts +1 -3
  146. package/dist/coordination/agents/phase3-wave2-meta.d.ts +1 -3
  147. package/dist/coordination/agents/phase8-wave3-products.d.ts +1 -3
  148. package/dist/coordination/agents/phase9-wave4-platform-meta.d.ts +1 -3
  149. package/dist/coordination/agents/project-agent-identity.d.ts +11 -11
  150. package/dist/coordination/agents/types.d.ts +13 -2
  151. package/dist/coordination/brain-monitor.d.ts +30 -7
  152. package/dist/coordination/collab-debug.d.ts +1 -1
  153. package/dist/coordination/collab-pause.d.ts +1 -1
  154. package/dist/coordination/delegate-tool.d.ts +7 -5
  155. package/dist/coordination/director-kanban-queue-helpers.d.ts +1 -0
  156. package/dist/coordination/director-options.d.ts +7 -0
  157. package/dist/coordination/director-spawn-model.d.ts +17 -0
  158. package/dist/coordination/director-tools.d.ts +2 -2
  159. package/dist/coordination/director.d.ts +12 -0
  160. package/dist/coordination/dispatcher.d.ts +8 -0
  161. package/dist/coordination/fleet-bus.d.ts +35 -4
  162. package/dist/coordination/fleet-supervisor.d.ts +10 -2
  163. package/dist/coordination/fleet.d.ts +16 -7
  164. package/dist/coordination/index.d.ts +4 -0
  165. package/dist/coordination/index.js +402 -34324
  166. package/dist/coordination/kanban-dispatch-port.d.ts +2 -2
  167. package/dist/coordination/mailbox-http-router.d.ts +4 -3
  168. package/dist/coordination/mailbox-http-validation.d.ts +1 -1
  169. package/dist/coordination/mailbox-project-server.js +48 -3276
  170. package/dist/coordination/mailbox-types.d.ts +24 -6
  171. package/dist/coordination/model-tier-leader.d.ts +122 -0
  172. package/dist/coordination/model-tier.d.ts +122 -0
  173. package/dist/coordination/multi-agent-coordinator.d.ts +24 -0
  174. package/dist/coordination/origin-session.d.ts +16 -0
  175. package/dist/coordination/provider-status-tracker.d.ts +41 -5
  176. package/dist/coordination/session-note-hub.d.ts +44 -0
  177. package/dist/coordination/session-note-tool.d.ts +10 -0
  178. package/dist/core/agent.d.ts +15 -2
  179. package/dist/core/context.d.ts +22 -3
  180. package/dist/core/index.d.ts +2 -0
  181. package/dist/core/index.js +239 -12360
  182. package/dist/core/model-ref.js +5 -23
  183. package/dist/core/provider-runner.d.ts +36 -1
  184. package/dist/core/request-conversation-binding.d.ts +37 -0
  185. package/dist/core/session-notes.d.ts +25 -0
  186. package/dist/core/system-prompt-builder.d.ts +11 -2
  187. package/dist/core/system-prompt-variants.d.ts +78 -0
  188. package/dist/design/index.js +50 -1087
  189. package/dist/execution/auto-compaction-middleware.d.ts +11 -0
  190. package/dist/execution/autonomy-brain.d.ts +2 -1
  191. package/dist/execution/autonomy-prompt-contributor.d.ts +7 -2
  192. package/dist/execution/compaction-core.d.ts +4 -4
  193. package/dist/execution/eternal-autonomy.d.ts +1 -1
  194. package/dist/execution/index.d.ts +1 -1
  195. package/dist/execution/index.js +1615 -21895
  196. package/dist/execution/model-runtime.d.ts +0 -7
  197. package/dist/execution/parallel-eternal-engine.d.ts +7 -7
  198. package/dist/execution/prompt-enhancer.js +16 -535
  199. package/dist/execution/retry-policy.d.ts +31 -1
  200. package/dist/extension/index.js +7 -311
  201. package/dist/goal/index.js +33 -3435
  202. package/dist/hooks/index.js +14 -1138
  203. package/dist/hq/index.js +114 -5139
  204. package/dist/hq/persistence/event-log.d.ts +0 -1
  205. package/dist/hq/persistence.d.ts +4 -4
  206. package/dist/hq/protocol.js +21 -668
  207. package/dist/hq/publisher.d.ts +2 -0
  208. package/dist/index.d.ts +14 -11
  209. package/dist/index.js +1502 -92655
  210. package/dist/infrastructure/index.d.ts +4 -4
  211. package/dist/infrastructure/index.js +504 -5230
  212. package/dist/infrastructure/token-counter.d.ts +9 -0
  213. package/dist/kernel/events/agent-events.d.ts +77 -3
  214. package/dist/kernel/events/brain-events.d.ts +12 -0
  215. package/dist/kernel/events/provider-events.d.ts +22 -1
  216. package/dist/kernel/events/session-events.d.ts +14 -0
  217. package/dist/kernel/events/tool-events.d.ts +13 -0
  218. package/dist/kernel/index.js +14 -992
  219. package/dist/mailbox-attach.d.ts +1 -1
  220. package/dist/models/index.js +41 -1117
  221. package/dist/notifications/index.js +3 -108
  222. package/dist/observability/event-bridge.d.ts +25 -5
  223. package/dist/observability/index.d.ts +9 -8
  224. package/dist/observability/index.js +477 -631
  225. package/dist/observability/tool-usage-source.d.ts +65 -0
  226. package/dist/plugin/index.d.ts +5 -0
  227. package/dist/plugin/index.js +600 -14835
  228. package/dist/plugins/auto-review-plugin.d.ts +3 -2
  229. package/dist/plugins/review-finding-commands.d.ts +0 -8
  230. package/dist/plugins/review-finding-store.js +22 -0
  231. package/dist/plugins/review-finding-types.js +19 -0
  232. package/dist/plugins/review-report-integration.js +21 -0
  233. package/dist/plugins/review-report-store.js +20 -0
  234. package/dist/plugins/review-report-types.js +13 -0
  235. package/dist/prompts/index.js +14 -948
  236. package/dist/registry/index.js +9 -822
  237. package/dist/registry/tool-registry.d.ts +59 -9
  238. package/dist/registry-7N4O3E7W.js +14 -0
  239. package/dist/replay/index.js +6 -84
  240. package/dist/security/capabilities.d.ts +6 -0
  241. package/dist/security/file-permissions.d.ts +1 -1
  242. package/dist/security/index.js +161 -2235
  243. package/dist/security/permission-policy.d.ts +12 -1
  244. package/dist/security/secret-scrubber.d.ts +15 -0
  245. package/dist/session-catalog/index.d.ts +1 -0
  246. package/dist/session-catalog/index.js +41 -2103
  247. package/dist/session-catalog/project-server.js +59 -1435
  248. package/dist/session-catalog/protocol.d.ts +32 -1
  249. package/dist/session-catalog/registry.d.ts +17 -1
  250. package/dist/session-catalog/session-agents.d.ts +56 -0
  251. package/dist/session-catalog/store-rebuild.d.ts +14 -0
  252. package/dist/session-catalog/store-schema.d.ts +26 -0
  253. package/dist/session-catalog/store.d.ts +27 -1
  254. package/dist/session-note-attach.d.ts +9 -0
  255. package/dist/skills/index.js +35 -1578
  256. package/dist/statusline/index.d.ts +43 -0
  257. package/dist/statusline/index.js +102 -0
  258. package/dist/storage/board-store-port.d.ts +2 -2
  259. package/dist/storage/config-loader/in-project-policy.d.ts +29 -0
  260. package/dist/storage/config-loader.d.ts +3 -2
  261. package/dist/storage/file-session-writer.d.ts +4 -2
  262. package/dist/storage/goal-coordination.d.ts +6 -1
  263. package/dist/storage/goal-kanban.d.ts +4 -1
  264. package/dist/storage/index.d.ts +12 -4
  265. package/dist/storage/index.js +198 -15601
  266. package/dist/storage/input-history-store.d.ts +2 -4
  267. package/dist/storage/memory-curator.d.ts +133 -0
  268. package/dist/storage/session-agent-attribution.d.ts +39 -0
  269. package/dist/storage/session-doctor.d.ts +109 -0
  270. package/dist/storage/session-event-bridge.d.ts +5 -7
  271. package/dist/storage/session-outcome.d.ts +42 -0
  272. package/dist/storage/session-recovery.d.ts +55 -0
  273. package/dist/storage/session-store/load-session-data.d.ts +11 -0
  274. package/dist/storage/session-store/prune-helpers.d.ts +1 -1
  275. package/dist/storage/session-store/resume-session.d.ts +0 -2
  276. package/dist/storage/session-store/types.d.ts +8 -0
  277. package/dist/storage/session-store.d.ts +3 -3
  278. package/dist/storage/session-summary-tracker.d.ts +8 -1
  279. package/dist/storage/session-write-buffer.d.ts +18 -0
  280. package/dist/storage/session-writer-truncate.d.ts +2 -0
  281. package/dist/tasking/index.js +10 -676
  282. package/dist/tools/fallback-manage-tools.d.ts +6 -4
  283. package/dist/tools/index.js +52 -9590
  284. package/dist/tools/model-tier-set-tool.d.ts +66 -0
  285. package/dist/types/agent-bridge.d.ts +2 -1
  286. package/dist/types/config/autonomy.d.ts +5 -0
  287. package/dist/types/config/mcp-features.d.ts +7 -0
  288. package/dist/types/config/model-tiers.d.ts +148 -0
  289. package/dist/types/config/root.d.ts +9 -0
  290. package/dist/types/config/tools.d.ts +73 -0
  291. package/dist/types/config/ui.d.ts +1 -1
  292. package/dist/types/config.d.ts +1 -0
  293. package/dist/types/context.d.ts +2 -0
  294. package/dist/types/default-config.d.ts +6 -0
  295. package/dist/types/errors.d.ts +20 -1
  296. package/dist/types/index.d.ts +11 -9
  297. package/dist/types/index.js +131 -1342
  298. package/dist/types/multi-agent.d.ts +43 -0
  299. package/dist/types/plugin.d.ts +1 -1
  300. package/dist/types/provider-runner.d.ts +8 -0
  301. package/dist/types/provider.d.ts +15 -0
  302. package/dist/types/runtime-capability-manifest.d.ts +1 -1
  303. package/dist/types/secret-scrubber.d.ts +15 -0
  304. package/dist/types/session-markers.d.ts +37 -10
  305. package/dist/types/session-markers.js +8 -144
  306. package/dist/types/session-timeline.d.ts +197 -0
  307. package/dist/types/session-timeline.js +12 -0
  308. package/dist/types/session.d.ts +172 -11
  309. package/dist/types/system-prompt.d.ts +27 -0
  310. package/dist/utils/config-backup.d.ts +9 -1
  311. package/dist/utils/error.js +3 -4
  312. package/dist/utils/expect-defined.js +3 -9
  313. package/dist/utils/heap-watchdog.js +6 -706
  314. package/dist/utils/index.js +271 -5685
  315. package/dist/utils/message-invariants.d.ts +4 -1
  316. package/dist/utils/regex-guard.d.ts +1 -1
  317. package/dist/utils/sage-output-block.js +5 -42
  318. package/dist/utils/socket-path.d.ts +1 -1
  319. package/dist/utils/token-estimate.d.ts +6 -2
  320. package/dist/utils/wstack-paths.d.ts +2 -0
  321. package/dist/wiring/proxy-rewrite.d.ts +46 -0
  322. package/dist/wiring/proxy-rewrite.js +24 -121
  323. package/dist/worktree/index.js +6 -887
  324. package/instructions/agents/explore-companion.md +45 -18
  325. package/instructions/agents/memory-curator.md +34 -22
  326. package/instructions/coordination/director-preamble.md +12 -7
  327. package/instructions/coordination/subagent-baseline.md +26 -5
  328. package/instructions/leader-after-task.md +4 -1
  329. package/instructions/llm/chimera-review.md +30 -9
  330. package/instructions/llm/memory-curator.md +31 -0
  331. package/instructions/sections/tool/delegation-compact.md +2 -0
  332. package/instructions/sections/tool/delegation-full.md +5 -1
  333. package/instructions/sections/tool/mailbox-compact.md +5 -1
  334. package/instructions/sections/tool/mailbox-full.md +3 -0
  335. package/instructions/sections/tool/session-note-compact.md +3 -0
  336. package/instructions/sections/tool/session-note-full.md +15 -0
  337. package/instructions/system-lite.md +9 -4
  338. package/instructions/system-pro.md +66 -143
  339. package/instructions/system.md +73 -175
  340. package/package.json +32 -4
  341. package/dist/coordination/agents.d.ts +0 -8
  342. package/dist/coordination/transport.d.ts +0 -2
  343. package/dist/storage/session-writer/session-writer-summary-tracker.d.ts +0 -28
@@ -0,0 +1,655 @@
1
+ import {
2
+ applyToolDescriptionModeToTool,
3
+ normalizeToolDescriptionMode
4
+ } from "./chunk-WQTOVMGV.js";
5
+ import {
6
+ estimateToolDefTokens
7
+ } from "./chunk-HMLIGAU7.js";
8
+ import {
9
+ ERROR_CODES,
10
+ WrongStackError
11
+ } from "./chunk-25LSLC3G.js";
12
+ import {
13
+ toErrorMessage
14
+ } from "./chunk-TBRL2RCC.js";
15
+
16
+ // src/registry/provider-registry.ts
17
+ var ProviderRegistry = class {
18
+ factories = /* @__PURE__ */ new Map();
19
+ /**
20
+ * Register a provider factory. If a factory with the same type already
21
+ * exists, it is replaced. Use this for both initial registration and
22
+ * runtime overrides (e.g. from plugins or CLI flags).
23
+ */
24
+ register(f) {
25
+ this.factories.set(f.type, f);
26
+ }
27
+ /**
28
+ * Bulk-register multiple provider factories at once.
29
+ */
30
+ registerAll(factories) {
31
+ for (const f of factories) this.register(f);
32
+ }
33
+ /**
34
+ * Override an existing factory. Throws if no factory is registered
35
+ * for the given type. Use this to safely replace a provider at runtime
36
+ * (e.g. in tests or when a plugin provides a custom implementation).
37
+ */
38
+ override(type, f) {
39
+ if (!this.factories.has(type)) {
40
+ throw new Error(`Provider type "${type}" not registered; cannot override`);
41
+ }
42
+ this.factories.set(type, f);
43
+ }
44
+ has(type) {
45
+ return this.factories.has(type);
46
+ }
47
+ /**
48
+ * Unregister a provider factory by type. Returns true if a factory was
49
+ * removed, false if none was registered for that type.
50
+ */
51
+ unregister(type) {
52
+ return this.factories.delete(type);
53
+ }
54
+ create(cfg, factoryType = cfg.type) {
55
+ const f = this.factories.get(factoryType);
56
+ if (!f) {
57
+ throw new Error(
58
+ `Provider type "${factoryType}" not registered. Available: ${Array.from(this.factories.keys()).join(", ")}`
59
+ );
60
+ }
61
+ return f.create(cfg);
62
+ }
63
+ list() {
64
+ return Array.from(this.factories.keys());
65
+ }
66
+ };
67
+
68
+ // src/registry/slash-command-registry.ts
69
+ var SlashCommandRegistry = class {
70
+ cmds = /* @__PURE__ */ new Map();
71
+ /**
72
+ * Register a command.
73
+ *
74
+ * Trust tiers, by `owner` and `opts.official`:
75
+ *
76
+ * - **Built-ins** (`owner === 'core'`) and **official plugins**
77
+ * (`opts.official === true`, set by the host only for first-party plugins
78
+ * loaded from the built-in factory list) claim the **bare** command name
79
+ * (`/prompts`). They may override one another — last write wins — so an
80
+ * official plugin can replace a built-in. Official plugins are *also*
81
+ * reachable under their `owner:name` namespace.
82
+ * - **External plugins** (any other `owner`) are isolated under the
83
+ * `owner:name` namespace: invocable only as `/owner:cmd`, never by bare
84
+ * name, and unable to shadow or override a built-in or official command.
85
+ *
86
+ * Officiality is supplied by the host based on the plugin's load source, not
87
+ * self-declared by the plugin — an external plugin cannot name itself into
88
+ * the official tier.
89
+ */
90
+ register(cmd, owner = "core", opts) {
91
+ const isPlugin = owner !== "core";
92
+ const official = !isPlugin || opts?.official === true;
93
+ if (official) {
94
+ const existing = this.cmds.get(cmd.name);
95
+ if (existing) {
96
+ const existingIsOfficialPlugin = existing.official && existing.owner !== "core";
97
+ if (!isPlugin && existingIsOfficialPlugin) {
98
+ return;
99
+ }
100
+ if (!isPlugin && existing.owner === "core") return;
101
+ }
102
+ this.cmds.set(cmd.name, { cmd, owner, official });
103
+ for (const a of cmd.aliases ?? []) {
104
+ this.cmds.set(a, { cmd, owner, official });
105
+ }
106
+ }
107
+ if (isPlugin) {
108
+ this.cmds.set(`${owner}:${cmd.name}`, { cmd, owner, official });
109
+ for (const a of cmd.aliases ?? []) {
110
+ this.cmds.set(`${owner}:${a}`, { cmd, owner, official });
111
+ }
112
+ }
113
+ }
114
+ unregister(name) {
115
+ const entry = this.cmds.get(name);
116
+ if (!entry) return false;
117
+ for (const [key, e] of this.cmds.entries()) {
118
+ if (e.cmd === entry.cmd) this.cmds.delete(key);
119
+ }
120
+ return true;
121
+ }
122
+ /**
123
+ * Bulk-register multiple slash commands at once.
124
+ */
125
+ registerAll(cmds, owner = "core") {
126
+ for (const cmd of cmds) this.register(cmd, owner);
127
+ }
128
+ get(name) {
129
+ return this.cmds.get(name)?.cmd;
130
+ }
131
+ ownerOf(name) {
132
+ return this.cmds.get(name)?.owner;
133
+ }
134
+ list() {
135
+ const seen = /* @__PURE__ */ new Set();
136
+ const out = [];
137
+ for (const { cmd } of this.cmds.values()) {
138
+ if (!seen.has(cmd)) {
139
+ seen.add(cmd);
140
+ out.push(cmd);
141
+ }
142
+ }
143
+ return out;
144
+ }
145
+ listWithOwner() {
146
+ const seen = /* @__PURE__ */ new Set();
147
+ const out = [];
148
+ for (const [fullName, { cmd, owner }] of this.cmds.entries()) {
149
+ if (!seen.has(cmd)) {
150
+ seen.add(cmd);
151
+ out.push({ cmd, owner, fullName });
152
+ }
153
+ }
154
+ return out;
155
+ }
156
+ /**
157
+ * Parse a slash command line. Accepts both:
158
+ * `/cmd args` → builtin command (owner=core)
159
+ * `/pluginName:cmd args` → plugin command
160
+ * The command name is split at the first `:` if the prefix matches a known owner.
161
+ */
162
+ async dispatch(line, ctx) {
163
+ if (!line.startsWith("/")) return null;
164
+ const trimmed = line.slice(1);
165
+ const spaceIdx = trimmed.indexOf(" ");
166
+ const firstColonIdx = trimmed.indexOf(":");
167
+ let name;
168
+ let args;
169
+ if (firstColonIdx !== -1 && (spaceIdx === -1 || firstColonIdx < spaceIdx)) {
170
+ const prefix = trimmed.slice(0, firstColonIdx);
171
+ name = trimmed.slice(0, spaceIdx === -1 ? void 0 : spaceIdx);
172
+ args = spaceIdx === -1 ? "" : trimmed.slice(spaceIdx + 1);
173
+ const entry2 = this.cmds.get(name);
174
+ if (!entry2 || entry2.owner !== prefix) {
175
+ name = trimmed.slice(0, spaceIdx === -1 ? void 0 : spaceIdx);
176
+ args = spaceIdx === -1 ? "" : trimmed.slice(spaceIdx + 1);
177
+ }
178
+ } else {
179
+ name = trimmed.slice(0, spaceIdx === -1 ? void 0 : spaceIdx);
180
+ args = spaceIdx === -1 ? "" : trimmed.slice(spaceIdx + 1);
181
+ }
182
+ const entry = this.cmds.get(name);
183
+ if (!entry) {
184
+ return { message: `Unknown command "/${name}". Type /help for a list.` };
185
+ }
186
+ try {
187
+ const res = await entry.cmd.run(args, ctx);
188
+ return res ?? {};
189
+ } catch (err) {
190
+ const msg = toErrorMessage(err);
191
+ return { message: `Command "/${name}" failed: ${msg}` };
192
+ }
193
+ }
194
+ };
195
+
196
+ // src/registry/tool-registry.ts
197
+ var ToolRegistry = class _ToolRegistry {
198
+ tools = /* @__PURE__ */ new Map();
199
+ descriptionModes = /* @__PURE__ */ new Map();
200
+ /**
201
+ * Disabled tool names plus the audit-trail metadata explaining WHY each
202
+ * one was disabled. `user` is the historical default (manual
203
+ * `/tool disable`); `auto-thinned` is the new path the auto-thinning
204
+ * pipeline writes so `/tool autothin undo` can restore the right subset.
205
+ * The underlying tool data stays in `_tools` so re-enable is constant-time.
206
+ */
207
+ _disabled = /* @__PURE__ */ new Map();
208
+ /**
209
+ * Optional EventBus used by `thinUnderused()` to emit `tool.thinned`.
210
+ * Set via `setEventBus()` at boot — optional so the registry stays
211
+ * usable in pure unit tests and in code paths that never run the
212
+ * auto-thinning pipeline.
213
+ */
214
+ _events;
215
+ /** Monotonic version bumped on every registry mutation. */
216
+ _version = 0;
217
+ /** Cached `list()` result, frozen after build. Invalidated on _version change. */
218
+ _listSnapshot;
219
+ _listSnapshotVersion = -1;
220
+ /**
221
+ * Optional direct provider surface. `undefined` preserves the legacy
222
+ * behaviour (every enabled catalog tool is direct); when set, `list()` still
223
+ * exposes the complete executable catalog while `listForProvider()` returns
224
+ * only these names. This keeps lazy tools discoverable by tool_search/tool_use.
225
+ */
226
+ _providerToolNames;
227
+ _providerListSnapshot;
228
+ _providerListSnapshotVersion = -1;
229
+ /** Pre-compute tool definition token estimate once at registration time. */
230
+ _stampDefTokens(tool) {
231
+ if (tool._estDefTokens === void 0) {
232
+ tool._estDefTokens = estimateToolDefTokens(tool);
233
+ }
234
+ }
235
+ /** Apply the description mode transform and stamp token estimates. */
236
+ _prepareForStorage(tool) {
237
+ const mode = this.descriptionModes.get(tool.name) ?? "extend";
238
+ return applyToolDescriptionModeToTool(tool, mode);
239
+ }
240
+ register(tool, owner = "core") {
241
+ if (this.tools.has(tool.name)) {
242
+ throw new WrongStackError({
243
+ message: `Tool "${tool.name}" already registered`,
244
+ code: ERROR_CODES.REGISTRY_DUPLICATE,
245
+ subsystem: "container",
246
+ context: { tool: tool.name }
247
+ });
248
+ }
249
+ if (!tool.inputSchema || typeof tool.inputSchema !== "object") {
250
+ throw new WrongStackError({
251
+ message: `Tool "${tool.name}" has an invalid or missing inputSchema`,
252
+ code: ERROR_CODES.REGISTRY_INVALID,
253
+ subsystem: "container",
254
+ context: { tool: tool.name }
255
+ });
256
+ }
257
+ const stored = this._prepareForStorage(tool);
258
+ this._stampDefTokens(stored);
259
+ this.tools.set(tool.name, { tool: stored, owner });
260
+ this._version++;
261
+ }
262
+ /**
263
+ * Attempt to register a tool. Returns true if successful, false if a tool
264
+ * with the same name is already registered. Useful in multi-agent or plugin
265
+ * scenarios where duplicate registration may be intentional.
266
+ */
267
+ tryRegister(tool, owner = "core") {
268
+ if (this.tools.has(tool.name)) return false;
269
+ if (!tool.inputSchema || typeof tool.inputSchema !== "object") {
270
+ return false;
271
+ }
272
+ const stored = this._prepareForStorage(tool);
273
+ this._stampDefTokens(stored);
274
+ this.tools.set(tool.name, { tool: stored, owner });
275
+ this._version++;
276
+ return true;
277
+ }
278
+ /**
279
+ * Bulk-register multiple tools at once. Each tool that conflicts with an
280
+ * existing registration is silently skipped — use `registerAllOrThrow`
281
+ * if you want it to throw on conflicts.
282
+ */
283
+ registerAll(tools, owner = "core") {
284
+ for (const tool of tools) this.tryRegister(tool, owner);
285
+ }
286
+ /**
287
+ * Bulk-register and throw on the first conflict. Use when you need
288
+ * strict registration (e.g. at boot time).
289
+ */
290
+ registerAllOrThrow(tools, owner = "core") {
291
+ for (const tool of tools) this.register(tool, owner);
292
+ }
293
+ /**
294
+ * Register a tool as a default. If the tool name is already registered,
295
+ * this is a no-op — the existing registration (from core or another
296
+ * plugin) takes precedence. Use `override` to intentionally replace.
297
+ */
298
+ registerDefault(tool, owner = "core") {
299
+ if (this.tools.has(tool.name)) return;
300
+ const stored = this._prepareForStorage(tool);
301
+ this._stampDefTokens(stored);
302
+ this.tools.set(tool.name, { tool: stored, owner });
303
+ this._version++;
304
+ }
305
+ unregister(name) {
306
+ const deleted = this.tools.delete(name);
307
+ if (deleted) this._version++;
308
+ return deleted;
309
+ }
310
+ /**
311
+ * Override an existing tool. Throws if the tool is not already registered.
312
+ * Plugins use this to replace built-in tools with custom implementations.
313
+ */
314
+ override(name, tool, owner = "core") {
315
+ if (!this.tools.has(name)) {
316
+ throw new WrongStackError({
317
+ message: `Tool "${name}" not registered; cannot override`,
318
+ code: ERROR_CODES.REGISTRY_NOT_FOUND,
319
+ subsystem: "container",
320
+ context: { tool: name }
321
+ });
322
+ }
323
+ const stored = this._prepareForStorage(tool);
324
+ this._stampDefTokens(stored);
325
+ this.tools.set(name, { tool: stored, owner });
326
+ this._version++;
327
+ }
328
+ /**
329
+ * Wrap (decorate) an existing tool. The wrapper receives the current
330
+ * tool and must return a new tool — typically the same tool with a
331
+ * wrapped `execute` or `executeStream`. Throws if the tool is not
332
+ * registered.
333
+ *
334
+ * Multiple wraps stack: each wrapper gets the output of the previous.
335
+ *
336
+ * @example
337
+ * registry.wrap('bash', (t) => ({ ...t, permission: 'confirm' }));
338
+ */
339
+ wrap(name, wrapper, owner = "core") {
340
+ const entry = this.tools.get(name);
341
+ if (!entry) {
342
+ throw new WrongStackError({
343
+ message: `Tool "${name}" not registered; cannot wrap`,
344
+ code: ERROR_CODES.REGISTRY_NOT_FOUND,
345
+ subsystem: "container",
346
+ context: { tool: name }
347
+ });
348
+ }
349
+ const current = applyToolDescriptionModeToTool(entry.tool, "extend");
350
+ const wrapped = this._prepareForStorage(wrapper(current));
351
+ wrapped._estDefTokens = void 0;
352
+ this._stampDefTokens(wrapped);
353
+ this.tools.set(name, { tool: wrapped, owner: `${entry.owner}+${owner}` });
354
+ this._version++;
355
+ }
356
+ setDescriptionMode(name, mode) {
357
+ const normalized = normalizeToolDescriptionMode(mode);
358
+ if (!normalized) return false;
359
+ const entry = this.tools.get(name);
360
+ if (!entry) return false;
361
+ if (normalized === "extend") {
362
+ this.descriptionModes.delete(name);
363
+ } else {
364
+ this.descriptionModes.set(name, normalized);
365
+ }
366
+ const stored = applyToolDescriptionModeToTool(entry.tool, normalized);
367
+ stored._estDefTokens = void 0;
368
+ this._stampDefTokens(stored);
369
+ this.tools.set(name, { ...entry, tool: stored });
370
+ this._version++;
371
+ return true;
372
+ }
373
+ getDescriptionMode(name) {
374
+ return this.descriptionModes.get(name) ?? "extend";
375
+ }
376
+ applyDescriptionModes(modes = {}) {
377
+ const missing = [];
378
+ let applied = 0;
379
+ for (const [name, rawMode] of Object.entries(modes)) {
380
+ const mode = normalizeToolDescriptionMode(rawMode);
381
+ if (!mode) continue;
382
+ if (this.tools.has(name)) {
383
+ if (this.setDescriptionMode(name, mode)) applied++;
384
+ } else {
385
+ if (mode === "simple") this.descriptionModes.set(name, mode);
386
+ else this.descriptionModes.delete(name);
387
+ missing.push(name);
388
+ }
389
+ }
390
+ return { applied, missing };
391
+ }
392
+ get(name) {
393
+ if (this._disabled.has(name)) return void 0;
394
+ return this.tools.get(name)?.tool;
395
+ }
396
+ ownerOf(name) {
397
+ return this.tools.get(name)?.owner;
398
+ }
399
+ // ── Disable / enable ────────────────────────────────────────────
400
+ /** Attach the EventBus so `thinUnderused()` can emit `tool.thinned`.
401
+ * Idempotent; safe to call multiple times at boot. */
402
+ setEventBus(events) {
403
+ this._events = events;
404
+ }
405
+ /**
406
+ * Disable a tool by name. The tool is removed from all public accessors
407
+ * (list(), get(), listByCategory(), listWithOwner()) so it does NOT
408
+ * appear in the system prompt or provider request. The underlying
409
+ * registration is preserved in memory — use `enable()` to restore it.
410
+ *
411
+ * `reason` defaults to `'user'` for backward compatibility — every
412
+ * historical caller (CLI `/tool disable`, WebUI, subagent filter)
413
+ * writes a user-authored disable. The auto-thinning pipeline always
414
+ * passes `'auto-thinned'`.
415
+ *
416
+ * @returns `true` if the tool was found and disabled; `false` if the
417
+ * tool is not registered or is already disabled.
418
+ */
419
+ disable(name, reason = "user", meta) {
420
+ if (!this.tools.has(name) || this._disabled.has(name)) return false;
421
+ this._disabled.set(name, {
422
+ reason,
423
+ at: Date.now(),
424
+ ...meta?.caller ? { caller: meta.caller } : {}
425
+ });
426
+ this._version++;
427
+ return true;
428
+ }
429
+ /**
430
+ * Re-enable a previously disabled tool. The tool reappears in all
431
+ * public accessors and will be included in the next system prompt /
432
+ * provider request.
433
+ *
434
+ * @returns `true` if the tool was disabled and is now re-enabled;
435
+ * `false` if the tool was not disabled.
436
+ */
437
+ enable(name) {
438
+ if (!this._disabled.has(name)) return false;
439
+ this._disabled.delete(name);
440
+ this._version++;
441
+ return true;
442
+ }
443
+ /**
444
+ * Re-enable ALL currently disabled tools at once. Returns the number
445
+ * of tools that were re-enabled.
446
+ */
447
+ enableAll() {
448
+ const count = this._disabled.size;
449
+ if (count === 0) return 0;
450
+ this._disabled.clear();
451
+ this._version++;
452
+ return count;
453
+ }
454
+ /**
455
+ * Re-enable only the tools that were disabled by the auto-thinning
456
+ * pipeline (`reason === 'auto-thinned'` in `disabledToolMeta`). Manual
457
+ * user disables are preserved. Returns the names that were re-enabled.
458
+ */
459
+ enableAutoThinned() {
460
+ const restored = [];
461
+ for (const [name, meta] of this._disabled) {
462
+ if (meta.reason === "auto-thinned") {
463
+ this._disabled.delete(name);
464
+ restored.push(name);
465
+ }
466
+ }
467
+ if (restored.length > 0) this._version++;
468
+ return restored;
469
+ }
470
+ /**
471
+ * Check whether a tool is currently disabled.
472
+ */
473
+ isDisabled(name) {
474
+ return this._disabled.has(name);
475
+ }
476
+ /** Return the audit-trail metadata for a disabled tool, if any. */
477
+ disabledMeta(name) {
478
+ return this._disabled.get(name);
479
+ }
480
+ /**
481
+ * Apply a list of tool names to disable. Tools not in the registry
482
+ * are silently ignored so config can reference future tools without
483
+ * error. Returns the number of tools actually disabled. Always
484
+ * tagged `reason: 'user'` — the auto-thinning pipeline uses
485
+ * `thinUnderused()` instead.
486
+ */
487
+ applyDisabled(names) {
488
+ let count = 0;
489
+ for (const name of names) {
490
+ if (this.disable(name, "user")) count++;
491
+ }
492
+ return count;
493
+ }
494
+ /**
495
+ * Apply the audit-trail metadata for a previously-disabled tool.
496
+ * Used at boot to restore `disabledToolMeta` (so the auto-thinned
497
+ * decision survives a restart). Does NOT mutate the disabled set
498
+ * itself — pair with `applyDisabled()` on the same names.
499
+ */
500
+ applyDisabledMeta(meta) {
501
+ let count = 0;
502
+ const at = Date.now();
503
+ for (const [name, entry] of Object.entries(meta)) {
504
+ if (!this._disabled.has(name)) continue;
505
+ this._disabled.set(name, { ...entry, at: entry.at ?? at });
506
+ count++;
507
+ }
508
+ if (count > 0) this._version++;
509
+ return count;
510
+ }
511
+ /**
512
+ * Disable every name in `candidates` that is currently registered and
513
+ * not already disabled, tagged with `reason: 'auto-thinned'`. Emits
514
+ * a `tool.thinned` event with the names that actually flipped.
515
+ *
516
+ * @returns `{ thinned, skipped }` so the caller can persist the
517
+ * decision to `disabledToolMeta` and report what was changed.
518
+ */
519
+ thinUnderused(candidates, caller) {
520
+ const thinned = [];
521
+ const skipped = [];
522
+ const at = Date.now();
523
+ for (const name of candidates) {
524
+ if (!this.tools.has(name)) {
525
+ skipped.push(name);
526
+ continue;
527
+ }
528
+ if (this._disabled.has(name)) {
529
+ skipped.push(name);
530
+ continue;
531
+ }
532
+ this._disabled.set(name, { reason: "auto-thinned", at, caller });
533
+ thinned.push(name);
534
+ }
535
+ if (thinned.length > 0) {
536
+ this._version++;
537
+ this._events?.emit("tool.thinned", { names: thinned, reason: caller, at });
538
+ }
539
+ return { thinned, skipped };
540
+ }
541
+ /**
542
+ * Return the list of all disabled tool entries (tool + owner + reason).
543
+ * Useful for the /tools slash command to show disabled tools alongside
544
+ * enabled ones, and for `/tool autothin status` to count the auto-thinned subset.
545
+ */
546
+ listDisabled() {
547
+ const out = [];
548
+ for (const [name, meta] of this._disabled) {
549
+ const entry = this.tools.get(name);
550
+ if (!entry) continue;
551
+ out.push({ tool: entry.tool, owner: entry.owner, meta });
552
+ }
553
+ return out;
554
+ }
555
+ list() {
556
+ if (this._listSnapshot && this._version === this._listSnapshotVersion) {
557
+ return this._listSnapshot;
558
+ }
559
+ const arr = Array.from(this.tools.entries()).filter(([name]) => !this._disabled.has(name)).map(([, entry]) => entry.tool);
560
+ this._listSnapshot = arr;
561
+ this._listSnapshotVersion = this._version;
562
+ return arr;
563
+ }
564
+ /** Replace the direct provider surface. Pass `undefined` to expose the catalog. */
565
+ setProviderToolNames(names) {
566
+ this._providerToolNames = names ? new Set(names) : void 0;
567
+ this._version++;
568
+ }
569
+ /** Add registered or future tool names to the direct provider surface. */
570
+ exposeToProvider(names) {
571
+ if (!this._providerToolNames) return;
572
+ for (const name of typeof names === "string" ? [names] : names) {
573
+ this._providerToolNames.add(name);
574
+ }
575
+ this._version++;
576
+ }
577
+ /** Tools serialized into provider requests and described by the system prompt. */
578
+ listForProvider() {
579
+ if (!this._providerToolNames) return this.list();
580
+ if (this._providerListSnapshot && this._version === this._providerListSnapshotVersion) {
581
+ return this._providerListSnapshot;
582
+ }
583
+ const arr = Array.from(this.tools.entries()).filter(([name]) => !this._disabled.has(name) && this._providerToolNames?.has(name) === true).map(([, entry]) => entry.tool);
584
+ this._providerListSnapshot = arr;
585
+ this._providerListSnapshotVersion = this._version;
586
+ return arr;
587
+ }
588
+ /**
589
+ * Whether an enabled catalog tool is part of the direct provider surface.
590
+ *
591
+ * This is intentionally different from `get()`/`list()`: a tool can remain
592
+ * executable through a lazy gateway while its schema is omitted from the
593
+ * next provider request. Disabled and unknown tools always return false.
594
+ */
595
+ isExposedToProvider(name) {
596
+ if (this._disabled.has(name) || !this.tools.has(name)) return false;
597
+ return this._providerToolNames?.has(name) ?? true;
598
+ }
599
+ /**
600
+ * Group tools by their `category` field. Tools without a category
601
+ * are placed under the key `""` (empty string). Returns a Map of
602
+ * category → tools, sorted by registration order within each category.
603
+ */
604
+ listByCategory() {
605
+ const map = /* @__PURE__ */ new Map();
606
+ for (const [name, { tool }] of this.tools) {
607
+ if (this._disabled.has(name)) continue;
608
+ const cat = tool.category ?? "";
609
+ let group = map.get(cat);
610
+ if (!group) {
611
+ group = [];
612
+ map.set(cat, group);
613
+ }
614
+ group.push(tool);
615
+ }
616
+ return map;
617
+ }
618
+ listWithOwner() {
619
+ return Array.from(this.tools.entries()).filter(([name]) => !this._disabled.has(name)).map(([, entry]) => entry);
620
+ }
621
+ clear() {
622
+ this.tools.clear();
623
+ this.descriptionModes.clear();
624
+ this._disabled.clear();
625
+ this._providerToolNames = void 0;
626
+ this._version++;
627
+ }
628
+ /**
629
+ * Return a new ToolRegistry with the same registered tools and owners.
630
+ * Useful for creating filtered copies in multi-agent scenarios.
631
+ */
632
+ clone() {
633
+ const copy = new _ToolRegistry();
634
+ copy.descriptionModes.clear();
635
+ for (const [name, mode] of this.descriptionModes) {
636
+ copy.descriptionModes.set(name, mode);
637
+ }
638
+ for (const [name, { tool, owner }] of this.tools) {
639
+ copy.tools.set(name, { tool, owner });
640
+ }
641
+ for (const [name, meta] of this._disabled) {
642
+ copy._disabled.set(name, { ...meta });
643
+ }
644
+ copy._providerToolNames = this._providerToolNames ? new Set(this._providerToolNames) : void 0;
645
+ copy._version = this._version;
646
+ return copy;
647
+ }
648
+ };
649
+
650
+ export {
651
+ ProviderRegistry,
652
+ SlashCommandRegistry,
653
+ ToolRegistry
654
+ };
655
+ //# sourceMappingURL=chunk-TCCHINEF.js.map