openryoko 2026.10.8 → 2026.10.13

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 (691) hide show
  1. package/dist/bin/jimmy.js +51 -1
  2. package/dist/bin/jimmy.js.map +1 -1
  3. package/dist/package.json +2 -1
  4. package/dist/src/backup/archive.d.ts +65 -0
  5. package/dist/src/backup/archive.d.ts.map +1 -0
  6. package/dist/src/backup/archive.js +214 -0
  7. package/dist/src/backup/archive.js.map +1 -0
  8. package/dist/src/backup/catalog.d.ts +64 -0
  9. package/dist/src/backup/catalog.d.ts.map +1 -0
  10. package/dist/src/backup/catalog.js +252 -0
  11. package/dist/src/backup/catalog.js.map +1 -0
  12. package/dist/src/backup/database-restore.d.ts +63 -0
  13. package/dist/src/backup/database-restore.d.ts.map +1 -0
  14. package/dist/src/backup/database-restore.js +236 -0
  15. package/dist/src/backup/database-restore.js.map +1 -0
  16. package/dist/src/backup/database-source.d.ts +70 -0
  17. package/dist/src/backup/database-source.d.ts.map +1 -0
  18. package/dist/src/backup/database-source.js +70 -0
  19. package/dist/src/backup/database-source.js.map +1 -0
  20. package/dist/src/backup/format.d.ts +4 -0
  21. package/dist/src/backup/format.d.ts.map +1 -0
  22. package/dist/src/backup/format.js +15 -0
  23. package/dist/src/backup/format.js.map +1 -0
  24. package/dist/src/backup/gateway-liveness.d.ts +44 -0
  25. package/dist/src/backup/gateway-liveness.d.ts.map +1 -0
  26. package/dist/src/backup/gateway-liveness.js +120 -0
  27. package/dist/src/backup/gateway-liveness.js.map +1 -0
  28. package/dist/src/backup/inspect.d.ts +45 -0
  29. package/dist/src/backup/inspect.d.ts.map +1 -0
  30. package/dist/src/backup/inspect.js +291 -0
  31. package/dist/src/backup/inspect.js.map +1 -0
  32. package/dist/src/backup/layout.d.ts +11 -0
  33. package/dist/src/backup/layout.d.ts.map +1 -0
  34. package/dist/src/backup/layout.js +16 -0
  35. package/dist/src/backup/layout.js.map +1 -0
  36. package/dist/src/backup/limits.d.ts +54 -0
  37. package/dist/src/backup/limits.d.ts.map +1 -0
  38. package/dist/src/backup/limits.js +59 -0
  39. package/dist/src/backup/limits.js.map +1 -0
  40. package/dist/src/backup/manifest.d.ts +45 -0
  41. package/dist/src/backup/manifest.d.ts.map +1 -0
  42. package/dist/src/backup/manifest.js +77 -0
  43. package/dist/src/backup/manifest.js.map +1 -0
  44. package/dist/src/backup/restore.d.ts +73 -0
  45. package/dist/src/backup/restore.d.ts.map +1 -0
  46. package/dist/src/backup/restore.js +685 -0
  47. package/dist/src/backup/restore.js.map +1 -0
  48. package/dist/src/backup/run.d.ts +76 -0
  49. package/dist/src/backup/run.d.ts.map +1 -0
  50. package/dist/src/backup/run.js +181 -0
  51. package/dist/src/backup/run.js.map +1 -0
  52. package/dist/src/backup/scheduler.d.ts +51 -0
  53. package/dist/src/backup/scheduler.d.ts.map +1 -0
  54. package/dist/src/backup/scheduler.js +198 -0
  55. package/dist/src/backup/scheduler.js.map +1 -0
  56. package/dist/src/backup/settings.d.ts +44 -0
  57. package/dist/src/backup/settings.d.ts.map +1 -0
  58. package/dist/src/backup/settings.js +91 -0
  59. package/dist/src/backup/settings.js.map +1 -0
  60. package/dist/src/backup/space.d.ts +22 -0
  61. package/dist/src/backup/space.d.ts.map +1 -0
  62. package/dist/src/backup/space.js +47 -0
  63. package/dist/src/backup/space.js.map +1 -0
  64. package/dist/src/backup/state.d.ts +46 -0
  65. package/dist/src/backup/state.d.ts.map +1 -0
  66. package/dist/src/backup/state.js +137 -0
  67. package/dist/src/backup/state.js.map +1 -0
  68. package/dist/src/backup/tar.d.ts +64 -0
  69. package/dist/src/backup/tar.d.ts.map +1 -0
  70. package/dist/src/backup/tar.js +274 -0
  71. package/dist/src/backup/tar.js.map +1 -0
  72. package/dist/src/backup/targets.d.ts +85 -0
  73. package/dist/src/backup/targets.d.ts.map +1 -0
  74. package/dist/src/backup/targets.js +104 -0
  75. package/dist/src/backup/targets.js.map +1 -0
  76. package/dist/src/backup/walk.d.ts +42 -0
  77. package/dist/src/backup/walk.d.ts.map +1 -0
  78. package/dist/src/backup/walk.js +324 -0
  79. package/dist/src/backup/walk.js.map +1 -0
  80. package/dist/src/cli/backup.d.ts +45 -0
  81. package/dist/src/cli/backup.d.ts.map +1 -0
  82. package/dist/src/cli/backup.js +344 -0
  83. package/dist/src/cli/backup.js.map +1 -0
  84. package/dist/src/cli/bundled-skills.d.ts +7 -1
  85. package/dist/src/cli/bundled-skills.d.ts.map +1 -1
  86. package/dist/src/cli/bundled-skills.js +12 -2
  87. package/dist/src/cli/bundled-skills.js.map +1 -1
  88. package/dist/src/cli/config-failure.d.ts +18 -0
  89. package/dist/src/cli/config-failure.d.ts.map +1 -0
  90. package/dist/src/cli/config-failure.js +39 -0
  91. package/dist/src/cli/config-failure.js.map +1 -0
  92. package/dist/src/cli/gateway-audit.d.ts +3 -0
  93. package/dist/src/cli/gateway-audit.d.ts.map +1 -1
  94. package/dist/src/cli/gateway-audit.js +61 -14
  95. package/dist/src/cli/gateway-audit.js.map +1 -1
  96. package/dist/src/cli/gateway-url-backup.d.ts +21 -0
  97. package/dist/src/cli/gateway-url-backup.d.ts.map +1 -0
  98. package/dist/src/cli/gateway-url-backup.js +87 -0
  99. package/dist/src/cli/gateway-url-backup.js.map +1 -0
  100. package/dist/src/cli/home-copy.d.ts +37 -0
  101. package/dist/src/cli/home-copy.d.ts.map +1 -0
  102. package/dist/src/cli/home-copy.js +155 -0
  103. package/dist/src/cli/home-copy.js.map +1 -0
  104. package/dist/src/cli/interactive-config.d.ts +5 -0
  105. package/dist/src/cli/interactive-config.d.ts.map +1 -1
  106. package/dist/src/cli/interactive-config.js +16 -7
  107. package/dist/src/cli/interactive-config.js.map +1 -1
  108. package/dist/src/cli/migrate.d.ts +20 -0
  109. package/dist/src/cli/migrate.d.ts.map +1 -1
  110. package/dist/src/cli/migrate.js +365 -68
  111. package/dist/src/cli/migrate.js.map +1 -1
  112. package/dist/src/cli/migration-declarations.d.ts +24 -0
  113. package/dist/src/cli/migration-declarations.d.ts.map +1 -0
  114. package/dist/src/cli/migration-declarations.js +54 -0
  115. package/dist/src/cli/migration-declarations.js.map +1 -0
  116. package/dist/src/cli/start.d.ts.map +1 -1
  117. package/dist/src/cli/start.js +40 -1
  118. package/dist/src/cli/start.js.map +1 -1
  119. package/dist/src/connectors/chunked-send.d.ts +27 -0
  120. package/dist/src/connectors/chunked-send.d.ts.map +1 -0
  121. package/dist/src/connectors/chunked-send.js +40 -0
  122. package/dist/src/connectors/chunked-send.js.map +1 -0
  123. package/dist/src/connectors/cron/index.d.ts +10 -0
  124. package/dist/src/connectors/cron/index.d.ts.map +1 -1
  125. package/dist/src/connectors/cron/index.js +26 -3
  126. package/dist/src/connectors/cron/index.js.map +1 -1
  127. package/dist/src/connectors/discord/attachments.d.ts +25 -0
  128. package/dist/src/connectors/discord/attachments.d.ts.map +1 -0
  129. package/dist/src/connectors/discord/attachments.js +33 -0
  130. package/dist/src/connectors/discord/attachments.js.map +1 -0
  131. package/dist/src/connectors/discord/format.d.ts +17 -1
  132. package/dist/src/connectors/discord/format.d.ts.map +1 -1
  133. package/dist/src/connectors/discord/format.js +36 -6
  134. package/dist/src/connectors/discord/format.js.map +1 -1
  135. package/dist/src/connectors/discord/index.d.ts +12 -0
  136. package/dist/src/connectors/discord/index.d.ts.map +1 -1
  137. package/dist/src/connectors/discord/index.js +47 -40
  138. package/dist/src/connectors/discord/index.js.map +1 -1
  139. package/dist/src/connectors/discord/remote.d.ts +45 -1
  140. package/dist/src/connectors/discord/remote.d.ts.map +1 -1
  141. package/dist/src/connectors/discord/remote.js +147 -22
  142. package/dist/src/connectors/discord/remote.js.map +1 -1
  143. package/dist/src/connectors/slack/attachments.d.ts +25 -0
  144. package/dist/src/connectors/slack/attachments.d.ts.map +1 -0
  145. package/dist/src/connectors/slack/attachments.js +32 -0
  146. package/dist/src/connectors/slack/attachments.js.map +1 -0
  147. package/dist/src/connectors/slack/auth-test-cache.d.ts +22 -0
  148. package/dist/src/connectors/slack/auth-test-cache.d.ts.map +1 -0
  149. package/dist/src/connectors/slack/auth-test-cache.js +34 -0
  150. package/dist/src/connectors/slack/auth-test-cache.js.map +1 -0
  151. package/dist/src/connectors/slack/format.d.ts +6 -1
  152. package/dist/src/connectors/slack/format.d.ts.map +1 -1
  153. package/dist/src/connectors/slack/format.js +65 -13
  154. package/dist/src/connectors/slack/format.js.map +1 -1
  155. package/dist/src/connectors/slack/index.d.ts +4 -0
  156. package/dist/src/connectors/slack/index.d.ts.map +1 -1
  157. package/dist/src/connectors/slack/index.js +64 -52
  158. package/dist/src/connectors/slack/index.js.map +1 -1
  159. package/dist/src/connectors/slack/provider-auth-blocks.d.ts +62 -0
  160. package/dist/src/connectors/slack/provider-auth-blocks.d.ts.map +1 -0
  161. package/dist/src/connectors/slack/provider-auth-blocks.js +204 -0
  162. package/dist/src/connectors/slack/provider-auth-blocks.js.map +1 -0
  163. package/dist/src/connectors/slack/provider-auth.d.ts +126 -0
  164. package/dist/src/connectors/slack/provider-auth.d.ts.map +1 -0
  165. package/dist/src/connectors/slack/provider-auth.js +357 -0
  166. package/dist/src/connectors/slack/provider-auth.js.map +1 -0
  167. package/dist/src/connectors/telegram/index.d.ts +5 -0
  168. package/dist/src/connectors/telegram/index.d.ts.map +1 -1
  169. package/dist/src/connectors/telegram/index.js +14 -22
  170. package/dist/src/connectors/telegram/index.js.map +1 -1
  171. package/dist/src/connectors/whatsapp/index.d.ts +3 -0
  172. package/dist/src/connectors/whatsapp/index.d.ts.map +1 -1
  173. package/dist/src/connectors/whatsapp/index.js +33 -14
  174. package/dist/src/connectors/whatsapp/index.js.map +1 -1
  175. package/dist/src/cron/alert-throttle.d.ts +28 -0
  176. package/dist/src/cron/alert-throttle.d.ts.map +1 -0
  177. package/dist/src/cron/alert-throttle.js +106 -0
  178. package/dist/src/cron/alert-throttle.js.map +1 -0
  179. package/dist/src/cron/jobs.d.ts +8 -0
  180. package/dist/src/cron/jobs.d.ts.map +1 -1
  181. package/dist/src/cron/jobs.js +27 -1
  182. package/dist/src/cron/jobs.js.map +1 -1
  183. package/dist/src/cron/run-outcome.d.ts +28 -0
  184. package/dist/src/cron/run-outcome.d.ts.map +1 -0
  185. package/dist/src/cron/run-outcome.js +66 -0
  186. package/dist/src/cron/run-outcome.js.map +1 -0
  187. package/dist/src/cron/runner.d.ts.map +1 -1
  188. package/dist/src/cron/runner.js +68 -5
  189. package/dist/src/cron/runner.js.map +1 -1
  190. package/dist/src/cron/scheduler.d.ts +8 -1
  191. package/dist/src/cron/scheduler.d.ts.map +1 -1
  192. package/dist/src/cron/scheduler.js +11 -4
  193. package/dist/src/cron/scheduler.js.map +1 -1
  194. package/dist/src/cron/waiting-fires.d.ts +18 -0
  195. package/dist/src/cron/waiting-fires.d.ts.map +1 -0
  196. package/dist/src/cron/waiting-fires.js +49 -0
  197. package/dist/src/cron/waiting-fires.js.map +1 -0
  198. package/dist/src/engines/claude-interactive.d.ts +19 -3
  199. package/dist/src/engines/claude-interactive.d.ts.map +1 -1
  200. package/dist/src/engines/claude-interactive.js +42 -17
  201. package/dist/src/engines/claude-interactive.js.map +1 -1
  202. package/dist/src/engines/claude.d.ts.map +1 -1
  203. package/dist/src/engines/claude.js +38 -5
  204. package/dist/src/engines/claude.js.map +1 -1
  205. package/dist/src/engines/codex.d.ts.map +1 -1
  206. package/dist/src/engines/codex.js +1 -0
  207. package/dist/src/engines/codex.js.map +1 -1
  208. package/dist/src/engines/gemini.d.ts.map +1 -1
  209. package/dist/src/engines/gemini.js +1 -0
  210. package/dist/src/engines/gemini.js.map +1 -1
  211. package/dist/src/gateway/api.d.ts.map +1 -1
  212. package/dist/src/gateway/api.js +184 -160
  213. package/dist/src/gateway/api.js.map +1 -1
  214. package/dist/src/gateway/config-redaction.d.ts +32 -0
  215. package/dist/src/gateway/config-redaction.d.ts.map +1 -0
  216. package/dist/src/gateway/config-redaction.js +139 -0
  217. package/dist/src/gateway/config-redaction.js.map +1 -0
  218. package/dist/src/gateway/config-revision.d.ts +46 -0
  219. package/dist/src/gateway/config-revision.d.ts.map +1 -0
  220. package/dist/src/gateway/config-revision.js +63 -0
  221. package/dist/src/gateway/config-revision.js.map +1 -0
  222. package/dist/src/gateway/connector-config.d.ts +21 -0
  223. package/dist/src/gateway/connector-config.d.ts.map +1 -0
  224. package/dist/src/gateway/connector-config.js +24 -0
  225. package/dist/src/gateway/connector-config.js.map +1 -0
  226. package/dist/src/gateway/daemon-entry.js +5 -0
  227. package/dist/src/gateway/daemon-entry.js.map +1 -1
  228. package/dist/src/gateway/engine-health-monitor.d.ts +67 -0
  229. package/dist/src/gateway/engine-health-monitor.d.ts.map +1 -0
  230. package/dist/src/gateway/engine-health-monitor.js +221 -0
  231. package/dist/src/gateway/engine-health-monitor.js.map +1 -0
  232. package/dist/src/gateway/files.d.ts +7 -1
  233. package/dist/src/gateway/files.d.ts.map +1 -1
  234. package/dist/src/gateway/files.js +110 -217
  235. package/dist/src/gateway/files.js.map +1 -1
  236. package/dist/src/gateway/onboarding-personalize.d.ts +2 -0
  237. package/dist/src/gateway/onboarding-personalize.d.ts.map +1 -1
  238. package/dist/src/gateway/onboarding-personalize.js +17 -1
  239. package/dist/src/gateway/onboarding-personalize.js.map +1 -1
  240. package/dist/src/gateway/portal-config.d.ts +17 -3
  241. package/dist/src/gateway/portal-config.d.ts.map +1 -1
  242. package/dist/src/gateway/portal-config.js +52 -3
  243. package/dist/src/gateway/portal-config.js.map +1 -1
  244. package/dist/src/gateway/request-origin.d.ts +9 -0
  245. package/dist/src/gateway/request-origin.d.ts.map +1 -1
  246. package/dist/src/gateway/request-origin.js +10 -0
  247. package/dist/src/gateway/request-origin.js.map +1 -1
  248. package/dist/src/gateway/server.d.ts.map +1 -1
  249. package/dist/src/gateway/server.js +82 -59
  250. package/dist/src/gateway/server.js.map +1 -1
  251. package/dist/src/gateway/slack-connect-rollback.d.ts +23 -0
  252. package/dist/src/gateway/slack-connect-rollback.d.ts.map +1 -0
  253. package/dist/src/gateway/slack-connect-rollback.js +53 -0
  254. package/dist/src/gateway/slack-connect-rollback.js.map +1 -0
  255. package/dist/src/gateway/status-reconciler.d.ts +25 -7
  256. package/dist/src/gateway/status-reconciler.d.ts.map +1 -1
  257. package/dist/src/gateway/status-reconciler.js +86 -43
  258. package/dist/src/gateway/status-reconciler.js.map +1 -1
  259. package/dist/src/gateway/watcher.d.ts.map +1 -1
  260. package/dist/src/gateway/watcher.js +44 -3
  261. package/dist/src/gateway/watcher.js.map +1 -1
  262. package/dist/src/mcp/gateway-server.js +21 -3
  263. package/dist/src/mcp/gateway-server.js.map +1 -1
  264. package/dist/src/mcp/resolver.d.ts.map +1 -1
  265. package/dist/src/mcp/resolver.js +51 -1
  266. package/dist/src/mcp/resolver.js.map +1 -1
  267. package/dist/src/models/service.d.ts.map +1 -1
  268. package/dist/src/models/service.js +14 -8
  269. package/dist/src/models/service.js.map +1 -1
  270. package/dist/src/provider-auth/discovery.d.ts +16 -0
  271. package/dist/src/provider-auth/discovery.d.ts.map +1 -0
  272. package/dist/src/provider-auth/discovery.js +66 -0
  273. package/dist/src/provider-auth/discovery.js.map +1 -0
  274. package/dist/src/provider-auth/failure-notices.d.ts +29 -0
  275. package/dist/src/provider-auth/failure-notices.d.ts.map +1 -0
  276. package/dist/src/provider-auth/failure-notices.js +48 -0
  277. package/dist/src/provider-auth/failure-notices.js.map +1 -0
  278. package/dist/src/provider-auth/failure-signal.d.ts +22 -0
  279. package/dist/src/provider-auth/failure-signal.d.ts.map +1 -0
  280. package/dist/src/provider-auth/failure-signal.js +79 -0
  281. package/dist/src/provider-auth/failure-signal.js.map +1 -0
  282. package/dist/src/provider-auth/index.d.ts +26 -0
  283. package/dist/src/provider-auth/index.d.ts.map +1 -0
  284. package/dist/src/provider-auth/index.js +51 -0
  285. package/dist/src/provider-auth/index.js.map +1 -0
  286. package/dist/src/provider-auth/input.d.ts +44 -0
  287. package/dist/src/provider-auth/input.d.ts.map +1 -0
  288. package/dist/src/provider-auth/input.js +86 -0
  289. package/dist/src/provider-auth/input.js.map +1 -0
  290. package/dist/src/provider-auth/providers.d.ts +26 -0
  291. package/dist/src/provider-auth/providers.d.ts.map +1 -0
  292. package/dist/src/provider-auth/providers.js +86 -0
  293. package/dist/src/provider-auth/providers.js.map +1 -0
  294. package/dist/src/provider-auth/runtime.d.ts +21 -0
  295. package/dist/src/provider-auth/runtime.d.ts.map +1 -0
  296. package/dist/src/provider-auth/runtime.js +104 -0
  297. package/dist/src/provider-auth/runtime.js.map +1 -0
  298. package/dist/src/provider-auth/service.d.ts +70 -0
  299. package/dist/src/provider-auth/service.d.ts.map +1 -0
  300. package/dist/src/provider-auth/service.js +349 -0
  301. package/dist/src/provider-auth/service.js.map +1 -0
  302. package/dist/src/provider-auth/terminal.d.ts +21 -0
  303. package/dist/src/provider-auth/terminal.d.ts.map +1 -0
  304. package/dist/src/provider-auth/terminal.js +46 -0
  305. package/dist/src/provider-auth/terminal.js.map +1 -0
  306. package/dist/src/provider-auth/types.d.ts +123 -0
  307. package/dist/src/provider-auth/types.d.ts.map +1 -0
  308. package/dist/src/provider-auth/types.js +10 -0
  309. package/dist/src/provider-auth/types.js.map +1 -0
  310. package/dist/src/sessions/accounting.d.ts +3 -0
  311. package/dist/src/sessions/accounting.d.ts.map +1 -1
  312. package/dist/src/sessions/accounting.js +5 -0
  313. package/dist/src/sessions/accounting.js.map +1 -1
  314. package/dist/src/sessions/backup-integrity.d.ts +45 -0
  315. package/dist/src/sessions/backup-integrity.d.ts.map +1 -0
  316. package/dist/src/sessions/backup-integrity.js +122 -0
  317. package/dist/src/sessions/backup-integrity.js.map +1 -0
  318. package/dist/src/sessions/backup.d.ts +40 -2
  319. package/dist/src/sessions/backup.d.ts.map +1 -1
  320. package/dist/src/sessions/backup.js +88 -12
  321. package/dist/src/sessions/backup.js.map +1 -1
  322. package/dist/src/sessions/callbacks.d.ts +9 -0
  323. package/dist/src/sessions/callbacks.d.ts.map +1 -1
  324. package/dist/src/sessions/callbacks.js +55 -10
  325. package/dist/src/sessions/callbacks.js.map +1 -1
  326. package/dist/src/sessions/completion-batching.d.ts +82 -0
  327. package/dist/src/sessions/completion-batching.d.ts.map +1 -0
  328. package/dist/src/sessions/completion-batching.js +126 -0
  329. package/dist/src/sessions/completion-batching.js.map +1 -0
  330. package/dist/src/sessions/connector-command-guard.d.ts +66 -0
  331. package/dist/src/sessions/connector-command-guard.d.ts.map +1 -0
  332. package/dist/src/sessions/connector-command-guard.js +145 -0
  333. package/dist/src/sessions/connector-command-guard.js.map +1 -0
  334. package/dist/src/sessions/context.d.ts.map +1 -1
  335. package/dist/src/sessions/context.js +3 -4
  336. package/dist/src/sessions/context.js.map +1 -1
  337. package/dist/src/sessions/engine-fallback.d.ts +43 -1
  338. package/dist/src/sessions/engine-fallback.d.ts.map +1 -1
  339. package/dist/src/sessions/engine-fallback.js +266 -15
  340. package/dist/src/sessions/engine-fallback.js.map +1 -1
  341. package/dist/src/sessions/engine-health-gate.d.ts +83 -0
  342. package/dist/src/sessions/engine-health-gate.d.ts.map +1 -0
  343. package/dist/src/sessions/engine-health-gate.js +186 -0
  344. package/dist/src/sessions/engine-health-gate.js.map +1 -0
  345. package/dist/src/sessions/engine-login.d.ts +58 -0
  346. package/dist/src/sessions/engine-login.d.ts.map +1 -0
  347. package/dist/src/sessions/engine-login.js +107 -0
  348. package/dist/src/sessions/engine-login.js.map +1 -0
  349. package/dist/src/sessions/fork.d.ts.map +1 -1
  350. package/dist/src/sessions/fork.js +3 -1
  351. package/dist/src/sessions/fork.js.map +1 -1
  352. package/dist/src/sessions/goal-execution.d.ts.map +1 -1
  353. package/dist/src/sessions/goal-execution.js +8 -1
  354. package/dist/src/sessions/goal-execution.js.map +1 -1
  355. package/dist/src/sessions/limit-failure-notice.d.ts +41 -0
  356. package/dist/src/sessions/limit-failure-notice.d.ts.map +1 -0
  357. package/dist/src/sessions/limit-failure-notice.js +87 -0
  358. package/dist/src/sessions/limit-failure-notice.js.map +1 -0
  359. package/dist/src/sessions/lost-turn.d.ts +39 -0
  360. package/dist/src/sessions/lost-turn.d.ts.map +1 -0
  361. package/dist/src/sessions/lost-turn.js +32 -0
  362. package/dist/src/sessions/lost-turn.js.map +1 -0
  363. package/dist/src/sessions/manager.d.ts.map +1 -1
  364. package/dist/src/sessions/manager.js +104 -47
  365. package/dist/src/sessions/manager.js.map +1 -1
  366. package/dist/src/sessions/new-session-engine.d.ts +42 -0
  367. package/dist/src/sessions/new-session-engine.d.ts.map +1 -0
  368. package/dist/src/sessions/new-session-engine.js +100 -0
  369. package/dist/src/sessions/new-session-engine.js.map +1 -0
  370. package/dist/src/sessions/origin-delivery.d.ts +50 -4
  371. package/dist/src/sessions/origin-delivery.d.ts.map +1 -1
  372. package/dist/src/sessions/origin-delivery.js +108 -9
  373. package/dist/src/sessions/origin-delivery.js.map +1 -1
  374. package/dist/src/sessions/queue.d.ts +14 -0
  375. package/dist/src/sessions/queue.d.ts.map +1 -1
  376. package/dist/src/sessions/queue.js +38 -2
  377. package/dist/src/sessions/queue.js.map +1 -1
  378. package/dist/src/sessions/registry.d.ts +4 -2
  379. package/dist/src/sessions/registry.d.ts.map +1 -1
  380. package/dist/src/sessions/registry.js +21 -4
  381. package/dist/src/sessions/registry.js.map +1 -1
  382. package/dist/src/sessions/reply-disposition.d.ts +8 -0
  383. package/dist/src/sessions/reply-disposition.d.ts.map +1 -1
  384. package/dist/src/sessions/reply-disposition.js +8 -0
  385. package/dist/src/sessions/reply-disposition.js.map +1 -1
  386. package/dist/src/sessions/restart-resume.d.ts +234 -0
  387. package/dist/src/sessions/restart-resume.d.ts.map +1 -0
  388. package/dist/src/sessions/restart-resume.js +596 -0
  389. package/dist/src/sessions/restart-resume.js.map +1 -0
  390. package/dist/src/sessions/speaker-prefix.d.ts.map +1 -1
  391. package/dist/src/sessions/speaker-prefix.js +3 -1
  392. package/dist/src/sessions/speaker-prefix.js.map +1 -1
  393. package/dist/src/sessions/turn-delivery.d.ts +26 -0
  394. package/dist/src/sessions/turn-delivery.d.ts.map +1 -0
  395. package/dist/src/sessions/turn-delivery.js +34 -0
  396. package/dist/src/sessions/turn-delivery.js.map +1 -0
  397. package/dist/src/sessions/unrequested-stop.d.ts +26 -0
  398. package/dist/src/sessions/unrequested-stop.d.ts.map +1 -0
  399. package/dist/src/sessions/unrequested-stop.js +19 -0
  400. package/dist/src/sessions/unrequested-stop.js.map +1 -0
  401. package/dist/src/sessions/usage-limit-wait.d.ts +14 -0
  402. package/dist/src/sessions/usage-limit-wait.d.ts.map +1 -0
  403. package/dist/src/sessions/usage-limit-wait.js +9 -0
  404. package/dist/src/sessions/usage-limit-wait.js.map +1 -0
  405. package/dist/src/shared/attachment-download.d.ts +41 -0
  406. package/dist/src/shared/attachment-download.d.ts.map +1 -0
  407. package/dist/src/shared/attachment-download.js +110 -0
  408. package/dist/src/shared/attachment-download.js.map +1 -0
  409. package/dist/src/shared/attachment-notice.d.ts +24 -0
  410. package/dist/src/shared/attachment-notice.d.ts.map +1 -0
  411. package/dist/src/shared/attachment-notice.js +37 -0
  412. package/dist/src/shared/attachment-notice.js.map +1 -0
  413. package/dist/src/shared/attachments.d.ts +65 -0
  414. package/dist/src/shared/attachments.d.ts.map +1 -0
  415. package/dist/src/shared/attachments.js +153 -0
  416. package/dist/src/shared/attachments.js.map +1 -0
  417. package/dist/src/shared/childEnv.d.ts +15 -0
  418. package/dist/src/shared/childEnv.d.ts.map +1 -1
  419. package/dist/src/shared/childEnv.js +15 -0
  420. package/dist/src/shared/childEnv.js.map +1 -1
  421. package/dist/src/shared/claude-auto-memory.d.ts +33 -0
  422. package/dist/src/shared/claude-auto-memory.d.ts.map +1 -0
  423. package/dist/src/shared/claude-auto-memory.js +156 -0
  424. package/dist/src/shared/claude-auto-memory.js.map +1 -0
  425. package/dist/src/shared/claude-limit-reset.d.ts +54 -0
  426. package/dist/src/shared/claude-limit-reset.d.ts.map +1 -0
  427. package/dist/src/shared/claude-limit-reset.js +99 -0
  428. package/dist/src/shared/claude-limit-reset.js.map +1 -0
  429. package/dist/src/shared/config-error.d.ts +21 -0
  430. package/dist/src/shared/config-error.d.ts.map +1 -0
  431. package/dist/src/shared/config-error.js +37 -0
  432. package/dist/src/shared/config-error.js.map +1 -0
  433. package/dist/src/shared/config-file.d.ts +57 -0
  434. package/dist/src/shared/config-file.d.ts.map +1 -0
  435. package/dist/src/shared/config-file.js +217 -0
  436. package/dist/src/shared/config-file.js.map +1 -0
  437. package/dist/src/shared/config-yaml-edit.d.ts +20 -0
  438. package/dist/src/shared/config-yaml-edit.d.ts.map +1 -0
  439. package/dist/src/shared/config-yaml-edit.js +468 -0
  440. package/dist/src/shared/config-yaml-edit.js.map +1 -0
  441. package/dist/src/shared/config.d.ts.map +1 -1
  442. package/dist/src/shared/config.js +12 -4
  443. package/dist/src/shared/config.js.map +1 -1
  444. package/dist/src/shared/engine-fallback.d.ts +22 -0
  445. package/dist/src/shared/engine-fallback.d.ts.map +1 -1
  446. package/dist/src/shared/engine-fallback.js +55 -4
  447. package/dist/src/shared/engine-fallback.js.map +1 -1
  448. package/dist/src/shared/engine-health.d.ts +16 -0
  449. package/dist/src/shared/engine-health.d.ts.map +1 -1
  450. package/dist/src/shared/engine-health.js +42 -0
  451. package/dist/src/shared/engine-health.js.map +1 -1
  452. package/dist/src/shared/list-alignment.d.ts +23 -0
  453. package/dist/src/shared/list-alignment.d.ts.map +1 -0
  454. package/dist/src/shared/list-alignment.js +61 -0
  455. package/dist/src/shared/list-alignment.js.map +1 -0
  456. package/dist/src/shared/logger.d.ts.map +1 -1
  457. package/dist/src/shared/logger.js +104 -33
  458. package/dist/src/shared/logger.js.map +1 -1
  459. package/dist/src/shared/map-limited.d.ts +11 -0
  460. package/dist/src/shared/map-limited.d.ts.map +1 -0
  461. package/dist/src/shared/map-limited.js +30 -0
  462. package/dist/src/shared/map-limited.js.map +1 -0
  463. package/dist/src/shared/oneShotCli.d.ts.map +1 -1
  464. package/dist/src/shared/oneShotCli.js +4 -2
  465. package/dist/src/shared/oneShotCli.js.map +1 -1
  466. package/dist/src/shared/partial-delivery.d.ts +24 -0
  467. package/dist/src/shared/partial-delivery.d.ts.map +1 -0
  468. package/dist/src/shared/partial-delivery.js +46 -0
  469. package/dist/src/shared/partial-delivery.js.map +1 -0
  470. package/dist/src/shared/process-safety-net.d.ts +44 -0
  471. package/dist/src/shared/process-safety-net.d.ts.map +1 -0
  472. package/dist/src/shared/process-safety-net.js +88 -0
  473. package/dist/src/shared/process-safety-net.js.map +1 -0
  474. package/dist/src/shared/rateLimit.d.ts +45 -2
  475. package/dist/src/shared/rateLimit.d.ts.map +1 -1
  476. package/dist/src/shared/rateLimit.js +64 -2
  477. package/dist/src/shared/rateLimit.js.map +1 -1
  478. package/dist/src/shared/redact.d.ts.map +1 -1
  479. package/dist/src/shared/redact.js +11 -1
  480. package/dist/src/shared/redact.js.map +1 -1
  481. package/dist/src/shared/safe-file-name.d.ts +9 -0
  482. package/dist/src/shared/safe-file-name.d.ts.map +1 -0
  483. package/dist/src/shared/safe-file-name.js +16 -0
  484. package/dist/src/shared/safe-file-name.js.map +1 -0
  485. package/dist/src/shared/terminal-safe-text.d.ts +2 -0
  486. package/dist/src/shared/terminal-safe-text.d.ts.map +1 -0
  487. package/dist/src/shared/terminal-safe-text.js +21 -0
  488. package/dist/src/shared/terminal-safe-text.js.map +1 -0
  489. package/dist/src/shared/types.d.ts +75 -4
  490. package/dist/src/shared/types.d.ts.map +1 -1
  491. package/dist/src/skills-sync/apply.d.ts +21 -0
  492. package/dist/src/skills-sync/apply.d.ts.map +1 -0
  493. package/dist/src/skills-sync/apply.js +209 -0
  494. package/dist/src/skills-sync/apply.js.map +1 -0
  495. package/dist/src/skills-sync/backup-run.d.ts +47 -0
  496. package/dist/src/skills-sync/backup-run.d.ts.map +1 -0
  497. package/dist/src/skills-sync/backup-run.js +150 -0
  498. package/dist/src/skills-sync/backup-run.js.map +1 -0
  499. package/dist/src/skills-sync/bounded-read.d.ts +32 -0
  500. package/dist/src/skills-sync/bounded-read.d.ts.map +1 -0
  501. package/dist/src/skills-sync/bounded-read.js +104 -0
  502. package/dist/src/skills-sync/bounded-read.js.map +1 -0
  503. package/dist/src/skills-sync/bundled.d.ts +28 -0
  504. package/dist/src/skills-sync/bundled.d.ts.map +1 -0
  505. package/dist/src/skills-sync/bundled.js +84 -0
  506. package/dist/src/skills-sync/bundled.js.map +1 -0
  507. package/dist/src/skills-sync/fingerprint.d.ts +32 -0
  508. package/dist/src/skills-sync/fingerprint.d.ts.map +1 -0
  509. package/dist/src/skills-sync/fingerprint.js +58 -0
  510. package/dist/src/skills-sync/fingerprint.js.map +1 -0
  511. package/dist/src/skills-sync/history.d.ts +44 -0
  512. package/dist/src/skills-sync/history.d.ts.map +1 -0
  513. package/dist/src/skills-sync/history.js +115 -0
  514. package/dist/src/skills-sync/history.js.map +1 -0
  515. package/dist/src/skills-sync/home-skill.d.ts +28 -0
  516. package/dist/src/skills-sync/home-skill.d.ts.map +1 -0
  517. package/dist/src/skills-sync/home-skill.js +67 -0
  518. package/dist/src/skills-sync/home-skill.js.map +1 -0
  519. package/dist/src/skills-sync/instance.d.ts +26 -0
  520. package/dist/src/skills-sync/instance.d.ts.map +1 -0
  521. package/dist/src/skills-sync/instance.js +128 -0
  522. package/dist/src/skills-sync/instance.js.map +1 -0
  523. package/dist/src/skills-sync/names.d.ts +25 -0
  524. package/dist/src/skills-sync/names.d.ts.map +1 -0
  525. package/dist/src/skills-sync/names.js +56 -0
  526. package/dist/src/skills-sync/names.js.map +1 -0
  527. package/dist/src/skills-sync/plan.d.ts +58 -0
  528. package/dist/src/skills-sync/plan.d.ts.map +1 -0
  529. package/dist/src/skills-sync/plan.js +132 -0
  530. package/dist/src/skills-sync/plan.js.map +1 -0
  531. package/dist/src/skills-sync/receipt.d.ts +61 -0
  532. package/dist/src/skills-sync/receipt.d.ts.map +1 -0
  533. package/dist/src/skills-sync/receipt.js +149 -0
  534. package/dist/src/skills-sync/receipt.js.map +1 -0
  535. package/dist/src/skills-sync/staging.d.ts +21 -0
  536. package/dist/src/skills-sync/staging.d.ts.map +1 -0
  537. package/dist/src/skills-sync/staging.js +81 -0
  538. package/dist/src/skills-sync/staging.js.map +1 -0
  539. package/dist/src/skills-sync/sync.d.ts +37 -0
  540. package/dist/src/skills-sync/sync.d.ts.map +1 -0
  541. package/dist/src/skills-sync/sync.js +201 -0
  542. package/dist/src/skills-sync/sync.js.map +1 -0
  543. package/dist/src/skills-sync/types.d.ts +66 -0
  544. package/dist/src/skills-sync/types.d.ts.map +1 -0
  545. package/dist/src/skills-sync/types.js +2 -0
  546. package/dist/src/skills-sync/types.js.map +1 -0
  547. package/dist/src/stt/config.d.ts +5 -0
  548. package/dist/src/stt/config.d.ts.map +1 -0
  549. package/dist/src/stt/config.js +18 -0
  550. package/dist/src/stt/config.js.map +1 -0
  551. package/dist/src/updates/maintenance.d.ts.map +1 -1
  552. package/dist/src/updates/maintenance.js +24 -4
  553. package/dist/src/updates/maintenance.js.map +1 -1
  554. package/dist/src/workflows/repository-mutex.d.ts +1 -1
  555. package/dist/web/404.html +1 -1
  556. package/dist/web/__next.__PAGE__.txt +11 -11
  557. package/dist/web/__next._full.txt +12 -12
  558. package/dist/web/__next._tree.txt +2 -2
  559. package/dist/web/_next/static/chunks/{0g5c5ppr8zmup.js → 20v6mri7epga5.js} +1 -1
  560. package/dist/web/_next/static/chunks/2u0328ngpt-ek.js +1 -0
  561. package/dist/web/_next/static/chunks/3f9i3f9q6v6_j.css +1 -0
  562. package/dist/web/_next/static/chunks/{08i7uo3uz6_fn.js → 3yy053rafgrzy.js} +1 -1
  563. package/dist/web/_not-found/__next._full.txt +10 -10
  564. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +9 -9
  565. package/dist/web/_not-found/__next._tree.txt +2 -2
  566. package/dist/web/_not-found.html +1 -1
  567. package/dist/web/_not-found.txt +10 -10
  568. package/dist/web/chat/__next._full.txt +12 -12
  569. package/dist/web/chat/__next._tree.txt +2 -2
  570. package/dist/web/chat/__next.chat.__PAGE__.txt +11 -11
  571. package/dist/web/chat.html +1 -1
  572. package/dist/web/chat.txt +12 -12
  573. package/dist/web/cron/__next._full.txt +12 -12
  574. package/dist/web/cron/__next._tree.txt +2 -2
  575. package/dist/web/cron/__next.cron.__PAGE__.txt +11 -11
  576. package/dist/web/cron.html +1 -1
  577. package/dist/web/cron.txt +12 -12
  578. package/dist/web/index.html +1 -1
  579. package/dist/web/index.txt +12 -12
  580. package/dist/web/kanban/__next._full.txt +12 -12
  581. package/dist/web/kanban/__next._tree.txt +2 -2
  582. package/dist/web/kanban/__next.kanban.__PAGE__.txt +11 -11
  583. package/dist/web/kanban.html +1 -1
  584. package/dist/web/kanban.txt +12 -12
  585. package/dist/web/logs/__next._full.txt +12 -12
  586. package/dist/web/logs/__next._tree.txt +2 -2
  587. package/dist/web/logs/__next.logs.__PAGE__.txt +11 -11
  588. package/dist/web/logs.html +1 -1
  589. package/dist/web/logs.txt +12 -12
  590. package/dist/web/models/__next._full.txt +12 -12
  591. package/dist/web/models/__next._tree.txt +2 -2
  592. package/dist/web/models/__next.models.__PAGE__.txt +11 -11
  593. package/dist/web/models.html +1 -1
  594. package/dist/web/models.txt +12 -12
  595. package/dist/web/org/__next._full.txt +12 -12
  596. package/dist/web/org/__next._tree.txt +2 -2
  597. package/dist/web/org/__next.org.__PAGE__.txt +11 -11
  598. package/dist/web/org.html +1 -1
  599. package/dist/web/org.txt +12 -12
  600. package/dist/web/sessions/__next._full.txt +10 -10
  601. package/dist/web/sessions/__next._tree.txt +2 -2
  602. package/dist/web/sessions/__next.sessions.__PAGE__.txt +9 -9
  603. package/dist/web/sessions.html +1 -1
  604. package/dist/web/sessions.txt +10 -10
  605. package/dist/web/settings/__next._full.txt +12 -12
  606. package/dist/web/settings/__next._tree.txt +2 -2
  607. package/dist/web/settings/__next.settings.__PAGE__.txt +11 -11
  608. package/dist/web/settings.html +1 -1
  609. package/dist/web/settings.txt +12 -12
  610. package/dist/web/skills/__next._full.txt +12 -12
  611. package/dist/web/skills/__next._tree.txt +2 -2
  612. package/dist/web/skills/__next.skills.__PAGE__.txt +11 -11
  613. package/dist/web/skills.html +1 -1
  614. package/dist/web/skills.txt +12 -12
  615. package/package.json +2 -1
  616. package/template/AGENTS.md +48 -308
  617. package/template/CLAUDE.md +4 -349
  618. package/template/bundled-skill-history.json +377 -0
  619. package/template/config.default.yaml +52 -3
  620. package/template/docs/architecture.md +41 -3
  621. package/template/docs/backup.md +142 -0
  622. package/template/docs/connectors.md +192 -16
  623. package/template/docs/cron.md +30 -11
  624. package/template/docs/memory.md +47 -0
  625. package/template/docs/overview.md +6 -2
  626. package/template/docs/self-modification.md +11 -10
  627. package/template/docs/skills.md +77 -4
  628. package/template/migrations/0.3.0/MIGRATION.md +6 -0
  629. package/template/migrations/0.7.3/MIGRATION.md +6 -0
  630. package/template/migrations/0.7.5/MIGRATION.md +1 -1
  631. package/template/migrations/0.9.0/MIGRATION.md +6 -0
  632. package/template/migrations/2026.10.13/MIGRATION.md +76 -0
  633. package/template/migrations/2026.10.13/files/docs/architecture.md +112 -0
  634. package/template/migrations/2026.10.13/files/docs/automations.md +110 -0
  635. package/template/migrations/2026.10.13/files/docs/backup.md +142 -0
  636. package/template/migrations/2026.10.13/files/docs/connectors.md +370 -0
  637. package/template/migrations/2026.10.13/files/docs/cron-commands.md +52 -0
  638. package/template/migrations/2026.10.13/files/docs/cron.md +178 -0
  639. package/template/migrations/2026.10.13/files/docs/mcp.md +108 -0
  640. package/template/migrations/2026.10.13/files/docs/memory.md +47 -0
  641. package/template/migrations/2026.10.13/files/docs/org.md +111 -0
  642. package/template/migrations/2026.10.13/files/docs/overview.md +44 -0
  643. package/template/migrations/2026.10.13/files/docs/self-modification.md +71 -0
  644. package/template/migrations/2026.10.13/files/docs/skills.md +140 -0
  645. package/template/migrations/2026.10.13/files/skills/cron-manager/SKILL.md +107 -0
  646. package/template/migrations/2026.10.13/files/skills/management/SKILL.md +227 -0
  647. package/template/migrations/2026.10.13/files/skills/migrate/SKILL.md +194 -0
  648. package/template/migrations/2026.10.13/files/skills/onboarding/SKILL.md +153 -0
  649. package/template/migrations/2026.10.13/files/skills/openryoko-config/SKILL.md +35 -0
  650. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/engine-fallback.md +98 -0
  651. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/jev.md +89 -0
  652. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/maintenance.md +49 -0
  653. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/platform.md +100 -0
  654. package/template/migrations/2026.10.13/files/skills/self-heal/SKILL.md +187 -0
  655. package/template/migrations/2026.10.9/MIGRATION.md +44 -0
  656. package/template/migrations/2026.10.9/files/docs/memory.md +47 -0
  657. package/template/migrations/2026.10.9/files/skills/migrate/SKILL.md +194 -0
  658. package/template/migrations/2026.5.7/MIGRATION.md +6 -0
  659. package/template/migrations/2026.8.28/MIGRATION.md +6 -0
  660. package/template/migrations/2026.9.11/MIGRATION.md +6 -0
  661. package/template/skills/cron-manager/SKILL.md +10 -0
  662. package/template/skills/management/SKILL.md +5 -4
  663. package/template/skills/migrate/SKILL.md +47 -14
  664. package/template/skills/onboarding/SKILL.md +3 -3
  665. package/template/skills/openryoko-config/SKILL.md +1 -1
  666. package/template/skills/openryoko-config/references/engine-fallback.md +16 -5
  667. package/template/skills/openryoko-config/references/platform.md +23 -4
  668. package/template/skills/self-heal/SKILL.md +117 -44
  669. package/dist/src/engines/mock.d.ts +0 -16
  670. package/dist/src/engines/mock.d.ts.map +0 -1
  671. package/dist/src/engines/mock.js +0 -47
  672. package/dist/src/engines/mock.js.map +0 -1
  673. package/dist/src/shared/test-support/posix-mode.d.ts +0 -17
  674. package/dist/src/shared/test-support/posix-mode.d.ts.map +0 -1
  675. package/dist/src/shared/test-support/posix-mode.js +0 -23
  676. package/dist/src/shared/test-support/posix-mode.js.map +0 -1
  677. package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_buildManifest.js +0 -11
  678. package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_clientMiddlewareManifest.js +0 -1
  679. package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_ssgManifest.js +0 -1
  680. package/dist/web/_next/static/chunks/02h65sho8c14h.js +0 -1
  681. package/dist/web/_next/static/chunks/0ic18n-m7ixyw.css +0 -1
  682. package/dist/web/_next/static/chunks/19s8vn2kgy7q1.js +0 -1
  683. package/dist/web/_next/static/chunks/1_jm0szyu2the.js +0 -1
  684. package/dist/web/_next/static/chunks/1omdg4m5w9lgx.js +0 -1
  685. package/dist/web/_next/static/chunks/25nob1new8t4s.js +0 -79
  686. package/dist/web/_next/static/chunks/2iqxlc9wtxzm2.js +0 -1
  687. package/dist/web/_next/static/chunks/3_6klkygi417n.js +0 -1
  688. package/dist/web/_next/static/chunks/3alc-b00c58_3.css +0 -1
  689. /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_buildManifest.js +0 -0
  690. /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_clientMiddlewareManifest.js +0 -0
  691. /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_ssgManifest.js +0 -0
