@songsid/agend 2.1.12 → 2.2.0-alpha.2

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/README.md +4 -2
  2. package/README.zh-TW.md +4 -2
  3. package/dist/agent-cli.js +6 -1
  4. package/dist/agent-cli.js.map +1 -1
  5. package/dist/agent-endpoint.js +68 -12
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/agent-token-header.d.ts +13 -0
  8. package/dist/agent-token-header.js +16 -0
  9. package/dist/agent-token-header.js.map +1 -0
  10. package/dist/auth/one-time-code.d.ts +19 -0
  11. package/dist/auth/one-time-code.js +49 -0
  12. package/dist/auth/one-time-code.js.map +1 -0
  13. package/dist/auth-api.d.ts +52 -0
  14. package/dist/auth-api.js +346 -0
  15. package/dist/auth-api.js.map +1 -0
  16. package/dist/backend/antigravity.js +4 -3
  17. package/dist/backend/antigravity.js.map +1 -1
  18. package/dist/backend/claude-code.d.ts +4 -0
  19. package/dist/backend/claude-code.js +97 -0
  20. package/dist/backend/claude-code.js.map +1 -1
  21. package/dist/backend/codex.js +59 -30
  22. package/dist/backend/codex.js.map +1 -1
  23. package/dist/backend/grok.js +1 -1
  24. package/dist/backend/grok.js.map +1 -1
  25. package/dist/backend/kiro-agent.d.ts +66 -0
  26. package/dist/backend/kiro-agent.js +302 -0
  27. package/dist/backend/kiro-agent.js.map +1 -0
  28. package/dist/backend/kiro-identity.d.ts +80 -0
  29. package/dist/backend/kiro-identity.js +537 -0
  30. package/dist/backend/kiro-identity.js.map +1 -0
  31. package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
  32. package/dist/backend/kiro-v2-store-worker.js +87 -0
  33. package/dist/backend/kiro-v2-store-worker.js.map +1 -0
  34. package/dist/backend/kiro-v2-store.d.ts +54 -0
  35. package/dist/backend/kiro-v2-store.js +131 -0
  36. package/dist/backend/kiro-v2-store.js.map +1 -0
  37. package/dist/backend/kiro-v3-identity.d.ts +5 -0
  38. package/dist/backend/kiro-v3-identity.js +22 -0
  39. package/dist/backend/kiro-v3-identity.js.map +1 -1
  40. package/dist/backend/kiro.d.ts +90 -7
  41. package/dist/backend/kiro.js +500 -124
  42. package/dist/backend/kiro.js.map +1 -1
  43. package/dist/backend/muse.js +1 -1
  44. package/dist/backend/muse.js.map +1 -1
  45. package/dist/backend/types.d.ts +51 -3
  46. package/dist/backend/types.js.map +1 -1
  47. package/dist/cache-analysis.d.ts +92 -0
  48. package/dist/cache-analysis.js +147 -0
  49. package/dist/cache-analysis.js.map +1 -0
  50. package/dist/cache-ledger.d.ts +108 -0
  51. package/dist/cache-ledger.js +230 -0
  52. package/dist/cache-ledger.js.map +1 -0
  53. package/dist/cache-prices.d.ts +32 -0
  54. package/dist/cache-prices.js +73 -0
  55. package/dist/cache-prices.js.map +1 -0
  56. package/dist/cache-scan.d.ts +39 -0
  57. package/dist/cache-scan.js +115 -0
  58. package/dist/cache-scan.js.map +1 -0
  59. package/dist/cache-service.d.ts +115 -0
  60. package/dist/cache-service.js +417 -0
  61. package/dist/cache-service.js.map +1 -0
  62. package/dist/channel/adapters/discord.d.ts +1 -0
  63. package/dist/channel/adapters/discord.js +29 -10
  64. package/dist/channel/adapters/discord.js.map +1 -1
  65. package/dist/channel/adapters/telegram.d.ts +1 -0
  66. package/dist/channel/adapters/telegram.js +13 -1
  67. package/dist/channel/adapters/telegram.js.map +1 -1
  68. package/dist/channel/types.d.ts +9 -1
  69. package/dist/classic-channel-manager.d.ts +18 -10
  70. package/dist/classic-channel-manager.js +45 -18
  71. package/dist/classic-channel-manager.js.map +1 -1
  72. package/dist/cli-entry.d.ts +19 -0
  73. package/dist/cli-entry.js +36 -0
  74. package/dist/cli-entry.js.map +1 -0
  75. package/dist/cli.js +471 -146
  76. package/dist/cli.js.map +1 -1
  77. package/dist/command-table.d.ts +5 -3
  78. package/dist/command-table.js +29 -27
  79. package/dist/command-table.js.map +1 -1
  80. package/dist/config-validator.js +46 -0
  81. package/dist/config-validator.js.map +1 -1
  82. package/dist/config.js +12 -0
  83. package/dist/config.js.map +1 -1
  84. package/dist/connection-secrets.d.ts +6 -0
  85. package/dist/connection-secrets.js +4 -0
  86. package/dist/connection-secrets.js.map +1 -1
  87. package/dist/daemon.d.ts +95 -4
  88. package/dist/daemon.js +748 -111
  89. package/dist/daemon.js.map +1 -1
  90. package/dist/darwin-memory.d.ts +6 -1
  91. package/dist/darwin-memory.js +17 -6
  92. package/dist/darwin-memory.js.map +1 -1
  93. package/dist/delivery-consumed-watch.d.ts +85 -0
  94. package/dist/delivery-consumed-watch.js +244 -0
  95. package/dist/delivery-consumed-watch.js.map +1 -0
  96. package/dist/delivery-outbox.d.ts +61 -0
  97. package/dist/delivery-outbox.js +120 -2
  98. package/dist/delivery-outbox.js.map +1 -1
  99. package/dist/delivery-reconciliation.d.ts +14 -5
  100. package/dist/delivery-reconciliation.js +27 -4
  101. package/dist/delivery-reconciliation.js.map +1 -1
  102. package/dist/delivery-reconciliation.test.js +35 -1
  103. package/dist/delivery-reconciliation.test.js.map +1 -1
  104. package/dist/event-log.d.ts +4 -1
  105. package/dist/event-log.js +6 -3
  106. package/dist/event-log.js.map +1 -1
  107. package/dist/event-loop-watch.d.ts +28 -0
  108. package/dist/event-loop-watch.js +75 -3
  109. package/dist/event-loop-watch.js.map +1 -1
  110. package/dist/fleet-context.d.ts +22 -2
  111. package/dist/fleet-control-audit.d.ts +5 -0
  112. package/dist/fleet-control-audit.js +7 -0
  113. package/dist/fleet-control-audit.js.map +1 -1
  114. package/dist/fleet-level-config.d.ts +2 -2
  115. package/dist/fleet-level-config.js +28 -1
  116. package/dist/fleet-level-config.js.map +1 -1
  117. package/dist/fleet-manager.d.ts +339 -12
  118. package/dist/fleet-manager.js +2623 -461
  119. package/dist/fleet-manager.js.map +1 -1
  120. package/dist/full-restart.js +2 -3
  121. package/dist/full-restart.js.map +1 -1
  122. package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
  123. package/dist/host-memory.d.ts +4 -0
  124. package/dist/host-memory.js.map +1 -1
  125. package/dist/install-lock.d.ts +49 -0
  126. package/dist/install-lock.js +200 -0
  127. package/dist/install-lock.js.map +1 -0
  128. package/dist/instance-config-impact.js +8 -2
  129. package/dist/instance-config-impact.js.map +1 -1
  130. package/dist/instance-lifecycle.d.ts +10 -5
  131. package/dist/instance-lifecycle.js +162 -53
  132. package/dist/instance-lifecycle.js.map +1 -1
  133. package/dist/locale.js +164 -16
  134. package/dist/locale.js.map +1 -1
  135. package/dist/login-controller.d.ts +2 -0
  136. package/dist/login-controller.js +17 -5
  137. package/dist/login-controller.js.map +1 -1
  138. package/dist/memory-pressure.d.ts +7 -8
  139. package/dist/memory-pressure.js +76 -15
  140. package/dist/memory-pressure.js.map +1 -1
  141. package/dist/monotonic-budget.d.ts +2 -0
  142. package/dist/monotonic-budget.js +28 -0
  143. package/dist/monotonic-budget.js.map +1 -0
  144. package/dist/needs-you-hub.d.ts +114 -0
  145. package/dist/needs-you-hub.js +370 -0
  146. package/dist/needs-you-hub.js.map +1 -0
  147. package/dist/needs-you-live.d.ts +116 -0
  148. package/dist/needs-you-live.js +228 -0
  149. package/dist/needs-you-live.js.map +1 -0
  150. package/dist/needs-you.d.ts +132 -0
  151. package/dist/needs-you.js +164 -0
  152. package/dist/needs-you.js.map +1 -0
  153. package/dist/node-version-guard.d.ts +30 -0
  154. package/dist/node-version-guard.js +50 -0
  155. package/dist/node-version-guard.js.map +1 -0
  156. package/dist/operator-control-paths.d.ts +4 -0
  157. package/dist/operator-control-paths.js +24 -0
  158. package/dist/operator-control-paths.js.map +1 -0
  159. package/dist/outbound-handlers.d.ts +2 -0
  160. package/dist/outbound-handlers.js +9 -2
  161. package/dist/outbound-handlers.js.map +1 -1
  162. package/dist/outbound-schemas.d.ts +5 -5
  163. package/dist/outbound-schemas.js +1 -1
  164. package/dist/outbound-schemas.js.map +1 -1
  165. package/dist/package-preimage.d.ts +26 -0
  166. package/dist/package-preimage.js +96 -0
  167. package/dist/package-preimage.js.map +1 -0
  168. package/dist/profile-control.js +4 -20
  169. package/dist/profile-control.js.map +1 -1
  170. package/dist/public-web-gateway.d.ts +18 -0
  171. package/dist/public-web-gateway.js +141 -0
  172. package/dist/public-web-gateway.js.map +1 -0
  173. package/dist/public-web-link.d.ts +53 -0
  174. package/dist/public-web-link.js +175 -0
  175. package/dist/public-web-link.js.map +1 -0
  176. package/dist/quickstart-api.d.ts +8 -1
  177. package/dist/quickstart-api.js +86 -48
  178. package/dist/quickstart-api.js.map +1 -1
  179. package/dist/quickstart.d.ts +1 -0
  180. package/dist/quickstart.js +16 -6
  181. package/dist/quickstart.js.map +1 -1
  182. package/dist/restart-guard.d.ts +52 -0
  183. package/dist/restart-guard.js +109 -0
  184. package/dist/restart-guard.js.map +1 -0
  185. package/dist/scheduler/db.d.ts +7 -1
  186. package/dist/scheduler/db.js +44 -2
  187. package/dist/scheduler/db.js.map +1 -1
  188. package/dist/scheduler/index.d.ts +1 -1
  189. package/dist/scheduler/retry-label.d.ts +11 -0
  190. package/dist/scheduler/retry-label.js +24 -0
  191. package/dist/scheduler/retry-label.js.map +1 -0
  192. package/dist/scheduler/scheduler.d.ts +55 -2
  193. package/dist/scheduler/scheduler.js +220 -8
  194. package/dist/scheduler/scheduler.js.map +1 -1
  195. package/dist/scheduler/types.d.ts +22 -0
  196. package/dist/scheduler/types.js.map +1 -1
  197. package/dist/secret-store.d.ts +5 -0
  198. package/dist/secret-store.js +20 -0
  199. package/dist/secret-store.js.map +1 -1
  200. package/dist/service-activation.d.ts +152 -0
  201. package/dist/service-activation.js +407 -0
  202. package/dist/service-activation.js.map +1 -0
  203. package/dist/service-installer.d.ts +63 -1
  204. package/dist/service-installer.js +141 -16
  205. package/dist/service-installer.js.map +1 -1
  206. package/dist/service-plan.d.ts +65 -0
  207. package/dist/service-plan.js +108 -0
  208. package/dist/service-plan.js.map +1 -0
  209. package/dist/service-restart-selection.d.ts +6 -5
  210. package/dist/service-restart-selection.js +6 -5
  211. package/dist/service-restart-selection.js.map +1 -1
  212. package/dist/settings-api.d.ts +10 -2
  213. package/dist/settings-api.js +216 -72
  214. package/dist/settings-api.js.map +1 -1
  215. package/dist/settings-baseline.d.ts +20 -0
  216. package/dist/settings-baseline.js +104 -0
  217. package/dist/settings-baseline.js.map +1 -0
  218. package/dist/settings-change.d.ts +21 -0
  219. package/dist/settings-change.js +161 -0
  220. package/dist/settings-change.js.map +1 -0
  221. package/dist/settings-confirmation.d.ts +105 -0
  222. package/dist/settings-confirmation.js +232 -0
  223. package/dist/settings-confirmation.js.map +1 -0
  224. package/dist/settings-control.d.ts +41 -0
  225. package/dist/settings-control.js +294 -0
  226. package/dist/settings-control.js.map +1 -0
  227. package/dist/settings-effect.d.ts +24 -0
  228. package/dist/settings-effect.js +169 -0
  229. package/dist/settings-effect.js.map +1 -0
  230. package/dist/settings-http-confirmation.d.ts +29 -0
  231. package/dist/settings-http-confirmation.js +123 -0
  232. package/dist/settings-http-confirmation.js.map +1 -0
  233. package/dist/settings-instance-patch.d.ts +4 -0
  234. package/dist/settings-instance-patch.js +26 -0
  235. package/dist/settings-instance-patch.js.map +1 -0
  236. package/dist/settings-request-capability.d.ts +16 -0
  237. package/dist/settings-request-capability.js +32 -0
  238. package/dist/settings-request-capability.js.map +1 -0
  239. package/dist/settings-transaction.d.ts +65 -0
  240. package/dist/settings-transaction.js +223 -0
  241. package/dist/settings-transaction.js.map +1 -0
  242. package/dist/setup-auth.d.ts +10 -18
  243. package/dist/setup-auth.js +14 -38
  244. package/dist/setup-auth.js.map +1 -1
  245. package/dist/setup-form.d.ts +1 -1
  246. package/dist/setup-form.js +75 -18
  247. package/dist/setup-form.js.map +1 -1
  248. package/dist/setup-guide.d.ts +13 -0
  249. package/dist/setup-guide.js +25 -0
  250. package/dist/setup-guide.js.map +1 -0
  251. package/dist/setup-host.d.ts +16 -0
  252. package/dist/setup-host.js +199 -35
  253. package/dist/setup-host.js.map +1 -1
  254. package/dist/setup-wizard.js +5 -1
  255. package/dist/setup-wizard.js.map +1 -1
  256. package/dist/slash-authz.d.ts +17 -3
  257. package/dist/slash-authz.js +5 -0
  258. package/dist/slash-authz.js.map +1 -1
  259. package/dist/spawn-gate.js +3 -3
  260. package/dist/spawn-gate.js.map +1 -1
  261. package/dist/sqlite-open-errors.d.ts +12 -0
  262. package/dist/sqlite-open-errors.js +13 -0
  263. package/dist/sqlite-open-errors.js.map +1 -0
  264. package/dist/statusline-watcher.d.ts +5 -0
  265. package/dist/statusline-watcher.js +2 -0
  266. package/dist/statusline-watcher.js.map +1 -1
  267. package/dist/steer-capability.d.ts +6 -0
  268. package/dist/steer-capability.js +8 -0
  269. package/dist/steer-capability.js.map +1 -1
  270. package/dist/sync-work-attribution.d.ts +14 -0
  271. package/dist/sync-work-attribution.js +43 -8
  272. package/dist/sync-work-attribution.js.map +1 -1
  273. package/dist/tips.js +10 -5
  274. package/dist/tips.js.map +1 -1
  275. package/dist/tmux-control.d.ts +57 -5
  276. package/dist/tmux-control.js +379 -61
  277. package/dist/tmux-control.js.map +1 -1
  278. package/dist/tmux-manager.d.ts +20 -6
  279. package/dist/tmux-manager.js +90 -47
  280. package/dist/tmux-manager.js.map +1 -1
  281. package/dist/tmux-read.d.ts +59 -0
  282. package/dist/tmux-read.js +213 -0
  283. package/dist/tmux-read.js.map +1 -0
  284. package/dist/topic-commands.d.ts +21 -10
  285. package/dist/topic-commands.js +205 -63
  286. package/dist/topic-commands.js.map +1 -1
  287. package/dist/transcript-delta-reader.js +2 -1
  288. package/dist/transcript-delta-reader.js.map +1 -1
  289. package/dist/tunnel/cloudflared-install.d.ts +2 -0
  290. package/dist/tunnel/cloudflared-install.js +1 -1
  291. package/dist/tunnel/cloudflared-install.js.map +1 -1
  292. package/dist/tunnel/purpose-lane.d.ts +14 -0
  293. package/dist/tunnel/purpose-lane.js +43 -0
  294. package/dist/tunnel/purpose-lane.js.map +1 -0
  295. package/dist/turn-reply-guard.d.ts +2 -0
  296. package/dist/turn-reply-guard.js +10 -1
  297. package/dist/turn-reply-guard.js.map +1 -1
  298. package/dist/types.d.ts +33 -0
  299. package/dist/ui/app.html +18 -0
  300. package/dist/ui/chat-commands.js +43 -0
  301. package/dist/ui/chat-render.js +478 -0
  302. package/dist/ui/chat-store.js +318 -0
  303. package/dist/ui/chat-strings.js +89 -0
  304. package/dist/ui/chat-thread.js +246 -0
  305. package/dist/ui/chat-tour.js +116 -0
  306. package/dist/ui/fleet-cache.js +168 -0
  307. package/dist/ui/fleet-org.js +142 -0
  308. package/dist/ui/panel-chat.js +504 -0
  309. package/dist/ui/panel-fleet.js +427 -0
  310. package/dist/ui/panel-needs.js +202 -0
  311. package/dist/ui/panel-settings.js +754 -0
  312. package/dist/ui/preview-panel.js +202 -0
  313. package/dist/ui/preview.js +270 -0
  314. package/dist/ui/settings-apply.js +239 -0
  315. package/dist/ui/settings-confirm.js +186 -0
  316. package/dist/ui/settings-dialogs.js +546 -0
  317. package/dist/ui/settings-model.js +277 -0
  318. package/dist/ui/settings-strings.js +654 -0
  319. package/dist/ui/settings-wizard.js +140 -0
  320. package/dist/ui/shared/agend-auth.js +93 -0
  321. package/dist/ui/shared/app-ctx.js +80 -0
  322. package/dist/ui/shared/app-html.js +9 -0
  323. package/dist/ui/shared/app-i18n.js +95 -0
  324. package/dist/ui/shared/app-nav.js +73 -0
  325. package/dist/ui/shared/app-needs.js +114 -0
  326. package/dist/ui/shared/app-route.js +73 -0
  327. package/dist/ui/shared/app-session.js +66 -0
  328. package/dist/ui/shared/app-shell.js +346 -0
  329. package/dist/ui/shared/app-store.js +51 -0
  330. package/dist/ui/shared/app-stream.js +201 -0
  331. package/dist/ui/shared/app.css +820 -0
  332. package/dist/ui/shared/app.js +88 -0
  333. package/dist/ui/shared/fonts/OFL.txt +92 -0
  334. package/dist/ui/shared/fonts/README.md +21 -0
  335. package/dist/ui/shared/fonts/inter.woff2 +0 -0
  336. package/dist/ui/shared/htm.module.js +1 -0
  337. package/dist/ui/shared/panel-view.js +655 -0
  338. package/dist/ui/shared/preact-hooks.module.js +2 -0
  339. package/dist/ui/shared/preact.module.js +2 -0
  340. package/dist/ui/shared/signin.js +142 -0
  341. package/dist/ui/shared/theme.js +29 -0
  342. package/dist/ui/shared/tokens.css +153 -0
  343. package/dist/ui/shared/ui-confirm.js +43 -0
  344. package/dist/ui/shared/ui-dialog.js +45 -0
  345. package/dist/ui/shared/ui-icons.js +63 -0
  346. package/dist/ui/shared/ui-menu.js +39 -0
  347. package/dist/ui/shared/ui-states.js +20 -0
  348. package/dist/ui/shared/ui-toast.js +18 -0
  349. package/dist/ui/shared/vendor/htm.LICENSE +202 -0
  350. package/dist/ui/shared/vendor/preact.LICENSE +21 -0
  351. package/dist/ui/shared/vendor/vendor.json +39 -0
  352. package/dist/ui/shared/view-strings.js +309 -0
  353. package/dist/ui/signin.html +52 -0
  354. package/dist/update-check.d.ts +6 -2
  355. package/dist/update-check.js +12 -3
  356. package/dist/update-check.js.map +1 -1
  357. package/dist/update-dispatch.d.ts +28 -0
  358. package/dist/update-dispatch.js +73 -0
  359. package/dist/update-dispatch.js.map +1 -0
  360. package/dist/update-install.d.ts +129 -0
  361. package/dist/update-install.js +262 -0
  362. package/dist/update-install.js.map +1 -0
  363. package/dist/upgrade-notices.d.ts +17 -0
  364. package/dist/upgrade-notices.js +93 -0
  365. package/dist/upgrade-notices.js.map +1 -0
  366. package/dist/usage/statusline-usage.d.ts +2 -0
  367. package/dist/usage/statusline-usage.js +14 -10
  368. package/dist/usage/statusline-usage.js.map +1 -1
  369. package/dist/view-api.d.ts +6 -1
  370. package/dist/view-api.js +62 -51
  371. package/dist/view-api.js.map +1 -1
  372. package/dist/web-api.d.ts +85 -14
  373. package/dist/web-api.js +557 -77
  374. package/dist/web-api.js.map +1 -1
  375. package/dist/web-auth.d.ts +71 -27
  376. package/dist/web-auth.js +169 -69
  377. package/dist/web-auth.js.map +1 -1
  378. package/dist/web-body.d.ts +3 -0
  379. package/dist/web-body.js +55 -0
  380. package/dist/web-body.js.map +1 -0
  381. package/dist/web-channel-echo.d.ts +9 -0
  382. package/dist/web-channel-echo.js +55 -0
  383. package/dist/web-channel-echo.js.map +1 -0
  384. package/dist/web-chat-history.d.ts +125 -0
  385. package/dist/web-chat-history.js +184 -0
  386. package/dist/web-chat-history.js.map +1 -0
  387. package/dist/web-commands.d.ts +77 -0
  388. package/dist/web-commands.js +81 -0
  389. package/dist/web-commands.js.map +1 -0
  390. package/dist/web-continuation.d.ts +7 -0
  391. package/dist/web-continuation.js +22 -0
  392. package/dist/web-continuation.js.map +1 -0
  393. package/dist/web-host-guard.d.ts +34 -0
  394. package/dist/web-host-guard.js +57 -1
  395. package/dist/web-host-guard.js.map +1 -1
  396. package/dist/web-login.d.ts +72 -0
  397. package/dist/web-login.js +132 -0
  398. package/dist/web-login.js.map +1 -0
  399. package/dist/web-org.d.ts +55 -0
  400. package/dist/web-org.js +67 -0
  401. package/dist/web-org.js.map +1 -0
  402. package/dist/web-preview.d.ts +77 -0
  403. package/dist/web-preview.js +240 -0
  404. package/dist/web-preview.js.map +1 -0
  405. package/dist/web-request-context.d.ts +10 -0
  406. package/dist/web-request-context.js +13 -0
  407. package/dist/web-request-context.js.map +1 -0
  408. package/dist/web-session.d.ts +167 -0
  409. package/dist/web-session.js +389 -0
  410. package/dist/web-session.js.map +1 -0
  411. package/dist/web-shell-routes.d.ts +59 -0
  412. package/dist/web-shell-routes.js +96 -0
  413. package/dist/web-shell-routes.js.map +1 -0
  414. package/dist/web-upload.d.ts +183 -0
  415. package/dist/web-upload.js +468 -0
  416. package/dist/web-upload.js.map +1 -0
  417. package/dist/website-tips-renderer.d.ts +2 -2
  418. package/dist/website-tips-renderer.js +3 -3
  419. package/dist/website-tips-renderer.js.map +1 -1
  420. package/launcher/agend +110 -0
  421. package/launcher/agend-agent +110 -0
  422. package/launcher/agend-agent.cjs +4 -0
  423. package/launcher/agend.cjs +4 -0
  424. package/launcher/install-admission.cjs +105 -0
  425. package/launcher/launch.cjs +64 -0
  426. package/launcher/postinstall.cjs +114 -0
  427. package/launcher/run-in-process.cjs +13 -0
  428. package/launcher/runtime-platform.cjs +86 -0
  429. package/launcher/runtime-select.cjs +217 -0
  430. package/package.json +18 -7
  431. package/scripts/preinstall-guard.cjs +55 -0
  432. package/templates/launchd.plist.ejs +2 -2
  433. package/templates/systemd.service.ejs +1 -1
  434. package/dist/ui/dashboard.html +0 -774
  435. package/dist/ui/settings.html +0 -2165
  436. package/dist/ui/view.html +0 -1139
