@geminixiang/mikan 1.0.0-beta.39 → 1.0.0-beta.40

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 (397) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +50 -23
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +2 -1
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +3 -3
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts +2 -1
  11. package/dist/adapters/discord/context.d.ts.map +1 -1
  12. package/dist/adapters/discord/context.js +1 -1
  13. package/dist/adapters/discord/context.js.map +1 -1
  14. package/dist/adapters/github/bot.d.ts +2 -1
  15. package/dist/adapters/github/bot.d.ts.map +1 -1
  16. package/dist/adapters/github/bot.js +11 -7
  17. package/dist/adapters/github/bot.js.map +1 -1
  18. package/dist/adapters/github/client.js +2 -2
  19. package/dist/adapters/github/client.js.map +1 -1
  20. package/dist/adapters/github/context.d.ts +4 -2
  21. package/dist/adapters/github/context.d.ts.map +1 -1
  22. package/dist/adapters/github/context.js +2 -2
  23. package/dist/adapters/github/context.js.map +1 -1
  24. package/dist/adapters/github/gcp-auth.js +2 -2
  25. package/dist/adapters/github/gcp-auth.js.map +1 -1
  26. package/dist/adapters/github/github-ops.d.ts +3 -2
  27. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  28. package/dist/adapters/github/github-ops.js +1 -1
  29. package/dist/adapters/github/github-ops.js.map +1 -1
  30. package/dist/adapters/github/ids.d.ts.map +1 -1
  31. package/dist/adapters/github/ids.js +7 -3
  32. package/dist/adapters/github/ids.js.map +1 -1
  33. package/dist/adapters/github/repo.js +3 -3
  34. package/dist/adapters/github/repo.js.map +1 -1
  35. package/dist/adapters/github/types.d.ts +2 -1
  36. package/dist/adapters/github/types.d.ts.map +1 -1
  37. package/dist/adapters/github/types.js.map +1 -1
  38. package/dist/adapters/progressive-renderer.js +1 -1
  39. package/dist/adapters/progressive-renderer.js.map +1 -1
  40. package/dist/adapters/shared.js +4 -4
  41. package/dist/adapters/shared.js.map +1 -1
  42. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  43. package/dist/adapters/slack/blocks.js +3 -1
  44. package/dist/adapters/slack/blocks.js.map +1 -1
  45. package/dist/adapters/slack/bot.d.ts +12 -2
  46. package/dist/adapters/slack/bot.d.ts.map +1 -1
  47. package/dist/adapters/slack/bot.js +70 -9
  48. package/dist/adapters/slack/bot.js.map +1 -1
  49. package/dist/adapters/slack/context.d.ts +2 -1
  50. package/dist/adapters/slack/context.d.ts.map +1 -1
  51. package/dist/adapters/slack/context.js +1 -0
  52. package/dist/adapters/slack/context.js.map +1 -1
  53. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  54. package/dist/adapters/slack/response-lifecycle.js +4 -4
  55. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  56. package/dist/adapters/slack/session.d.ts.map +1 -1
  57. package/dist/adapters/slack/session.js +2 -3
  58. package/dist/adapters/slack/session.js.map +1 -1
  59. package/dist/adapters/slack/tools/attach.js +1 -1
  60. package/dist/adapters/slack/tools/attach.js.map +1 -1
  61. package/dist/adapters/telegram/bot.d.ts +2 -1
  62. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  63. package/dist/adapters/telegram/bot.js +6 -6
  64. package/dist/adapters/telegram/bot.js.map +1 -1
  65. package/dist/adapters/telegram/context.d.ts +2 -1
  66. package/dist/adapters/telegram/context.d.ts.map +1 -1
  67. package/dist/adapters/telegram/context.js.map +1 -1
  68. package/dist/adapters/telegram/html.d.ts.map +1 -1
  69. package/dist/adapters/telegram/html.js +10 -7
  70. package/dist/adapters/telegram/html.js.map +1 -1
  71. package/dist/adapters/types.d.ts +4 -2
  72. package/dist/adapters/types.d.ts.map +1 -1
  73. package/dist/adapters/types.js.map +1 -1
  74. package/dist/agent-events.d.ts +3 -2
  75. package/dist/agent-events.d.ts.map +1 -1
  76. package/dist/agent-events.js +19 -1
  77. package/dist/agent-events.js.map +1 -1
  78. package/dist/agent.d.ts.map +1 -1
  79. package/dist/agent.js +34 -9
  80. package/dist/agent.js.map +1 -1
  81. package/dist/cli/arg-grammar.d.ts.map +1 -1
  82. package/dist/cli/arg-grammar.js +5 -3
  83. package/dist/cli/arg-grammar.js.map +1 -1
  84. package/dist/cli/boot.d.ts.map +1 -1
  85. package/dist/cli/boot.js +5 -3
  86. package/dist/cli/boot.js.map +1 -1
  87. package/dist/cli/download.d.ts.map +1 -1
  88. package/dist/cli/download.js +2 -0
  89. package/dist/cli/download.js.map +1 -1
  90. package/dist/cli/ext-dev.d.ts.map +1 -1
  91. package/dist/cli/ext-dev.js +4 -1
  92. package/dist/cli/ext-dev.js.map +1 -1
  93. package/dist/cli/ext.d.ts.map +1 -1
  94. package/dist/cli/ext.js +123 -23
  95. package/dist/cli/ext.js.map +1 -1
  96. package/dist/cli/office.d.ts.map +1 -1
  97. package/dist/cli/office.js +2 -0
  98. package/dist/cli/office.js.map +1 -1
  99. package/dist/cli/types.d.ts +0 -6
  100. package/dist/cli/types.d.ts.map +1 -1
  101. package/dist/cli/types.js.map +1 -1
  102. package/dist/commands/admin.js +1 -1
  103. package/dist/commands/admin.js.map +1 -1
  104. package/dist/commands/auto-reply.js +2 -2
  105. package/dist/commands/auto-reply.js.map +1 -1
  106. package/dist/commands/extensions.js +1 -1
  107. package/dist/commands/extensions.js.map +1 -1
  108. package/dist/commands/login.js +1 -1
  109. package/dist/commands/login.js.map +1 -1
  110. package/dist/commands/manifest.d.ts +7 -0
  111. package/dist/commands/manifest.d.ts.map +1 -1
  112. package/dist/commands/manifest.js +28 -0
  113. package/dist/commands/manifest.js.map +1 -1
  114. package/dist/commands/model.d.ts.map +1 -1
  115. package/dist/commands/model.js +4 -1
  116. package/dist/commands/model.js.map +1 -1
  117. package/dist/commands/new.js +1 -1
  118. package/dist/commands/new.js.map +1 -1
  119. package/dist/commands/sandbox.js +3 -3
  120. package/dist/commands/sandbox.js.map +1 -1
  121. package/dist/commands/session-view.d.ts.map +1 -1
  122. package/dist/commands/session-view.js +5 -2
  123. package/dist/commands/session-view.js.map +1 -1
  124. package/dist/commands/types.d.ts +1 -1
  125. package/dist/commands/types.d.ts.map +1 -1
  126. package/dist/commands/types.js.map +1 -1
  127. package/dist/config.js +4 -4
  128. package/dist/config.js.map +1 -1
  129. package/dist/env-manifest.d.ts +2 -0
  130. package/dist/env-manifest.d.ts.map +1 -1
  131. package/dist/env-manifest.js +11 -1
  132. package/dist/env-manifest.js.map +1 -1
  133. package/dist/events.d.ts.map +1 -1
  134. package/dist/events.js +7 -6
  135. package/dist/events.js.map +1 -1
  136. package/dist/execution-resolver.d.ts.map +1 -1
  137. package/dist/execution-resolver.js +3 -2
  138. package/dist/execution-resolver.js.map +1 -1
  139. package/dist/extension-schedules.d.ts +31 -0
  140. package/dist/extension-schedules.d.ts.map +1 -0
  141. package/dist/extension-schedules.js +229 -0
  142. package/dist/extension-schedules.js.map +1 -0
  143. package/dist/harness/auth.js +5 -5
  144. package/dist/harness/auth.js.map +1 -1
  145. package/dist/harness/event-format.d.ts +2 -0
  146. package/dist/harness/event-format.d.ts.map +1 -1
  147. package/dist/harness/event-format.js +2 -1
  148. package/dist/harness/event-format.js.map +1 -1
  149. package/dist/harness/extensions/loader.d.ts +2 -2
  150. package/dist/harness/extensions/loader.d.ts.map +1 -1
  151. package/dist/harness/extensions/loader.js +135 -33
  152. package/dist/harness/extensions/loader.js.map +1 -1
  153. package/dist/harness/extensions/registry.d.ts +33 -1
  154. package/dist/harness/extensions/registry.d.ts.map +1 -1
  155. package/dist/harness/extensions/registry.js +79 -2
  156. package/dist/harness/extensions/registry.js.map +1 -1
  157. package/dist/harness/extensions/types.d.ts +165 -21
  158. package/dist/harness/extensions/types.d.ts.map +1 -1
  159. package/dist/harness/extensions/types.js.map +1 -1
  160. package/dist/harness/index.d.ts +2 -2
  161. package/dist/harness/index.d.ts.map +1 -1
  162. package/dist/harness/index.js +1 -1
  163. package/dist/harness/index.js.map +1 -1
  164. package/dist/harness/models.d.ts.map +1 -1
  165. package/dist/harness/models.js +36 -24
  166. package/dist/harness/models.js.map +1 -1
  167. package/dist/harness/runner.js +2 -2
  168. package/dist/harness/runner.js.map +1 -1
  169. package/dist/harness/session-store.d.ts.map +1 -1
  170. package/dist/harness/session-store.js +9 -7
  171. package/dist/harness/session-store.js.map +1 -1
  172. package/dist/harness/skills.js +3 -3
  173. package/dist/harness/skills.js.map +1 -1
  174. package/dist/harness/subagent-profiles.js +2 -2
  175. package/dist/harness/subagent-profiles.js.map +1 -1
  176. package/dist/harness/subagent-runner.js +3 -3
  177. package/dist/harness/subagent-runner.js.map +1 -1
  178. package/dist/index.d.ts +8 -8
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +5 -5
  181. package/dist/index.js.map +1 -1
  182. package/dist/main.js +58 -9
  183. package/dist/main.js.map +1 -1
  184. package/dist/observability/instrument.js +1 -1
  185. package/dist/observability/instrument.js.map +1 -1
  186. package/dist/observability/sentry.js +1 -1
  187. package/dist/observability/sentry.js.map +1 -1
  188. package/dist/office/index.d.ts +1 -1
  189. package/dist/office/index.d.ts.map +1 -1
  190. package/dist/office/index.js +1 -1
  191. package/dist/office/index.js.map +1 -1
  192. package/dist/office/layout.d.ts +7 -0
  193. package/dist/office/layout.d.ts.map +1 -1
  194. package/dist/office/layout.js +10 -1
  195. package/dist/office/layout.js.map +1 -1
  196. package/dist/office/registry.d.ts.map +1 -1
  197. package/dist/office/registry.js +7 -5
  198. package/dist/office/registry.js.map +1 -1
  199. package/dist/packages/materialize.js +10 -3
  200. package/dist/packages/materialize.js.map +1 -1
  201. package/dist/packages/source.d.ts +6 -0
  202. package/dist/packages/source.d.ts.map +1 -1
  203. package/dist/packages/source.js +14 -2
  204. package/dist/packages/source.js.map +1 -1
  205. package/dist/packages/types.d.ts +5 -3
  206. package/dist/packages/types.d.ts.map +1 -1
  207. package/dist/packages/types.js.map +1 -1
  208. package/dist/provisioner.js +5 -5
  209. package/dist/provisioner.js.map +1 -1
  210. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  211. package/dist/runtime/conversation-runtime.js +44 -2
  212. package/dist/runtime/conversation-runtime.js.map +1 -1
  213. package/dist/runtime/types.d.ts +10 -2
  214. package/dist/runtime/types.d.ts.map +1 -1
  215. package/dist/runtime/types.js.map +1 -1
  216. package/dist/sandbox/cloudflare.js +1 -1
  217. package/dist/sandbox/cloudflare.js.map +1 -1
  218. package/dist/sandbox/container.js +1 -2
  219. package/dist/sandbox/container.js.map +1 -1
  220. package/dist/sandbox/firecracker.js +1 -1
  221. package/dist/sandbox/firecracker.js.map +1 -1
  222. package/dist/sandbox/gondolin.d.ts.map +1 -1
  223. package/dist/sandbox/gondolin.js +1 -2
  224. package/dist/sandbox/gondolin.js.map +1 -1
  225. package/dist/sandbox/host.d.ts.map +1 -1
  226. package/dist/sandbox/host.js +4 -5
  227. package/dist/sandbox/host.js.map +1 -1
  228. package/dist/sandbox/index.js +1 -1
  229. package/dist/sandbox/index.js.map +1 -1
  230. package/dist/sandbox/utils.d.ts +2 -0
  231. package/dist/sandbox/utils.d.ts.map +1 -1
  232. package/dist/sandbox/utils.js +30 -1
  233. package/dist/sandbox/utils.js.map +1 -1
  234. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  235. package/dist/sessions/chat-history-sync.js +9 -8
  236. package/dist/sessions/chat-history-sync.js.map +1 -1
  237. package/dist/sessions/conversation-log.d.ts.map +1 -1
  238. package/dist/sessions/conversation-log.js +5 -2
  239. package/dist/sessions/conversation-log.js.map +1 -1
  240. package/dist/sessions/history-line.d.ts +9 -0
  241. package/dist/sessions/history-line.d.ts.map +1 -1
  242. package/dist/sessions/history-line.js +22 -1
  243. package/dist/sessions/history-line.js.map +1 -1
  244. package/dist/sessions/session-key.d.ts +5 -12
  245. package/dist/sessions/session-key.d.ts.map +1 -1
  246. package/dist/sessions/session-key.js +23 -0
  247. package/dist/sessions/session-key.js.map +1 -1
  248. package/dist/sessions/store.d.ts +2 -6
  249. package/dist/sessions/store.d.ts.map +1 -1
  250. package/dist/sessions/store.js +16 -16
  251. package/dist/sessions/store.js.map +1 -1
  252. package/dist/sessions/types.d.ts +2 -1
  253. package/dist/sessions/types.d.ts.map +1 -1
  254. package/dist/sessions/types.js.map +1 -1
  255. package/dist/tools/bash.js +1 -1
  256. package/dist/tools/bash.js.map +1 -1
  257. package/dist/tools/edit.d.ts.map +1 -1
  258. package/dist/tools/edit.js +4 -1
  259. package/dist/tools/edit.js.map +1 -1
  260. package/dist/tools/event.js +1 -1
  261. package/dist/tools/event.js.map +1 -1
  262. package/dist/tools/generate-image.js +3 -3
  263. package/dist/tools/generate-image.js.map +1 -1
  264. package/dist/tools/read.js +4 -4
  265. package/dist/tools/read.js.map +1 -1
  266. package/dist/tools/subagent.d.ts.map +1 -1
  267. package/dist/tools/subagent.js +9 -2
  268. package/dist/tools/subagent.js.map +1 -1
  269. package/dist/tools/types.d.ts +0 -26
  270. package/dist/tools/types.d.ts.map +1 -1
  271. package/dist/tools/types.js.map +1 -1
  272. package/dist/trigger.d.ts +2 -1
  273. package/dist/trigger.d.ts.map +1 -1
  274. package/dist/trigger.js.map +1 -1
  275. package/dist/types.d.ts +108 -16
  276. package/dist/types.d.ts.map +1 -1
  277. package/dist/types.js +2 -2
  278. package/dist/types.js.map +1 -1
  279. package/dist/utils/file-guards.d.ts +9 -0
  280. package/dist/utils/file-guards.d.ts.map +1 -1
  281. package/dist/utils/file-guards.js +44 -1
  282. package/dist/utils/file-guards.js.map +1 -1
  283. package/dist/vault/disabled.d.ts.map +1 -1
  284. package/dist/vault/disabled.js +3 -0
  285. package/dist/vault/disabled.js.map +1 -1
  286. package/dist/vault/index.d.ts +29 -0
  287. package/dist/vault/index.d.ts.map +1 -1
  288. package/dist/vault/index.js +68 -4
  289. package/dist/vault/index.js.map +1 -1
  290. package/dist/vault/types.d.ts +2 -0
  291. package/dist/vault/types.d.ts.map +1 -1
  292. package/dist/vault/types.js.map +1 -1
  293. package/dist/web/admin/portal.d.ts +1 -1
  294. package/dist/web/admin/portal.d.ts.map +1 -1
  295. package/dist/web/admin/portal.js +194 -22
  296. package/dist/web/admin/portal.js.map +1 -1
  297. package/dist/web/admin/provider-models.js +1 -1
  298. package/dist/web/admin/provider-models.js.map +1 -1
  299. package/dist/web/login/oauth.js +1 -1
  300. package/dist/web/login/oauth.js.map +1 -1
  301. package/dist/web/login/portal.d.ts +1 -1
  302. package/dist/web/login/portal.d.ts.map +1 -1
  303. package/dist/web/login/portal.js +13 -36
  304. package/dist/web/login/portal.js.map +1 -1
  305. package/dist/web/portal-shell.d.ts +17 -0
  306. package/dist/web/portal-shell.d.ts.map +1 -1
  307. package/dist/web/portal-shell.js +66 -1
  308. package/dist/web/portal-shell.js.map +1 -1
  309. package/dist/web/server.d.ts +3 -2
  310. package/dist/web/server.d.ts.map +1 -1
  311. package/dist/web/server.js +3 -3
  312. package/dist/web/server.js.map +1 -1
  313. package/dist/web/session-view/portal.d.ts +1 -1
  314. package/dist/web/session-view/portal.d.ts.map +1 -1
  315. package/dist/web/session-view/portal.js +10 -12
  316. package/dist/web/session-view/portal.js.map +1 -1
  317. package/dist/web/session-view/service.d.ts.map +1 -1
  318. package/dist/web/session-view/service.js +11 -6
  319. package/dist/web/session-view/service.js.map +1 -1
  320. package/dist/web/session-view/types.d.ts +0 -4
  321. package/dist/web/session-view/types.d.ts.map +1 -1
  322. package/dist/web/session-view/types.js.map +1 -1
  323. package/dist/web/token-store.js +1 -1
  324. package/dist/web/token-store.js.map +1 -1
  325. package/package.json +8 -17
  326. package/dist/cli/ext-git.d.ts +0 -17
  327. package/dist/cli/ext-git.d.ts.map +0 -1
  328. package/dist/cli/ext-git.js +0 -107
  329. package/dist/cli/ext-git.js.map +0 -1
  330. package/dist/commands/parse.d.ts +0 -7
  331. package/dist/commands/parse.d.ts.map +0 -1
  332. package/dist/commands/parse.js +0 -14
  333. package/dist/commands/parse.js.map +0 -1
  334. package/dist/commands/text.d.ts +0 -2
  335. package/dist/commands/text.d.ts.map +0 -1
  336. package/dist/commands/text.js +0 -16
  337. package/dist/commands/text.js.map +0 -1
  338. package/dist/harness/extensions/blockkit.d.ts +0 -19
  339. package/dist/harness/extensions/blockkit.d.ts.map +0 -1
  340. package/dist/harness/extensions/blockkit.js +0 -42
  341. package/dist/harness/extensions/blockkit.js.map +0 -1
  342. package/dist/sandbox/path-context.d.ts +0 -3
  343. package/dist/sandbox/path-context.d.ts.map +0 -1
  344. package/dist/sandbox/path-context.js +0 -30
  345. package/dist/sandbox/path-context.js.map +0 -1
  346. package/dist/sessions/metadata.d.ts +0 -3
  347. package/dist/sessions/metadata.d.ts.map +0 -1
  348. package/dist/sessions/metadata.js +0 -11
  349. package/dist/sessions/metadata.js.map +0 -1
  350. package/dist/sessions/policy.d.ts +0 -6
  351. package/dist/sessions/policy.d.ts.map +0 -1
  352. package/dist/sessions/policy.js +0 -25
  353. package/dist/sessions/policy.js.map +0 -1
  354. package/dist/tools/truncate.d.ts +0 -33
  355. package/dist/tools/truncate.d.ts.map +0 -1
  356. package/dist/tools/truncate.js +0 -184
  357. package/dist/tools/truncate.js.map +0 -1
  358. package/dist/utils/date.d.ts +0 -10
  359. package/dist/utils/date.d.ts.map +0 -1
  360. package/dist/utils/date.js +0 -23
  361. package/dist/utils/date.js.map +0 -1
  362. package/dist/utils/env.d.ts +0 -3
  363. package/dist/utils/env.d.ts.map +0 -1
  364. package/dist/utils/env.js +0 -12
  365. package/dist/utils/env.js.map +0 -1
  366. package/dist/utils/fs-atomic.d.ts +0 -10
  367. package/dist/utils/fs-atomic.d.ts.map +0 -1
  368. package/dist/utils/fs-atomic.js +0 -45
  369. package/dist/utils/fs-atomic.js.map +0 -1
  370. package/dist/utils/html.d.ts +0 -2
  371. package/dist/utils/html.d.ts.map +0 -1
  372. package/dist/utils/html.js +0 -4
  373. package/dist/utils/html.js.map +0 -1
  374. package/dist/utils/http-body.d.ts +0 -10
  375. package/dist/utils/http-body.d.ts.map +0 -1
  376. package/dist/utils/http-body.js +0 -34
  377. package/dist/utils/http-body.js.map +0 -1
  378. package/dist/vault/injection.d.ts +0 -12
  379. package/dist/vault/injection.d.ts.map +0 -1
  380. package/dist/vault/injection.js +0 -30
  381. package/dist/vault/injection.js.map +0 -1
  382. package/dist/vault/policy.d.ts +0 -20
  383. package/dist/vault/policy.d.ts.map +0 -1
  384. package/dist/vault/policy.js +0 -20
  385. package/dist/vault/policy.js.map +0 -1
  386. package/dist/web/agent-events/portal.d.ts +0 -3
  387. package/dist/web/agent-events/portal.d.ts.map +0 -1
  388. package/dist/web/agent-events/portal.js +0 -19
  389. package/dist/web/agent-events/portal.js.map +0 -1
  390. package/dist/web/request.d.ts +0 -3
  391. package/dist/web/request.d.ts.map +0 -1
  392. package/dist/web/request.js +0 -13
  393. package/dist/web/request.js.map +0 -1
  394. package/dist/web/session-view/command.d.ts +0 -4
  395. package/dist/web/session-view/command.d.ts.map +0 -1
  396. package/dist/web/session-view/command.js +0 -10
  397. package/dist/web/session-view/command.js.map +0 -1