@@ -9,106 +9,179 @@ description: Diagnose and fix problems in {{portalName}}'s configuration and run
9
9
 
10
10
  This skill activates when {{portalName}} is experiencing issues, errors, or unexpected behavior. It also activates when the user asks to diagnose problems, check system health, or fix something that is not working.
11
11
 
12
+ ## Before You Change Anything
13
+
14
+ Three rules hold for every repair in this skill.
15
+
16
+ - **Restore before you rebuild.** By default the gateway backs the home up once a day. A file that an edit broke, and that you cannot repair by fixing the one mistake in it, is put back from a backup. It is never replaced with an empty or default file. See "Restore a File from a Backup" below.
17
+ - **Do not delete or empty the gateway's own working state.** `tmp/`, `sessions/`, `cron/runs/`, `backups/` and `.migration-backups/` are not caches to clear.
18
+ - **Do not edit the databases.** `sessions/registry.db` and the workflow database belong to the gateway process. A status written into them by hand is not one the gateway understands. Everything you need is available through the API.
19
+
20
+ All relative paths below are relative to the {{portalName}} home directory, which is always your working directory. Commands are run where the gateway runs. When the home is shared with a container (a bind mount), that is inside the container: a `ryoko` on the host cannot see the gateway that runs in it.
21
+
12
22
  ## Diagnostic Steps