@@ -0,0 +1,468 @@
1
+ /**
2
+ * Files in the web chat (web track C2): what a browser may upload, where it goes, and which files the
3
+ * dashboard may fetch back.
4
+ *
5
+ * Telegram parity: a photo or document a user sends reaches the agent exactly as a Telegram one does —
6
+ * the file in the instance's workspace inbox, a `[📷 Image: <path>]` / `[📎 File: <name> → <path>]`
7
+ * line in the text and `image_path` / `attachment_path` in the meta. The files an agent attaches to
8
+ * its reply are shown in the web chat too.
9
+ *
10
+ * Nothing the client says about a file is trusted: the type is read from the bytes (magic numbers, or
11
+ * valid UTF-8 without NUL for text), the stored name is chosen here, the display name is reduced to a
12
+ * label, and a file can be fetched back only by an id this process issued for it — never by a path.
13
+ */
14
+ import { randomBytes } from "node:crypto";
15
+ import { constants as fsConstants, closeSync, existsSync, fstatSync, lstatSync, mkdirSync, openSync, readdirSync, readSync, realpathSync, renameSync, statSync, unlinkSync, writeFileSync } from "node:fs";
16
+ import { basename, dirname, extname, join } from "node:path";
17
+ export const UPLOAD_LIMITS = {
18
+ /** One file. */
19
+ maxFileBytes: 10 * 1024 * 1024,
20
+ /** Files on one message. */
21
+ maxFiles: 5,
22
+ /** All files on one message together. */
23
+ maxTotalBytes: 25 * 1024 * 1024,
24
+ };
25
+ /** How long an uploaded file waits to be sent with a message before its id stops working. */
26
+ export const UPLOAD_TTL_MS = 30 * 60 * 1000;
27
+ /** An upload no message has taken yet is stored under this prefix; it drops the prefix when a message takes it. */
28
+ export const PENDING_PREFIX = "web-pending-";
29
+ function sentPath(p) { const b = basename(p); return b.startsWith(PENDING_PREFIX) ? join(dirname(p), "web-" + b.slice(PENDING_PREFIX.length)) : p; }
30
+ function pendingPath(p) { const b = basename(p); return b.startsWith("web-") && !b.startsWith(PENDING_PREFIX) ? join(dirname(p), PENDING_PREFIX + b.slice(4)) : p; }
31
+ /** The largest file the dashboard will serve back (a reply attachment can be anything the agent made). */
32
+ export const MAX_SERVED_BYTES = 50 * 1024 * 1024;
33
+ /** Text files keep a known extension from their name; anything else is stored as .txt. */
34
+ const TEXT_EXTENSIONS = new Set([
35
+ ".txt", ".md", ".csv", ".tsv", ".json", ".log", ".yaml", ".yml", ".xml", ".html", ".css",
36
+ ".js", ".ts", ".tsx", ".jsx", ".py", ".rb", ".go", ".rs", ".java", ".kt", ".c", ".h", ".cpp", ".sh", ".sql", ".toml", ".ini", ".diff", ".patch",
37
+ ]);
38
+ const startsWith = (b, sig, at = 0) => sig.every((v, i) => b[at + i] === v);
39
+ /**
40
+ * The type of an upload, from its bytes. Images by signature (PNG, JPEG, GIF, WebP), PDF by `%PDF-`,
41
+ * text when it is valid UTF-8 with no NUL byte. Everything else is refused — no executable, archive or
42
+ * office format is guessed at.
43
+ */
44
+ export function sniffUpload(bytes, name) {
45
+ if (bytes.length === 0)
46
+ return null;
47
+ if (startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))
48
+ return { kind: "photo", mime: "image/png", ext: ".png" };
49
+ if (startsWith(bytes, [0xff, 0xd8, 0xff]))
50
+ return { kind: "photo", mime: "image/jpeg", ext: ".jpg" };
51
+ if (startsWith(bytes, [0x47, 0x49, 0x46, 0x38]))
52
+ return { kind: "photo", mime: "image/gif", ext: ".gif" };
53
+ if (startsWith(bytes, [0x52, 0x49, 0x46, 0x46]) && startsWith(bytes, [0x57, 0x45, 0x42, 0x50], 8))
54
+ return { kind: "photo", mime: "image/webp", ext: ".webp" };
55
+ if (startsWith(bytes, [0x25, 0x50, 0x44, 0x46, 0x2d]))
56
+ return { kind: "document", mime: "application/pdf", ext: ".pdf" };
57
+ if (bytes.includes(0))
58
+ return null;
59
+ try {
60
+ new TextDecoder("utf-8", { fatal: true }).decode(bytes);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ const ext = extname(name).toLowerCase();
66
+ return { kind: "document", mime: "text/plain; charset=utf-8", ext: TEXT_EXTENSIONS.has(ext) ? ext : ".txt" };
67
+ }
68
+ /** A file name as a label only: no directory, no control characters, no leading dots, bounded. */
69
+ export function displayName(raw, fallback) {
70
+ let s = String(raw ?? "");
71
+ try {
72
+ s = decodeURIComponent(s);
73
+ }
74
+ catch { /* keep as sent */ }
75
+ s = basename(s.replace(/\\/g, "/"));
76
+ // eslint-disable-next-line no-control-regex
77
+ s = s.replace(/[\u0000-\u001f\u007f\u2028\u2029\u202a-\u202e\u2066-\u2069]/g, "").replace(/^\.+/, "").trim();
78
+ // Bounded by code point, never by UTF-16 unit: cutting between the halves of an emoji left a lone surrogate,
79
+ // which encodeURIComponent refuses with a throw — in the download header, on the fleet's own loop (#1252 review).
80
+ const points = Array.from(s);
81
+ if (points.length > 100)
82
+ s = points.slice(0, 100).join("");
83
+ return wellFormed(s) || fallback;
84
+ }
85
+ /** Any lone surrogate replaced by U+FFFD, so the name always encodes. */
86
+ export function wellFormed(s) {
87
+ return s.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "\uFFFD");
88
+ }
89
+ const ID_PATTERN = /^[0-9a-f]{32}$/;
90
+ export const isFileId = (id) => ID_PATTERN.test(id);
91
+ const MIME_BY_EXT = {
92
+ ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".gif": "image/gif", ".webp": "image/webp",
93
+ ".pdf": "application/pdf", ".txt": "text/plain; charset=utf-8", ".md": "text/plain; charset=utf-8",
94
+ ".csv": "text/plain; charset=utf-8", ".json": "text/plain; charset=utf-8", ".log": "text/plain; charset=utf-8",
95
+ };
96
+ /** Images the browser may show inline; everything else is served as a download. */
97
+ export const INLINE_MIME = new Set(["image/png", "image/jpeg", "image/gif", "image/webp"]);
98
+ /**
99
+ * Uploads waiting for their message, and every file the dashboard may fetch back. In memory: ids from
100
+ * before a restart stop working (the files stay in the inbox, where the agent got them).
101
+ */
102
+ export class WebFileLedger {
103
+ uploads = new Map();
104
+ /** The file each upload was written as (device + inode): a rename moves only that file (#1304 review). */
105
+ written = new WeakMap();
106
+ served = new Map();
107
+ now;
108
+ maxServed;
109
+ constructor(opts = {}) {
110
+ // Elapsed time, like the sweep timer below: a wall-clock jump must neither expire an upload early nor keep
111
+ // one past the timer that was meant to remove it (#1252 review).
112
+ this.now = opts.now ?? (() => performance.now());
113
+ this.maxServed = opts.maxServed ?? 2000;
114
+ }
115
+ /**
116
+ * Store an upload in `inboxDir` under a name chosen here and register it. The directory is made
117
+ * private (0700), the file 0600, written exclusively (never over an existing file).
118
+ */
119
+ storeUpload(input) {
120
+ mkdirSync(input.inboxDir, { recursive: true, mode: 0o700 });
121
+ const id = randomBytes(16).toString("hex");
122
+ // Stored as web-pending-…: the name says on disk that no message has taken it yet, so a sweep after a restart
123
+ // (which loses this ledger) can still tell an abandoned upload from one an agent got (#1273).
124
+ const path = join(input.inboxDir, `${PENDING_PREFIX}${Date.now()}-${id.slice(0, 8)}${input.type.ext}`);
125
+ writeFileSync(path, input.bytes, { mode: 0o600, flag: "wx" });
126
+ const entry = {
127
+ id, instance: input.instance, path, kind: input.type.kind, mime: input.type.mime,
128
+ name: displayName(input.name, "file"), size: input.bytes.length, expiresAt: this.now() + UPLOAD_TTL_MS, state: "pending",
129
+ };
130
+ const st = lstatSync(path);
131
+ this.written.set(entry, { dev: st.dev, ino: st.ino });
132
+ this.prune();
133
+ this.uploads.set(id, entry);
134
+ this.registerServed({ id, path, name: entry.name, mime: entry.mime, instance: entry.instance, kind: entry.kind });
135
+ // If no message takes it in time, the file goes when its id does, without waiting for the next upload.
136
+ const sweep = setTimeout(() => this.prune(), UPLOAD_TTL_MS + 1_000);
137
+ sweep.unref?.();
138
+ return entry;
139
+ }
140
+ /**
141
+ * The uploads a message names, all or nothing: each must exist, belong to this instance, not be
142
+ * expired and be waiting for a message; together within the per-message limits. On success they are
143
+ * RESERVED for this message — no other message can take them, no sweep removes them — until the caller
144
+ * says how the delivery went: commit() when it was delivered, release() when it definitely was not.
145
+ */
146
+ takeForMessage(instance, ids) {
147
+ if (ids.length > UPLOAD_LIMITS.maxFiles)
148
+ return { ok: false, error: `at most ${UPLOAD_LIMITS.maxFiles} files per message` };
149
+ if (new Set(ids).size !== ids.length)
150
+ return { ok: false, error: "the same file twice" };
151
+ const entries = [];
152
+ let total = 0;
153
+ for (const id of ids) {
154
+ const e = isFileId(id) ? this.uploads.get(id) : undefined;
155
+ if (!e || e.state !== "pending" || e.instance !== instance || this.now() >= e.expiresAt) {
156
+ return { ok: false, error: "an attached file is unknown, expired, already sent, or for another chat — attach it again" };
157
+ }
158
+ total += e.size;
159
+ entries.push(e);
160
+ }
161
+ if (total > UPLOAD_LIMITS.maxTotalBytes)
162
+ return { ok: false, error: `the files together are over ${UPLOAD_LIMITS.maxTotalBytes / 1024 / 1024} MB` };
163
+ // Each file gets its sent name now, before the delivery names it to the agent; all or nothing.
164
+ const moved = [];
165
+ for (const e of entries) {
166
+ if (!this.rename(e, sentPath(e.path))) {
167
+ for (const m of moved)
168
+ this.rename(m, pendingPath(m.path));
169
+ return { ok: false, error: "an attached file could not be prepared — attach it again" };
170
+ }
171
+ moved.push(e);
172
+ }
173
+ for (const e of entries)
174
+ e.state = "reserved";
175
+ return { ok: true, entries };
176
+ }
177
+ /** Move an upload's file (same directory) and keep what is served for its id on the new path. */
178
+ rename(e, to) {
179
+ // Only the regular file this ledger wrote moves (#1304 review): something swapped in on disk — a symlink,
180
+ // a directory, another file (by inode) — is refused, never renamed and never resolved. Checked even when the
181
+ // name is already right (a retry after a release that could not rename back): that is still a take.
182
+ if (!this.isWritten(e, e.path))
183
+ return false;
184
+ if (to === e.path)
185
+ return true;
186
+ try {
187
+ renameSync(e.path, to);
188
+ }
189
+ catch {
190
+ return false;
191
+ }
192
+ // And the same file arrived (a swap between the check and the rename): otherwise put it back and refuse.
193
+ try {
194
+ if (!this.isWritten(e, to))
195
+ throw new Error("swapped");
196
+ }
197
+ catch {
198
+ try {
199
+ renameSync(to, e.path);
200
+ }
201
+ catch { /* left under the other name: read() still refuses it */ }
202
+ return false;
203
+ }
204
+ e.path = to;
205
+ // The served path moves by NAME only, in the directory it was registered in: never realpath() the new name,
206
+ // which would bind the id to whatever a link points at. read() still opens it O_NOFOLLOW and re-checks size.
207
+ const served = this.served.get(e.id);
208
+ if (served)
209
+ served.realPath = join(dirname(served.realPath), basename(to));
210
+ return true;
211
+ }
212
+ /** Is the file at `p` the one this ledger wrote for `e` (regular, same size, same device + inode)? */
213
+ isWritten(e, p) {
214
+ const written = this.written.get(e);
215
+ try {
216
+ const st = lstatSync(p);
217
+ return !!written && st.isFile() && st.size === e.size && st.dev === written.dev && st.ino === written.ino;
218
+ }
219
+ catch {
220
+ return false;
221
+ }
222
+ }
223
+ /** The files this process still owns — waiting for a message or on their way: a sweep must not touch them. */
224
+ ownedPaths() {
225
+ const out = new Set();
226
+ for (const e of this.uploads.values())
227
+ if (e.state !== "sent")
228
+ out.add(e.path);
229
+ return out;
230
+ }
231
+ /** The reserved uploads were delivered: they are the agent's now. */
232
+ commit(entries) {
233
+ for (const e of entries)
234
+ if (this.uploads.get(e.id) === e && e.state === "reserved")
235
+ e.state = "sent";
236
+ }
237
+ /**
238
+ * The delivery definitely did not happen: the uploads wait for a message again, and the user can retry with the
239
+ * same ids. One whose window closed meanwhile is removed now (file and id) — its sweep has already run.
240
+ */
241
+ release(entries) {
242
+ for (const e of entries) {
243
+ if (this.uploads.get(e.id) !== e || e.state !== "reserved")
244
+ continue;
245
+ e.state = "pending";
246
+ this.rename(e, pendingPath(e.path)); // back to "not taken" on disk (if this fails it reads as sent: kept 7 days)
247
+ }
248
+ this.prune();
249
+ }
250
+ /**
251
+ * Make a file fetchable by id (an upload, or a file an agent attached to its reply). The path is
252
+ * resolved now and must be a regular file within the size limit; null when it is not.
253
+ */
254
+ registerServed(input) {
255
+ let realPath;
256
+ let size;
257
+ let dev;
258
+ let ino;
259
+ try {
260
+ realPath = realpathSync(input.path);
261
+ const st = statSync(realPath);
262
+ if (!st.isFile() || st.size > MAX_SERVED_BYTES)
263
+ return null;
264
+ ({ size, dev, ino } = st);
265
+ }
266
+ catch {
267
+ return null;
268
+ }
269
+ const ext = extname(realPath).toLowerCase();
270
+ const mime = input.mime ?? MIME_BY_EXT[ext] ?? "application/octet-stream";
271
+ const file = {
272
+ id: input.id ?? randomBytes(16).toString("hex"),
273
+ realPath, size, dev, ino, mime, instance: input.instance,
274
+ name: displayName(input.name ?? basename(realPath), "file"),
275
+ kind: input.kind ?? (INLINE_MIME.has(mime) ? "photo" : "document"),
276
+ };
277
+ this.served.set(file.id, file);
278
+ while (this.served.size > this.maxServed)
279
+ this.served.delete(this.served.keys().next().value);
280
+ return file;
281
+ }
282
+ /**
283
+ * The bytes of a served file, re-checked at read time: opened without following a symlink, still a
284
+ * regular file, still the file (device + inode) and size it was registered with. Null when any of that fails.
285
+ */
286
+ read(id) {
287
+ const file = isFileId(id) ? this.served.get(id) : undefined;
288
+ if (!file)
289
+ return null;
290
+ let fd = null;
291
+ try {
292
+ fd = openSync(file.realPath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
293
+ const st = fstatSync(fd);
294
+ if (!st.isFile() || st.size !== file.size || st.dev !== file.dev || st.ino !== file.ino)
295
+ return null;
296
+ const bytes = Buffer.alloc(st.size);
297
+ let off = 0;
298
+ while (off < st.size) {
299
+ const n = readSync(fd, bytes, off, st.size - off, off);
300
+ if (n <= 0)
301
+ break;
302
+ off += n;
303
+ }
304
+ return off === st.size ? { file, bytes } : null;
305
+ }
306
+ catch {
307
+ return null;
308
+ }
309
+ finally {
310
+ if (fd !== null)
311
+ closeSync(fd);
312
+ }
313
+ }
314
+ /** Forget an instance's files (it was deleted). The files themselves are its workspace's to remove. */
315
+ forget(instance) {
316
+ for (const [id, e] of this.uploads)
317
+ if (e.instance === instance)
318
+ this.uploads.delete(id);
319
+ for (const [id, f] of this.served)
320
+ if (f.instance === instance)
321
+ this.served.delete(id);
322
+ }
323
+ /**
324
+ * Drop what is done with. A sent upload leaves the list (the agent has it; the file stays in the inbox, as one
325
+ * from Telegram does). One that expired before any message took it was never seen by anyone but this ledger:
326
+ * its file is deleted with its id, so abandoned uploads do not pile up in the workspace.
327
+ */
328
+ prune() {
329
+ const now = this.now();
330
+ for (const [id, e] of this.uploads) {
331
+ if (e.state === "sent") {
332
+ this.uploads.delete(id);
333
+ continue;
334
+ }
335
+ if (e.state === "reserved" || now < e.expiresAt)
336
+ continue;
337
+ // Only the file this ledger wrote: something swapped in under its name is not ours to delete.
338
+ if (this.isWritten(e, e.path))
339
+ try {
340
+ unlinkSync(e.path);
341
+ }
342
+ catch { /* already gone */ }
343
+ this.uploads.delete(id);
344
+ this.served.delete(id);
345
+ }
346
+ }
347
+ }
348
+ /**
349
+ * The text and meta an agent gets for a message with files — the same tags and keys a Telegram
350
+ * message produces (attachment-handler.ts), so agents need nothing new.
351
+ */
352
+ export function attachmentDelivery(message, entries) {
353
+ const photos = entries.filter(e => e.kind === "photo");
354
+ const docs = entries.filter(e => e.kind === "document");
355
+ const meta = {};
356
+ const lines = [];
357
+ if (photos.length) {
358
+ meta.image_path = photos[0].path;
359
+ if (photos.length > 1)
360
+ meta.image_paths = photos.map(p => p.path).join(",");
361
+ for (const p of photos)
362
+ lines.push(`[📷 Image: ${p.path}]`);
363
+ }
364
+ if (docs.length) {
365
+ meta.attachment_path = docs[0].path;
366
+ if (docs.length > 1)
367
+ meta.attachment_paths = docs.map(d => d.path).join(",");
368
+ for (const d of docs)
369
+ lines.push(`[📎 File: ${d.name} → ${d.path}]`);
370
+ }
371
+ return { text: lines.length ? `${lines.join("\n")}\n${message}` : message, meta };
372
+ }
373
+ /** What the chat shows for a file: never the path. */
374
+ export function publicAttachment(f) {
375
+ return { id: f.id, kind: f.kind, name: f.name, size: f.size, mime: f.mime };
376
+ }
377
+ /** Linux names an open directory by its descriptor: a path through it cannot be redirected by a renamed parent. */
378
+ const PROC_FD = process.platform === "linux" ? "/proc/self/fd" : null;
379
+ /**
380
+ * At fleet startup (#1273): the ledger of uploads waiting for a message lives in memory, so after a restart an
381
+ * upload no message took is nobody's — its id is gone. Remove each such file (named web-pending-…) in every
382
+ * workspace inbox once it is older than the upload window. Files a message took (web-…, no "pending") are the
383
+ * agent's and follow the inbox's ordinary 7-day rotation, exactly like a file from Telegram; nothing else in an
384
+ * inbox is ever touched here.
385
+ *
386
+ * Age is the file's mtime against the wall clock — the only clock a file has. A future mtime (the clock was set
387
+ * back) counts as just written, never as a negative age, so it is kept and looked at again later; a clock set
388
+ * forward can only remove an upload early, and after a restart none of them can be sent anyway. The uploads this
389
+ * process holds (`owned`, by inbox path) are skipped: their window is the ledger's elapsed time, not a file's mtime.
390
+ * Returns how many were removed and, when younger ones remain, in how long the next one comes due.
391
+ */
392
+ export function sweepOrphanedUploads(workspacesDir, nowMs = Date.now(), ttlMs = UPLOAD_TTL_MS, owned = new Set()) {
393
+ let deleted = 0;
394
+ let nextDueInMs = null;
395
+ let workspaces;
396
+ let root;
397
+ try {
398
+ if (!existsSync(workspacesDir))
399
+ return { deleted, nextDueInMs };
400
+ root = realpathSync(workspacesDir);
401
+ workspaces = readdirSync(root);
402
+ }
403
+ catch {
404
+ return { deleted, nextDueInMs };
405
+ }
406
+ for (const ws of workspaces) {
407
+ // Only real directories inside the workspaces tree (#1304 review): a workspace or an inbox that is a symlink
408
+ // could lead the sweep to delete files anywhere it points.
409
+ const wsDir = join(root, ws);
410
+ const inbox = join(wsDir, "inbox");
411
+ let fd = null;
412
+ try {
413
+ if (!lstatSync(wsDir).isDirectory() || !lstatSync(inbox).isDirectory())
414
+ continue;
415
+ // Pin the inbox: opened as a directory, then checked to be the in-tree one. A parent swapped for a link after
416
+ // this cannot redirect the deletes, which go through the open directory where the platform allows it.
417
+ fd = openSync(inbox, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);
418
+ const pinned = fstatSync(fd);
419
+ const here = lstatSync(inbox);
420
+ if (realpathSync(inbox) !== inbox || pinned.dev !== here.dev || pinned.ino !== here.ino)
421
+ continue;
422
+ const anchor = PROC_FD && existsSync(`${PROC_FD}/${fd}`) ? `${PROC_FD}/${fd}` : inbox;
423
+ const stillPinned = () => {
424
+ if (anchor !== inbox)
425
+ return true;
426
+ const now = lstatSync(inbox);
427
+ return now.isDirectory() && now.dev === pinned.dev && now.ino === pinned.ino && realpathSync(inbox) === inbox;
428
+ };
429
+ for (const f of readdirSync(anchor)) {
430
+ if (!f.startsWith(PENDING_PREFIX))
431
+ continue;
432
+ // An upload this process holds is governed by its ledger (elapsed time), never by this wall-clock sweep.
433
+ if (owned.has(join(inbox, f)))
434
+ continue;
435
+ const full = join(anchor, f);
436
+ try {
437
+ const st = lstatSync(full); // a symlink is not one of ours: never followed, never removed
438
+ if (!st.isFile())
439
+ continue;
440
+ const age = Math.max(0, nowMs - st.mtimeMs);
441
+ if (age >= ttlMs) {
442
+ if (!stillPinned())
443
+ break;
444
+ unlinkSync(full);
445
+ deleted++;
446
+ continue;
447
+ }
448
+ const due = ttlMs - age;
449
+ if (nextDueInMs === null || due < nextDueInMs)
450
+ nextDueInMs = due;
451
+ }
452
+ catch { /* vanished or unreadable: leave it */ }
453
+ }
454
+ }
455
+ catch {
456
+ continue;
457
+ }
458
+ finally {
459
+ if (fd !== null)
460
+ try {
461
+ closeSync(fd);
462
+ }
463
+ catch { /* closed */ }
464
+ }
465
+ }
466
+ return { deleted, nextDueInMs };
467
+ }
468
+ //# sourceMappingURL=web-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-upload.js","sourceRoot":"","sources":["../src/web-upload.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ export declare const COPY: {
13
13
  readonly en: {
14
14
  readonly lang: "en";
15
15
  readonly description: "Practical AgEnD guidance, from first chat to fleet operations.";
16
- readonly intro: "300 practical notes, grouped from everyday use to advanced fleet operations.";
16
+ readonly intro: "{0} practical notes, grouped from everyday use to advanced fleet operations.";
17
17
  readonly switchLabel: "繁體中文";
18
18
  readonly switchHref: "./tips-zh.html";
19
19
  readonly home: "Home";
@@ -27,7 +27,7 @@ export declare const COPY: {
27
27
  readonly zh: {
28
28
  readonly lang: "zh-TW";
29
29
  readonly description: "從第一次對話到 Fleet 維運的 AgEnD 實用提示。";
30
- readonly intro: "300 條實用提示,從日常操作一路整理到進階 Fleet 維運。";
30
+ readonly intro: "{0} 條實用提示,從日常操作一路整理到進階 Fleet 維運。";
31
31
  readonly switchLabel: "English";
32
32
  readonly switchHref: "./tips-en.html";
33
33
  readonly home: "首頁";
@@ -12,7 +12,7 @@ export const COPY = {
12
12
  en: {
13
13
  lang: "en",
14
14
  description: "Practical AgEnD guidance, from first chat to fleet operations.",
15
- intro: "300 practical notes, grouped from everyday use to advanced fleet operations.",
15
+ intro: "{0} practical notes, grouped from everyday use to advanced fleet operations.",
16
16
  switchLabel: "繁體中文",
17
17
  switchHref: "./tips-zh.html",
18
18
  home: "Home",
@@ -26,7 +26,7 @@ export const COPY = {
26
26
  zh: {
27
27
  lang: "zh-TW",
28
28
  description: "從第一次對話到 Fleet 維運的 AgEnD 實用提示。",
29
- intro: "300 條實用提示,從日常操作一路整理到進階 Fleet 維運。",
29
+ intro: "{0} 條實用提示,從日常操作一路整理到進階 Fleet 維運。",
30
30
  switchLabel: "English",
31
31
  switchHref: "./tips-en.html",
32
32
  home: "首頁",
@@ -127,7 +127,7 @@ export function renderPage(tips, locale) {
127
127
  <body>
128
128
  <nav><div class="nav-inner"><a class="brand" href="./">AgEnD</a><div class="nav-actions"><a href="./">${escapeHtml(copy.home)}</a><a href="${copy.switchHref}" hreflang="${locale === "zh" ? "en" : "zh-TW"}">${escapeHtml(copy.switchLabel)}</a></div></div></nav>
129
129
  <main>
130
- <header class="hero"><span class="kicker">Knowledge library</span><h1>AgEnD Tips</h1><p>${escapeHtml(copy.intro)}</p><div class="jump-links">${LEVELS.map(level => `<a href="#${level}">${escapeHtml(copy.levels[level][0])}</a>`).join("")}</div></header>
130
+ <header class="hero"><span class="kicker">Knowledge library</span><h1>AgEnD Tips</h1><p>${escapeHtml(copy.intro.replace("{0}", String(tips.length)))}</p><div class="jump-links">${LEVELS.map(level => `<a href="#${level}">${escapeHtml(copy.levels[level][0])}</a>`).join("")}</div></header>
131
131
  ${sections}
132
132
  </main>
133
133
  <footer><div class="footer-inner"><span><strong>AgEnD</strong> · Multi-Agent, One Conversation</span><span>Generated from <code>src/tips.ts</code></span></div></footer>
@@ -1 +1 @@
1
- {"version":3,"file":"website-tips-renderer.js","sourceRoot":"","sources":["../src/website-tips-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAU,CAAC;AAGxE,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,gEAAgE;QAC7E,KAAK,EAAE,8EAA8E;QACrF,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,gBAAgB;QAC5B,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC,UAAU,EAAE,iCAAiC,CAAC;YACzD,YAAY,EAAE,CAAC,cAAc,EAAE,sCAAsC,CAAC;YACtE,QAAQ,EAAE,CAAC,UAAU,EAAE,iDAAiD,CAAC;SAC1E;KACF;IACD,EAAE,EAAE;QACF,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,+BAA+B;QAC5C,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,gBAAgB;QAC5B,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;YAC7B,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC;YACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC;SAChC;KACF;CACO,CAAC;AAEX,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAUD,MAAM,UAAU,SAAS,CAAC,GAAQ,EAAE,MAAc;IAChD,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;IACzD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,6DAA6D,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,OAAO,iCAAiC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,GAAG,CAAC,KAAK;uCACnF,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;iBAC/D,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM;qBACzB,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAW,EAAE,MAAc;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,qCAAqC,KAAK;;;kCAGnB,UAAU,CAAC,KAAK,CAAC;gBACnC,UAAU,CAAC,OAAO,CAAC;eACpB,UAAU,CAAC,QAAQ,CAAC;;oCAEC,SAAS,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;;UAGpE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;;eAE1D,CAAC;IACd,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;cACK,IAAI,CAAC,IAAI;;;;;sCAKe,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0GA6CwC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,eAAe,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;;8FAEhJ,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;MACzO,QAAQ;;;;;CAKb,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"website-tips-renderer.js","sourceRoot":"","sources":["../src/website-tips-renderer.ts"],"names":[],"mappings":"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"}