@@ -1,12 +1,10 @@
1
- import { existsSync, readdirSync, readFileSync, statSync } from "fs";
2
- import { basename, join, resolve as pathResolve, sep as pathSep } from "path";
3
- import { MikanModels, parseFrontmatter, SessionStore } from "../../harness/index.js";
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { basename, join, resolve as pathResolve, sep as pathSep } from "node:path";
3
+ import { defaultExtensionDirs, listInstalledExtensions, MikanModels, parseFrontmatter, SessionStore, } from "../../harness/index.js";
4
4
  import { loadConversationAutoReplyConfig, loadConversationWorkspaceOverride, loadGlobalSettings, resolveConversationSettings, saveConversationAutoReplyConfig, } from "../../config.js";
5
5
  import { applyConversationSettings, applyConversationWorkspacePolicy, applyGlobalSettings, applyGlobalWorkspacePolicy, } from "../../settings-mutation.js";
6
6
  import { addPackage, inspectConversationPackages, refreshPackage, removePackage, } from "../../packages/index.js";
7
- import { escapeHtml } from "../../utils/html.js";
8
- import { readRawBody } from "../../utils/http-body.js";
9
- import { renderPortalShell } from "../portal-shell.js";
7
+ import { escapeHtml, readJsonBody, renderPortalShell } from "../portal-shell.js";
10
8
  import { resolveExistingSessionFile } from "../session-view/service.js";