13
23
 
14
- Work through these checks in order. Stop and fix issues as you find them. All relative paths below are relative to the {{portalName}} home directory, which is always your working directory.
24
+ Work through these checks in order. Stop and fix issues as you find them.
25
+
26
+ ### 1. Ask the Gateway
27
+
28
+ ```bash
29
+ ryoko api GET /api/status
30
+ ```
31
+
32
+ - `process`: `unhandledRejections` or `uncaughtExceptions` above 0 means the gateway caught an error nothing handled and kept running. Part of it may not be working until it is restarted. Look for `Unhandled promise rejection` and `Uncaught exception` in the log.
33
+ - `backup`: `level` is `ok`, `warning`, `disabled` or `unknown`. With `warning`, `targets` names what failed and why. With `disabled` there may be no recent backup to restore from.
34
+ - `engines.<name>.health`: `state: "exhausted"` means the engine's usage limit is on record, and `until` is the reset it stated. New sessions start on the fallback engine in the meantime, when one can take them. This is not a fault to repair.
35
+ - `connectors`: the status of each connector.
36
+ - `storage`: `level` is `warning` or `critical` when the disk is running out.
37
+
38
+ If the API does not answer, the gateway is not running, or you are asking another instance. Check with `ryoko status`.
15
39
 
16
- ### 1. Check Gateway Logs
40
+ ### 2. Check Gateway Logs
17
41
 
18
- Read the newest log file under `logs/` and look for:
42
+ Read `logs/gateway.log` (or `ryoko api GET '/api/logs?n=100'`) and look for:
19
43
  - Error messages or stack traces
20
44
  - Repeated failures or crash loops
21
45
  - Connection refused or timeout errors
22
46
  - Out of memory warnings
23
- - Unhandled promise rejections
47
+ - `Failed to reload config`: the last change to `config.yaml` was not loaded. When the file does not parse, the line gives the position of the mistake.
48
+ - `Cron reload skipped; keeping previous registrations`: `cron/jobs.json` cannot be read. The jobs registered before it broke are still scheduled.
49
+ - `Backup failed`, and warnings about bundled skills that were not synced.
24
50
 
25
51
  Summarize any problems found to the user.
26
52
 
27
- ### 2. Validate Configuration
53
+ ### 3. Validate Configuration
28
54
 
29
55
  Read `config.yaml` and verify:
30
- - The file is valid YAML (no syntax errors)
31
- - The `port` field is a valid number (typically 3777)
32
- - Required fields are present: `port`, `engine`, `model`
33
- - Engine value is one of: `claude`, `codex`
34
- - No duplicate keys or malformed values
56
+ - The file is valid YAML, with no duplicate keys
57
+ - `gateway.port` is a number (7777 unless it was changed)
58
+ - `engines.default` names an engine that has its own block under `engines` (`claude`, `codex` or `gemini`), and the `bin` of that block is a command that exists
59
+ - Connector tokens are present for the connectors that should be running
35
60
 
36
- ### 3. Verify Engine Availability
61
+ While the file does not parse, the running gateway keeps the last configuration it loaded, the API refuses to save over the file, and `ryoko start` stops with the line and column of the mistake.
62
+
63
+ ### 4. Verify Engine Availability
37
64
 
38
65
  Check that the configured AI engine is installed and accessible:
39
66
  - For Claude: run `claude --version` and confirm it returns a version number
40
67
  - For Codex: run `codex --version` and confirm it returns a version number
68
+ - For Gemini: run `gemini --version` and confirm it returns a version number
41
69
 
42
70
  If the engine command is not found, inform the user that the engine is not installed or not on their PATH.
43
71
 
44
- ### 4. Check Session Database
72
+ If the engine is installed but its turns fail with an authentication error, its login has expired. The operator can log in again on the host with the CLI's own login command, or — where the Slack connector has `providerAuth` enabled — by sending `ログイン` to the bot in their own DM (see `docs/connectors.md`, "Provider Re-login").
73
+
74
+ ### 5. Check Sessions
75
+
76
+ List sessions through the API, never by opening the database:
77
+
78
+ ```bash
79
+ ryoko api GET /api/sessions
80
+ ```
45
81
 
46
- Look at the session registry for stuck sessions:
47
- - Read `sessions/registry.db` (the SQLite session registry)
48
- - Look for sessions with status `running` that have not been updated recently (more than 30 minutes old)
49
- - These may be stuck and need to be reset
82
+ A status alone does not show that a session is stuck:
50
83
 
51
- ### 5. Check Disk and Temp Files
84
+ - `running`: a turn is in progress. Long turns are normal. When the engine process behind a turn is gone, the gateway notices by itself, within about a minute at most: it records the turn as failed or lost, with the reason, and tells the parent session.
85
+ - `waiting`: the turn met a usage limit and waits for it to reset, for up to six hours. It continues by itself, also after a restart.
86
+ - `interrupted`: the turn was cut off, usually by a restart. By default the gateway wakes such sessions itself after it starts: up to 10 per start, and only an interruption of the last 120 minutes (see `docs/architecture.md`, "Session Lifecycle"). One that was not woken stays `interrupted` until a new message continues it.
87
+ - `error`: the last turn failed, and `lastError` says why. The next message starts a new turn.
88
+ - `idle`: nothing is running.
52
89
 
53
- - Check if `tmp/` contains stale files that should be cleaned up
54
- - Large or numerous temp files can cause issues
90
+ ### 6. Check Disk Space
91
+
92
+ Read `storage` in `/api/status`, or check the free space of the disk the home is on. Do not make room by clearing `tmp/` (see "Leave `tmp/` Alone").
55
93
 
56
94
  ## Common Fixes
57
95
 
58
96
  ### Restart Gateway
59
97
 
60
- If the gateway appears to be in a bad state (crash loops, unresponsive, port conflicts):
98
+ If the gateway appears to be in a bad state (crash loops, unresponsive, port conflicts), tell the user to restart it the way it is run:
99
+
100
+ ```bash
101
+ ryoko stop
102
+ ryoko start
103
+ ```
104
+
105
+ When it runs as a service or in a container, the service or the container is restarted instead. A restart ends every turn that is running, yours included. Do not restart the gateway yourself unless the user asked you to. By default, sessions that were cut off are woken after the next start, within the limits given under "Check Sessions".
106
+
107
+ ### Restore a File from a Backup
108
+
109
+ For `config.yaml`, `cron/jobs.json`, persona and memory files, `org/`, `skills/`, `docs/` and `knowledge/`:
61
110
 
62
- Tell the user to run:
63
111
  ```bash
64
- jinn stop && jinn start
112
+ ryoko backup list # newest first; the first column is the id
113
+ ryoko backup restore <id> --only <kind> --dry-run # shows what would change, writes nothing
114
+ ryoko backup restore <id> --only <kind> # restores
65
115
  ```
66
116
 
67
- ### Clear Temp Directory
117
+ `<kind>` is one or more of `config`, `cron`, `cron-history`, `persona`, `memory`, `org`, `skills`, `docs`, `knowledge`, `workflows`, separated by commas. Use an `id` that starts with `home-`.
118
+
119
+ - A restore only writes. It puts back the files the backup holds and removes nothing. What it overwrites is saved first as `pre-restore-…`.
120
+ - Restoring files is safe while the gateway runs. It reloads `config.yaml`, `cron/jobs.json`, `org/` and `skills/` by itself.
121
+ - `config` also puts back `.env`, and the tokens as they were when the backup was taken.
68
122
 
69
- If temp files are stale or causing issues:
123
+ **Never restore a database yourself.** The ids that start with `sessions-` or `workflows-` are database copies. Restoring one needs the gateway stopped, which ends your own turn. If a database has to be restored, give the operator these steps from `docs/backup.md`: stop the gateway, wait a minute, run `ryoko backup restore sessions-<date> --gateway-stopped` where the gateway runs (inside the container when it runs in one), then start the gateway.
70
124
 
71
- Delete all contents of `tmp/` but keep the directory itself.
125
+ Before a risky edit, `ryoko backup run` archives those files on the spot; it leaves the databases alone, which the gateway copies itself once a day.
72
126
 
73
127
  ### Fix Malformed JSON
74
128
 
