elanous 0.2.9 → 0.2.10

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 (361) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/2DsiDfDCks44g1cPUMhiW/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/24-e6d28380efab7faf.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/3615-740dd270764ffa24.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/3734-1015fe991eb9b7e7.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/5012-a7fe6f3c8b6fe45a.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/5783-ef40ebfc91d55230.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/62-ff227c3edb8b248b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/7633-1b3709b0854c9412.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/7951-8b03dbb10b24cd06.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/8067-87ce253ec2f23697.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{5080-1613752891fcadb4.js → 8195-6fde3d7a39859206.js} +5 -5
  14. package/apps/pwa/out/_next/static/chunks/8894-b5fb36bab837cd29.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/9454-84d0d5d77446bd92.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/988-5f92e7ab7ccea3dd.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/9989-5582582f06429840.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d2253d7e58ef1890.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5441d4a9ab35e518.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/app/board/page-d9b12d680922d980.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-54b32bd27726588d.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/app/bots/page-e268d6d145827a22.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/app/chat/page-f8116559c7424da7.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/app/consult/page-1085399fd0f32112.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/app/control/page-1df686a14f65895a.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/app/design-check/page-54e1f966ab60a4dc.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/app/editor/{page-973996d584f008c1.js → page-7ed95f296f5ee8e9.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/app/exec/page-11edac668d77e5c3.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/app/field/page-59e2b9a22cd5a6d5.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/app/intake/page-2976df21ad74ab48.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/app/layout-34d211a67f16d510.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/app/live/page-8ff652d5d950639b.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/app/market/{page-8b0402a46a749a3d.js → page-b31610deda76337b.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-037f83e2a1edc8e2.js → page-6cb0e1bbefe5fb3d.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/app/morning/page-a286a152cf584576.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/app/not-found-d9237581e7003bcb.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/app/observatory/page-83274e761643fdd2.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ceee6cfb1d4e6d68.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-9c9f8bb3e4a64091.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-c17217603ea3426a.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/app/page-efb6177cbf1e8a51.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/app/reflection/page-d307523703bc4df3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-462f4e4bab45ce7d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/app/sessions/page-8990e96f33af3837.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0df30e0c7e50148a.js → page-e168fa1030af0548.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/app/settings/page-1233e05a4068bc9c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-13a1840b1fac337a.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/app/setup/page-64a29fc80b11ab55.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/app/share/page-68e787339a16b3dc.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4fddc90b23feb215.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/tasks/page-886ba8260dc79c79.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/term/page-0f26507a1722e40b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/today/page-109d4ccd42259c9d.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/trace/page-f5c2a4e510726774.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/vault/page-b2e0039416f42522.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-90670589b87abea8.js → page-26102fd7350f171e.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/app/workflows/page-708948bc8a802794.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/workspace/page-5e5611620f78fb0b.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/worktrees/{page-35bedde6d885f08f.js → page-139ba5c367bbf60a.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/main-app-202b4e81f33895ea.js +1 -0
  61. package/apps/pwa/out/_next/static/css/43feca5fd387dcbd.css +1 -0
  62. package/apps/pwa/out/approvals/index.html +1 -1
  63. package/apps/pwa/out/approvals/index.txt +14 -14
  64. package/apps/pwa/out/autopilot/index.html +1 -1
  65. package/apps/pwa/out/autopilot/index.txt +14 -14
  66. package/apps/pwa/out/board/index.html +1 -1
  67. package/apps/pwa/out/board/index.txt +14 -14
  68. package/apps/pwa/out/botlab/index.html +1 -1
  69. package/apps/pwa/out/botlab/index.txt +14 -14
  70. package/apps/pwa/out/bots/index.html +1 -1
  71. package/apps/pwa/out/bots/index.txt +14 -14
  72. package/apps/pwa/out/chat/index.html +1 -1
  73. package/apps/pwa/out/chat/index.txt +14 -14
  74. package/apps/pwa/out/consult/index.html +1 -1
  75. package/apps/pwa/out/consult/index.txt +14 -14
  76. package/apps/pwa/out/control/index.html +1 -1
  77. package/apps/pwa/out/control/index.txt +14 -14
  78. package/apps/pwa/out/design-check/index.html +1 -1
  79. package/apps/pwa/out/design-check/index.txt +14 -14
  80. package/apps/pwa/out/editor/index.html +1 -1
  81. package/apps/pwa/out/editor/index.txt +14 -14
  82. package/apps/pwa/out/exec/index.html +1 -1
  83. package/apps/pwa/out/exec/index.txt +14 -14
  84. package/apps/pwa/out/field/index.html +1 -1
  85. package/apps/pwa/out/field/index.txt +14 -14
  86. package/apps/pwa/out/healthz +1 -1
  87. package/apps/pwa/out/index.html +1 -1
  88. package/apps/pwa/out/index.txt +14 -14
  89. package/apps/pwa/out/intake/index.html +1 -1
  90. package/apps/pwa/out/intake/index.txt +14 -14
  91. package/apps/pwa/out/live/index.html +1 -1
  92. package/apps/pwa/out/live/index.txt +14 -14
  93. package/apps/pwa/out/market/index.html +1 -1
  94. package/apps/pwa/out/market/index.txt +14 -14
  95. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  96. package/apps/pwa/out/missions/placeholder/index.txt +14 -14
  97. package/apps/pwa/out/morning/index.html +1 -1
  98. package/apps/pwa/out/morning/index.txt +14 -14
  99. package/apps/pwa/out/observatory/index.html +1 -1
  100. package/apps/pwa/out/observatory/index.txt +14 -14
  101. package/apps/pwa/out/ops/checklist/index.html +1 -1
  102. package/apps/pwa/out/ops/checklist/index.txt +14 -14
  103. package/apps/pwa/out/ops/release/index.html +1 -1
  104. package/apps/pwa/out/ops/release/index.txt +14 -14
  105. package/apps/pwa/out/ops/seats/index.html +1 -0
  106. package/apps/pwa/out/ops/seats/index.txt +30 -0
  107. package/apps/pwa/out/reflection/index.html +1 -1
  108. package/apps/pwa/out/reflection/index.txt +15 -15
  109. package/apps/pwa/out/scheduler/index.html +1 -1
  110. package/apps/pwa/out/scheduler/index.txt +14 -14
  111. package/apps/pwa/out/sessions/index.html +1 -1
  112. package/apps/pwa/out/sessions/index.txt +14 -14
  113. package/apps/pwa/out/settings/devices/index.html +1 -1
  114. package/apps/pwa/out/settings/devices/index.txt +14 -14
  115. package/apps/pwa/out/settings/index.html +1 -1
  116. package/apps/pwa/out/settings/index.txt +14 -14
  117. package/apps/pwa/out/setup/done/index.html +1 -1
  118. package/apps/pwa/out/setup/done/index.txt +14 -14
  119. package/apps/pwa/out/setup/index.html +1 -1
  120. package/apps/pwa/out/setup/index.txt +14 -14
  121. package/apps/pwa/out/share/index.html +1 -1
  122. package/apps/pwa/out/share/index.txt +14 -14
  123. package/apps/pwa/out/showroom/index.html +1 -1
  124. package/apps/pwa/out/showroom/index.txt +14 -14
  125. package/apps/pwa/out/tasks/index.html +1 -1
  126. package/apps/pwa/out/tasks/index.txt +14 -14
  127. package/apps/pwa/out/term/index.html +1 -1
  128. package/apps/pwa/out/term/index.txt +14 -14
  129. package/apps/pwa/out/today/index.html +1 -0
  130. package/apps/pwa/out/today/index.txt +33 -0
  131. package/apps/pwa/out/trace/index.html +1 -1
  132. package/apps/pwa/out/trace/index.txt +14 -14
  133. package/apps/pwa/out/vault/index.html +1 -1
  134. package/apps/pwa/out/vault/index.txt +14 -14
  135. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  136. package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
  137. package/apps/pwa/out/workflows/index.html +1 -1
  138. package/apps/pwa/out/workflows/index.txt +14 -14
  139. package/apps/pwa/out/workspace/index.html +1 -1
  140. package/apps/pwa/out/workspace/index.txt +14 -14
  141. package/apps/pwa/out/worktrees/index.html +1 -1
  142. package/apps/pwa/out/worktrees/index.txt +14 -14
  143. package/graphs/field/field-feed.yaml +2 -0
  144. package/graphs/implement-loop.yaml +1 -1
  145. package/package.json +1 -1
  146. package/plugins/card-followup/graphs/run-step.ts +48 -13
  147. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  148. package/plugins/doc-draft/graphs/run-step.ts +13 -6
  149. package/scripts/ci-pwa-build-gate.ts +160 -0
  150. package/scripts/coord-channel-watch.sh +42 -8
  151. package/scripts/coord-digest.ts +199 -0
  152. package/scripts/coord-post.sh +60 -3
  153. package/scripts/install.ps1 +68 -9
  154. package/scripts/install.sh +39 -12
  155. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  156. package/scripts/lib/tui-regress-checks.ts +146 -0
  157. package/scripts/memory-lifecycle-cycle.ts +2 -2
  158. package/scripts/ops-now-probe.ts +327 -0
  159. package/scripts/publish-internal-dist.ts +11 -1
  160. package/scripts/release-loop/cutoff.ts +19 -8
  161. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  162. package/scripts/release-loop/release-readiness.ts +9 -0
  163. package/scripts/release-loop/version-node.ts +58 -10
  164. package/scripts/repo-watch-cycle.ts +1 -1
  165. package/scripts/retro-cycle.ts +2 -2
  166. package/scripts/schedule-health-report.ts +1 -1
  167. package/scripts/storyboard/storyboard.ts +5 -161
  168. package/scripts/test-diet/lib.ts +30 -1
  169. package/scripts/test-diet/node.ts +82 -7
  170. package/scripts/test-timeout-audit.ts +114 -0
  171. package/scripts/tree-sync-alert.ts +1 -1
  172. package/scripts/tui-regress.ts +71 -0
  173. package/scripts/waitlist-daily-digest.ts +1 -1
  174. package/skills/explainer-video/SKILL.md +4 -0
  175. package/skills/explainer-video/engine/reel.mjs +18 -13
  176. package/skills/explainer-video/engine/reel.sh +24 -5
  177. package/skills/explainer-video/engine/stitch.mjs +145 -0
  178. package/skills/pitch-deck/SKILL.md +36 -0
  179. package/skills/pitch-deck/template.html +80 -0
  180. package/src/acp/codex-approval-adapter.ts +9 -3
  181. package/src/acp/core-turn-bridge.ts +117 -18
  182. package/src/acp/fact-question.ts +11 -0
  183. package/src/acp/server.ts +48 -7
  184. package/src/acp/tool-approval.ts +126 -0
  185. package/src/acp/turn-runner.ts +36 -0
  186. package/src/agent/monad-agent-turn.ts +8 -0
  187. package/src/ask-user-question/pending-questions.ts +25 -10
  188. package/src/ask-user-question/types.ts +9 -0
  189. package/src/auth/setup-link-tokens.ts +16 -5
  190. package/src/autopilot/build/integrity-gate.ts +12 -0
  191. package/src/boot/daemon-prompt-turn.ts +3 -0
  192. package/src/boot/daemon-tools/index.ts +8 -0
  193. package/src/boot/daemon-tools/types.ts +2 -0
  194. package/src/boot/daemon-tools/web-search.ts +1 -0
  195. package/src/chat/ctrl-c-in-input.ts +14 -0
  196. package/src/chat/index.ts +52 -0
  197. package/src/chat/pickers/state.ts +6 -2
  198. package/src/cli/agent-cli.ts +7 -0
  199. package/src/cli/decisions-cli.ts +25 -3
  200. package/src/cli/doctor-bundle-upload.ts +68 -0
  201. package/src/cli/doctor-cli.ts +38 -4
  202. package/src/cli/ops-cli.ts +20 -0
  203. package/src/cli/pod-cli.ts +49 -0
  204. package/src/cli/pr-cli.ts +31 -2
  205. package/src/cli/pwa-stop.ts +163 -13
  206. package/src/cli/pwa-test.ts +3 -0
  207. package/src/cli/release-cli.ts +63 -20
  208. package/src/cli/self-update.ts +14 -0
  209. package/src/cli/storyboard-cli.ts +37 -0
  210. package/src/cli/test-state-dir-flag.ts +11 -4
  211. package/src/connectors/linear.ts +146 -0
  212. package/src/context-bus/coord-events.ts +115 -0
  213. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  214. package/src/dashboard/index.ts +58 -21
  215. package/src/dashboard/slash-runtime/dashboard-handlers.ts +7 -0
  216. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  217. package/src/decisions/decision-cards.ts +49 -1
  218. package/src/decisions/decision-ledger.ts +75 -4
  219. package/src/decisions/decision-linear-projection.ts +157 -0
  220. package/src/decisions/web-push-decision-cards.ts +50 -0
  221. package/src/directive/interpretation-card.ts +36 -0
  222. package/src/discord.ts +2 -1
  223. package/src/domains/coo-admin-tool.ts +62 -0
  224. package/src/domains/core-tools.ts +11 -3
  225. package/src/domains/elanous-card.ts +29 -0
  226. package/src/domains/ops-facts-tool.ts +76 -0
  227. package/src/domains/outbound-alert.ts +41 -13
  228. package/src/domains/release-tool.ts +168 -0
  229. package/src/domains/telegram-kind-route.ts +19 -1
  230. package/src/exec-requests/planner.ts +98 -28
  231. package/src/exec-requests/runner.ts +107 -10
  232. package/src/exec-requests/store.ts +8 -2
  233. package/src/field/field-media.ts +10 -7
  234. package/src/field/field-reel.ts +14 -4
  235. package/src/git-fs/worktree.ts +45 -6
  236. package/src/graph-runner/graph-approval-card.ts +113 -0
  237. package/src/graph-runner/graph-cli.ts +129 -4
  238. package/src/graph-runner/graph-notify.ts +25 -3
  239. package/src/graph-runner/runner.ts +142 -16
  240. package/src/harness/browser-verify.ts +25 -2
  241. package/src/harness/harness-cli-command.ts +231 -35
  242. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  243. package/src/harness/harness-incidents.ts +129 -0
  244. package/src/harness/harness-stop.ts +53 -3
  245. package/src/hitl/clarification-policy.ts +3 -1
  246. package/src/index.ts +156 -37
  247. package/src/intake-plane/author-goals.ts +37 -4
  248. package/src/intake-plane/check.ts +3 -0
  249. package/src/intake-plane/discord-seat-work.ts +47 -2
  250. package/src/intake-plane/seat-doc-route.ts +170 -6
  251. package/src/intake-plane/telegram-seat-work.ts +44 -2
  252. package/src/intake-plane/telegram-work.ts +1 -0
  253. package/src/maturity/cli-maturity.ts +34 -0
  254. package/src/maturity/feature-maturity.ts +98 -1
  255. package/src/maturity/tui-slash-maturity.ts +31 -0
  256. package/src/memory.ts +32 -4
  257. package/src/nexus/api/exec-requests.ts +33 -3
  258. package/src/nexus/api/http-server.ts +53 -1
  259. package/src/nexus/api/meta-api.ts +11 -0
  260. package/src/nexus/api/ops-api.ts +10 -1
  261. package/src/nexus/api/ops-seats-sources.ts +37 -7
  262. package/src/nexus/api/ops-seats.ts +16 -6
  263. package/src/nexus/api/seat-requests.ts +88 -8
  264. package/src/nexus/api/sessions-store.ts +63 -0
  265. package/src/nexus/api/setup-codex-login.ts +160 -0
  266. package/src/nexus/api/usage-api.ts +102 -0
  267. package/src/nexus/index.ts +45 -4
  268. package/src/onboarding/first-run.ts +89 -0
  269. package/src/onboarding/lan-address.ts +45 -0
  270. package/src/onboarding/web-first.ts +119 -24
  271. package/src/onboarding.ts +4 -0
  272. package/src/ops-now/ops-now-refresh.ts +100 -0
  273. package/src/project/project-store.ts +115 -0
  274. package/src/release-loop/checklist.ts +78 -4
  275. package/src/release-loop/feature-store.ts +154 -21
  276. package/src/release-loop/release-schedule.ts +53 -0
  277. package/src/repl/index.ts +7 -0
  278. package/src/seat-dispatch/ceo-commands.ts +41 -8
  279. package/src/seat-dispatch/ceo-intent.ts +38 -0
  280. package/src/seat-loop/seat-loop.ts +231 -0
  281. package/src/seat-loop/seat-report.ts +64 -0
  282. package/src/self-dev/decompose.ts +66 -11
  283. package/src/self-dev/run-store.ts +10 -1
  284. package/src/self-implement/execution-clarification.ts +115 -0
  285. package/src/self-implement/gate-cli.ts +6 -3
  286. package/src/self-implement/orchestrator.ts +37 -3
  287. package/src/self-implement/pipeline-shape.ts +1 -1
  288. package/src/self-implement/run-status-mapping.ts +5 -3
  289. package/src/session/chat.ts +2 -0
  290. package/src/session/index.ts +9 -0
  291. package/src/shell-env-bootstrap.ts +17 -0
  292. package/src/steward/directive.ts +51 -2
  293. package/src/steward/launch.ts +250 -0
  294. package/src/steward/outcome-notify.ts +115 -0
  295. package/src/steward/steward-cards.ts +8 -2
  296. package/src/steward/triage-plan.ts +32 -4
  297. package/src/steward/triage.ts +93 -9
  298. package/src/steward/working-backwards.ts +64 -0
  299. package/src/storyboard/storyboard.ts +141 -0
  300. package/src/task-cards/card-store.ts +2 -2
  301. package/src/task-orchestrator/surfaces/pod-lease.ts +260 -0
  302. package/src/telegram-card-followup.ts +233 -0
  303. package/src/telegram-report.ts +15 -9
  304. package/src/telegram-run.ts +7 -0
  305. package/src/telegram.ts +29 -8
  306. package/src/tool-runtime/types.ts +4 -0
  307. package/src/tui-client/dashboard-session.ts +2 -0
  308. package/src/user-config.ts +118 -11
  309. package/src/version/packed-revision.json +1 -1
  310. package/src/web-push/notify-exec-request.ts +32 -0
  311. package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
  312. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  313. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  314. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  315. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  316. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  317. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  318. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  319. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  320. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  321. package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
  322. package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
  323. package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
  324. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  325. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
  326. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
  327. package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
  328. package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
  329. package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
  330. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
  331. package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
  332. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
  333. package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
  334. package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
  335. package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
  336. package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
  337. package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
  338. package/apps/pwa/out/_next/static/chunks/app/morning/page-adfbd2ba9598e59a.js +0 -1
  339. package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
  340. package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
  341. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
  342. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
  343. package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
  344. package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
  345. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
  346. package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
  347. package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
  348. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
  349. package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
  350. package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
  351. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
  352. package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
  353. package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
  354. package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
  355. package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
  356. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
  357. package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
  358. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  359. package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
  360. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  361. /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → 2DsiDfDCks44g1cPUMhiW}/_ssgManifest.js +0 -0
package/src/telegram.ts CHANGED
@@ -71,6 +71,7 @@ import { effectiveInstanceRoot } from './instance/resolve.js';
71
71
  import { getElanousConfigDir } from './elanous-config-dir.js';
72
72
  import { defaultFieldEvent, FieldUploadError, parseFieldCaption, resolveFieldMime, saveFieldMedia } from './field/field-media.js';
73
73
  import { scheduleFieldReel, type FieldReelOptions } from './field/field-reel.js';
74
+ import { maybeHandleCardPhoto, type CardPhotoDeps } from './telegram-card-followup.js';
74
75
 
75
76
  export type TgAttachmentKind = 'photo' | 'voice' | 'audio' | 'document';
76
77
 
@@ -216,6 +217,8 @@ export interface TelegramBotOpts {
216
217
  fieldRootDir?: () => string;
217
218
  /** 시험에서는 실제 렌더 대신 가짜 실행기를 주입한다. */
218
219
  fieldReel?: FieldReelOptions;
220
+ /** Test seam for the business-card graph and its private run root. */
221
+ cardFollowupDeps?: Pick<CardPhotoDeps, 'runGraph' | 'rootDir' | 'ocrText'>;
219
222
  }
220
223
 
221
224
  /** Surface-unification v2 (FU-2) — Telegram trigger event passed to
@@ -333,10 +336,11 @@ export class TelegramBot {
333
336
  private readonly fieldDefaultEventOpt?: string;
334
337
  private readonly fieldRootDir: () => string;
335
338
  private readonly fieldReel?: FieldReelOptions;
339
+ private readonly cardFollowupDeps: Pick<CardPhotoDeps, 'runGraph' | 'rootDir' | 'ocrText'>;
336
340
  private readonly seatWorkDeps: TelegramSeatWorkDeps;
337
341
  /** 앨범 id → `#현장` 행사 · 답장 디바운스. 태그된 앨범만 들어온다. */
338
342
  private readonly fieldGroups = new Map<string, {
339
- event: string; at: number; chatId: number; threadId?: number; replyTo: number; count: number;
343
+ event: string; mode?: 'instant'; at: number; chatId: number; threadId?: number; replyTo: number; count: number;
340
344
  timer?: ReturnType<typeof setTimeout>;
341
345
  }>();
342
346
 
@@ -368,6 +372,7 @@ export class TelegramBot {
368
372
  this.fieldDefaultEventOpt = opts.fieldDefaultEvent;
369
373
  this.fieldRootDir = opts.fieldRootDir ?? getElanousConfigDir;
370
374
  this.fieldReel = opts.fieldReel;
375
+ this.cardFollowupDeps = opts.cardFollowupDeps ?? {};
371
376
  this.seatWorkDeps = opts.seatWorkDeps ?? {};
372
377
  if (opts.onTriggerTap) {
373
378
  // Assign through `as unknown` to bypass `readonly` + private —
@@ -376,7 +381,7 @@ export class TelegramBot {
376
381
  }
377
382
  }
378
383
 
379
- private isOwnerAllowed(userId: number): boolean {
384
+ isOwnerAllowed(userId: number): boolean {
380
385
  return this.allowedUsers.size > 0 && this.allowedUsers.has(userId);
381
386
  }
382
387
 
@@ -1415,6 +1420,10 @@ export class TelegramBot {
1415
1420
  ? tag.event ?? defaultFieldEvent(
1416
1421
  this.fieldDefaultEventOpt ?? this.slashContext?.userConfig?.telegram?.fieldDefaultEvent, new Date(now))
1417
1422
  : group!.event;
1423
+ const captionMode = tag?.mode ?? group?.mode;
1424
+ const configMode = this.slashContext?.userConfig?.telegram?.fieldReelMode;
1425
+ const mode = captionMode ?? configMode ?? 'standard';
1426
+ const source = captionMode ? 'caption' : configMode ? 'config' : 'default';
1418
1427
 
1419
1428
  let count: number | null = null;
1420
1429
  let failure: string | null = null;
@@ -1435,14 +1444,16 @@ export class TelegramBot {
1435
1444
  // 글(자막)은 캡션이 달린 항목에만 있다 — 앨범이면 첫 장에만 붙는다(MK 2026-09-30).
1436
1445
  const saved = saveFieldMedia(inputs, { rootDir: this.fieldRootDir(), event, device: 'telegram', ...(tag?.text ? { caption: tag.text } : {}) });
1437
1446
  count = saved.count;
1447
+ debug.log('telegram.field', 'reel-mode', { event, mode, source });
1438
1448
  scheduleFieldReel(saved.dir, {
1439
1449
  ...this.fieldReel,
1450
+ mode,
1440
1451
  notificationKey: `telegram:${this.botId}:${ctx.chatId}:${ctx.threadId ?? ''}:${ctx.mediaGroupId ?? ctx.messageId}`,
1441
1452
  onDone: async (result) => {
1442
1453
  const reply = { replyTo: ctx.messageId, threadId: ctx.threadId };
1443
1454
  if (result.ok && result.file) {
1444
1455
  const sent = await this.sendDocument(ctx.chatId, readFileSync(result.file), 'reel-9x16.mp4', {
1445
- ...reply, mimeType: 'video/mp4', caption: `현장 영상 · ${event} · ${result.seconds}초`,
1456
+ ...reply, mimeType: 'video/mp4', caption: `현장 영상 · ${event} · ${result.seconds}초${mode === 'instant' ? ' (즉석판)' : ''}`,
1446
1457
  });
1447
1458
  if (!sent) throw new Error('sendDocument failed');
1448
1459
  if (result.feed?.started) {
@@ -1469,7 +1480,8 @@ export class TelegramBot {
1469
1480
  return true;
1470
1481
  }
1471
1482
  // 앨범은 항목마다 답하지 않는다 — 마지막 항목 뒤 한 번(디바운스)만 최신 수로 답한다.
1472
- const entry = group ?? { event, at: now, chatId: ctx.chatId, threadId: ctx.threadId, replyTo: ctx.messageId, count: 0 };
1483
+ const entry = group ?? { event, mode: tag?.mode, at: now, chatId: ctx.chatId, threadId: ctx.threadId, replyTo: ctx.messageId, count: 0 };
1484
+ if (group && tag?.mode) group.mode = tag.mode;
1473
1485
  entry.at = now;
1474
1486
  entry.count = count!;
1475
1487
  if (entry.timer) clearTimeout(entry.timer);
@@ -1490,10 +1502,18 @@ export class TelegramBot {
1490
1502
  }
1491
1503
  // 현장 업로드 — `#현장` 캡션(또는 태그된 앨범의 나머지)의 사진·영상은 LLM 대신 현장 폴더로.
1492
1504
  if (await this.tryHandleFieldUpload(ctx)) return;
1493
- if (ctx.text.startsWith('@')) {
1505
+ if (await maybeHandleCardPhoto(ctx, {
1506
+ isOwner: (userId) => this.isOwnerAllowed(userId),
1507
+ isFieldAlbum: (id) => this.fieldGroups.has(id),
1508
+ downloadFile: (fileId, dir) => this.downloadFile(fileId, dir),
1509
+ sendMessage: (chatId, text, opts) => this.sendMessage(chatId, text, opts),
1510
+ sendDocument: (chatId, body, filename, opts) => this.sendDocument(chatId, body, filename, opts),
1511
+ ...this.cardFollowupDeps,
1512
+ })) return;
1513
+ if (ctx.text.startsWith('@') || (ctx.isDm && ctx.text && !ctx.text.startsWith('/'))) {
1494
1514
  const reply = await handleTelegramSeatWork(ctx.text, {
1495
- chatId: ctx.chatId, messageId: ctx.messageId, threadId: ctx.threadId, botId: ctx.botId,
1496
- }, this.seatWorkDeps);
1515
+ chatId: ctx.chatId, userId: ctx.userId, messageId: ctx.messageId, threadId: ctx.threadId, botId: ctx.botId,
1516
+ }, { ...this.seatWorkDeps, config: this.seatWorkDeps.config ?? this.slashContext?.userConfig });
1497
1517
  if (reply !== null) {
1498
1518
  await this.sendMessage(ctx.chatId, reply, { replyTo: ctx.messageId, threadId: ctx.threadId });
1499
1519
  return;
@@ -1529,7 +1549,7 @@ export class TelegramBot {
1529
1549
  try {
1530
1550
  const { addDirective } = await import('./steward/directive.js');
1531
1551
  const text = ctx.text.startsWith('지시:') ? ctx.text.slice('지시:'.length) : ctx.text.slice('/directive '.length);
1532
- const result = await addDirective(text, { source: 'telegram' });
1552
+ const result = await addDirective(text, { source: 'telegram', origin: { chatId: ctx.chatId, botId: ctx.botId, threadId: ctx.threadId } });
1533
1553
  await this.sendMessage(ctx.chatId, `${result.issue}: ${result.status}`, { replyTo: ctx.messageId, threadId: ctx.threadId });
1534
1554
  } catch {
1535
1555
  await this.sendMessage(ctx.chatId, '지시 등록 실패 — Linear 연결과 자격을 확인하세요.', { replyTo: ctx.messageId, threadId: ctx.threadId });
@@ -2746,6 +2766,7 @@ export function botFromConfig(opts: BotFromConfigOpts): TelegramBot {
2746
2766
  // (makeTelegramAgentRunTurn) threads it into `delegate_code_agent`
2747
2767
  // so a delegated sub-agent's approval prompt lands back here.
2748
2768
  hitlConfirmChannel: botRef.hitlConfirmChannelForChat(ctx.chatId, ctx.threadId),
2769
+ ...(botRef.isOwnerAllowed(ctx.userId) ? { verifiedOwner: { id: `telegram:${ctx.userId}` } } : {}),
2749
2770
  hitlQuestionChannel: botRef.hitlQuestionChannelForChat(ctx.chatId, ctx.threadId),
2750
2771
  // P1.4 — surface file spill bound to THIS chat so the NL
2751
2772
  // `delegate_code_agent` path spills big diffs/stdout back here.
@@ -91,8 +91,12 @@ export interface ToolRuntimeContext {
91
91
  sessionId?: string;
92
92
  /** Session that originated this execution when it was delegated through another runtime session. */
93
93
  originSessionId?: string;
94
+ /** Server-verified owner principal. Never derive this from session source, tool args, or a client-declared origin. */
95
+ verifiedOwner?: { id: string };
94
96
  /** Server-assigned provenance; omitted on existing owner tool paths. */
95
97
  requestOrigin?: RequestOrigin;
98
+ /** Confirm through the originating chat's channels, not another user's global channel. */
99
+ confirmChannels?: import('../hitl/confirm.js').ConfirmChannel[];
96
100
  }
97
101
 
98
102
  /** Output shape the LLM layer expects back. Most tools produce
@@ -210,6 +210,8 @@ export class DashboardSession {
210
210
  transportFactory: pair.transportFactory,
211
211
  shutdownSignal: shutdownCtrl.signal,
212
212
  runTurn,
213
+ // PCH-2b — the in-process TUI dispatcher carries its own approval modals.
214
+ toolApproval: 'off',
213
215
  ...(opts.agentName ? { agentName: opts.agentName } : {}),
214
216
  ...(opts.agentVersion ? { agentVersion: opts.agentVersion } : {}),
215
217
  ...(opts.serverOptions ?? {}),
@@ -917,6 +917,8 @@ export interface TelegramConfig {
917
917
  kindRoles?: Record<string, string>;
918
918
  /** `#현장` 캡션에 행사 슬러그가 없을 때 쓸 기본 행사(예: `marketers-night-2026-10`). 없으면 `field-<로컬 날짜>`. */
919
919
  fieldDefaultEvent?: string;
920
+ /** `#현장` 영상의 기본 렌더 모드. 미지정 시 standard, 캡션의 `즉석`/`instant` 가 우선. */
921
+ fieldReelMode?: 'standard' | 'instant';
920
922
  }
921
923
 
922
924
  const TELEGRAM_DEFAULTS: TelegramConfig = { enabled: false, allowedUsers: [] };
@@ -982,6 +984,7 @@ const DISCORD_DEFAULTS: DiscordConfig = { enabled: false, allowedUsers: [] };
982
984
 
983
985
  export interface OnboardingConfig {
984
986
  webFirst?: boolean;
987
+ ready?: boolean;
985
988
  completed: boolean;
986
989
  completedAt?: string;
987
990
  version: number;
@@ -1474,6 +1477,7 @@ export function parseErrorReportsConfig(raw: unknown): ErrorReportsConfig | unde
1474
1477
  }
1475
1478
 
1476
1479
  export interface ChatConfig {
1480
+ factQuestion: { maxToolTurns: number };
1477
1481
  /** Short questions may receive a tool-free first reply. Default true. */
1478
1482
  fastPath: boolean;
1479
1483
  conciseness: ChatConcisenessConfig;
@@ -1502,6 +1506,7 @@ const CHAT_CONCISENESS_DEFAULTS: ChatConcisenessConfig = {
1502
1506
  };
1503
1507
 
1504
1508
  export const CHAT_DEFAULTS: ChatConfig = {
1509
+ factQuestion: { maxToolTurns: 6 },
1505
1510
  fastPath: true,
1506
1511
  conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
1507
1512
  toolOutput: {
@@ -1682,6 +1687,8 @@ export interface AcpHopCapConfig {
1682
1687
 
1683
1688
  export interface AcpConfig {
1684
1689
  hopCap: AcpHopCapConfig;
1690
+ /** ACP client permission response deadline (positive integer milliseconds). */
1691
+ toolApproval: { timeoutMs: number };
1685
1692
  /** ACP PR reviewer and final judge backend. Absent defers to DEFAULT_REVIEW_BACKEND. */
1686
1693
  reviewBackend?: string;
1687
1694
  /** Rework agent backend. Absent defers to the driver default (codex). */
@@ -1707,7 +1714,17 @@ export interface AcpConfig {
1707
1714
  scrubBillingEnv: boolean;
1708
1715
  }
1709
1716
 
1710
- const ACP_DEFAULTS: AcpConfig = { hopCap: {}, scrubBillingEnv: true };
1717
+ const ACP_DEFAULTS: AcpConfig = { hopCap: {}, toolApproval: { timeoutMs: 60_000 }, scrubBillingEnv: true };
1718
+
1719
+ function acpApprovalTimeoutMs(value: unknown): number | undefined {
1720
+ return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 && value <= 2_147_483_647
1721
+ ? value : undefined;
1722
+ }
1723
+
1724
+ function acpApprovalTimeoutEnv(): number | undefined {
1725
+ const raw = process.env.ELANOUS_ACP_TOOL_APPROVAL_TIMEOUT_MS;
1726
+ return raw !== undefined && /^\d+$/.test(raw) ? acpApprovalTimeoutMs(Number(raw)) : undefined;
1727
+ }
1711
1728
 
1712
1729
  // ── Plan mode config (Coding Pipeline P4 followup) ───────────────────
1713
1730
  //
@@ -1912,6 +1929,17 @@ function parseOpenDesignConfig(raw: unknown): OpenDesignConfig | undefined {
1912
1929
  return Object.keys(out).length > 0 ? out : undefined;
1913
1930
  }
1914
1931
 
1932
+ export function parseDiagnosticsConfig(raw: unknown): UserConfig['diagnostics'] {
1933
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1934
+ const value = (raw as Record<string, unknown>).uploadUrl;
1935
+ if (typeof value !== 'string' || !value.trim()) return undefined;
1936
+ try {
1937
+ const url = new URL(value.trim());
1938
+ if (url.protocol !== 'https:' || !url.hostname || url.username || url.password) return undefined;
1939
+ return { uploadUrl: url.href };
1940
+ } catch { return undefined; }
1941
+ }
1942
+
1915
1943
  function parseDesignConfig(raw: unknown): DesignConfig | undefined {
1916
1944
  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1917
1945
  const r = raw as Record<string, unknown>;
@@ -3440,16 +3468,27 @@ export type SeatLoopMode = 'off' | 'shadow' | 'on';
3440
3468
  export interface SeatLoopConfig {
3441
3469
  /** No seat actions by default; shadow observes without execution, on permits the seat loop to act. */
3442
3470
  mode: SeatLoopMode;
3471
+ seats?: string[];
3472
+ podPool?: string;
3473
+ reportPr?: number;
3443
3474
  }
3444
3475
 
3445
3476
  export interface UserConfig {
3477
+ /** Explicit HTTPS destination for doctor diagnostics; absent means no upload. */
3478
+ diagnostics?: { uploadUrl?: string };
3479
+ /** Root CLI help audience; absent or invalid means owner. */
3480
+ cli?: { helpRole?: 'owner' | 'contributor' | 'general' };
3481
+ /** Execution-phase HITL answer deadline; absent means 30 minutes. */
3482
+ hitl?: { executionDeadlineMinutes?: number };
3483
+ coo?: { linearProject?: string };
3484
+ decisions?: { linearProjection: { enabled: boolean } };
3446
3485
  /** Steward and seat loops are parsed independently. An absent seat remains off. */
3447
- loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number }; seat?: SeatLoopConfig };
3486
+ loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig };
3448
3487
  /** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
3449
3488
  * budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
3450
- harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string };
3489
+ harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string; worktreeAddTimeoutSec?: number };
3451
3490
  /** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
3452
- pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string };
3491
+ pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string; /** 읽기 전용 Pod lease 권장에 쓰는 계정별 동시 수. */ lease?: { perAccount?: number } };
3453
3492
  skillRouter: SkillRouterConfig;
3454
3493
  llm: LLMConfig;
3455
3494
  skills: SkillsConfig;
@@ -3773,7 +3812,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
3773
3812
 
3774
3813
  function defaultConfig(): UserConfig {
3775
3814
  return {
3776
- loops: { seat: { mode: 'off' } },
3815
+ cli: { helpRole: 'owner' },
3816
+ coo: { linearProject: '외부 행정·큰 일 (COO)' },
3817
+ decisions: { linearProjection: { enabled: false } },
3818
+ loops: { seat: { mode: 'off', seats: ['MK'], podPool: 'pool-node-b@node-b:8' } },
3777
3819
  skillRouter: { ...SR_DEFAULTS },
3778
3820
  llm: { ...LLM_DEFAULTS },
3779
3821
  skills: skillsDefaults(),
@@ -3786,6 +3828,7 @@ function defaultConfig(): UserConfig {
3786
3828
  logs: { retention: { ...LOGS_DEFAULTS.retention } },
3787
3829
  shell: { ...SHELL_DEFAULTS },
3788
3830
  chat: {
3831
+ factQuestion: { ...CHAT_DEFAULTS.factQuestion },
3789
3832
  fastPath: CHAT_DEFAULTS.fastPath,
3790
3833
  conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
3791
3834
  toolOutput: { ...CHAT_DEFAULTS.toolOutput },
@@ -3823,7 +3866,7 @@ function defaultConfig(): UserConfig {
3823
3866
  iulForegroundOnStartup: false,
3824
3867
  order: [...VW_ORDER_DEFAULT],
3825
3868
  },
3826
- acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
3869
+ acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, toolApproval: { timeoutMs: acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
3827
3870
  lsp: cloneLspDefaults(),
3828
3871
  plan: { ...PLAN_DEFAULTS },
3829
3872
  goals: { ...GOALS_DEFAULTS },
@@ -4253,11 +4296,21 @@ function parseStewardTracks(input: unknown): Record<string, string> | undefined
4253
4296
  }
4254
4297
 
4255
4298
  function parseSeatLoopsConfig(input: unknown): SeatLoopConfig {
4256
- if (!input || typeof input !== 'object' || Array.isArray(input)) return { mode: 'off' };
4299
+ const defaults: SeatLoopConfig = { mode: 'off', seats: ['MK'], podPool: 'pool-node-b@node-b:8' };
4300
+ if (!input || typeof input !== 'object' || Array.isArray(input)) return defaults;
4257
4301
  const seat = (input as Record<string, unknown>).seat;
4258
- if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return { mode: 'off' };
4259
- const mode = (seat as Record<string, unknown>).mode;
4260
- return { mode: mode === 'on' || mode === 'shadow' ? mode : 'off' };
4302
+ if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return defaults;
4303
+ const values = seat as Record<string, unknown>;
4304
+ const mode = values.mode;
4305
+ return {
4306
+ mode: mode === 'on' || mode === 'shadow' ? mode : 'off',
4307
+ seats: Array.isArray(values.seats) && values.seats.length > 0
4308
+ && values.seats.every((value) => typeof value === 'string' && /^(?:MK|OP|TC|UX)$/.test(value))
4309
+ ? [...new Set(values.seats as string[])] : ['MK'],
4310
+ podPool: typeof values.podPool === 'string' && values.podPool.trim() ? values.podPool.trim() : defaults.podPool,
4311
+ ...(typeof values.reportPr === 'number' && Number.isSafeInteger(values.reportPr) && values.reportPr > 0
4312
+ ? { reportPr: values.reportPr } : {}),
4313
+ };
4261
4314
  }
4262
4315
 
4263
4316
  function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
@@ -4275,6 +4328,10 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
4275
4328
  }
4276
4329
  return { steward: {
4277
4330
  mode: s.mode === 'act' ? 'act' : 'observe',
4331
+ // Absent or invalid launch keys stay absent: launch.ts applies the defaults (shadow · 3 · pool-node-b@node-b:8).
4332
+ ...(s.launch === 'off' || s.launch === 'shadow' || s.launch === 'live' ? { launch: s.launch } : {}),
4333
+ ...(typeof s.maxParallel === 'number' && Number.isSafeInteger(s.maxParallel) && s.maxParallel > 0 ? { maxParallel: s.maxParallel } : {}),
4334
+ ...(typeof s.podPool === 'string' && s.podPool.trim() ? { podPool: s.podPool.trim() } : {}),
4278
4335
  ...(typeof s.linearTeam === 'string' && s.linearTeam.trim() ? { linearTeam: s.linearTeam.trim() } : {}),
4279
4336
  ...(Object.keys(roles).length ? { roles } : {}),
4280
4337
  ...(typeof s.budget === 'number' && Number.isFinite(s.budget) && s.budget >= 0 ? { budget: s.budget } : {}),
@@ -4283,6 +4340,11 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
4283
4340
  } };
4284
4341
  }
4285
4342
 
4343
+ export function parseCliHelpRole(raw: unknown): NonNullable<UserConfig['cli']>['helpRole'] {
4344
+ const cli = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : {};
4345
+ return cli.helpRole === 'general' || cli.helpRole === 'contributor' ? cli.helpRole : 'owner';
4346
+ }
4347
+
4286
4348
  export function buildUserConfig(path: string = defaultPath()): UserConfig {
4287
4349
  if (!existsSync(path)) return defaultConfigWithRuntimeProvider();
4288
4350
  let raw: unknown;
@@ -4338,6 +4400,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4338
4400
  const logsRaw = (rawObj.logs ?? {}) as Record<string, unknown>;
4339
4401
  const sh = (rawObj.shell ?? {}) as Record<string, unknown>;
4340
4402
  const chat = (rawObj.chat ?? {}) as Record<string, unknown>;
4403
+ const chatFactQuestion = (chat.factQuestion && typeof chat.factQuestion === 'object' && !Array.isArray(chat.factQuestion))
4404
+ ? chat.factQuestion as Record<string, unknown> : {};
4341
4405
  const chatConciseness = (chat.conciseness ?? {}) as Record<string, unknown>;
4342
4406
  const chatToolOutput = (chat.toolOutput ?? {}) as Record<string, unknown>;
4343
4407
  const chatAutoCompact = (chat.autoCompact ?? {}) as Record<string, unknown>;
@@ -4370,6 +4434,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4370
4434
  const vw = (rawObj.vw ?? {}) as Record<string, unknown>;
4371
4435
  const acp = (rawObj.acp ?? {}) as Record<string, unknown>;
4372
4436
  const acpHopCap = (acp.hopCap ?? {}) as Record<string, unknown>;
4437
+ const acpToolApproval = (acp.toolApproval ?? {}) as Record<string, unknown>;
4373
4438
  const lspRaw = (rawObj.lsp ?? {}) as Record<string, unknown>;
4374
4439
 
4375
4440
  // RFC #2161 (PLAN-config-unification-elanous-root) — `elanous nexus config
@@ -4391,11 +4456,20 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4391
4456
  ...(typeof legacyPod.pool === 'string' && legacyPod.pool.trim() ? { pool: legacyPod.pool.trim() } : {}),
4392
4457
  ...(typeof legacyPod.hostMirror === 'string' && legacyPod.hostMirror.trim() ? { hostMirror: legacyPod.hostMirror.trim() } : {}),
4393
4458
  ...(typeof legacyPod.groundingUrl === 'string' ? { groundingUrl: legacyPod.groundingUrl } : {}),
4459
+ lease: { perAccount: (() => {
4460
+ const lease = legacyPod.lease && typeof legacyPod.lease === 'object' && !Array.isArray(legacyPod.lease)
4461
+ ? (legacyPod.lease as Record<string, unknown>) : {};
4462
+ return typeof lease.perAccount === 'number' && Number.isSafeInteger(lease.perAccount) && lease.perAccount > 0
4463
+ ? lease.perAccount : 4;
4464
+ })() },
4394
4465
  },
4395
4466
  harness: {
4396
4467
  pod: { grokApiKeyOptIn: harnessPod.grokApiKeyOptIn === true },
4397
4468
  ...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
4398
4469
  ...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
4470
+ ...(typeof harness.worktreeAddTimeoutSec === 'number' && Number.isSafeInteger(harness.worktreeAddTimeoutSec)
4471
+ && harness.worktreeAddTimeoutSec > 0 && harness.worktreeAddTimeoutSec <= 2_147_483
4472
+ ? { worktreeAddTimeoutSec: harness.worktreeAddTimeoutSec } : {}),
4399
4473
  ...(typeof harness.defaultRepo === 'string' && isAbsolute(harness.defaultRepo)
4400
4474
  ? { defaultRepo: harness.defaultRepo } : {}),
4401
4475
  budgetGate: parseHarnessBudgetGate(
@@ -4533,6 +4607,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4533
4607
  ...(tg.poller === 'standalone' || tg.poller === 'nexus' ? { poller: tg.poller } : {}),
4534
4608
  ...(normalizeKindRoles(tg.kindRoles) ? { kindRoles: normalizeKindRoles(tg.kindRoles)! } : {}),
4535
4609
  ...(str(tg.fieldDefaultEvent) ? { fieldDefaultEvent: str(tg.fieldDefaultEvent)! } : {}),
4610
+ ...(tg.fieldReelMode === 'instant' || tg.fieldReelMode === 'standard' ? { fieldReelMode: tg.fieldReelMode } : {}),
4536
4611
  },
4537
4612
  discord: {
4538
4613
  enabled: dc.enabled === true,
@@ -4593,6 +4668,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4593
4668
  },
4594
4669
  onboarding: {
4595
4670
  ...(typeof ob2.webFirst === 'boolean' ? { webFirst: ob2.webFirst } : {}),
4671
+ ...(typeof ob2.ready === 'boolean' ? { ready: ob2.ready } : {}),
4596
4672
  completed: ob2.completed === true,
4597
4673
  completedAt: str(ob2.completedAt),
4598
4674
  version: typeof ob2.version === 'number' ? ob2.version : 0,
@@ -4640,6 +4716,11 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4640
4716
  },
4641
4717
  ...((): { errorReports?: ErrorReportsConfig } => { const er = parseErrorReportsConfig(rawObj.errorReports); return er ? { errorReports: er } : {}; })(),
4642
4718
  chat: {
4719
+ factQuestion: {
4720
+ maxToolTurns: typeof chatFactQuestion.maxToolTurns === 'number'
4721
+ && Number.isSafeInteger(chatFactQuestion.maxToolTurns) && chatFactQuestion.maxToolTurns > 0
4722
+ ? chatFactQuestion.maxToolTurns : CHAT_DEFAULTS.factQuestion.maxToolTurns,
4723
+ },
4643
4724
  fastPath: chat.fastPath === false || chat.fastPath === 'false' ? false : CHAT_DEFAULTS.fastPath,
4644
4725
  conciseness: {
4645
4726
  enabled: chatConciseness.enabled === false ? false : CHAT_CONCISENESS_DEFAULTS.enabled,
@@ -4999,6 +5080,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4999
5080
  })(),
5000
5081
  acp: {
5001
5082
  hopCap: parseHopCap(acpHopCap),
5083
+ toolApproval: {
5084
+ timeoutMs: acpApprovalTimeoutMs(acpToolApproval.timeoutMs)
5085
+ ?? acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs,
5086
+ },
5002
5087
  ...(typeof acp.reviewBackend === 'string' && acp.reviewBackend.trim()
5003
5088
  ? { reviewBackend: acp.reviewBackend.trim() }
5004
5089
  : {}),
@@ -5019,6 +5104,14 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
5019
5104
  goals: parseGoalsConfig(rawObj.goals),
5020
5105
  registry: parseRegistryConfig(rawObj.registry),
5021
5106
  tools: parseToolsConfig(rawObj.tools),
5107
+ ...(rawObj.hitl && typeof rawObj.hitl === 'object' && !Array.isArray(rawObj.hitl)
5108
+ && typeof (rawObj.hitl as Record<string, unknown>).executionDeadlineMinutes === 'number'
5109
+ ? { hitl: { executionDeadlineMinutes: (rawObj.hitl as { executionDeadlineMinutes: number }).executionDeadlineMinutes } }
5110
+ : {}),
5111
+ cli: { helpRole: parseCliHelpRole(rawObj.cli) },
5112
+ coo: { linearProject: typeof (rawObj.coo as { linearProject?: unknown } | undefined)?.linearProject === 'string' && (rawObj.coo as { linearProject: string }).linearProject.trim()
5113
+ ? (rawObj.coo as { linearProject: string }).linearProject.trim() : '외부 행정·큰 일 (COO)' },
5114
+ decisions: { linearProjection: { enabled: ((rawObj.decisions as { linearProjection?: { enabled?: unknown } } | undefined)?.linearProjection?.enabled === true) } },
5022
5115
  loops: { ...(stewardLoops ?? {}), seat: parseSeatLoopsConfig(rawObj.loops) },
5023
5116
  // M1-1: sparse — undefined when the user hasn't set anything, so
5024
5117
  // resolvers fall through to zero-config defaults.
@@ -5028,6 +5121,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
5028
5121
  ...spreadIfDefined('taste', parseTasteConfig(rawObj.taste)),
5029
5122
  ...spreadIfDefined('webSearch', parseWebSearchConfig(rawObj.webSearch)),
5030
5123
  ...spreadIfDefined('design', parseDesignConfig(rawObj.design)),
5124
+ diagnostics: parseDiagnosticsConfig(rawObj.diagnostics),
5031
5125
  ...spreadIfDefined('budget', parseBudgetConfig(rawObj.budget)),
5032
5126
  ...spreadIfDefined('smartDefaults', parseSmartDefaultsConfig(rawObj.smartDefaults)),
5033
5127
  ...spreadIfDefined('roleModels', parseRoleModelConfig(rawObj.roleModels)),
@@ -5590,6 +5684,7 @@ export function saveUserConfig(
5590
5684
  delete rawRest.budget;
5591
5685
  delete rawRest.smartDefaults;
5592
5686
  delete rawRest.grounding;
5687
+ delete rawRest.diagnostics;
5593
5688
  const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
5594
5689
  ? rawRest.harness as Record<string, unknown> : {};
5595
5690
  delete rawRest.harness;
@@ -5616,7 +5711,12 @@ export function saveUserConfig(
5616
5711
  ...rawRest,
5617
5712
  ...(cfg.loops ? { loops: {
5618
5713
  ...rawLoops,
5619
- ...(cfg.loops.seat ? { seat: { mode: cfg.loops.seat.mode } } : {}),
5714
+ ...(cfg.loops.seat ? { seat: {
5715
+ mode: cfg.loops.seat.mode,
5716
+ seats: cfg.loops.seat.seats ?? ['MK'],
5717
+ podPool: cfg.loops.seat.podPool ?? 'pool-node-b@node-b:8',
5718
+ ...(cfg.loops.seat.reportPr === undefined ? {} : { reportPr: cfg.loops.seat.reportPr }),
5719
+ } } : {}),
5620
5720
  } } : {}),
5621
5721
  ...(cfg.autopilot ? { autopilot: {
5622
5722
  ...rawAutopilot,
@@ -5739,6 +5839,7 @@ export function saveUserConfig(
5739
5839
  // 「직렬화 드롭」으로 조용히 사라졌다 — 운영 전환 스위치를 켤 방법이 없었다(07-22 botUsername 과 같은 모양).
5740
5840
  poller: cfg.telegram.poller,
5741
5841
  fieldDefaultEvent: cfg.telegram.fieldDefaultEvent,
5842
+ fieldReelMode: cfg.telegram.fieldReelMode,
5742
5843
  }),
5743
5844
  discord: stripUndef({
5744
5845
  enabled: cfg.discord.enabled,
@@ -5773,6 +5874,7 @@ export function saveUserConfig(
5773
5874
  }),
5774
5875
  onboarding: stripUndef({
5775
5876
  webFirst: cfg.onboarding.webFirst,
5877
+ ready: cfg.onboarding.ready,
5776
5878
  completed: cfg.onboarding.completed,
5777
5879
  completedAt: cfg.onboarding.completedAt,
5778
5880
  version: cfg.onboarding.version,
@@ -5855,6 +5957,10 @@ export function saveUserConfig(
5855
5957
  : undefined,
5856
5958
  slashMaxTurns: cfg.acp.slashMaxTurns,
5857
5959
  editApproval: cfg.acp.editApproval ? true : undefined,
5960
+ toolApproval: acpApprovalTimeoutMs(
5961
+ (cfg.raw?.acp as { toolApproval?: { timeoutMs?: unknown } } | undefined)?.toolApproval?.timeoutMs,
5962
+ ) !== undefined || cfg.acp.toolApproval.timeoutMs !== (acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs)
5963
+ ? { timeoutMs: cfg.acp.toolApproval.timeoutMs } : undefined,
5858
5964
  scrubBillingEnv: cfg.acp.scrubBillingEnv === false ? false : undefined,
5859
5965
  }),
5860
5966
  lsp: stripUndef({
@@ -5939,6 +6045,7 @@ export function saveUserConfig(
5939
6045
  ...(cfg.taste ? { taste: cfg.taste } : {}),
5940
6046
  ...(cfg.webSearch ? { webSearch: cfg.webSearch } : {}),
5941
6047
  ...(cfg.design ? { design: cfg.design } : {}),
6048
+ ...(cfg.diagnostics?.uploadUrl ? { diagnostics: parseDiagnosticsConfig(cfg.diagnostics) } : {}),
5942
6049
  ...(cfg.budget ? { budget: cfg.budget } : {}),
5943
6050
  ...(cfg.smartDefaults ? { smartDefaults: cfg.smartDefaults } : {}),
5944
6051
  ...(cfg.grounding && cfg.grounding.sources.length > 0
@@ -1 +1 @@
1
- {"commit":"8f3512a904cff53bb1595fffc091f7443a29c2c2"}
1
+ {"commit":"2740cab836f9926e0d4e88c7343f3aa5523b069d"}
@@ -0,0 +1,32 @@
1
+ import { debug } from '../debug/log.js';
2
+ import type { ExecRequest } from '../exec-requests/store.js';
3
+ import { sendPushToAll } from './sender.js';
4
+ import { listSubscriptions } from './subscriptions.js';
5
+
6
+ export async function notifyExecRequestTransition(opts: {
7
+ id: string;
8
+ text: string;
9
+ from: ExecRequest['status'];
10
+ to: ExecRequest['status'];
11
+ summary?: string;
12
+ pendingApprovals: number;
13
+ }): Promise<void> {
14
+ const { id, text, from, to, summary, pendingApprovals } = opts;
15
+ const kind = from !== to && (to === 'done' || to === 'failed')
16
+ ? to : pendingApprovals > 0 && from === to ? 'approval' : null;
17
+ if (!kind) return;
18
+ const subscribers = listSubscriptions().length;
19
+ const details = { id, kind, subscribers, textLength: text.length };
20
+ if (!subscribers) {
21
+ debug.log('webpush.exec', 'skipped', details);
22
+ return;
23
+ }
24
+ const title = `${kind === 'done' ? '맡긴 일 완료' : kind === 'failed' ? '맡긴 일 실패' : '게시 승인 대기'} · ${text.slice(0, 40)}`;
25
+ const body = kind === 'approval' ? '승인하거나 보류해 주세요' : (summary ?? '').split(/\r?\n/, 1)[0]!.slice(0, 80);
26
+ try {
27
+ await sendPushToAll({ title, body, url: `/exec?id=${encodeURIComponent(id)}`, tag: `exec-${id}` });
28
+ debug.log('webpush.exec', 'sent', details);
29
+ } catch {
30
+ debug.log('webpush.exec', 'skipped', details);
31
+ }
32
+ }
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST=function(e,r,t,_){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:39,errorRate:1e-4,numBits:748,numHashes:14,bitArray:[1,0,0,1,e,e,r,r,e,r,e,e,r,r,r,r,e,e,r,r,e,e,r,r,r,r,e,r,e,e,e,r,r,e,r,e,e,r,e,e,e,r,e,e,r,r,r,r,e,r,r,r,r,r,r,r,e,e,e,r,e,e,e,r,r,r,e,e,e,e,r,e,e,e,e,r,r,r,r,e,e,r,r,r,e,r,r,e,r,r,e,r,r,e,r,e,e,e,e,r,e,e,e,r,e,e,r,r,e,r,e,e,e,e,r,e,r,r,e,e,r,r,r,r,e,r,e,r,e,e,e,e,e,r,e,e,e,e,e,e,e,e,e,e,e,r,e,r,r,r,e,e,e,e,r,e,e,r,e,r,e,r,e,r,r,r,r,r,e,r,r,e,r,e,e,r,r,e,e,r,e,r,e,r,r,r,r,r,r,e,e,r,e,e,e,e,r,r,e,e,r,e,r,e,r,e,e,r,r,r,r,e,e,e,e,e,r,e,r,r,e,e,r,e,e,r,r,e,e,r,r,r,e,e,r,e,e,r,e,e,e,e,e,e,r,e,e,e,e,e,e,r,e,r,r,r,r,r,e,r,e,r,r,e,e,e,r,r,r,e,e,r,e,e,e,r,r,e,e,e,r,r,r,r,r,e,r,e,e,r,r,r,e,r,r,r,r,e,r,r,r,r,e,e,e,e,e,e,e,r,e,e,r,r,r,r,r,r,e,r,r,e,r,e,e,r,e,e,r,r,r,e,r,e,e,e,e,r,e,r,e,r,e,e,r,r,r,r,e,r,e,r,e,r,e,e,e,r,r,r,r,e,r,r,e,e,e,e,r,r,e,r,r,r,e,r,e,r,e,r,e,r,e,e,e,r,e,e,e,e,r,e,r,e,e,r,e,r,e,e,r,r,e,e,r,r,r,e,e,e,e,e,e,e,r,r,e,e,r,e,e,e,r,r,r,e,r,e,e,e,e,r,r,e,r,r,r,r,e,r,e,e,e,r,e,e,r,e,e,r,e,r,e,r,r,r,e,r,e,e,e,e,e,e,r,e,e,r,r,e,r,r,e,e,e,e,e,e,e,e,e,e,r,e,r,e,e,r,e,e,r,e,e,r,r,e,r,r,r,e,e,r,e,e,e,r,e,e,e,e,e,r,e,r,r,e,e,e,r,e,r,e,e,r,r,e,r,e,e,e,e,r,r,r,r,r,r,r,r,e,e,e,r,r,e,e,r,r,r,e,r,r,e,r,e,r,e,e,e,r,e,e,e,r,e,r,e,e,e,e,r,r,e,e,r,r,r,r,r,e,e,e,e,r,e,r,e,r,r,e,r,e,e,r,e,r,r,r,e,e,r,r,e,e,e,r,r,e,e,e,e,e,e,r,r,r,r,e,e,e,r,e,e,r,r,r,e,r,e,r,e,e,e,e,e,e,e,e,e,r,e,e,e,e,r,e,r,e,e,e,e,r,e,e,r,r,r,e,r,e,e,r,e,r,e,r,e,r,r,r,e,e,r,r,e,e,r,e,e,e,e,r,e,r,r,r,e,r,r,e,r,e,r,e,r,e,r,r,r,r,e,r,e,e,r,e,e,r,e,r,r,e,e,e,r,e,r,r,r,e,e,e,e,e,e,e,r,e,e,e,e,r,r,e,e,r,e,r,e,r,e,r,e,e,r,e,e,r]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:20,numHashes:14,bitArray:[e,r,r,r,e,e,e,r,r,e,e,r,r,e,e,r,e,r,r,r]},"/_error":["static/chunks/pages/_error-689039227d443fab.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1201],{2961:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("sliders-vertical",[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]])},4790:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("telescope",[["path",{d:"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44",key:"k4qptu"}],["path",{d:"m13.56 11.747 4.332-.924",key:"19l80z"}],["path",{d:"m16 21-3.105-6.21",key:"7oh9d"}],["path",{d:"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z",key:"m7xp4m"}],["path",{d:"m6.158 8.633 1.114 4.456",key:"74o979"}],["path",{d:"m8 21 3.105-6.21",key:"1fvxut"}],["circle",{cx:"12",cy:"13",r:"2",key:"1c1ljs"}]])},6381:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("store",[["path",{d:"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5",key:"slp6dd"}],["path",{d:"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244",key:"o0xfot"}],["path",{d:"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05",key:"wn3emo"}]])},7347:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]])},8542:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]])},11635:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},26882:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]])},31159:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]])},33011:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("layers-2",[["path",{d:"M13 13.74a2 2 0 0 1-2 0L2.5 8.87a1 1 0 0 1 0-1.74L11 2.26a2 2 0 0 1 2 0l8.5 4.87a1 1 0 0 1 0 1.74z",key:"15q6uc"}],["path",{d:"m20 14.285 1.5.845a1 1 0 0 1 0 1.74L13 21.74a2 2 0 0 1-2 0l-8.5-4.87a1 1 0 0 1 0-1.74l1.5-.845",key:"byia6g"}]])},34881:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("square-kanban",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M8 7v7",key:"1x2jlm"}],["path",{d:"M12 7v4",key:"xawao1"}],["path",{d:"M16 7v9",key:"1hp2iy"}]])},42310:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("book-open",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]])},42859:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("message-square",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]])},49454:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("crosshair",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"22",x2:"18",y1:"12",y2:"12",key:"l9bcsi"}],["line",{x1:"6",x2:"2",y1:"12",y2:"12",key:"13hhkx"}],["line",{x1:"12",x2:"12",y1:"6",y2:"2",key:"10w3f3"}],["line",{x1:"12",x2:"12",y1:"22",y2:"18",key:"15g9kq"}]])},49559:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("palette",[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]])},58291:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]])},59573:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]])},62480:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("git-pull-request",[["circle",{cx:"18",cy:"18",r:"3",key:"1xkwt0"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7",key:"1yeb86"}],["line",{x1:"6",x2:"6",y1:"9",y2:"21",key:"rroup"}]])},67089:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])},68634:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("compass",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}]])},70765:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("layout-grid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]])},84081:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("git-branch",[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]])},87216:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("square-terminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]])},95895:(e,a,y)=>{y.d(a,{A:()=>t});let t=(0,y(89117).A)("calendar-clock",[["path",{d:"M16 14v2.2l1.6 1",key:"fo4ql5"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5",key:"1osxxc"}],["path",{d:"M3 10h5",key:"r794hk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["circle",{cx:"16",cy:"16",r:"6",key:"qoo3c4"}]])}}]);