11
9
  import { PRODUCT_NAME } from "../../platform-messages.js";
12
10
  import { credentialAuthorizationKey } from "../../sandbox/identity.js";
@@ -95,6 +93,10 @@ async function routeApiRequest(req, res, url, services) {
95
93
  await servePackagesList(res, url, services, token);
96
94
  return;
97
95
  }
96
+ if (url.pathname === "/admin/api/extension-secrets") {
97
+ serveExtensionSecretsList(res, url, services, token);
98
+ return;
99
+ }
98
100
  if (url.pathname === "/admin/api/events") {
99
101
  await serveEventsList(res, services);
100
102
  return;
@@ -114,7 +116,7 @@ async function routeApiRequest(req, res, url, services) {
114
116
  jsonRes(res, 405, { error: "Method not allowed" });
115
117
  return;
116
118
  }
117
- const body = await readJsonBody(req, res);
119
+ const body = await readJsonBody(req, res, 32 * 1024);
118
120
  if (!body)
119
121
  return;
120
122
  const rawToken = typeof body.token === "string" ? body.token : "";
@@ -155,6 +157,10 @@ async function routeApiRequest(req, res, url, services) {
155
157
  servePackageMutation(res, body, services, token);
156
158
  return;
157
159
  }
160
+ if (url.pathname === "/admin/api/extension-secrets/mutate") {
161
+ serveExtensionSecretMutation(res, body, services);
162
+ return;
163
+ }
158
164
  if (url.pathname === "/admin/api/settings/model") {
159
165
  serveGlobalModelUpdate(res, body, services);
160
166
  return;
@@ -854,9 +860,9 @@ function isWorkspacePathAllowed(rel) {
854
860
  if (rel === "")
855
861
  return true;
856
862
  const segments = rel.split("/").filter(Boolean);
857
- if (segments.length === 0)
858
- return true;
859
863
  const first = segments[0];
864
+ if (first === undefined)
865
+ return true;
860
866
  if (segments.length === 1) {
861
867
  return WORKSPACE_TOP_DIRS.has(first) || WORKSPACE_TOP_FILES.has(first);
862
868
  }
@@ -981,7 +987,7 @@ function looksTextual(buf) {
981
987
  const limit = Math.min(buf.length, BINARY_PROBE_BYTES);
982
988
  for (let i = 0; i < limit; i++) {
983
989
  const byte = buf[i];
984
- if (byte === 0)
990
+ if (byte === undefined || byte === 0)
985
991
  return false;
986
992
  if (byte < 9)
987
993
  return false;
@@ -1137,6 +1143,77 @@ async function servePackagesList(res, url, services, token) {
1137
1143
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
1138
1144
  }
1139
1145
  }
1146
+ const EXTENSION_SLUG_PATTERN = /^[a-z0-9_-]{1,64}$/;
1147
+ const EXTENSION_SECRET_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
1148
+ /**
1149
+ * Declared + provisioned secrets for every extension visible to the selected
1150
+ * conversation (global scope plus the conversation's own installs, deduped by
1151
+ * slug — the vault is keyed by slug, so two scopes share one secret set).
1152
+ * Values never leave the server; only key names and provisioning status do.
1153
+ */
1154
+ function serveExtensionSecretsList(res, url, services, token) {
1155
+ const scope = resolveConversationFromQuery(url, token);
1156
+ if (scope.error) {
1157
+ jsonRes(res, 403, { error: scope.error });
1158
+ return;
1159
+ }
1160
+ const workspace = requireAdminWorkspace(res, services);
1161
+ if (!workspace)
1162
+ return;
1163
+ const infosBySlug = new Map();
1164
+ for (const info of listInstalledExtensions(defaultExtensionDirs(scope.address, workspace.stateDir))) {
1165
+ infosBySlug.set(info.slug, info);
1166
+ }
1167
+ const extensions = [...infosBySlug.values()]
1168
+ .toSorted((left, right) => left.slug.localeCompare(right.slug))
1169
+ .map((info) => {
1170
+ const provisioned = Object.keys(services.vaultManager.resolve(`extensions/${info.slug}`)?.env ?? {}).toSorted();
1171
+ const declaredKeys = new Set(info.secrets.map((secret) => secret.key));
1172
+ return {
1173
+ slug: info.slug,
1174
+ name: info.name,
1175
+ declared: info.secrets.map((secret) => ({
1176
+ ...secret,
1177
+ provisioned: provisioned.includes(secret.key),
1178
+ })),
1179
+ extraProvisioned: provisioned.filter((key) => !declaredKeys.has(key)),
1180
+ };
1181
+ });
1182
+ jsonRes(res, 200, { extensions });
1183
+ }
1184
+ /** Set or delete one extension secret. Values are write-only through here. */
1185
+ function serveExtensionSecretMutation(res, body, services) {
1186
+ const action = body.action;
1187
+ if (action !== "set" && action !== "delete") {
1188
+ jsonRes(res, 400, { error: "action must be 'set' or 'delete'" });
1189
+ return;
1190
+ }
1191
+ const slug = typeof body.slug === "string" ? body.slug : "";
1192
+ if (!EXTENSION_SLUG_PATTERN.test(slug)) {
1193
+ jsonRes(res, 400, { error: "invalid extension slug" });
1194
+ return;
1195
+ }
1196
+ const key = typeof body.key === "string" ? body.key : "";
1197
+ if (!EXTENSION_SECRET_KEY_PATTERN.test(key)) {
1198
+ jsonRes(res, 400, { error: "invalid secret key (expected an env-style name)" });
1199
+ return;
1200
+ }
1201
+ const vaultKey = `extensions/${slug}`;
1202
+ if (action === "set") {
1203
+ const value = typeof body.value === "string" ? body.value : "";
1204
+ if (!value) {
1205
+ jsonRes(res, 400, { error: "value is required" });
1206
+ return;
1207
+ }
1208
+ services.vaultManager.upsertEnv(vaultKey, { [key]: value });
1209
+ }
1210
+ else if (!services.vaultManager.deleteEnvKey(vaultKey, key)) {
1211
+ jsonRes(res, 404, { error: "Not provisioned." });
1212
+ return;
1213
+ }
1214
+ const provisioned = Object.keys(services.vaultManager.resolve(vaultKey)?.env ?? {}).toSorted();
1215
+ jsonRes(res, 200, { ok: true, provisioned });
1216
+ }
1140
1217
  /**
1141
1218
  * Add / remove / refresh, in one route because they share validation and all
1142
1219
  * three answer with the freshly re-read inventory: the panel never has to
@@ -1363,18 +1440,6 @@ function jsonRes(res, status, body) {
1363
1440
  });
1364
1441
  res.end(JSON.stringify(body));
1365
1442
  }
1366
- async function readJsonBody(req, res) {
1367
- const data = await readRawBody(req, res, 32 * 1024);
1368
- if (data === null)
1369
- return null;
1370
- try {
1371
- return JSON.parse(data);
1372
- }
1373
- catch {
1374
- jsonRes(res, 400, { error: "Invalid JSON" });
1375
- return null;
1376
- }
1377
- }
1378
1443
  const esc = escapeHtml;
1379
1444
  // ── HTML ───────────────────────────────────────────────────────────────────────
1380
1445
  function renderAdminPage(token) {
@@ -1539,6 +1604,18 @@ function renderAdminPage(token) {
1539
1604
  <div id="pkg-global-content"><div class="loading-msg">Loading…</div></div>
1540
1605
  </section>
1541
1606
 
1607
+ <section class="card sect">
1608
+ <header class="sect-head">
1609
+ <div>
1610
+ <p class="eyebrow">Extension Secrets</p>
1611
+ <h2 class="card-title">Extension 密鑰(依 slug 全域共用)</h2>
1612
+ </div>
1613
+ <button class="refresh-btn" onclick="loadExtensionSecrets()">↻</button>
1614
+ </header>
1615
+ <div id="ext-secrets-msg" class="pkg-msg" style="display:none"></div>
1616
+ <div id="ext-secrets-content"><div class="loading-msg">Loading…</div></div>
1617
+ </section>
1618
+
1542
1619
  <section class="card sect">
1543
1620
  <header class="sect-head">
1544
1621
  <div>
@@ -2012,6 +2089,94 @@ function renderAdminPage(token) {
2012
2089
  void mutatePackage(btn.dataset.pkgScope, btn.dataset.pkgAction, btn.dataset.pkgSource);
2013
2090
  });
2014
2091
 
2092
+ // ── Extension secrets ───────────────────────────────────────────────────────
2093
+
2094
+ function extSecretsMessage(text, kind) {
2095
+ const el = document.getElementById('ext-secrets-msg');
2096
+ if (!el) return;
2097
+ el.style.display = 'block';
2098
+ el.className = 'pkg-msg pkg-msg-' + kind;
2099
+ el.textContent = text;
2100
+ }
2101
+
2102
+ function renderSecretRow(slug, key, meta) {
2103
+ return '<div class="pkg-row">' +
2104
+ '<div class="pkg-row-main"><span class="pkg-source">' + escHtml(key) + '</span>' +
2105
+ (meta.required ? '<span class="pkg-badge pkg-badge-warn">required</span>' : '') +
2106
+ (meta.provisioned
2107
+ ? '<span class="pkg-badge pkg-badge-ok">provisioned</span>'
2108
+ : '<span class="pkg-badge pkg-badge-err">missing</span>') +
2109
+ '</div>' +
2110
+ (meta.description ? '<div class="skill-desc">' + escHtml(meta.description) + '</div>' : '') +
2111
+ '<div class="pkg-actions">' +
2112
+ '<button class="pkg-btn" data-secret-action="set" data-secret-slug="' + escAttr(slug) + '" data-secret-key="' + escAttr(key) + '">Set</button>' +
2113
+ (meta.provisioned
2114
+ ? '<button class="pkg-btn pkg-btn-danger" data-secret-action="delete" data-secret-slug="' + escAttr(slug) + '" data-secret-key="' + escAttr(key) + '">Delete</button>'
2115
+ : '') +
2116
+ '</div>' +
2117
+ '</div>';
2118
+ }
2119
+
2120
+ async function loadExtensionSecrets() {
2121
+ const container = document.getElementById('ext-secrets-content');
2122
+ if (!container) return;
2123
+ container.innerHTML = '<div class="loading-msg">Loading…</div>';
2124
+ try {
2125
+ const data = await apiGet('/admin/api/extension-secrets?' + scopeQuery());
2126
+ if (data.extensions.length === 0) {
2127
+ container.innerHTML = '<div class="empty-state">No extensions installed</div>';
2128
+ return;
2129
+ }
2130
+ container.innerHTML = data.extensions.map((ext) => {
2131
+ const declared = ext.declared.map((s) => renderSecretRow(ext.slug, s.key, s)).join('');
2132
+ const extras = ext.extraProvisioned
2133
+ .map((key) => renderSecretRow(ext.slug, key, { provisioned: true }))
2134
+ .join('');
2135
+ return '<div class="pkg-group">' +
2136
+ '<div class="pkg-group-head"><strong>' + escHtml(ext.name) + '</strong>' +
2137
+ '<span class="pkg-source">' + escHtml(ext.slug) + '</span>' +
2138
+ '<button class="pkg-btn" data-secret-action="add" data-secret-slug="' + escAttr(ext.slug) + '">Add key</button>' +
2139
+ '</div>' +
2140
+ '<div class="pkg-list">' +
2141
+ (declared + extras || '<div class="pkg-provides-empty">No secrets declared</div>') +
2142
+ '</div>' +
2143
+ '</div>';
2144
+ }).join('');
2145
+ } catch (err) {
2146
+ container.innerHTML = '<div class="err-msg">' + escHtml(err.message) + '</div>';
2147
+ }
2148
+ }
2149
+
2150
+ document.addEventListener('click', async (event) => {
2151
+ const btn = event.target.closest('[data-secret-action]');
2152
+ if (!btn) return;
2153
+ const slug = btn.dataset.secretSlug;
2154
+ const action = btn.dataset.secretAction;
2155
+ let key = btn.dataset.secretKey;
2156
+ if (action === 'add') {
2157
+ key = (prompt('Secret key for ' + slug + '(e.g. SLACK_BOT_TOKEN)') || '').trim();
2158
+ if (!key) return;
2159
+ }
2160
+ if (action === 'delete' && !confirm('Delete ' + key + ' from ' + slug + '?')) return;
2161
+ let value;
2162
+ if (action !== 'delete') {
2163
+ value = prompt('Value for ' + key + '(' + slug + ')');
2164
+ if (!value) return;
2165
+ }
2166
+ try {
2167
+ await apiPost('/admin/api/extension-secrets/mutate', {
2168
+ action: action === 'delete' ? 'delete' : 'set',
2169
+ slug: slug,
2170
+ key: key,
2171
+ value: value,
2172
+ });
2173
+ extSecretsMessage('已更新。對話輸入 /pi-new 生效。', 'ok');
2174
+ await loadExtensionSecrets();
2175
+ } catch (err) {
2176
+ extSecretsMessage(err.message, 'err');
2177
+ }
2178
+ });
2179
+
2015
2180
  async function loadSkills() {
2016
2181
  const container = document.getElementById('skills-content');
2017
2182
  const previewEl = document.getElementById('skills-preview');
@@ -2176,6 +2341,7 @@ function renderAdminPage(token) {
2176
2341
  loadGlobalSettings();
2177
2342
  loadGlobalSkills();
2178
2343
  loadEvents();
2344
+ loadExtensionSecrets();
2179
2345
  }
2180
2346
 
2181
2347
  async function loadAllConversations() {
@@ -2761,6 +2927,12 @@ const adminViewStyles = `
2761
2927
  }
2762
2928
  .pkg-btn:hover { background: rgba(0,0,0,0.05); }
2763
2929
  .pkg-btn-danger { color: #b91c1c; }
2930
+ .pkg-group { margin-bottom: 16px; }
2931
+ .pkg-group-head {
2932
+ display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
2933
+ font-size: 0.85rem;
2934
+ }
2935
+ .pkg-group-head .pkg-btn { margin-left: auto; }
2764
2936
 
2765
2937
  /* ── Events ─────────────────────────────────────────────────────────── */
2766
2938