75
- If any JSON file (board.json, jobs.json, etc.) is malformed:
129
+ If a JSON file (`cron/jobs.json`, a department's `board.json`) is malformed:
76
130
  1. Read the raw file content.
77
- 2. Attempt to identify the syntax error (missing comma, bracket, quote).
78
- 3. Fix the error and parse to verify.
79
- 4. Write the corrected JSON back to the file.
80
- 5. If the file is unrecoverable, back it up as `<filename>.bak` and create a fresh default (empty array `[]` for boards and job files).
131
+ 2. Identify the syntax error (missing comma, bracket, quote).
132
+ 3. Fix that error in a copy and parse the copy to verify it.
133
+ 4. Replace the file with the verified copy: write a temporary file beside it and rename it.
134
+ 5. If you cannot repair it, restore it from a backup (`--only cron` for `jobs.json`, `--only org` for a board).
135
+ 6. If no backup helps, keep the broken file under another name, tell the user what could not be recovered, and stop.
136
+
137
+ Never replace `cron/jobs.json` with an empty list `[]`. While the file cannot be read, the scheduler keeps the jobs it had registered. A valid empty list removes every one of them. The `cron-manager` skill has the rules for editing jobs.
81
138
 
82
139
  ### Fix Malformed YAML
83
140
 
84
- If any YAML file (config.yaml, employee personas) is malformed:
141
+ If a YAML file (`config.yaml`, employee personas) is malformed:
85
142
  1. Read the raw file content.
86
- 2. Attempt to identify the syntax error (indentation, missing colon, bad quoting).
87
- 3. Fix the error and validate.
88
- 4. Write the corrected YAML back to the file.
89
- 5. If unrecoverable, back it up and inform the user what fields need to be re-entered.
143
+ 2. Identify the syntax error (indentation, missing colon, bad quoting).
144
+ 3. Fix that error in a copy and validate the copy.
145
+ 4. Replace the file with the validated copy: write a temporary file beside it and rename it.
146
+ 5. If you cannot repair it, restore it from a backup (`--only config` for `config.yaml`, `--only org` for a persona).
147
+ 6. If no backup helps, keep the broken file under another name and tell the user which settings need to be entered again. Do not write a new `config.yaml` from memory: it holds the connector tokens.
148
+
149
+ ### Sessions That Look Stuck
150
+
151
+ Do not change a session's status in `sessions/registry.db`. Check first whether the session is stuck at all (see "Check Sessions"), then use what the gateway provides:
152
+
153
+ - To stop a turn that should not go on: `ryoko api POST /api/sessions/<id>/stop`. It stops the engine process of that session and clears the messages queued behind it. The conversation continues with the next message.
154
+ - When a session keeps failing because its engine-side conversation can no longer be resumed: `ryoko api POST /api/sessions/<id>/reset`. It also forgets the engine-side conversation, so the next turn starts a new one. The transcript the gateway keeps is not deleted.
155
+ - From chat, the user can send `/new`: the session of that conversation is deleted, and the next message starts a new one.
156
+
157
+ Leave `waiting` sessions and long `running` turns alone. Never stop or reset the session you are running in. Report which sessions you acted on.
158
+
159
+ ### Leave `tmp/` Alone
160
+
161
+ Do not delete the contents of `tmp/`. It holds what running work depends on:
90
162
 
91
- ### Reset Stuck Sessions
163
+ - `tmp/attachments/`: the files of turns that are queued or running. A turn that waits for a usage limit keeps its files for hours.
164
+ - `tmp/engine-health.json`: which engine is out of allowance. New sessions are started by it.
165
+ - `tmp/settings/` and `tmp/mcp/`: the settings that running Claude sessions were started with.
166
+ - `tmp/pty-snapshots/`: the terminal history of interactive sessions.
167
+ - `tmp/restore-…`: the working directory of a restore in progress.
92
168
 
93
- If sessions are stuck in `running` status:
94
- 1. Identify the stuck sessions (running for more than 30 minutes with no updates).
95
- 2. Update their status to `failed` or `cancelled` in the session registry.
96
- 3. Report which sessions were reset.
169
+ The gateway cleans up after itself. Attachments are removed when their turn ends, and leftovers older than 24 hours are swept every hour.
97
170
 
98
171
  ### Fix Port Conflicts
99
172
 
100
173
  If the gateway cannot bind to its configured port:
101
174
  1. Check if another process is using the port: `lsof -i :<port>`
102
175
  2. If another {{portalName}} instance is running, tell the user to stop it first.
103
- 3. If a different process is using the port, suggest changing the port in `config.yaml`.
176
+ 3. If a different process is using the port, suggest changing `gateway.port` in `config.yaml`. A changed port takes effect after a restart.
104
177
 
105
178
  ## Reference
106
179
 
107
- For understanding {{portalName}}'s architecture and component relationships, refer to the documentation in `docs/` if available.
180
+ For understanding {{portalName}}'s architecture and component relationships, refer to the documentation in `docs/`. `docs/backup.md` describes what a backup holds, what it leaves out, and how a restore works.
108
181
 
109
182
  ## Error Handling
110
183
 
111
184
  - If log files do not exist, note that logging may not be configured and skip that check.
112
- - If config.yaml does not exist, this is likely a fresh install — suggest running the onboarding process instead.
113
- - Always back up files before modifying them during repair.
185
+ - If `config.yaml` does not exist, this is likely a fresh install — suggest running the onboarding process instead.
186
+ - Keep a copy of every file you modify during a repair.
114
187
  - Report all findings clearly to the user, even if no issues are found (a clean bill of health is useful information).
@@ -1,16 +0,0 @@
1
- import type { Engine, EngineRunOpts, EngineResult } from "../shared/types.js";
2
- /**
3
- * MockEngine — a zero-cost engine for E2E and integration tests.
4
- * Returns canned responses with simulated word-by-word streaming.
5
- * Cost is fixed at $0.001 per run for budget tracking tests.
6
- */
7
- export declare class MockEngine implements Engine {
8
- name: "mock";
9
- private responseIndex;
10
- private fixedResponse?;
11
- constructor(opts?: {
12
- fixedResponse?: string;
13
- });
14
- run(opts: EngineRunOpts): Promise<EngineResult>;
15
- }
16
- //# sourceMappingURL=mock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/engines/mock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQ9E;;;;GAIG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,IAAI,EAAG,MAAM,CAAU;IAEvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAIvC,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAgCtD"}
@@ -1,47 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- const CANNED_RESPONSES = [
3
- "This is a mock engine response for testing purposes.",
4
- "The mock engine returns canned responses to simulate real engine behavior.",
5
- "Mock response: task completed successfully.",
6
- ];
7
- /**
8
- * MockEngine — a zero-cost engine for E2E and integration tests.
9
- * Returns canned responses with simulated word-by-word streaming.
10
- * Cost is fixed at $0.001 per run for budget tracking tests.
11
- */
12
- export class MockEngine {
13
- name = "mock";
14
- responseIndex = 0;
15
- fixedResponse;
16
- constructor(opts) {
17
- this.fixedResponse = opts?.fixedResponse;
18
- }
19
- async run(opts) {
20
- const startMs = Date.now();
21
- const sessionId = opts.resumeSessionId || opts.sessionId || randomUUID();
22
- // Pick the next canned response (cycles through the list)
23
- const response = this.fixedResponse ??
24
- CANNED_RESPONSES[this.responseIndex++ % CANNED_RESPONSES.length];
25
- if (opts.onStream) {
26
- // Simulate word-by-word streaming with small delays
27
- const words = response.split(" ");
28
- for (let i = 0; i < words.length; i++) {
29
- const chunk = i === 0 ? words[i] : " " + words[i];
30
- opts.onStream({ type: "text", content: chunk });
31
- // Simulate network/processing delay between words
32
- await new Promise((resolve) => setTimeout(resolve, 10));
33
- }
34
- // Emit a final snapshot so clients can reconcile
35
- opts.onStream({ type: "text_snapshot", content: response });
36
- }
37
- const durationMs = Date.now() - startMs;
38
- return {
39
- sessionId,
40
- result: response,
41
- cost: 0.001,
42
- durationMs,
43
- numTurns: 1,
44
- };
45
- }
46
- }
47
- //# sourceMappingURL=mock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/engines/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,gBAAgB,GAAG;IACvB,sDAAsD;IACtD,4EAA4E;IAC5E,6CAA6C;CAC9C,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACrB,IAAI,GAAG,MAAe,CAAC;IAEf,aAAa,GAAG,CAAC,CAAC;IAClB,aAAa,CAAU;IAE/B,YAAY,IAAiC;QAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,aAAa,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAmB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE,CAAC;QAEzE,0DAA0D;QAC1D,MAAM,QAAQ,GACZ,IAAI,CAAC,aAAa;YAClB,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEnE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,oDAAoD;YACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChD,kDAAkD;gBAClD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,iDAAiD;YACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAExC,OAAO;YACL,SAAS;YACT,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,KAAK;YACX,UAAU;YACV,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;CACF"}
@@ -1,17 +0,0 @@
1
- import fs from "node:fs";
2
- /** Windows has no POSIX permission bits. fs.chmod there only toggles the
3
- * read-only attribute, so a file written with mode 0o600 reports 0o666 and a
4
- * directory reports 0o777 — every owner-only assertion fails for a reason the
5
- * code cannot fix.
6
- *
7
- * IMPORTANT: this is a gap in the platform, not only in the tests. Files Jinn
8
- * intends to be owner-only (gateway tokens, pairing challenges, per-session MCP
9
- * configs carrying capabilities, instance keys) are NOT restricted on Windows;
10
- * achieving that needs ACLs, which Jinn does not set today. Skipping the
11
- * assertion keeps the suite honest on Windows without implying the property
12
- * holds there. */
13
- export declare const POSIX_MODES_SUPPORTED: boolean;
14
- /** Assert permission bits, where the platform can express them. Accepts a path
15
- * or an already-taken Stats, so call sites read the way they did before. */
16
- export declare function expectPosixMode(target: string | fs.Stats, expected: number): void;
17
- //# sourceMappingURL=posix-mode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"posix-mode.d.ts","sourceRoot":"","sources":["../../../../src/shared/test-support/posix-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB;;;;;;;;;;mBAUmB;AACnB,eAAO,MAAM,qBAAqB,SAA+B,CAAC;AAElE;6EAC6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIjF"}
@@ -1,23 +0,0 @@
1
- import fs from "node:fs";
2
- import { expect } from "vitest";
3
- /** Windows has no POSIX permission bits. fs.chmod there only toggles the
4
- * read-only attribute, so a file written with mode 0o600 reports 0o666 and a
5
- * directory reports 0o777 — every owner-only assertion fails for a reason the
6
- * code cannot fix.
7
- *
8
- * IMPORTANT: this is a gap in the platform, not only in the tests. Files Jinn
9
- * intends to be owner-only (gateway tokens, pairing challenges, per-session MCP
10
- * configs carrying capabilities, instance keys) are NOT restricted on Windows;
11
- * achieving that needs ACLs, which Jinn does not set today. Skipping the
12
- * assertion keeps the suite honest on Windows without implying the property
13
- * holds there. */
14
- export const POSIX_MODES_SUPPORTED = process.platform !== "win32";
15
- /** Assert permission bits, where the platform can express them. Accepts a path
16
- * or an already-taken Stats, so call sites read the way they did before. */
17
- export function expectPosixMode(target, expected) {
18
- if (!POSIX_MODES_SUPPORTED)
19
- return;
20
- const stats = typeof target === "string" ? fs.statSync(target) : target;
21
- expect(stats.mode & 0o777).toBe(expected);
22
- }
23
- //# sourceMappingURL=posix-mode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"posix-mode.js","sourceRoot":"","sources":["../../../../src/shared/test-support/posix-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;;;;;mBAUmB;AACnB,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAElE;6EAC6E;AAC7E,MAAM,UAAU,eAAe,CAAC,MAAyB,EAAE,QAAgB;IACzE,IAAI,CAAC,qBAAqB;QAAE,OAAO;IACnC,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,11 +0,0 @@
1
- self.__BUILD_MANIFEST = {
2
- "__rewrites": {
3
- "afterFiles": [],
4
- "beforeFiles": [],
5
- "fallback": []
6
- },
7
- "sortedPages": [
8
- "/_app",
9
- "/_error"
10
- ]
11
- };self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
@@ -1 +0,0 @@
1
- self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
@@ -1 +0,0 @@
1
- self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,82074,e=>{"use strict";var a=e.i(47565),t=e.i(28225),r=e.i(20750);let n=(0,r.default)("rotate-ccw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);var l=e.i(77053),s=e.i(42095);let o=(0,r.default)("save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);var i=e.i(92470),c=e.i(62671),d=e.i(58963),p=e.i(45994),x=e.i(64374),v=e.i(51397),u=e.i(47721),h=e.i(43701);let m=[{value:"claude",label:"Anthropic(Claude)"},{value:"codex",label:"OpenAI(Codex)"},{value:"gemini",label:"Google(Gemini)"}],g=m.filter(e=>"gemini"!==e.value),b="__custom_model__",j=[{value:"claude-opus-5",label:"Opus 5 — 上(既定 / claude-opus-5)"},{value:"claude-fable-5-1",label:"Fable 5.1 — 高度な推論・長時間のエージェント作業"},{value:"claude-opus-4-8",label:"Opus 4.8 — 旧世代(ピン留め用 / claude-opus-4-8)"},{value:"opus",label:"Opus — CLI が解決する最新 Opus に自動追従"},{value:"sonnet",label:"Sonnet 5 — 中(バランス / claude-sonnet-5)"},{value:"claude-haiku-4-5",label:"Haiku 4.5 — 小(明示ID / トリアージ既定)"},{value:"haiku",label:"Haiku 4.5 — 小(軽量・高速 / claude-haiku-4-5)"}],y=[{value:"gpt-6-astra",label:"GPT-6 Astra — 高度な推論・コーディング"},{value:"gpt-5.6-sol",label:"GPT-5.6 Sol — 上(フラッグシップ / 既定)"},{value:"gpt-5.6-terra",label:"GPT-5.6 Terra — 中(バランス・低コスト)"},{value:"gpt-5.6-luna",label:"GPT-5.6 Luna — 小(最速・最安 / トリアージ向け)"},{value:"gpt-5.5",label:"GPT-5.5"},{value:"gpt-5.4",label:"GPT-5.4"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"gpt-5.2-codex",label:"GPT-5.2 Codex"},{value:"gpt-5.2",label:"GPT-5.2"},{value:"gpt-5.1-codex-max",label:"GPT-5.1 Codex Max"},{value:"gpt-5.1-codex-mini",label:"GPT-5.1 Codex Mini"},{value:"gpt-5-nano",label:"GPT-5 nano — 軽量(トリアージ向け)"}],f=[{value:"auto",label:"Auto — タスクに応じて自動選択(Gemini CLI推奨)"},{value:"pro",label:"Pro — 高度な推論向け(自動追従)"},{value:"flash",label:"Flash — 高速・バランス(自動追従)"},{value:"flash-lite",label:"Flash Lite — 最速・軽量(自動追従)"},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview"},{value:"gemini-3-pro-preview",label:"Gemini 3 Pro Preview"},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash"},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash Lite"}];function w(e){return"claude"===e?j:"gemini"===e?f:y}function N(e){return"claude"===e?"claude-opus-5":"gemini"===e?"gemini-2.5-pro":"gpt-5.6-sol"}function k(e,a){return!!(a&&w(e).some(e=>e.value===a))}let C="w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]";function S({id:e,engine:r,model:n,onChange:l,allowAutomatic:s=!1}){let o=k(r,n),[i,c]=(0,t.useState)(!!(n&&!o)),[d,p]=(0,t.useState)(n&&!o?n:""),x=(0,t.useRef)(null),v=(0,t.useRef)(!1),u=`${e}-help`,h=`${e}-custom`,m="claude"===r?"例: claude-sonnet-5-20260801":"gemini"===r?"例: gemini-3.1-pro-preview":"例: gpt-private-preview";(0,t.useEffect)(()=>{let e=!!(n&&!k(r,n));c(e),p(e?n??"":"")},[r,n]),(0,t.useEffect)(()=>{i&&x.current?.focus()},[i]);let g=i?b:n&&o?n:"";return(0,a.jsxs)("div",{className:"space-y-[var(--space-2)]",children:[(0,a.jsxs)("select",{id:e,value:g,"aria-describedby":u,onChange:e=>{let a=e.target.value;if(a===b){p(n&&!o?n:""),c(!0);return}c(!1),l(a||void 0)},className:`${C} cursor-pointer`,children:[s&&(0,a.jsx)("option",{value:"",children:"自動(ベンダー既定)"}),!s&&!n&&(0,a.jsx)("option",{value:"",children:"モデルを選択"}),w(r).map(e=>(0,a.jsx)("option",{value:e.value,children:e.label},e.value)),(0,a.jsx)("option",{value:b,children:"カスタムモデルIDを入力…"})]}),i&&(0,a.jsx)("input",{ref:x,id:h,type:"text",value:d,onChange:e=>p(e.target.value),onBlur:function(){if(v.current){v.current=!1;return}let e=d.trim();if(!e){let e=!!(n&&!o);p(e?n??"":""),c(e);return}l(e)},onKeyDown:e=>{"Enter"===e.key&&e.currentTarget.blur(),"Escape"===e.key&&(e.preventDefault(),v.current=!0,p(n&&!o?n:""),c(!!(n&&!o)),e.currentTarget.blur(),queueMicrotask(()=>{v.current=!1}))},placeholder:m,"aria-label":"カスタムモデルID","aria-describedby":u,autoComplete:"off",className:C}),(0,a.jsxs)("p",{id:u,className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)]",children:["一覧にないモデルは「カスタムモデルID」を選び、入力後に確定できます。","codex"===r&&"gpt-6-astra"===n&&(0,a.jsx)(a.Fragment,{children:" GPT-6 Astra の利用には、対応する Codex CLI とアカウントのアクセス権が必要です。"}),"claude"===r&&"claude-fable-5-1"===n&&(0,a.jsx)(a.Fragment,{children:" Fable 5.1 の利用には、Claude Code 2.1.255 以降とアカウントのアクセス権が必要です。"})]})]})}let I="typesafe-key-status-changed",T="w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]",A="px-[10px] py-[6px] border border-[var(--separator)] rounded-[var(--radius-sm)] text-[length:var(--text-footnote)] text-[var(--text-primary)] cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed",F="text-[length:var(--text-caption2)] text-[var(--text-tertiary)]",E={cli:"既存の CLI モデルで反応を判定します。",jev:"Jev で判定します。判断が難しい場合や API 障害時も判定用の CLI は起動しません。","jev-fallback":"Jev で判断が難しい場合や API 障害時は、下の CLI モデルで再判定します。","jev-shadow":"Jev と CLI の判定を比較します。実際の反応は CLI が決めます。"},P={missing_key:"API キーが未設定です。",unauthorized:"API キーを認証できませんでした。",rate_limited:"利用制限に達しました。時間をおいて再試行してください。",timeout:"接続がタイムアウトしました。",busy:"別の接続テストが実行中です。少し待って再試行してください。",provider_error:"TypeSafe 側でエラーが発生しました。",network_error:"TypeSafe に接続できませんでした。",invalid_response:"TypeSafe の応答を確認できませんでした。"};function D({label:e,id:t,children:r}){return(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-[var(--space-2)] py-[var(--space-2)]",children:[(0,a.jsx)("label",{htmlFor:t,className:"text-[length:var(--text-subheadline)] text-[var(--text-secondary)]",children:e}),(0,a.jsx)("div",{className:"w-[240px] max-w-full",children:r})]})}function M({config:e={},onChange:r,showCredentials:n=!0}){let l=(0,t.useId)(),s="jev-shadow"===e.backend?"jev-shadow":"jev"===e.backend?e.jev?.fallback==="cli"?"jev-fallback":"jev":"cli",o="cli"!==s,i=e.jev?.useCapabilities!==!1,[c,d]=(0,t.useState)(null),[p,x]=(0,t.useState)(""),[v,h]=(0,t.useState)(null),[m,b]=(0,t.useState)(null),[j,y]=(0,t.useState)(!1);async function f(){let e=p.trim();if(e&&!v){x(""),h("save"),b(null);try{let a=await u.api.saveTypeSafeKey(e);d(a),y(!1),b({error:!1,text:"API キーを保存しました。"}),window.dispatchEvent(new Event(I))}catch{b({error:!0,text:"API キーを保存できませんでした。入力内容と接続を確認してください。"})}finally{h(null)}}}async function w(){if(!v){x(""),h("delete"),b(null);try{let e=await u.api.deleteTypeSafeKey();d(e),y(!1),b({error:!1,text:e.configured?"保存したキーを削除しました。環境変数のキーを使用します。":"保存した API キーを削除しました。"}),window.dispatchEvent(new Event(I))}catch{b({error:!0,text:"API キーを削除できませんでした。"})}finally{h(null)}}}async function N(){if(!v&&c?.configured){h("test"),b(null);try{let e=await u.api.testTypeSafeKey(),a="number"==typeof e.latencyMs&&Number.isFinite(e.latencyMs)&&e.latencyMs>=0?`(${Math.round(e.latencyMs)} ms)`:"";b(e.ok?{error:!1,text:`接続を確認しました${a}。`}:{error:!0,text:P[e.error??""]??"接続を確認できませんでした。"})}catch{b({error:!0,text:"接続を確認できませんでした。"})}finally{h(null)}}}return(0,t.useEffect)(()=>{let e=!0,a=()=>{u.api.getTypeSafeKeyStatus().then(a=>{e&&(d(a),y(!1))},()=>{e&&(d(null),y(!0))})};return a(),window.addEventListener(I,a),()=>{e=!1,window.removeEventListener(I,a)}},[]),(0,a.jsxs)("div",{className:"space-y-[var(--space-2)]",children:[(0,a.jsx)(D,{label:"空気読みを有効化",id:`${l}-enabled`,children:(0,a.jsx)("button",{type:"button",id:`${l}-enabled`,role:"switch","aria-checked":e.enabled??!1,disabled:!e.enabled&&o&&!c?.configured,onClick:()=>r({...e,enabled:!e.enabled}),className:"relative block ml-auto w-[44px] h-[24px] rounded-[12px] border-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed",style:{background:e.enabled?"var(--system-green)":"var(--fill-primary)"},children:(0,a.jsx)("span",{className:"absolute top-[2px] w-[20px] h-[20px] rounded-full bg-white",style:{left:e.enabled?22:2}})})}),(0,a.jsx)(D,{label:"判定方式",id:`${l}-mode`,children:(0,a.jsxs)("select",{id:`${l}-mode`,value:s,"aria-describedby":`${l}-mode-help`,onChange:a=>{var t;return r("cli"===(t=a.target.value)||"jev-shadow"===t?{...e,backend:t}:{...e,backend:"jev",jev:{...e.jev,fallback:"jev-fallback"===t?"cli":"none"}})},className:T,children:[(0,a.jsx)("option",{value:"cli",children:"CLI(従来方式)"}),(0,a.jsx)("option",{value:"jev",disabled:!c?.configured,children:"Jev のみ"}),(0,a.jsx)("option",{value:"jev-fallback",disabled:!c?.configured,children:"Jev + CLI 再判定"}),(0,a.jsx)("option",{value:"jev-shadow",disabled:!c?.configured,children:"比較(実際の判定は CLI)"})]})}),(0,a.jsxs)("p",{id:`${l}-mode-help`,className:F,children:[E[s],"方式の変更は、ページ下部の「設定を保存」で反映されます。"]}),n?(0,a.jsxs)("div",{className:"space-y-[var(--space-2)] border-t border-[var(--separator)] pt-[var(--space-3)]",children:[(0,a.jsxs)("p",{className:"text-[length:var(--text-footnote)] text-[var(--text-secondary)]",children:["TypeSafe API キー:",j?"状態を取得できません":c?"stored"===c.source?"保存済み":"environment"===c.source?"環境変数で設定済み":"未設定":"確認中…"]}),(0,a.jsx)("p",{className:F,children:"Jev の利用には API キーが必要です。キーはこの画面から保存でき、保存後は表示されません。すべての Slack インスタンスで共有します。"}),(0,a.jsx)("label",{htmlFor:`${l}-key`,className:"block text-[length:var(--text-footnote)] text-[var(--text-secondary)]",children:c?.configured?"新しい API キー":"API キー"}),(0,a.jsx)("input",{id:`${l}-key`,type:"password",autoComplete:"new-password",spellCheck:!1,value:p,onChange:e=>x(e.target.value),disabled:null!==v,placeholder:c?.configured?"変更する場合だけ入力":"TypeSafe の API キーを入力",className:T}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-[var(--space-2)]",children:[(0,a.jsx)("button",{type:"button",onClick:()=>void f(),disabled:null!==v||!p.trim(),className:A,children:"save"===v?"保存中…":"API キーを保存"}),(0,a.jsx)("button",{type:"button",onClick:()=>void N(),disabled:null!==v||!c?.configured||!!p.trim(),className:A,children:"test"===v?"接続テスト中…":"保存済みキーで接続テスト"}),c?.source==="stored"&&(0,a.jsx)("button",{type:"button",onClick:()=>void w(),disabled:null!==v,className:A,children:"保存したキーを削除"})]}),(0,a.jsx)("p",{className:F,children:"キーの保存・削除はすぐに反映されます。接続テストには固定のサンプル文を使います。"}),m&&(0,a.jsx)("p",{role:m.error?"alert":"status",className:"text-[length:var(--text-footnote)]",style:{color:m.error?"var(--system-red)":"var(--system-green)"},children:m.text})]}):(0,a.jsxs)("p",{className:F,children:["TypeSafe API キーは上の Slack 設定で管理します。",c?.configured?"設定済みです。":"キーを保存すると Jev を選択できます。"]}),o&&c?.configured===!1&&(0,a.jsx)("p",{role:"alert",className:"text-[length:var(--text-footnote)] text-[var(--system-red)]",children:"Jev を使うには、先に API キーを保存してください。"}),o&&(0,a.jsx)(D,{label:"Jev タイムアウト (ms)",id:`${l}-jev-timeout`,children:(0,a.jsx)("input",{id:`${l}-jev-timeout`,type:"number",min:1,max:1e4,value:e.jev?.timeoutMs??"",placeholder:"3000",onChange:a=>r({...e,jev:{...e.jev,timeoutMs:a.target.value?Number(a.target.value):void 0}}),className:T})}),o&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(D,{label:"スキル・担当領域を考慮",id:`${l}-capabilities`,children:(0,a.jsx)("button",{type:"button",id:`${l}-capabilities`,role:"switch","aria-checked":i,"aria-describedby":`${l}-capabilities-help`,onClick:()=>r({...e,jev:{...e.jev,useCapabilities:!i}}),className:"relative block ml-auto w-[44px] h-[24px] rounded-[12px] border-none cursor-pointer",style:{background:i?"var(--system-green)":"var(--fill-primary)"},children:(0,a.jsx)("span",{className:"absolute top-[2px] w-[20px] h-[20px] rounded-full bg-white",style:{left:i?22:2}})})}),(0,a.jsx)("p",{id:`${l}-capabilities-help`,className:F,children:"担当社員の役割と利用可能なスキルから、具体的に手伝える依頼かを判断します。人宛ての会話や雑談には割り込みません。"}),(0,a.jsx)(D,{label:"呼ばれていない時の参加率 (%)",id:`${l}-proactive-percent`,children:(0,a.jsx)("input",{id:`${l}-proactive-percent`,type:"number",min:0,max:100,step:1,disabled:!i,"aria-describedby":`${l}-proactive-help`,value:e.jev?.proactiveParticipationPercent??0,onChange:a=>{let t=Number(a.target.value);Number.isInteger(t)&&t>=0&&t<=100&&r({...e,jev:{...e.jev,proactiveParticipationPercent:t}})},className:T})}),(0,a.jsx)("p",{id:`${l}-proactive-help`,className:F,children:"未解決の困りごとに具体的に役立てる時、呼ばれていなくても提案します。0%で停止、100%で対象の機会すべてに参加。判定の確信度とは別の割合で、名前で呼ばれた時や依頼への応答は減らしません。スキル・担当領域の考慮が必要です。メンション限定のチャンネル設定は優先されます。"})]}),"jev"!==s&&(0,a.jsxs)("div",{className:"border-t border-[var(--separator)] pt-[var(--space-3)]",children:[(0,a.jsx)("p",{className:"text-[length:var(--text-footnote)] text-[var(--text-secondary)]",children:"jev-shadow"===s?"比較に使う CLI モデル":"jev-fallback"===s?"再判定に使う CLI モデル":"CLI モデル"}),(0,a.jsx)(D,{label:"モデルのベンダー",id:`${l}-vendor`,children:(0,a.jsx)("select",{id:`${l}-vendor`,value:e.engine??"codex",className:T,onChange:a=>{let t=a.target.value;r({...e,engine:t,model:"claude"===t?"claude-haiku-4-5":"gpt-5-nano"})},children:g.map(e=>(0,a.jsx)("option",{value:e.value,children:e.label},e.value))})}),(0,a.jsx)(D,{label:"モデル",id:`${l}-model`,children:(0,a.jsx)(S,{id:`${l}-model`,engine:e.engine??"codex",model:e.model??void 0,allowAutomatic:!0,onChange:a=>r({...e,model:a??null})})}),(0,a.jsx)(D,{label:"CLI タイムアウト (ms)",id:`${l}-cli-timeout`,children:(0,a.jsx)("input",{id:`${l}-cli-timeout`,type:"number",min:1,value:e.timeoutMs??"",placeholder:"30000",className:T,onChange:a=>r({...e,timeoutMs:a.target.value?Number(a.target.value):void 0})})}),(0,a.jsx)(D,{label:"CLI パス(任意)",id:`${l}-bin`,children:(0,a.jsx)("input",{id:`${l}-bin`,value:e.bin??"",placeholder:e.engine??"codex",className:T,onChange:a=>r({...e,bin:a.target.value.trim()||void 0})})})]}),(0,a.jsx)(D,{label:"スレッド文脈の取得件数",id:`${l}-context`,children:(0,a.jsx)("input",{id:`${l}-context`,type:"number",min:1,max:10,value:e.threadContextLimit??"",placeholder:"10",className:T,onChange:a=>r({...e,threadContextLimit:a.target.value?Number(a.target.value):void 0})})}),(0,a.jsx)(D,{label:"ペルソナ(任意)",id:`${l}-persona`,children:(0,a.jsx)("input",{id:`${l}-persona`,value:e.persona??"",placeholder:"このボットの得意分野",className:T,onChange:a=>r({...e,persona:a.target.value||void 0})})})]})}var $=e.i(23414),L=e.i(39331);let B="openryoko-update-notification";function _({connectorOptions:e,defaultConnector:r,defaultChannel:n}){let[l,s]=(0,t.useState)(null),[c,d]=(0,t.useState)({enabled:!1,schedule:"0 9 * * *",timezone:"",connector:r??"",channel:n??"",maintenanceMode:"review"}),[p,x]=(0,t.useState)(!0),[v,h]=(0,t.useState)(!1),[m,g]=(0,t.useState)(!1),[b,j]=(0,t.useState)(null),y=(0,t.useCallback)(()=>{x(!0),u.api.getCronJobs().then(e=>{let a=e.find(e=>e.id===B||"update-notification"===e.kind);a?(s(a),d({enabled:a.enabled,schedule:a.schedule||"0 9 * * *",timezone:a.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone,connector:a.delivery?.connector||r||"",channel:a.delivery?.channel||n||"",maintenanceMode:a.maintenance?.mode??"review"})):d(e=>({...e,timezone:e.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone,connector:e.connector||r||"",channel:e.channel||n||""}))}).catch(e=>{j({type:"error",message:e instanceof Error?e.message:"通知設定を取得できませんでした"})}).finally(()=>x(!1))},[n,r]);(0,t.useEffect)(()=>{y()},[y]);let f=Array.from(new Set([...e,...c.connector?[c.connector]:[]]));async function w(){if(j(null),5!==c.schedule.trim().split(/\s+/).length)return void j({type:"error",message:"Cron式は「分 時 日 月 曜日」の5項目で入力してください"});if(c.enabled&&(!c.connector.trim()||!c.channel.trim()))return void j({type:"error",message:"通知を有効にするにはコネクタと送信先が必要です"});h(!0);let e={id:l?.id||B,name:"OpenRyoko Update Notification",kind:"update-notification",enabled:c.enabled,schedule:c.schedule.trim(),timezone:c.timezone.trim()||void 0,prompt:"",maintenance:{mode:c.maintenanceMode},delivery:c.connector.trim()&&c.channel.trim()?{connector:c.connector.trim(),channel:c.channel.trim()}:void 0};try{let a=l?await u.api.updateCronJob(l.id,e):await u.api.createCronJob(e);s(a),j({type:"success",message:c.enabled?"更新通知と運用点検を保存しました。新しいリリースや未点検の改善候補がある時に結果を知らせます。":"更新通知を無効で保存しました。"})}catch(e){j({type:"error",message:e instanceof Error?e.message:"保存に失敗しました"})}finally{h(!1)}}async function N(){if(l){g(!0),j(null);try{await u.api.triggerCronJob(l.id),j({type:"success",message:"更新確認を開始しました。新しいリリースや未点検の改善候補がある場合にチャットへ届きます。"})}catch(e){j({type:"error",message:e instanceof Error?e.message:"更新確認を開始できませんでした"})}finally{g(!1)}}}async function k(){if(l){g(!0),j(null);try{await u.api.runMaintenance(l.id,"review"),j({type:"success",message:"点検を開始しました。設定を変更せず、改善案を通知先へ送ります。"})}catch(e){j({type:"error",message:e instanceof Error?e.message:"点検を開始できませんでした"})}finally{g(!1)}}}return p?(0,a.jsxs)("div",{className:"flex items-center gap-2 py-3 text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:[(0,a.jsx)(i.Loader2,{size:14,className:"animate-spin"}),"更新通知設定を読み込み中…"]}):(0,a.jsxs)("div",{className:"mt-[var(--space-4)] border-t border-[var(--separator)] pt-[var(--space-4)]",children:[(0,a.jsxs)("div",{className:"mb-[var(--space-3)] flex items-start gap-[var(--space-3)]",children:[(0,a.jsx)($.BellRing,{size:18,className:"mt-0.5 shrink-0 text-[var(--system-blue)]","aria-hidden":"true"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-[length:var(--text-footnote)] font-[var(--weight-semibold)] text-[var(--text-primary)]",children:"アップデート通知と運用点検"}),(0,a.jsx)("p",{className:"mt-1 text-[length:var(--text-caption2)] leading-relaxed text-[var(--text-tertiary)]",children:"定期確認はコードで行い、新しいリリースや未点検の改善候補がある時だけAIを起動します。導入済み機能に合わせてCronやJevの利用を点検し、同じ内容の通知は繰り返しません。"})]})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between gap-4 py-2",children:[(0,a.jsx)("label",{htmlFor:"update-notification-enabled",className:"text-[length:var(--text-subheadline)] text-[var(--text-secondary)]",children:"チャット通知"}),(0,a.jsx)("button",{id:"update-notification-enabled",type:"button",role:"switch","aria-checked":c.enabled,onClick:()=>d(e=>({...e,enabled:!e.enabled})),className:"relative h-6 w-11 shrink-0 rounded-full border-none transition-colors",style:{background:c.enabled?"var(--system-green)":"var(--fill-primary)"},children:(0,a.jsx)("span",{className:"absolute top-0.5 h-5 w-5 rounded-full bg-white shadow-sm transition-[left]",style:{left:c.enabled?22:2}})})]}),(0,a.jsxs)("div",{className:"grid gap-[var(--space-3)] pt-2 sm:grid-cols-2",children:[(0,a.jsxs)("label",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:["Cron式",(0,a.jsx)("input",{value:c.schedule,onChange:e=>d(a=>({...a,schedule:e.target.value})),placeholder:"0 9 * * *",className:"apple-input mt-1 w-full rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--bg-secondary)] px-[10px] py-[6px] font-mono text-[length:var(--text-footnote)] text-[var(--text-primary)]"})]}),(0,a.jsxs)("label",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:["タイムゾーン",(0,a.jsx)("input",{value:c.timezone,onChange:e=>d(a=>({...a,timezone:e.target.value})),placeholder:"Asia/Tokyo",className:"apple-input mt-1 w-full rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--bg-secondary)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]"})]}),(0,a.jsxs)("label",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:["コネクタ",(0,a.jsxs)("select",{value:c.connector,onChange:e=>d(a=>({...a,connector:e.target.value})),className:"mt-1 w-full rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--bg-secondary)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]",children:[(0,a.jsx)("option",{value:"",children:"選択してください"}),f.map(e=>(0,a.jsx)("option",{value:e,children:e},e))]})]}),(0,a.jsxs)("label",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:["送信先",(0,a.jsx)("input",{value:c.channel,onChange:e=>d(a=>({...a,channel:e.target.value})),placeholder:"#general またはチャンネルID",className:"apple-input mt-1 w-full rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--bg-secondary)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]"})]})]}),(0,a.jsxs)("label",{className:"mt-3 block text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:["導入済み機能に合わせた運用点検",(0,a.jsxs)("select",{value:c.maintenanceMode,onChange:e=>d(a=>({...a,maintenanceMode:e.target.value})),className:"mt-1 w-full rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--bg-secondary)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]",children:[(0,a.jsx)("option",{value:"review",children:"点検・改善案を通知(既定)"}),(0,a.jsx)("option",{value:"apply",children:"検証できるローカル修正も実施"}),(0,a.jsx)("option",{value:"off",children:"運用点検は行わない"})]})]}),(0,a.jsx)("p",{className:"mt-1 text-[length:var(--text-caption2)] leading-relaxed text-[var(--text-tertiary)]",children:"更新確認と同じスケジュール・通知先を使います。自動修正でも、通知先・実行時刻の変更やJevなど外部サービスの新規有効化は提案に留めます。"}),b&&(0,a.jsx)("p",{className:`mt-3 text-[length:var(--text-caption1)] ${"success"===b.type?"text-[var(--system-green)]":"text-[var(--system-red)]"}`,role:"error"===b.type?"alert":"status",children:b.message}),(0,a.jsxs)("div",{className:"mt-[var(--space-3)] flex flex-wrap justify-end gap-[var(--space-2)]",children:[l&&(0,a.jsx)("button",{type:"button",onClick:k,disabled:m||v,className:"rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--fill-tertiary)] px-3 py-1.5 text-[length:var(--text-caption1)] text-[var(--text-secondary)] disabled:opacity-60",children:"点検を実行"}),l&&(0,a.jsxs)("button",{type:"button",onClick:N,disabled:m||v,className:"inline-flex items-center gap-1.5 rounded-[var(--radius-sm)] border border-[var(--separator)] bg-[var(--fill-tertiary)] px-3 py-1.5 text-[length:var(--text-caption1)] font-[var(--weight-medium)] text-[var(--text-secondary)] disabled:opacity-60",children:[m?(0,a.jsx)(i.Loader2,{size:13,className:"animate-spin"}):(0,a.jsx)(L.Play,{size:13}),"今すぐ確認"]}),(0,a.jsxs)("button",{type:"button",onClick:w,disabled:v||m,className:"inline-flex items-center gap-1.5 rounded-[var(--radius-sm)] border-none bg-[var(--accent)] px-3 py-1.5 text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--accent-contrast)] disabled:opacity-60",children:[v?(0,a.jsx)(i.Loader2,{size:13,className:"animate-spin"}):(0,a.jsx)(o,{size:13}),"通知設定を保存"]})]})]})}let O=[{label:"Red",value:"#EF4444"},{label:"Orange",value:"#F97316"},{label:"Amber",value:"#F59E0B"},{label:"Yellow",value:"#EAB308"},{label:"Lime",value:"#84CC16"},{label:"Green",value:"#22C55E"},{label:"Emerald",value:"#10B981"},{label:"Cyan",value:"#06B6D4"},{label:"Blue",value:"#3B82F6"},{label:"Indigo",value:"#6366F1"},{label:"Violet",value:"#8B5CF6"},{label:"Pink",value:"#EC4899"}];function G({title:e,children:t}){return(0,a.jsxs)("section",{className:"mb-[var(--space-6)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] tracking-[var(--tracking-wide)] uppercase text-[var(--text-tertiary)] px-[var(--space-2)] pb-[var(--space-2)]",children:e}),(0,a.jsx)("div",{className:"bg-[var(--material-regular)] rounded-[var(--radius-md)] border border-[var(--separator)] p-[var(--space-4)]",children:t})]})}function z({label:e,htmlFor:t,children:r}){return(0,a.jsxs)("div",{className:"flex items-center justify-between py-[var(--space-2)] gap-[var(--space-4)]",children:[(0,a.jsx)("label",{htmlFor:t,className:"text-[length:var(--text-subheadline)] text-[var(--text-secondary)] shrink-0",children:e}),(0,a.jsx)("div",{className:"w-[240px] shrink-0",children:r})]})}function J({value:e,onChange:t,type:r="text",placeholder:n}){return(0,a.jsx)("input",{type:r,value:e,onChange:e=>t(e.target.value),placeholder:n,className:"apple-input w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]"})}function R({id:e,value:t,onChange:r,options:n}){return(0,a.jsx)("select",{id:e,value:t,onChange:e=>r(e.target.value),className:"w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)] cursor-pointer",children:n.map(e=>(0,a.jsx)("option",{value:e.value,children:e.label},e.value))})}function W({checked:e,onChange:t}){return(0,a.jsx)("button",{role:"switch","aria-checked":e,onClick:()=>t(!e),className:"w-[44px] h-[24px] rounded-[12px] border-none cursor-pointer relative shrink-0 transition-[background] duration-200 ease-[var(--ease-smooth)]",style:{background:e?"var(--system-green)":"var(--fill-primary)"},children:(0,a.jsx)("span",{className:"absolute top-[2px] w-[20px] h-[20px] rounded-full bg-white shadow-[0_1px_3px_rgba(0,0,0,0.2)] transition-[left] duration-200 ease-[var(--ease-spring)]",style:{left:e?22:2}})})}let H={en:"English",bg:"Bulgarian",de:"German",fr:"French",es:"Spanish",it:"Italian",pt:"Portuguese",ru:"Russian",zh:"Chinese",ja:"Japanese",ko:"Korean",ar:"Arabic",hi:"Hindi",tr:"Turkish",pl:"Polish",nl:"Dutch",sv:"Swedish",cs:"Czech",el:"Greek",ro:"Romanian",uk:"Ukrainian",he:"Hebrew",da:"Danish",fi:"Finnish",hu:"Hungarian",no:"Norwegian",sk:"Slovak",hr:"Croatian",ca:"Catalan",th:"Thai",vi:"Vietnamese",id:"Indonesian",ms:"Malay",tl:"Filipino",sr:"Serbian",lt:"Lithuanian",lv:"Latvian",sl:"Slovenian",et:"Estonian"};function U(){let[e,r]=(0,t.useState)(null),[n,l]=(0,t.useState)(!1),[s,o]=(0,t.useState)("");if((0,t.useEffect)(()=>{u.api.sttStatus().then(r).catch(()=>{})},[]),(0,t.useEffect)(()=>{if(!e?.downloading)return;let a=setInterval(()=>{u.api.sttStatus().then(r).catch(()=>{})},1500);return()=>clearInterval(a)},[e?.downloading]),!e)return null;let i=Object.entries(H).filter(([a])=>!e.languages.includes(a)).sort((e,a)=>e[1].localeCompare(a[1]));return(0,a.jsxs)(G,{title:"音声入力",children:[(0,a.jsxs)("div",{className:"flex items-center gap-[var(--space-3)] mb-[var(--space-4)]",children:[(0,a.jsx)("div",{className:"w-[8px] h-[8px] rounded-full shrink-0",style:{background:e.available?"var(--system-green)":"var(--system-red)"}}),(0,a.jsxs)("div",{className:"flex-1",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-subheadline)] font-[var(--weight-medium)] text-[var(--text-primary)]",children:e.available?`Whisper ${(e.model||"small").charAt(0).toUpperCase()+(e.model||"small").slice(1)}`:"No model installed"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:e.available?"Offline speech recognition ready":"Download a model to enable voice input"})]})]}),!e.available&&!e.downloading&&(0,a.jsx)("button",{onClick:function(){u.api.sttDownload().then(()=>r(e=>e?{...e,downloading:!0,progress:0}:e)).catch(()=>{})},className:"w-full p-[var(--space-3)] rounded-[var(--radius-md)] bg-[var(--accent)] text-[var(--accent-contrast)] border-none cursor-pointer text-[length:var(--text-footnote)] font-[var(--weight-semibold)] mb-[var(--space-4)]",children:"Download Whisper Small (~500MB)"}),e.downloading&&(0,a.jsxs)("div",{className:"mb-[var(--space-4)]",children:[(0,a.jsxs)("div",{className:"flex justify-between mb-[var(--space-2)] text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:[(0,a.jsx)("span",{children:"モデルをダウンロード中…"}),(0,a.jsxs)("span",{children:[e.progress,"%"]})]}),(0,a.jsx)("div",{className:"h-[6px] rounded-[3px] bg-[var(--fill-tertiary)] overflow-hidden",children:(0,a.jsx)("div",{className:"h-full rounded-[3px] bg-[var(--accent)] transition-[width] duration-300 ease-out",style:{width:`${e.progress}%`}})})]}),e.available&&(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-2)] pt-[var(--space-3)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"文字起こし言語"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mb-[var(--space-3)]",children:"最初の言語がデフォルトになります。複数追加するとチャットで言語ピッカーが表示されます。"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-[var(--space-2)] mb-[var(--space-3)]",children:e.languages.map(t=>(0,a.jsxs)("div",{className:"inline-flex items-center gap-[var(--space-1)] px-[8px] py-[3px] rounded-[var(--radius-sm)] bg-[var(--fill-secondary)] text-[length:var(--text-caption1)] font-[var(--weight-medium)] text-[var(--text-primary)]",children:[(0,a.jsx)("span",{className:"font-[family-name:var(--font-mono)] uppercase text-[length:var(--text-caption2)] font-[var(--weight-semibold)] text-[var(--accent)] mr-[2px]",children:t}),H[t]||t,e.languages.length>1&&(0,a.jsx)("button",{onClick:()=>(function(a){if(!e||e.languages.length<=1)return;let t=e.languages.filter(e=>e!==a);l(!0),u.api.sttUpdateConfig(t).then(()=>r(e=>e?{...e,languages:t}:e)).catch(()=>{}).finally(()=>l(!1))})(t),disabled:n,"aria-label":`Remove ${H[t]||t}`,className:"bg-none border-none cursor-pointer p-0 ml-[2px] text-[var(--text-quaternary)] text-[14px] leading-none flex items-center",children:"×"})]},t))}),(0,a.jsxs)("div",{className:"flex gap-[var(--space-2)]",children:[(0,a.jsxs)("select",{value:s,onChange:e=>o(e.target.value),className:"flex-1 bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] cursor-pointer",style:{color:s?"var(--text-primary)":"var(--text-tertiary)"},children:[(0,a.jsx)("option",{value:"",children:"言語を追加…"}),i.map(([e,t])=>(0,a.jsxs)("option",{value:e,children:[e.toUpperCase()," — ",t]},e))]}),(0,a.jsx)("button",{onClick:function(){if(!s||!e||e.languages.includes(s))return;let a=[...e.languages,s];l(!0),o(""),u.api.sttUpdateConfig(a).then(()=>r(e=>e?{...e,languages:a}:e)).catch(()=>{}).finally(()=>l(!1))},disabled:!s||n,className:"px-[14px] py-[6px] rounded-[var(--radius-sm)] border-none text-[length:var(--text-footnote)] font-[var(--weight-semibold)] shrink-0",style:{background:s?"var(--accent)":"var(--fill-tertiary)",color:s?"var(--accent-contrast)":"var(--text-quaternary)",cursor:s?"pointer":"default"},children:"Add"})]})]})})]})}function q(){let e,{settings:r}=(0,d.useSettings)(),[n,l]=(0,t.useState)(!1),[s,o]=(0,t.useState)(!0),i=JSON.stringify({display_information:{name:e=(r.portalName??"").trim()||"Ryoko"},features:{app_home:{messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},bot_user:{display_name:e,always_online:!0},assistant_view:{assistant_description:`${e} — your AI assistant`,suggested_prompts:[{title:"What can you do?",message:"What can you help me with?"}]}},oauth_config:{scopes:{bot:["app_mentions:read","assistant:write","canvases:read","canvases:write","channels:history","channels:read","chat:write","chat:write.customize","files:read","files:write","groups:history","groups:read","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","reactions:read","reactions:write","users:read","users:read.email"],user:["channels:history","channels:read","files:read","groups:history","groups:read","im:history","im:read","mpim:history","mpim:read","search:read","users:read","bookmarks:read"]}},settings:{event_subscriptions:{bot_events:["app_mention","assistant_thread_context_changed","assistant_thread_started","message.channels","message.groups","message.im","message.mpim","reaction_added"]},socket_mode_enabled:!0}},null,2);return(0,a.jsxs)("div",{className:"border border-[var(--separator)] rounded-[var(--radius-md)] bg-[var(--fill-quaternary)] p-[var(--space-3)] mb-[var(--space-3)]",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex items-center justify-between w-full text-left cursor-pointer",children:[(0,a.jsx)("span",{className:"text-[length:var(--text-body)] font-[var(--weight-semibold)] text-[var(--text-primary)]",children:"Slack App セットアップガイド"}),(0,a.jsx)("span",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:s?"閉じる":"開く"})]}),s&&(0,a.jsxs)("div",{className:"mt-[var(--space-3)]",children:[(0,a.jsxs)("ol",{className:"list-decimal pl-[20px] text-[length:var(--text-caption1)] text-[var(--label-secondary)] leading-relaxed mb-[var(--space-3)] space-y-[2px]",children:[(0,a.jsxs)("li",{children:[(0,a.jsx)("a",{href:"https://api.slack.com/apps",target:"_blank",rel:"noopener noreferrer",className:"text-[var(--accent)] underline",children:"Slack API の Your Apps ページ"}),"を開き、「Create New App」を選択。"]}),(0,a.jsx)("li",{children:"「From a manifest」を選び、対象ワークスペースを指定。"}),(0,a.jsx)("li",{children:"下のJSONをコピーして貼り付け、「Create」で作成。"}),(0,a.jsxs)("li",{children:["「Install to Workspace」を実行し、OAuth & Permissions の「Bot User OAuth Token」(",(0,a.jsx)("code",{children:"xoxb-…"}),")を下の Bot Token に貼り付け。"]}),(0,a.jsxs)("li",{children:["「Basic Information」→「App-Level Tokens」で ",(0,a.jsx)("code",{children:"connections:write"})," ","スコープ付きトークンを発行し(",(0,a.jsx)("code",{children:"xapp-…"}),")、下の App Token に貼り付け。"]})]}),(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("button",{type:"button",onClick:function(){navigator.clipboard.writeText(i).then(()=>{l(!0),setTimeout(()=>l(!1),1500)})},"aria-label":"Copy manifest JSON",className:"absolute top-2 right-2 py-0.5 px-2 text-[11px] rounded-[var(--radius-sm)] bg-[var(--fill-secondary)] text-[var(--text-secondary)] border border-[var(--separator)] cursor-pointer",children:n?"コピー済み":"コピー"}),(0,a.jsx)("pre",{className:"bg-[var(--fill-tertiary)] border border-[var(--separator)] rounded-[var(--radius-md)] py-[var(--space-3)] px-[var(--space-4)] overflow-x-auto text-[12px] leading-normal font-['SF_Mono',Menlo,monospace] text-[var(--text-primary)] max-h-[280px]",children:(0,a.jsx)("code",{children:i})})]})]})]})}e.s(["default",0,function(){(0,p.useBreadcrumbs)([{label:"Settings"}]);let{settings:e,setAccentColor:r,setPortalName:b,setPortalSubtitle:j,setOperatorName:y,setPortalEmoji:f,setLanguage:w,resetAll:k}=(0,d.useSettings)(),{theme:C,setTheme:I}=(0,x.useTheme)(),[T,A]=(0,t.useState)(e.portalName??""),[F,E]=(0,t.useState)(e.portalSubtitle??""),[P,D]=(0,t.useState)(e.operatorName??""),[$,L]=(0,t.useState)(e.portalEmoji??""),[B,H]=(0,t.useState)(e.language??"English"),[K,V]=(0,t.useState)(e.accentColor??""),[Y,Q]=(0,t.useState)(!1),[Z,X]=(0,t.useState)({}),[ee,ea]=(0,t.useState)(!0),[et,er]=(0,t.useState)(null),[en,el]=(0,t.useState)(!1),[es,eo]=(0,t.useState)(null),[ei,ec]=(0,t.useState)(null),[ed,ep]=(0,t.useState)("unknown"),[ex,ev]=(0,t.useState)([]),[eu,eh]=(0,t.useState)(null),[em,eg]=(0,t.useState)(!1),[eb,ej]=(0,t.useState)(null);(0,t.useEffect)(()=>{u.api.getOrg().then(e=>{e?.employees&&ev(e.employees.map(e=>"string"==typeof e?{name:e,displayName:e}:{name:e.name,displayName:e.displayName||e.name}))}).catch(()=>{})},[]);let ey=async()=>{eg(!0),ej(null);try{let e=await fetch("/api/connectors/slack/channels"),a=await e.json();if(a?.ok)eh(a.channels??[]);else{let t=a?.error||`HTTP ${e.status}`;"missing_scope"===t?ej("Bot に canvases / channels scope が足りません。上のSlack App Manifestを貼り直して再インストールしてください。"):"slack_not_configured"===t?ej("Slack コネクタが未起動です。先に Bot Token / App Token を保存して再起動してください。"):ej(`チャンネル取得失敗: ${t}`),eh(null)}}catch(e){ej(e instanceof Error?e.message:String(e)),eh(null)}finally{eg(!1)}};function ef(){ea(!0),u.api.getConfig().then(e=>{X(e),er(null)}).catch(e=>er(e.message)).finally(()=>ea(!1))}function ew(e,a){X(t=>{let r=structuredClone(t),n=r;for(let a=0;a<e.length-1;a++)n[e[a]]&&"object"==typeof n[e[a]]||(n[e[a]]={}),n=n[e[a]];return n[e[e.length-1]]=a,"max"===n.effortLevel&&("engines.codex.model"===e.join(".")&&"gpt-6-astra"!==a||"engines.claude.model"===e.join(".")&&"claude-fable-5-1"!==a)&&(n.effortLevel="default"),r})}(0,t.useEffect)(()=>{A(e.portalName??""),E(e.portalSubtitle??""),D(e.operatorName??""),L(e.portalEmoji??""),H(e.language??"English"),V(e.accentColor??"")},[e.portalName,e.portalSubtitle,e.operatorName,e.portalEmoji,e.language,e.accentColor]),(0,t.useEffect)(()=>{ef()},[]),(0,t.useEffect)(()=>{if(!Z.connectors?.whatsapp)return;let e=!1;async function a(){try{let a=await fetch("/api/status"),t=await a.json(),r=t?.connectors?.whatsapp?.status;if(e||ep(r??"unknown"),"qr_pending"===r){let a=await fetch("/api/connectors/whatsapp/qr"),t=await a.json();e||ec(t.qr)}else e||ec(null)}catch{}}a();let t=setInterval(()=>{a()},1e4);return()=>{e=!0,clearInterval(t)}},[Z.connectors?.whatsapp]);let eN=Z.engines?.default==="codex"?"codex":Z.engines?.default==="gemini"?"gemini":"claude";return(0,a.jsx)(c.PageLayout,{children:(0,a.jsx)("div",{className:"h-full overflow-y-auto bg-[var(--bg)]",children:(0,a.jsxs)("div",{className:"max-w-[640px] mx-auto px-[var(--space-4)] py-[var(--space-6)] pb-[var(--space-12)]",children:[(0,a.jsx)("h1",{className:"text-[length:var(--text-title1)] font-[var(--weight-bold)] tracking-[var(--tracking-tight)] text-[var(--text-primary)] mb-[var(--space-6)]",children:"Settings"}),(0,a.jsxs)(G,{title:"外観",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-footnote)] font-[var(--weight-medium)] text-[var(--text-secondary)] mb-[var(--space-2)]",children:"Theme"}),(0,a.jsx)("div",{className:"grid grid-cols-5 gap-[var(--space-2)] mb-[var(--space-4)]",children:v.THEMES.map(e=>{let t=C===e.id;return(0,a.jsxs)("button",{onClick:()=>I(e.id),className:"flex flex-col items-center gap-[var(--space-1)] px-[var(--space-2)] py-[var(--space-3)] rounded-[var(--radius-md)] bg-[var(--fill-quaternary)] cursor-pointer transition-all duration-150 ease-[var(--ease-smooth)]",style:{border:t?"2px solid var(--accent)":"2px solid var(--separator)"},children:[(0,a.jsx)("span",{className:"text-[24px]",children:e.emoji}),(0,a.jsx)("span",{className:"text-[length:var(--text-caption2)]",style:{fontWeight:t?"var(--weight-semibold)":"var(--weight-medium)",color:t?"var(--accent)":"var(--text-secondary)"},children:e.label})]},e.id)})}),(0,a.jsx)("div",{className:"text-[length:var(--text-footnote)] font-[var(--weight-medium)] text-[var(--text-secondary)] mb-[var(--space-2)]",children:"Accent Color"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-[var(--space-2)] mb-[var(--space-3)]",children:O.map(t=>{let n=e.accentColor===t.value;return(0,a.jsx)("button",{onClick:()=>r(t.value),"aria-label":t.label,title:t.label,className:"w-[32px] h-[32px] rounded-full cursor-pointer transition-all duration-100 ease-[var(--ease-smooth)] flex items-center justify-center",style:{background:t.value,border:n?"2px solid var(--text-primary)":"2px solid transparent",outline:n?`2px solid ${t.value}`:"none",outlineOffset:2},children:n&&(0,a.jsx)(s.Check,{size:14,color:"#fff",strokeWidth:3})},t.value)})}),(0,a.jsxs)("div",{className:"flex items-center gap-[var(--space-3)]",children:[(0,a.jsxs)("label",{className:"flex items-center gap-[var(--space-2)] text-[length:var(--text-footnote)] text-[var(--text-secondary)] cursor-pointer",children:["Custom:",(0,a.jsx)("input",{type:"color",value:e.accentColor??"#3B82F6",onChange:e=>r(e.target.value),className:"w-[28px] h-[28px] border-none rounded-full cursor-pointer bg-transparent p-0"})]}),(0,a.jsx)("input",{type:"text",placeholder:"#3B82F6",value:K,onChange:e=>{V(e.target.value),/^#[0-9a-fA-F]{6}$/.test(e.target.value)&&r(e.target.value)},className:"apple-input w-[90px] px-[8px] py-[4px] text-[length:var(--text-caption1)] bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] text-[var(--text-primary)] font-mono"}),e.accentColor&&(0,a.jsxs)("button",{onClick:()=>r(null),className:"text-[length:var(--text-footnote)] text-[var(--system-blue)] bg-none border-none cursor-pointer p-0 inline-flex items-center gap-[4px]",children:[(0,a.jsx)(n,{size:12}),"リセット"]})]})]}),(0,a.jsx)(G,{title:"COO絵文字",children:(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)] mb-[var(--space-3)]",children:"サイドバーに表示される COO の絵文字を選択してください。"}),(0,a.jsxs)("div",{className:"relative flex items-center gap-[var(--space-4)]",children:[(0,a.jsx)("button",{onClick:()=>Q(!Y),className:"text-4xl cursor-pointer bg-transparent border-none p-0",children:e.portalEmoji??"🧞"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-[length:var(--text-body)] font-[var(--weight-semibold)] text-[var(--text-primary)]",children:e.operatorName||"Jimbo"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] text-[var(--text-tertiary)]",children:"絵文字をクリックして変更"})]}),Y&&(0,a.jsx)(h.EmojiPicker,{current:e.portalEmoji??"🧞",onSelect:e=>{f(e),Q(!1)},onClose:()=>Q(!1)})]})]})}),(0,a.jsx)(G,{title:"ブランディング",children:(0,a.jsxs)("div",{className:"flex flex-col gap-[var(--space-3)]",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[length:var(--text-caption1)] text-[var(--text-tertiary)] mb-[var(--space-1)]",children:"Portal Name"}),(0,a.jsx)("input",{type:"text",className:"apple-input w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]",placeholder:"Jinn",value:T,onChange:e=>A(e.target.value),onBlur:()=>{b(T||null),u.api.completeOnboarding({portalName:T||void 0}).catch(()=>{})}})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[length:var(--text-caption1)] text-[var(--text-tertiary)] mb-[var(--space-1)]",children:"Portal Subtitle"}),(0,a.jsx)("input",{type:"text",className:"apple-input w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]",placeholder:"Command Centre",value:F,onChange:e=>E(e.target.value),onBlur:()=>j(F||null)})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[length:var(--text-caption1)] text-[var(--text-tertiary)] mb-[var(--space-1)]",children:"Operator Name"}),(0,a.jsx)("input",{type:"text",className:"apple-input w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)]",placeholder:"Your Name",value:P,onChange:e=>D(e.target.value),onBlur:()=>{y(P||null),u.api.completeOnboarding({operatorName:P||void 0}).catch(()=>{})}})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[length:var(--text-caption1)] text-[var(--text-tertiary)] mb-[var(--space-1)]",children:"Portal Emoji"}),(0,a.jsx)("input",{type:"text",className:"apple-input w-[80px] text-center text-[length:var(--text-title2)] px-[8px] py-[6px] bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)]",placeholder:"\\ud83e\\uddde",value:$,onChange:e=>L(e.target.value),onBlur:()=>f($||null)})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[length:var(--text-caption1)] text-[var(--text-tertiary)] mb-[var(--space-1)]",children:"Language"}),(0,a.jsxs)("select",{value:B,onChange:e=>H(e.target.value),onBlur:()=>{w(B||"English"),u.api.completeOnboarding({language:B||void 0}).catch(()=>{})},className:"w-full bg-[var(--bg-secondary)] border border-[var(--separator)] rounded-[var(--radius-sm)] px-[10px] py-[6px] text-[length:var(--text-footnote)] text-[var(--text-primary)] cursor-pointer",children:[(0,a.jsx)("option",{value:"English",children:"English"}),(0,a.jsx)("option",{value:"Spanish",children:"Spanish"}),(0,a.jsx)("option",{value:"French",children:"French"}),(0,a.jsx)("option",{value:"German",children:"German"}),(0,a.jsx)("option",{value:"Portuguese",children:"Portuguese"}),(0,a.jsx)("option",{value:"Italian",children:"Italian"}),(0,a.jsx)("option",{value:"Dutch",children:"Dutch"}),(0,a.jsx)("option",{value:"Russian",children:"Russian"}),(0,a.jsx)("option",{value:"Chinese",children:"Chinese"}),(0,a.jsx)("option",{value:"Japanese",children:"Japanese"}),(0,a.jsx)("option",{value:"Korean",children:"Korean"}),(0,a.jsx)("option",{value:"Arabic",children:"Arabic"}),(0,a.jsx)("option",{value:"Hindi",children:"Hindi"}),(0,a.jsx)("option",{value:"Bulgarian",children:"Bulgarian"})]})]})]})}),es&&(0,a.jsx)("div",{className:"mb-[var(--space-4)] px-[var(--space-4)] py-[var(--space-3)] rounded-[var(--radius-md)] text-[length:var(--text-footnote)]",style:{background:"success"===es.type?"rgba(34,197,94,0.1)":"rgba(239,68,68,0.1)",border:`1px solid ${"success"===es.type?"rgba(34,197,94,0.3)":"rgba(239,68,68,0.3)"}`,color:"success"===es.type?"var(--system-green)":"var(--system-red)"},children:es.message}),ee?(0,a.jsxs)("div",{className:"text-center p-[var(--space-8)] text-[var(--text-tertiary)] text-[length:var(--text-footnote)]",children:[(0,a.jsx)(i.Loader2,{size:20,className:"mx-auto mb-[var(--space-2)] animate-spin"}),"Loading gateway config..."]}):et?(0,a.jsxs)("div",{className:"mb-[var(--space-6)] px-[var(--space-4)] py-[var(--space-3)] rounded-[var(--radius-md)] text-[length:var(--text-footnote)] text-[var(--system-red)]",style:{background:"rgba(239,68,68,0.1)",border:"1px solid rgba(239,68,68,0.3)"},children:["Failed to load config: ",et]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(G,{title:"ゲートウェイ設定",children:[(0,a.jsx)(z,{label:"Port",children:(0,a.jsx)(J,{type:"number",value:String(Z.gateway?.port??""),onChange:e=>ew(["gateway","port"],Number(e)||0),placeholder:"7777"})}),(0,a.jsx)(z,{label:"Host",children:(0,a.jsx)(J,{value:Z.gateway?.host??"",onChange:e=>ew(["gateway","host"],e),placeholder:"127.0.0.1"})}),(0,a.jsx)(z,{label:"既定モデルのベンダー",htmlFor:"default-model-vendor",children:(0,a.jsx)(R,{id:"default-model-vendor",value:eN,onChange:e=>{ew(["engines","default"],e),Z.engines?.[e]?.model||ew(["engines",e,"model"],N(e)),"gemini"!==e||Z.engines?.gemini?.bin||ew(["engines","gemini","bin"],"gemini")},options:m})}),(0,a.jsx)(z,{label:"既定モデル",htmlFor:"default-model",children:(0,a.jsx)(S,{id:"default-model",engine:eN,model:Z.engines?.[eN]?.model??N(eN),onChange:e=>ew(["engines",eN,"model"],e??N(eN))})})]}),(0,a.jsxs)(G,{title:"エンジン設定",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Claude"}),(0,a.jsx)(z,{label:"Binary Path",children:(0,a.jsx)(J,{value:Z.engines?.claude?.bin??"",onChange:e=>ew(["engines","claude","bin"],e),placeholder:"claude"})}),(0,a.jsx)(z,{label:"Model",htmlFor:"claude-engine-model",children:(0,a.jsx)(S,{id:"claude-engine-model",engine:"claude",model:Z.engines?.claude?.model??N("claude"),onChange:e=>ew(["engines","claude","model"],e??N("claude"))})}),(0,a.jsx)(z,{label:"Effort Level",children:(0,a.jsx)(R,{value:Z.engines?.claude?.effortLevel??"default",onChange:e=>ew(["engines","claude","effortLevel"],e),options:[{value:"default",label:"Default"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"xhigh",label:"Extra High"},..."claude-fable-5-1"===Z.engines?.claude?.model?[{value:"max",label:"Max"}]:[]]})}),(0,a.jsx)(z,{label:"インタラクティブPTY(Max定額)",children:(0,a.jsx)(W,{checked:Z.engines?.claude?.interactive??!1,onChange:e=>ew(["engines","claude","interactive"],e)})}),(0,a.jsxs)("div",{className:"text-[length:var(--text-caption1)] text-[var(--label-secondary)] mt-[4px]",children:["有効にすると Claude の作業ターンを PTY(cc_entrypoint=cli)で実行します。 Claude CLI が Max サブスクリプションでログイン済みなら、API 従量課金ではなく Max 側の利用枠で実行されます。 SSH リモート実行の従業員は headless ",(0,a.jsx)("code",{children:"claude -p"})," にフォールバックします。",(0,a.jsx)("strong",{children:"変更の反映にはゲートウェイの再起動が必要です"}),"(保存後に ",(0,a.jsx)("code",{children:"ryoko stop && ryoko start"})," など)。"]}),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Codex"}),(0,a.jsx)(z,{label:"Binary Path",children:(0,a.jsx)(J,{value:Z.engines?.codex?.bin??"",onChange:e=>ew(["engines","codex","bin"],e),placeholder:"codex"})}),(0,a.jsx)(z,{label:"Model",htmlFor:"codex-engine-model",children:(0,a.jsx)(S,{id:"codex-engine-model",engine:"codex",model:Z.engines?.codex?.model??N("codex"),onChange:e=>ew(["engines","codex","model"],e??N("codex"))})}),(0,a.jsx)(z,{label:"Effort Level",children:(0,a.jsx)(R,{value:Z.engines?.codex?.effortLevel??"default",onChange:e=>ew(["engines","codex","effortLevel"],e),options:[{value:"default",label:"Default"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"xhigh",label:"Extra High"},..."gpt-6-astra"===Z.engines?.codex?.model?[{value:"max",label:"Max"}]:[]]})}),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Gemini"}),(0,a.jsx)(z,{label:"Binary Path",children:(0,a.jsx)(J,{value:Z.engines?.gemini?.bin??"",onChange:e=>ew(["engines","gemini","bin"],e),placeholder:"gemini"})}),(0,a.jsx)(z,{label:"Model",htmlFor:"gemini-engine-model",children:(0,a.jsx)(S,{id:"gemini-engine-model",engine:"gemini",model:Z.engines?.gemini?.model??N("gemini"),onChange:e=>{ew(["engines","gemini","model"],e??N("gemini")),Z.engines?.gemini?.bin||ew(["engines","gemini","bin"],"gemini")}})})]}),(0,a.jsxs)(G,{title:"セッション",children:[(0,a.jsx)(z,{label:"新規メッセージで中断",children:(0,a.jsx)(W,{checked:Z.sessions?.interruptOnNewMessage??!0,onChange:e=>ew(["sessions","interruptOnNewMessage"],e)})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] text-[var(--label-secondary)] mt-[4px]",children:"有効にすると、実行中のセッションに新しいメッセージを送ると現在のエージェントを停止し、 すぐに新しいメッセージの処理を開始します。無効時はメッセージはキューに入ります。"}),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsx)(z,{label:"利用上限・無応答時の動作",children:(0,a.jsx)(R,{value:Z.sessions?.rateLimitStrategy??"fallback",onChange:e=>ew(["sessions","rateLimitStrategy"],e),options:[{value:"wait",label:"切り替えず、利用上限の解除を待つ"},{value:"fallback",label:"もう一方のエンジンに切り替え"}]})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] text-[var(--label-secondary)] mt-[4px]",children:"「切り替え」は Claude または Codex が利用上限に達したり応答しなくなった時に、 もう一方で処理を続けます。「待機」は利用上限の解除を待って自動再開し、 無応答時はエラーとして終了します。"})]}),(0,a.jsxs)(G,{title:"コネクタ",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Slack"}),(0,a.jsx)(q,{}),(0,a.jsx)(z,{label:"App Token",children:(0,a.jsx)(J,{type:"password",value:Z.connectors?.slack?.appToken??"",onChange:e=>ew(["connectors","slack","appToken"],e),placeholder:"xapp-..."})}),(0,a.jsxs)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mt-[-4px] mb-[var(--space-2)] pl-[var(--space-1)]",children:["Basic Information → App-Level Tokens で発行したトークン(",(0,a.jsx)("code",{children:"xapp-…"}),")。"]}),(0,a.jsx)(z,{label:"Bot Token",children:(0,a.jsx)(J,{type:"password",value:Z.connectors?.slack?.botToken??"",onChange:e=>ew(["connectors","slack","botToken"],e),placeholder:"xoxb-..."})}),(0,a.jsxs)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mt-[-4px] mb-[var(--space-2)] pl-[var(--space-1)]",children:["ワークスペースにインストール後の OAuth & Permissions → Bot User OAuth Token(",(0,a.jsx)("code",{children:"xoxb-…"}),")。"]}),(0,a.jsx)(z,{label:"チャンネルでセッションを共有",children:(0,a.jsx)(W,{checked:Z.connectors?.slack?.shareSessionInChannel??!1,onChange:e=>ew(["connectors","slack","shareSessionInChannel"],e)})}),(0,a.jsx)(z,{label:"許可ユーザー",children:(0,a.jsx)(J,{value:Array.isArray(Z.connectors?.slack?.allowFrom)?Z.connectors?.slack?.allowFrom?.join(", "):Z.connectors?.slack?.allowFrom??"",onChange:e=>ew(["connectors","slack","allowFrom"],e.trim()?e.split(",").map(e=>e.trim()).filter(Boolean):void 0),placeholder:"U123, U456"})}),(0,a.jsx)(z,{label:"起動時に古いメッセージを無視",children:(0,a.jsx)(W,{checked:Z.connectors?.slack?.ignoreOldMessagesOnBoot??!0,onChange:e=>ew(["connectors","slack","ignoreOldMessagesOnBoot"],e)})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mt-[var(--space-3)] mb-[var(--space-2)]",children:"応答ゲート(respondTo)"}),["im","mpim","channel"].map(e=>(0,a.jsx)(z,{label:"im"===e?"DM(1対1)":"mpim"===e?"グループDM":"チャンネル",children:(0,a.jsx)(R,{value:Z.connectors?.slack?.respondTo?.[e]??"always",onChange:a=>ew(["connectors","slack","respondTo",e],a),options:[{value:"always",label:"常に応答"},{value:"mention",label:"@メンション時のみ"},{value:"never",label:"応答しない"}]})},e)),(0,a.jsx)(z,{label:"参加済みスレッドは再メンション不要",children:(0,a.jsx)(W,{checked:Z.connectors?.slack?.respondTo?.engagedThreads??!0,onChange:e=>ew(["connectors","slack","respondTo","engagedThreads"],e)})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mt-[var(--space-3)] mb-[var(--space-2)]",children:"空気読みトリアージ"}),(0,a.jsx)(M,{config:Z.connectors?.slack?.triage,onChange:e=>ew(["connectors","slack","triage"],e)}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mt-[var(--space-3)] mb-[var(--space-2)]",children:"Goal 判定"}),(0,a.jsx)(z,{label:"有効化",children:(0,a.jsx)(W,{checked:Z.connectors?.slack?.goalExtraction?.enabled??!0,onChange:e=>{ew(["connectors","slack","goalExtraction","enabled"],e),e&&!Z.connectors?.slack?.goalExtraction?.engine&&ew(["connectors","slack","goalExtraction","engine"],"codex")}})}),(0,a.jsx)(z,{label:"モデルのベンダー",htmlFor:"goal-model-vendor",children:(0,a.jsx)(R,{id:"goal-model-vendor",value:Z.connectors?.slack?.goalExtraction?.engine??"codex",onChange:e=>{ew(["connectors","slack","goalExtraction","engine"],e),ew(["connectors","slack","goalExtraction","model"],null)},options:g})}),(0,a.jsx)(z,{label:"モデル",htmlFor:"goal-model",children:(0,a.jsx)(S,{id:"goal-model",engine:Z.connectors?.slack?.goalExtraction?.engine??"codex",model:Z.connectors?.slack?.goalExtraction?.model,allowAutomatic:!0,onChange:e=>ew(["connectors","slack","goalExtraction","model"],e??null)})}),(0,a.jsx)(z,{label:"タイムアウト (ms)",children:(0,a.jsx)(J,{type:"number",value:Z.connectors?.slack?.goalExtraction?.timeoutMs!==void 0?String(Z.connectors.slack.goalExtraction.timeoutMs):"",onChange:e=>ew(["connectors","slack","goalExtraction","timeoutMs"],e.trim()?Number(e):void 0),placeholder:"30000"})}),(0,a.jsx)(z,{label:"バイナリパス上書き(任意)",children:(0,a.jsx)(J,{value:Z.connectors?.slack?.goalExtraction?.bin??"",onChange:e=>ew(["connectors","slack","goalExtraction","bin"],e.trim()||void 0),placeholder:"codex"})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mt-[var(--space-3)] mb-[var(--space-2)]",children:"Agents View Canvas"}),Z.connectors?.slack?.appToken&&Z.connectors?.slack?.botToken&&!Z.connectors?.slack?.agentsCanvas?.enabled&&(0,a.jsxs)("div",{className:"mx-[var(--space-2)] mb-[var(--space-3)] p-[var(--space-3)] rounded-[var(--radius-md)] border border-[var(--accent-fill)] bg-[color-mix(in_srgb,var(--accent-fill)_30%,transparent)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-subheadline)] font-[var(--weight-semibold)] text-[var(--text-primary)] mb-[var(--space-1)]",children:"💡 Slack 連携済みです — Canvas も有効化してみませんか?"}),(0,a.jsxs)("div",{className:"text-[length:var(--text-caption1)] text-[var(--text-secondary)]",children:["いま動いている全 Ryoko セッションが Slack の Canvas タブにライブ表示されます。 下の「有効化」を ON にしてチャンネルを選ぶだけで30秒以内に作成されます。 必要 scope は ",(0,a.jsx)("code",{className:"text-[var(--accent)]",children:"canvases:write"})," と",(0,a.jsx)("code",{className:"text-[var(--accent)] ml-1",children:"canvases:read"}),"(manifest を貼り直して reinstall すれば自動)。"]})]}),(0,a.jsxs)("p",{className:"text-[length:var(--text-caption1)] text-[var(--text-secondary)] mb-[var(--space-2)] px-[var(--space-2)]",children:["今動いている Ryoko のセッション一覧(running / waiting / errored / idle) を Slack の Canvas に自動同期します。指定したチャンネル直下のタブとして 常に最新状態が見えるようになります。Bot に",(0,a.jsx)("code",{className:"mx-1 text-[var(--accent)]",children:"canvases:write"}),"と",(0,a.jsx)("code",{className:"mx-1 text-[var(--accent)]",children:"canvases:read"}),"scope が必要です(上の Slack App Manifest を貼り直して reinstall すれば 自動で揃います)。"]}),(0,a.jsx)(z,{label:"有効化",children:(0,a.jsx)(W,{checked:Z.connectors?.slack?.agentsCanvas?.enabled??!1,onChange:e=>ew(["connectors","slack","agentsCanvas","enabled"],e)})}),(0,a.jsx)(z,{label:"表示先チャンネル",children:(0,a.jsxs)("div",{className:"flex w-full gap-[var(--space-2)] items-center",children:[eu&&eu.length>0?(0,a.jsxs)("select",{className:"flex-1 bg-[var(--surface-secondary)] border border-[var(--separator)] rounded-[var(--radius-control)] px-[var(--space-3)] py-[var(--space-2)] text-[length:var(--text-body)]",value:Z.connectors?.slack?.agentsCanvas?.channelId??"",onChange:e=>ew(["connectors","slack","agentsCanvas","channelId"],e.target.value||void 0),children:[(0,a.jsx)("option",{value:"",children:"— 選択してください —"}),eu.map(e=>(0,a.jsxs)("option",{value:e.id,children:[e.isPrivate?"🔒 ":"#",e.name]},e.id))]}):(0,a.jsx)(J,{value:Z.connectors?.slack?.agentsCanvas?.channelId??"",onChange:e=>ew(["connectors","slack","agentsCanvas","channelId"],e.trim()||void 0),placeholder:"C01234ABCDE — bot が member のチャンネル"}),(0,a.jsx)("button",{type:"button",onClick:ey,disabled:em,className:"px-[var(--space-3)] py-[var(--space-2)] text-[length:var(--text-caption1)] bg-[var(--surface-secondary)] border border-[var(--separator)] rounded-[var(--radius-control)] hover:bg-[var(--surface-tertiary)] disabled:opacity-50",children:em?(0,a.jsx)(i.Loader2,{className:"h-4 w-4 animate-spin"}):eu?"更新":"読み込み"})]})}),eb?(0,a.jsx)("p",{className:"text-[length:var(--text-caption1)] text-[var(--accent-red,#ef4444)] px-[var(--space-2)] -mt-[var(--space-1)] mb-[var(--space-2)]",children:eb}):null,(0,a.jsx)(z,{label:"Canvas タイトル",children:(0,a.jsx)(J,{value:Z.connectors?.slack?.agentsCanvas?.title??"",onChange:e=>ew(["connectors","slack","agentsCanvas","title"],e.trim()||void 0),placeholder:"Ryoko Agents View"})}),(0,a.jsx)(z,{label:"更新間隔 (ms)",children:(0,a.jsx)(J,{type:"number",value:Z.connectors?.slack?.agentsCanvas?.pollIntervalMs!==void 0?String(Z.connectors.slack.agentsCanvas.pollIntervalMs):"",onChange:e=>ew(["connectors","slack","agentsCanvas","pollIntervalMs"],e.trim()?Number(e):void 0),placeholder:"30000(30秒, 最小 5000)"})}),(0,a.jsx)(z,{label:"グループ毎の最大表示件数",children:(0,a.jsx)(J,{type:"number",value:Z.connectors?.slack?.agentsCanvas?.maxPerGroup!==void 0?String(Z.connectors.slack.agentsCanvas.maxPerGroup):"",onChange:e=>ew(["connectors","slack","agentsCanvas","maxPerGroup"],e.trim()?Number(e):void 0),placeholder:"10"})}),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Discord"}),(0,a.jsx)(z,{label:"Bot Token",children:(0,a.jsx)(J,{type:"password",value:Z.connectors?.discord?.botToken??"",onChange:e=>ew(["connectors","discord","botToken"],e),placeholder:"Bot token..."})}),(0,a.jsx)(z,{label:"Allow From",children:(0,a.jsx)(J,{value:Array.isArray(Z.connectors?.discord?.allowFrom)?Z.connectors?.discord?.allowFrom?.join(", "):Z.connectors?.discord?.allowFrom??"",onChange:e=>ew(["connectors","discord","allowFrom"],e.trim()?e.split(",").map(e=>e.trim()).filter(Boolean):void 0),placeholder:"User IDs, comma-separated (optional)"})}),(0,a.jsx)(z,{label:"Guild ID",children:(0,a.jsx)(J,{value:Z.connectors?.discord?.guildId??"",onChange:e=>ew(["connectors","discord","guildId"],e.trim()||void 0),placeholder:"サーバー/Guild ID(任意)"})}),(0,a.jsx)(z,{label:"Channel ID",children:(0,a.jsx)(J,{value:Z.connectors?.discord?.channelId??"",onChange:e=>ew(["connectors","discord","channelId"],e.trim()||void 0),placeholder:"このチャンネルに限定(右クリック → Copy Channel ID)"})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mt-[var(--space-3)] mb-[var(--space-2)]",children:"応答ゲート(respondTo)"}),["dm","channel"].map(e=>(0,a.jsx)(z,{label:"dm"===e?"DM(1対1・グループ)":"チャンネル/スレッド",children:(0,a.jsx)(R,{value:Z.connectors?.discord?.respondTo?.[e]??"always",onChange:a=>ew(["connectors","discord","respondTo",e],a),options:[{value:"always",label:"常に応答"},{value:"mention",label:"@メンション/リプライ時のみ"},{value:"never",label:"応答しない"}]})},e)),(0,a.jsx)(z,{label:"参加済みスレッドは再メンション不要",children:(0,a.jsx)(W,{checked:Z.connectors?.discord?.respondTo?.engagedThreads??!0,onChange:e=>ew(["connectors","discord","respondTo","engagedThreads"],e)})}),(0,a.jsx)(z,{label:"返信スタイル(平場チャンネル)",children:(0,a.jsx)(R,{value:Z.connectors?.discord?.replyStyle??"channel",onChange:e=>ew(["connectors","discord","replyStyle"],e),options:[{value:"channel",label:"そのままチャンネルへ"},{value:"reply",label:"元メッセージにリプライ"},{value:"thread",label:"スレッドを作成して返信"}]})}),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Telegram"}),(0,a.jsx)(z,{label:"Bot Token",children:(0,a.jsx)(J,{type:"password",value:Z.connectors?.telegram?.botToken??"",onChange:e=>ew(["connectors","telegram","botToken"],e),placeholder:"123456:ABC-DEF..."})}),(0,a.jsx)(z,{label:"許可ユーザー (User ID)",children:(0,a.jsx)(J,{value:Array.isArray(Z.connectors?.telegram?.allowFrom)?Z.connectors?.telegram?.allowFrom?.join(", "):"",onChange:e=>ew(["connectors","telegram","allowFrom"],e.trim()?e.split(",").map(e=>Number(e.trim())).filter(e=>!isNaN(e)):void 0),placeholder:"Telegram の User ID をカンマ区切り(任意)"})}),(0,a.jsx)(z,{label:"起動時に古いメッセージを無視",children:(0,a.jsx)(W,{checked:Z.connectors?.telegram?.ignoreOldMessagesOnBoot??!0,onChange:e=>ew(["connectors","telegram","ignoreOldMessagesOnBoot"],e)})}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mt-[var(--space-4)] mb-[var(--space-2)]",children:"WhatsApp"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mb-[var(--space-3)]",children:"初回起動時、下のQRコードを WhatsApp アプリでスキャンして接続してください。認証情報は次回以降キャッシュされます。"}),(0,a.jsx)(z,{label:"認証ディレクトリ",children:(0,a.jsx)(J,{value:Z.connectors?.whatsapp?.authDir??"",onChange:e=>ew(["connectors","whatsapp","authDir"],e.trim()||void 0),placeholder:"デフォルト: ~/.ryoko/.whatsapp-auth"})}),(0,a.jsx)(z,{label:"許可送信元",children:(0,a.jsx)(J,{value:Array.isArray(Z.connectors?.whatsapp?.allowFrom)?Z.connectors?.whatsapp?.allowFrom?.join(", "):"",onChange:e=>ew(["connectors","whatsapp","allowFrom"],e.trim()?e.split(",").map(e=>e.trim()).filter(Boolean):void 0),placeholder:"447700900000@s.whatsapp.net, ...(任意)"})}),ei&&(0,a.jsxs)("div",{className:"mt-[var(--space-3)] flex flex-col items-center gap-[var(--space-2)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-semibold text-[var(--text-secondary)]",children:"WhatsApp でスキャンして接続"}),(0,a.jsx)("img",{src:ei,alt:"WhatsApp QRコード",className:"w-[200px] h-[200px] rounded-[var(--radius-md)] border border-[var(--separator)] bg-white p-[8px]"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)]",children:"WhatsApp → リンク済み端末 → 端末をリンク"})]}),Z.connectors?.whatsapp&&"ok"===ed&&(0,a.jsx)("div",{className:"mt-[var(--space-2)] text-[length:var(--text-caption1)] text-[var(--system-green)] font-semibold",children:"✓ 接続済み"}),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsxs)("div",{className:"flex items-center justify-between mb-[var(--space-2)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)]",children:"コネクタインスタンス"}),(0,a.jsxs)("div",{className:"flex items-center gap-[var(--space-2)]",children:[(0,a.jsxs)("button",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-secondary)] hover:text-[var(--accent)] transition-colors flex items-center gap-1",onClick:async()=>{try{let e=await u.api.reloadConnectors(),a=[];e.stopped.length&&a.push(`Stopped: ${e.stopped.join(", ")}`),e.started.length&&a.push(`Started: ${e.started.join(", ")}`),e.errors.length&&a.push(`Errors: ${e.errors.join(", ")}`),alert(a.length?a.join("\n"):"No connector instances to reload")}catch{alert("Failed to reload connectors")}},children:[(0,a.jsx)(n,{size:12}),"Reload"]}),(0,a.jsx)("button",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--accent)] hover:opacity-80 transition-opacity",onClick:()=>{let e=[...Z.connectors?.instances||[]],a=`discord-${e.length+1}`;e.push({id:a,type:"discord"}),ew(["connectors","instances"],e)},children:"+ Add Instance"})]})]}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mb-[var(--space-3)]",children:"Add multiple connector instances of the same type, each bound to a specific employee."}),(Z.connectors?.instances||[]).map((e,t)=>(0,a.jsxs)("div",{className:"mb-[var(--space-4)] p-[var(--space-3)] rounded-[var(--radius-md)] border border-[var(--separator)] bg-[var(--bg-secondary)]",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-[var(--space-2)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-subheadline)] font-[var(--weight-semibold)] text-[var(--text-primary)]",children:e.id||`Instance ${t+1}`}),(0,a.jsx)("button",{className:"text-[var(--system-red)] hover:opacity-80 transition-opacity p-[var(--space-1)]",onClick:()=>{let e=[...Z.connectors?.instances||[]];e.splice(t,1),ew(["connectors","instances"],e.length>0?e:void 0)},children:(0,a.jsx)(l.Trash2,{size:14})})]}),(0,a.jsx)(z,{label:"Instance ID",children:(0,a.jsx)(J,{value:e.id??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],id:e},ew(["connectors","instances"],a)},placeholder:"e.g. discord-vox"})}),(0,a.jsx)(z,{label:"Type",children:(0,a.jsx)(R,{value:e.type??"discord",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],type:e},ew(["connectors","instances"],a)},options:[{value:"discord",label:"Discord"},{value:"slack",label:"Slack"},{value:"whatsapp",label:"WhatsApp"}]})}),(0,a.jsx)(z,{label:"Employee",children:(0,a.jsx)(R,{value:e.employee??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],employee:e||void 0},ew(["connectors","instances"],a)},options:[{value:"",label:"Default (COO)"},...ex.map(e=>({value:e.name,label:e.displayName}))]})}),("discord"===e.type||!e.type)&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{label:"Bot Token",children:(0,a.jsx)(J,{type:"password",value:e.botToken??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],botToken:e},ew(["connectors","instances"],a)},placeholder:"Bot token..."})}),(0,a.jsx)(z,{label:"Guild ID",children:(0,a.jsx)(J,{value:e.guildId??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],guildId:e.trim()||void 0},ew(["connectors","instances"],a)},placeholder:"Server/Guild ID"})}),(0,a.jsx)(z,{label:"Channel ID",children:(0,a.jsx)(J,{value:e.channelId??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],channelId:e.trim()||void 0},ew(["connectors","instances"],a)},placeholder:"Restrict to channel (optional)"})}),(0,a.jsx)(z,{label:"Allow From",children:(0,a.jsx)(J,{value:Array.isArray(e.allowFrom)?e.allowFrom.join(", "):e.allowFrom??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],allowFrom:e.trim()?e.split(",").map(e=>e.trim()).filter(Boolean):void 0},ew(["connectors","instances"],a)},placeholder:"User IDs, comma-separated (optional)"})})]}),"slack"===e.type&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{label:"App Token",children:(0,a.jsx)(J,{type:"password",value:e.appToken??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],appToken:e},ew(["connectors","instances"],a)},placeholder:"xapp-..."})}),(0,a.jsx)(z,{label:"Bot Token",children:(0,a.jsx)(J,{type:"password",value:e.botToken??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],botToken:e},ew(["connectors","instances"],a)},placeholder:"xoxb-..."})})]}),"slack"===e.type&&(0,a.jsxs)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]",children:[(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"空気読みトリアージ"}),(0,a.jsx)(M,{config:e.triage,showCredentials:!1,onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],triage:e},ew(["connectors","instances"],a)}})]}),"whatsapp"===e.type&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{label:"Auth Directory",children:(0,a.jsx)(J,{value:e.authDir??"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],authDir:e.trim()||void 0},ew(["connectors","instances"],a)},placeholder:"Default: ~/.jinn/.whatsapp-auth"})}),(0,a.jsx)(z,{label:"Allow From",children:(0,a.jsx)(J,{value:Array.isArray(e.allowFrom)?e.allowFrom.join(", "):"",onChange:e=>{let a=[...Z.connectors?.instances||[]];a[t]={...a[t],allowFrom:e.trim()?e.split(",").map(e=>e.trim()).filter(Boolean):void 0},ew(["connectors","instances"],a)},placeholder:"Phone JIDs, comma-separated"})})]})]},e.id||t)),(0,a.jsx)("div",{className:"border-t border-[var(--separator)] mt-[var(--space-3)] pt-[var(--space-3)]"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Web UI"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)]",children:"Web conversations use queued one-shot resume flow for both engines."})]}),(0,a.jsxs)(G,{title:"自動化の通知",children:[(0,a.jsxs)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mb-[var(--space-3)]",children:["ジョブの作成・有効化・実行は",(0,a.jsx)("a",{href:"/cron",className:"text-[var(--accent)] underline",children:"自動化ページ"}),"で行います。ここは通知の既定値だけを設定します。"]}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption1)] font-[var(--weight-semibold)] text-[var(--text-tertiary)] mb-[var(--space-2)]",children:"Default Delivery"}),(0,a.jsx)("div",{className:"text-[length:var(--text-caption2)] text-[var(--text-tertiary)] mb-[var(--space-3)]",children:"When a cron job has no delivery configured, results will be sent here."}),(0,a.jsx)(z,{label:"Connector",children:(0,a.jsx)(R,{value:Z.cron?.defaultDelivery?.connector??"",onChange:e=>ew(["cron","defaultDelivery","connector"],e||void 0),options:[{value:"",label:"None (fire & forget)"},{value:"web",label:"Web"},{value:"slack",label:"Slack"}]})}),Z.cron?.defaultDelivery?.connector&&(0,a.jsx)(z,{label:"Channel",children:(0,a.jsx)(J,{value:Z.cron?.defaultDelivery?.channel??"",onChange:e=>ew(["cron","defaultDelivery","channel"],e),placeholder:"#general"})}),(0,a.jsx)(_,{connectorOptions:function(e){let a=new Set;for(let[t,r]of Object.entries(e.connectors??{}))"instances"!==t&&"web"!==t&&r&&"object"==typeof r&&a.add(t);for(let t of e.connectors?.instances??[])t.id&&a.add(t.id);return e.cron?.defaultDelivery?.connector&&"web"!==e.cron.defaultDelivery.connector&&a.add(e.cron.defaultDelivery.connector),Array.from(a).sort()}(Z),defaultConnector:Z.cron?.defaultDelivery?.connector,defaultChannel:Z.cron?.defaultDelivery?.channel})]}),(0,a.jsxs)(G,{title:"Logging",children:[(0,a.jsx)(z,{label:"Level",children:(0,a.jsx)(R,{value:Z.logging?.level??"info",onChange:e=>ew(["logging","level"],e),options:[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warn"},{value:"error",label:"Error"}]})}),(0,a.jsx)(z,{label:"Stdout",children:(0,a.jsx)(W,{checked:Z.logging?.stdout??!0,onChange:e=>ew(["logging","stdout"],e)})}),(0,a.jsx)(z,{label:"File Logging",children:(0,a.jsx)(W,{checked:Z.logging?.file??!1,onChange:e=>ew(["logging","file"],e)})})]}),(0,a.jsx)(U,{}),(0,a.jsxs)("div",{className:"flex justify-end gap-[var(--space-3)] mb-[var(--space-6)]",children:[(0,a.jsxs)("button",{onClick:()=>ef(),className:"px-[var(--space-4)] py-[var(--space-2)] rounded-[var(--radius-md)] bg-[var(--fill-tertiary)] text-[var(--text-secondary)] border-none cursor-pointer text-[length:var(--text-footnote)] font-[var(--weight-medium)] inline-flex items-center gap-[6px]",children:[(0,a.jsx)(n,{size:14}),"再読み込み"]}),(0,a.jsxs)("button",{onClick:function(){el(!0),eo(null),u.api.updateConfig(Z).then(e=>{if(e?.connectorsReloadError)return void eo({type:"error",message:`Settings saved but connector reload failed: ${e.connectorsReloadError}`});let a=e?.connectorsReload?.errors??[];e?.status==="partial"||a.length>0?eo({type:"error",message:`Settings saved but ${a.length} connector(s) failed: ${a.join("; ")}`}):eo({type:"success",message:"Settings saved successfully"})}).catch(e=>eo({type:"error",message:`Failed to save: ${e.message}`})).finally(()=>el(!1))},disabled:en,className:"px-[var(--space-5)] py-[var(--space-2)] rounded-[var(--radius-md)] bg-[var(--accent)] text-[var(--accent-contrast)] border-none text-[length:var(--text-footnote)] font-[var(--weight-semibold)] inline-flex items-center gap-[6px] transition-all duration-150 ease-[var(--ease-smooth)]",style:{cursor:en?"wait":"pointer",opacity:en?.7:1},children:[(0,a.jsx)(o,{size:14}),en?"保存中…":"設定を保存"]})]})]}),(0,a.jsx)(G,{title:"リセット",children:(0,a.jsxs)("div",{className:"flex items-center justify-center gap-[var(--space-3)] flex-wrap",children:[(0,a.jsxs)("button",{onClick:()=>{localStorage.removeItem("jinn-onboarded"),window.location.reload()},className:"px-[var(--space-5)] py-[var(--space-2)] rounded-[var(--radius-md)] bg-[var(--accent)] text-[var(--accent-contrast)] border-none cursor-pointer text-[length:var(--text-footnote)] font-[var(--weight-semibold)] transition-all duration-150 ease-[var(--ease-spring)] inline-flex items-center gap-[var(--space-2)]",children:[(0,a.jsx)(n,{size:14}),"オンボーディングを再実行"]}),(0,a.jsxs)("button",{onClick:()=>{window.confirm("すべての設定を初期値に戻しますか?")&&(localStorage.removeItem("jinn-settings"),localStorage.removeItem("jinn-theme"),k(),window.location.reload())},className:"px-[var(--space-5)] py-[var(--space-2)] rounded-[var(--radius-md)] bg-[var(--system-red)] text-white border-none cursor-pointer text-[length:var(--text-footnote)] font-[var(--weight-semibold)] transition-all duration-150 ease-[var(--ease-spring)] inline-flex items-center gap-[var(--space-2)]",children:[(0,a.jsx)(l.Trash2,{size:14}),"すべての設定をリセット"]})]})})]})})})}],82074)}]);