anymous 1.2.7 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/bin/anymous.exe +7 -0
  2. package/package.json +20 -135
  3. package/postinstall.mjs +214 -0
  4. package/bin/anymous.cjs +0 -45
  5. package/src/account/account.ts +0 -473
  6. package/src/account/repo.ts +0 -171
  7. package/src/account/schema.ts +0 -99
  8. package/src/account/url.ts +0 -8
  9. package/src/acp/agent.ts +0 -95
  10. package/src/acp/config-option.ts +0 -203
  11. package/src/acp/content.ts +0 -269
  12. package/src/acp/directory.ts +0 -212
  13. package/src/acp/error.ts +0 -97
  14. package/src/acp/event.ts +0 -342
  15. package/src/acp/permission.ts +0 -254
  16. package/src/acp/profile.ts +0 -42
  17. package/src/acp/service.ts +0 -1097
  18. package/src/acp/session.ts +0 -232
  19. package/src/acp/tool.ts +0 -364
  20. package/src/acp/usage.ts +0 -239
  21. package/src/agent/agent.ts +0 -973
  22. package/src/agent/generate.txt +0 -75
  23. package/src/agent/prompt/architect.txt +0 -26
  24. package/src/agent/prompt/backend.txt +0 -26
  25. package/src/agent/prompt/build.txt +0 -31
  26. package/src/agent/prompt/code-reviewer.txt +0 -29
  27. package/src/agent/prompt/compaction.txt +0 -45
  28. package/src/agent/prompt/database.txt +0 -27
  29. package/src/agent/prompt/debug-tools.txt +0 -40
  30. package/src/agent/prompt/debug.txt +0 -23
  31. package/src/agent/prompt/devops.txt +0 -26
  32. package/src/agent/prompt/docs.txt +0 -23
  33. package/src/agent/prompt/exe-extractor.txt +0 -39
  34. package/src/agent/prompt/explore.txt +0 -42
  35. package/src/agent/prompt/frontend.txt +0 -29
  36. package/src/agent/prompt/general.txt +0 -25
  37. package/src/agent/prompt/memory-dump.txt +0 -37
  38. package/src/agent/prompt/pentest-critic.txt +0 -51
  39. package/src/agent/prompt/pentest-enumerator.txt +0 -72
  40. package/src/agent/prompt/pentest-exploiter.txt +0 -69
  41. package/src/agent/prompt/pentest-identity.txt +0 -59
  42. package/src/agent/prompt/pentest-lead.txt +0 -46
  43. package/src/agent/prompt/pentest-postexploit.txt +0 -84
  44. package/src/agent/prompt/pentest-recon.txt +0 -50
  45. package/src/agent/prompt/pentest-reporter.txt +0 -76
  46. package/src/agent/prompt/pentest-scanner.txt +0 -57
  47. package/src/agent/prompt/pentest-webapp.txt +0 -94
  48. package/src/agent/prompt/performance.txt +0 -27
  49. package/src/agent/prompt/plan.txt +0 -35
  50. package/src/agent/prompt/refactor.txt +0 -31
  51. package/src/agent/prompt/reverser-automator.txt +0 -96
  52. package/src/agent/prompt/reverser-binary.txt +0 -62
  53. package/src/agent/prompt/reverser-dynamic.txt +0 -76
  54. package/src/agent/prompt/reverser-source.txt +0 -93
  55. package/src/agent/prompt/reverser-static.txt +0 -76
  56. package/src/agent/prompt/security.txt +0 -34
  57. package/src/agent/prompt/summary.txt +0 -22
  58. package/src/agent/prompt/test-writer.txt +0 -34
  59. package/src/agent/prompt/title.txt +0 -44
  60. package/src/agent/prompt/web-designer.txt +0 -23
  61. package/src/agent/subagent-permissions.ts +0 -27
  62. package/src/audio.d.ts +0 -14
  63. package/src/auth/index.ts +0 -97
  64. package/src/background/job.ts +0 -37
  65. package/src/bus/global.ts +0 -22
  66. package/src/cli/bootstrap.ts +0 -11
  67. package/src/cli/cmd/account.ts +0 -264
  68. package/src/cli/cmd/acp.ts +0 -73
  69. package/src/cli/cmd/agent.ts +0 -259
  70. package/src/cli/cmd/attach.ts +0 -148
  71. package/src/cli/cmd/cmd.ts +0 -7
  72. package/src/cli/cmd/db.ts +0 -62
  73. package/src/cli/cmd/debug/agent.handler.ts +0 -193
  74. package/src/cli/cmd/debug/agent.ts +0 -27
  75. package/src/cli/cmd/debug/config.ts +0 -14
  76. package/src/cli/cmd/debug/file.ts +0 -73
  77. package/src/cli/cmd/debug/index.ts +0 -87
  78. package/src/cli/cmd/debug/lsp.ts +0 -50
  79. package/src/cli/cmd/debug/ripgrep.ts +0 -79
  80. package/src/cli/cmd/debug/scrap.ts +0 -16
  81. package/src/cli/cmd/debug/skill.ts +0 -15
  82. package/src/cli/cmd/debug/snapshot.ts +0 -50
  83. package/src/cli/cmd/debug/startup.ts +0 -11
  84. package/src/cli/cmd/debug/v2.ts +0 -42
  85. package/src/cli/cmd/export.ts +0 -292
  86. package/src/cli/cmd/generate.ts +0 -54
  87. package/src/cli/cmd/github.handler.ts +0 -1593
  88. package/src/cli/cmd/github.shared.ts +0 -30
  89. package/src/cli/cmd/github.ts +0 -42
  90. package/src/cli/cmd/import.ts +0 -230
  91. package/src/cli/cmd/mcp.ts +0 -840
  92. package/src/cli/cmd/models.ts +0 -66
  93. package/src/cli/cmd/plug.ts +0 -230
  94. package/src/cli/cmd/pr.ts +0 -115
  95. package/src/cli/cmd/prompt-display.ts +0 -1
  96. package/src/cli/cmd/providers.ts +0 -534
  97. package/src/cli/cmd/run/demo.ts +0 -1274
  98. package/src/cli/cmd/run/entry.body.ts +0 -205
  99. package/src/cli/cmd/run/footer.command.tsx +0 -1070
  100. package/src/cli/cmd/run/footer.menu.tsx +0 -351
  101. package/src/cli/cmd/run/footer.permission.tsx +0 -472
  102. package/src/cli/cmd/run/footer.prompt.tsx +0 -1315
  103. package/src/cli/cmd/run/footer.question.tsx +0 -573
  104. package/src/cli/cmd/run/footer.subagent.tsx +0 -175
  105. package/src/cli/cmd/run/footer.ts +0 -1129
  106. package/src/cli/cmd/run/footer.view.tsx +0 -945
  107. package/src/cli/cmd/run/footer.width.ts +0 -27
  108. package/src/cli/cmd/run/permission.shared.ts +0 -256
  109. package/src/cli/cmd/run/prompt.editor.ts +0 -157
  110. package/src/cli/cmd/run/prompt.shared.ts +0 -153
  111. package/src/cli/cmd/run/question.shared.ts +0 -340
  112. package/src/cli/cmd/run/runtime.boot.ts +0 -202
  113. package/src/cli/cmd/run/runtime.lifecycle.ts +0 -410
  114. package/src/cli/cmd/run/runtime.queue.ts +0 -349
  115. package/src/cli/cmd/run/runtime.shared.ts +0 -17
  116. package/src/cli/cmd/run/runtime.stdin.ts +0 -37
  117. package/src/cli/cmd/run/runtime.ts +0 -821
  118. package/src/cli/cmd/run/scrollback.shared.ts +0 -92
  119. package/src/cli/cmd/run/scrollback.surface.ts +0 -431
  120. package/src/cli/cmd/run/scrollback.writer.tsx +0 -352
  121. package/src/cli/cmd/run/session-data.ts +0 -1113
  122. package/src/cli/cmd/run/session-replay.ts +0 -374
  123. package/src/cli/cmd/run/session.shared.ts +0 -196
  124. package/src/cli/cmd/run/splash.ts +0 -289
  125. package/src/cli/cmd/run/stream.transport.ts +0 -1462
  126. package/src/cli/cmd/run/stream.ts +0 -175
  127. package/src/cli/cmd/run/subagent-data.ts +0 -876
  128. package/src/cli/cmd/run/theme.ts +0 -690
  129. package/src/cli/cmd/run/tool.ts +0 -1486
  130. package/src/cli/cmd/run/trace.ts +0 -94
  131. package/src/cli/cmd/run/turn-summary.ts +0 -47
  132. package/src/cli/cmd/run/types.ts +0 -350
  133. package/src/cli/cmd/run/variant.shared.ts +0 -216
  134. package/src/cli/cmd/run.ts +0 -1011
  135. package/src/cli/cmd/serve.ts +0 -24
  136. package/src/cli/cmd/session.ts +0 -147
  137. package/src/cli/cmd/stats.ts +0 -393
  138. package/src/cli/cmd/tui.ts +0 -309
  139. package/src/cli/cmd/uninstall.ts +0 -353
  140. package/src/cli/cmd/upgrade.ts +0 -113
  141. package/src/cli/cmd/web.ts +0 -84
  142. package/src/cli/effect/prompt.ts +0 -37
  143. package/src/cli/effect-cmd.ts +0 -96
  144. package/src/cli/error.ts +0 -130
  145. package/src/cli/heap.ts +0 -45
  146. package/src/cli/logo.ts +0 -1
  147. package/src/cli/network.ts +0 -80
  148. package/src/cli/tui/layer.ts +0 -8
  149. package/src/cli/tui/validate-session.ts +0 -29
  150. package/src/cli/tui/worker.ts +0 -80
  151. package/src/cli/ui.ts +0 -146
  152. package/src/cli/upgrade.ts +0 -79
  153. package/src/cli/version.ts +0 -14
  154. package/src/command/index.ts +0 -177
  155. package/src/command/template/initialize.txt +0 -66
  156. package/src/command/template/review.txt +0 -101
  157. package/src/config/agent.ts +0 -59
  158. package/src/config/command.ts +0 -39
  159. package/src/config/config.ts +0 -689
  160. package/src/config/entry-name.ts +0 -19
  161. package/src/config/managed.ts +0 -69
  162. package/src/config/markdown.ts +0 -36
  163. package/src/config/parse.ts +0 -79
  164. package/src/config/paths.ts +0 -45
  165. package/src/config/plugin.ts +0 -79
  166. package/src/config/tui-cwd.ts +0 -5
  167. package/src/config/tui-host-attention.ts +0 -21
  168. package/src/config/tui-migrate.ts +0 -132
  169. package/src/config/tui.ts +0 -276
  170. package/src/config/variable.ts +0 -91
  171. package/src/control-plane/adapters/index.ts +0 -41
  172. package/src/control-plane/adapters/worktree.ts +0 -96
  173. package/src/control-plane/dev/README.md +0 -19
  174. package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
  175. package/src/control-plane/types.ts +0 -59
  176. package/src/control-plane/util.ts +0 -39
  177. package/src/control-plane/workspace-adapter-runtime.ts +0 -51
  178. package/src/control-plane/workspace-context.ts +0 -26
  179. package/src/control-plane/workspace.ts +0 -964
  180. package/src/effect/app-node-builder-v1.ts +0 -12
  181. package/src/effect/app-runtime.ts +0 -137
  182. package/src/effect/bootstrap-runtime.ts +0 -19
  183. package/src/effect/bridge.ts +0 -84
  184. package/src/effect/config-service.ts +0 -67
  185. package/src/effect/instance-ref.ts +0 -11
  186. package/src/effect/instance-registry.ts +0 -12
  187. package/src/effect/instance-state.ts +0 -69
  188. package/src/effect/promise.ts +0 -17
  189. package/src/effect/run-service.ts +0 -47
  190. package/src/effect/runner.ts +0 -217
  191. package/src/effect/runtime-flags.ts +0 -79
  192. package/src/env/index.ts +0 -41
  193. package/src/event-manifest.ts +0 -3
  194. package/src/event-v2-bridge.ts +0 -71
  195. package/src/format/formatter.ts +0 -404
  196. package/src/format/index.ts +0 -203
  197. package/src/git/index.ts +0 -348
  198. package/src/id/id.ts +0 -80
  199. package/src/ide/index.ts +0 -54
  200. package/src/image/image.ts +0 -172
  201. package/src/index.ts +0 -142
  202. package/src/installation/index.ts +0 -336
  203. package/src/lsp/client.ts +0 -650
  204. package/src/lsp/diagnostic.ts +0 -29
  205. package/src/lsp/language.ts +0 -121
  206. package/src/lsp/launch.ts +0 -21
  207. package/src/lsp/lsp.ts +0 -507
  208. package/src/lsp/server.ts +0 -1983
  209. package/src/markdown.d.ts +0 -4
  210. package/src/mcp/auth.ts +0 -163
  211. package/src/mcp/browser.ts +0 -37
  212. package/src/mcp/catalog.ts +0 -170
  213. package/src/mcp/index.ts +0 -1004
  214. package/src/mcp/oauth-callback.ts +0 -194
  215. package/src/mcp/oauth-provider.ts +0 -259
  216. package/src/memory/memory.ts +0 -133
  217. package/src/node.ts +0 -4
  218. package/src/patch/index.ts +0 -686
  219. package/src/permission/arity.ts +0 -163
  220. package/src/permission/evaluate.ts +0 -1
  221. package/src/permission/index.ts +0 -229
  222. package/src/plugin/azure.ts +0 -26
  223. package/src/plugin/cloudflare.ts +0 -76
  224. package/src/plugin/digitalocean.ts +0 -325
  225. package/src/plugin/github-copilot/copilot.ts +0 -414
  226. package/src/plugin/github-copilot/models.ts +0 -258
  227. package/src/plugin/index.ts +0 -311
  228. package/src/plugin/install.ts +0 -439
  229. package/src/plugin/loader.ts +0 -237
  230. package/src/plugin/meta.ts +0 -188
  231. package/src/plugin/openai/README.md +0 -31
  232. package/src/plugin/openai/codex.ts +0 -565
  233. package/src/plugin/openai/ws-pool.ts +0 -270
  234. package/src/plugin/openai/ws.ts +0 -381
  235. package/src/plugin/pty-environment.ts +0 -24
  236. package/src/plugin/shared.ts +0 -323
  237. package/src/plugin/snowflake-cortex.ts +0 -507
  238. package/src/plugin/tui/internal.ts +0 -10
  239. package/src/plugin/tui/runtime.ts +0 -1131
  240. package/src/plugin/xai.ts +0 -626
  241. package/src/project/bootstrap-service.ts +0 -9
  242. package/src/project/bootstrap.ts +0 -58
  243. package/src/project/instance-context.ts +0 -24
  244. package/src/project/instance-runtime.ts +0 -16
  245. package/src/project/instance-store.ts +0 -213
  246. package/src/project/project.ts +0 -483
  247. package/src/project/vcs.ts +0 -423
  248. package/src/provider/auth.ts +0 -229
  249. package/src/provider/error.ts +0 -188
  250. package/src/provider/model-status.ts +0 -8
  251. package/src/provider/provider.ts +0 -2006
  252. package/src/provider/transform.ts +0 -1832
  253. package/src/question/index.ts +0 -161
  254. package/src/question/schema.ts +0 -4
  255. package/src/server/auth.ts +0 -48
  256. package/src/server/event.ts +0 -10
  257. package/src/server/global-lifecycle.ts +0 -28
  258. package/src/server/init-projectors.ts +0 -3
  259. package/src/server/mdns.ts +0 -47
  260. package/src/server/projectors.ts +0 -1
  261. package/src/server/proxy-util.ts +0 -48
  262. package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
  263. package/src/server/routes/instance/httpapi/api.ts +0 -97
  264. package/src/server/routes/instance/httpapi/errors.ts +0 -193
  265. package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
  266. package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
  267. package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
  268. package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
  269. package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
  270. package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
  271. package/src/server/routes/instance/httpapi/groups/global.ts +0 -136
  272. package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
  273. package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
  274. package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
  275. package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
  276. package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
  277. package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
  278. package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
  279. package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
  280. package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
  281. package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
  282. package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
  283. package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
  284. package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
  285. package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
  286. package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
  287. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
  288. package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
  289. package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
  290. package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -193
  291. package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
  292. package/src/server/routes/instance/httpapi/handlers/global.ts +0 -156
  293. package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
  294. package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
  295. package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
  296. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
  297. package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
  298. package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -113
  299. package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
  300. package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
  301. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
  302. package/src/server/routes/instance/httpapi/handlers/session.ts +0 -442
  303. package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
  304. package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
  305. package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
  306. package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
  307. package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
  308. package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
  309. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
  310. package/src/server/routes/instance/httpapi/middleware/error.ts +0 -43
  311. package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
  312. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
  313. package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -108
  314. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
  315. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
  316. package/src/server/routes/instance/httpapi/public.ts +0 -537
  317. package/src/server/routes/instance/httpapi/server.ts +0 -327
  318. package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -60
  319. package/src/server/server.ts +0 -226
  320. package/src/server/shared/fence.ts +0 -60
  321. package/src/server/shared/pty-ticket.ts +0 -15
  322. package/src/server/shared/public-ui.ts +0 -12
  323. package/src/server/shared/tui-control.ts +0 -28
  324. package/src/server/shared/ui.ts +0 -108
  325. package/src/server/shared/workspace-routing.ts +0 -38
  326. package/src/server/tui-event.ts +0 -1
  327. package/src/session/compaction.ts +0 -562
  328. package/src/session/instruction.ts +0 -237
  329. package/src/session/llm/AGENTS.md +0 -90
  330. package/src/session/llm/ai-sdk.ts +0 -288
  331. package/src/session/llm/native-request.ts +0 -196
  332. package/src/session/llm/native-runtime.ts +0 -195
  333. package/src/session/llm/request.ts +0 -226
  334. package/src/session/llm.ts +0 -404
  335. package/src/session/message-error.ts +0 -14
  336. package/src/session/message-v2.ts +0 -734
  337. package/src/session/message.ts +0 -148
  338. package/src/session/overflow.ts +0 -34
  339. package/src/session/processor.ts +0 -718
  340. package/src/session/prompt/anthropic.txt +0 -96
  341. package/src/session/prompt/beast.txt +0 -147
  342. package/src/session/prompt/build-switch.txt +0 -5
  343. package/src/session/prompt/codex.txt +0 -79
  344. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  345. package/src/session/prompt/default.txt +0 -89
  346. package/src/session/prompt/gemini.txt +0 -155
  347. package/src/session/prompt/gpt.txt +0 -107
  348. package/src/session/prompt/kimi.txt +0 -95
  349. package/src/session/prompt/meta.txt +0 -64
  350. package/src/session/prompt/plan-mode.txt +0 -70
  351. package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  352. package/src/session/prompt/plan.txt +0 -26
  353. package/src/session/prompt/trinity.txt +0 -97
  354. package/src/session/prompt.ts +0 -1636
  355. package/src/session/reminders.ts +0 -92
  356. package/src/session/retry.ts +0 -201
  357. package/src/session/revert.ts +0 -146
  358. package/src/session/run-state.ts +0 -151
  359. package/src/session/schema.ts +0 -26
  360. package/src/session/session.ts +0 -1018
  361. package/src/session/status.ts +0 -56
  362. package/src/session/summary.ts +0 -160
  363. package/src/session/system.ts +0 -145
  364. package/src/session/todo.ts +0 -74
  365. package/src/session/tools.ts +0 -590
  366. package/src/share/session.ts +0 -58
  367. package/src/share/share-next.ts +0 -371
  368. package/src/skill/discovery.ts +0 -140
  369. package/src/skill/index.ts +0 -354
  370. package/src/snapshot/index.ts +0 -807
  371. package/src/sql.d.ts +0 -4
  372. package/src/storage/schema.ts +0 -5
  373. package/src/storage/storage.ts +0 -327
  374. package/src/sync/README.md +0 -179
  375. package/src/sync/schema.ts +0 -11
  376. package/src/temporary.ts +0 -31
  377. package/src/tool/apply_patch.ts +0 -313
  378. package/src/tool/apply_patch.txt +0 -33
  379. package/src/tool/code-mode.ts +0 -310
  380. package/src/tool/computer.ts +0 -476
  381. package/src/tool/computer.txt +0 -25
  382. package/src/tool/edit.ts +0 -737
  383. package/src/tool/edit.txt +0 -10
  384. package/src/tool/external-directory.ts +0 -49
  385. package/src/tool/glob.ts +0 -76
  386. package/src/tool/glob.txt +0 -6
  387. package/src/tool/grep.ts +0 -115
  388. package/src/tool/grep.txt +0 -8
  389. package/src/tool/invalid.ts +0 -21
  390. package/src/tool/json-schema.ts +0 -164
  391. package/src/tool/lsp.ts +0 -113
  392. package/src/tool/lsp.txt +0 -24
  393. package/src/tool/mcp-websearch.ts +0 -96
  394. package/src/tool/memory.ts +0 -59
  395. package/src/tool/memory.txt +0 -14
  396. package/src/tool/plan-enter.txt +0 -14
  397. package/src/tool/plan-exit.txt +0 -13
  398. package/src/tool/plan.ts +0 -79
  399. package/src/tool/question.ts +0 -44
  400. package/src/tool/question.txt +0 -10
  401. package/src/tool/read.ts +0 -386
  402. package/src/tool/read.txt +0 -14
  403. package/src/tool/registry.ts +0 -460
  404. package/src/tool/schema.ts +0 -14
  405. package/src/tool/shell/id.ts +0 -19
  406. package/src/tool/shell/prompt.ts +0 -293
  407. package/src/tool/shell/shell.txt +0 -21
  408. package/src/tool/shell.ts +0 -645
  409. package/src/tool/skill.ts +0 -70
  410. package/src/tool/skill.txt +0 -5
  411. package/src/tool/task.ts +0 -360
  412. package/src/tool/task.txt +0 -19
  413. package/src/tool/todo.ts +0 -46
  414. package/src/tool/todowrite.txt +0 -44
  415. package/src/tool/tool.ts +0 -183
  416. package/src/tool/truncate.ts +0 -156
  417. package/src/tool/truncation-dir.ts +0 -4
  418. package/src/tool/webfetch.ts +0 -192
  419. package/src/tool/webfetch.txt +0 -13
  420. package/src/tool/websearch.ts +0 -143
  421. package/src/tool/websearch.txt +0 -14
  422. package/src/tool/write.ts +0 -104
  423. package/src/tool/write.txt +0 -8
  424. package/src/util/archive.ts +0 -17
  425. package/src/util/bom.ts +0 -27
  426. package/src/util/data-url.ts +0 -9
  427. package/src/util/defer.ts +0 -10
  428. package/src/util/effect-http-client.ts +0 -11
  429. package/src/util/error.ts +0 -1
  430. package/src/util/filesystem.ts +0 -251
  431. package/src/util/html.ts +0 -8
  432. package/src/util/iife.ts +0 -3
  433. package/src/util/lazy.ts +0 -20
  434. package/src/util/local-context.ts +0 -25
  435. package/src/util/locale.ts +0 -2
  436. package/src/util/media.ts +0 -26
  437. package/src/util/process.ts +0 -177
  438. package/src/util/proxy-env.ts +0 -72
  439. package/src/util/queue.ts +0 -32
  440. package/src/util/record.ts +0 -1
  441. package/src/util/repository.ts +0 -232
  442. package/src/util/rpc.ts +0 -66
  443. package/src/util/signal.ts +0 -12
  444. package/src/util/timeout.ts +0 -13
  445. package/src/util/token.ts +0 -1
  446. package/src/util/wildcard.ts +0 -59
  447. package/src/worktree/index.ts +0 -623
  448. package/tsconfig.json +0 -17
@@ -1,689 +0,0 @@
1
- import { LayerNode } from "@anymous-ai/core/effect/layer-node"
2
- import { httpClient } from "@anymous-ai/core/effect/app-node-platform"
3
- import { serviceUse } from "@anymous-ai/core/effect/service-use"
4
- import path from "path"
5
- import { pathToFileURL } from "url"
6
- import os from "os"
7
- import { mergeDeep } from "remeda"
8
- import { Global } from "@anymous-ai/core/global"
9
- import fsNode from "fs/promises"
10
- import { Flag } from "@anymous-ai/core/flag/flag"
11
- import { Auth } from "../auth"
12
- import { Env } from "../env"
13
- import { applyEdits, modify } from "jsonc-parser"
14
- import { InstallationLocal, InstallationVersion } from "@anymous-ai/core/installation/version"
15
- import { existsSync } from "fs"
16
- import { Account } from "@/account/account"
17
- import { isRecord } from "@/util/record"
18
- import type { ConsoleState } from "@anymous-ai/core/v1/config/console-state"
19
- import { FSUtil } from "@anymous-ai/core/fs-util"
20
- import { InstanceState } from "@/effect/instance-state"
21
- import { Context, Duration, Effect, Exit, Fiber, Layer, Option, Schema } from "effect"
22
- import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http"
23
- import { EffectFlock } from "@anymous-ai/core/util/effect-flock"
24
- import { containsPath, type InstanceContext } from "../project/instance-context"
25
- import { ConfigV1 } from "@anymous-ai/core/v1/config/config"
26
- import { RemoteAuthError } from "@anymous-ai/core/v1/config/error"
27
- import { ConfigPermissionV1 } from "@anymous-ai/core/v1/config/permission"
28
- import { ConfigPluginV1 } from "@anymous-ai/core/v1/config/plugin"
29
- import { ConfigAgent } from "./agent"
30
- import { ConfigCommand } from "./command"
31
- import { ConfigManaged } from "./managed"
32
- import { ConfigParse } from "./parse"
33
- import { ConfigPaths } from "./paths"
34
- import { ConfigPlugin } from "./plugin"
35
- import { ConfigVariable } from "./variable"
36
- import { Npm } from "@anymous-ai/core/npm"
37
- import { withTransientReadRetry } from "@/util/effect-http-client"
38
-
39
- // Custom merge function that concatenates array fields instead of replacing them
40
- // Keep remeda's deep conditional merge type out of hot config-loading paths; TS profiling showed it dominates here.
41
- function mergeConfig(target: Info, source: Info): Info {
42
- return mergeDeep(target, source) as Info
43
- }
44
-
45
- function mergeConfigConcatArrays(target: Info, source: Info): Info {
46
- const merged = mergeConfig(target, source)
47
- if (target.instructions && source.instructions) {
48
- merged.instructions = Array.from(new Set([...target.instructions, ...source.instructions]))
49
- }
50
- return merged
51
- }
52
-
53
- function normalizeLoadedConfig(data: unknown) {
54
- if (!isRecord(data)) return data
55
- const copy = { ...data }
56
- const hadLegacy = "theme" in copy || "keybinds" in copy || "tui" in copy
57
- if (!hadLegacy) return copy
58
- delete copy.theme
59
- delete copy.keybinds
60
- delete copy.tui
61
- return copy
62
- }
63
-
64
- async function substituteWellKnownRemoteConfig(input: {
65
- value: unknown
66
- dir: string
67
- source: string
68
- env: Record<string, string>
69
- }) {
70
- if (!isRecord(input.value) || typeof input.value.url !== "string") return undefined
71
-
72
- const url = await ConfigVariable.substitute({
73
- text: input.value.url,
74
- type: "virtual",
75
- dir: input.dir,
76
- source: input.source,
77
- env: input.env,
78
- })
79
- const headers = isRecord(input.value.headers)
80
- ? Object.fromEntries(
81
- await Promise.all(
82
- Object.entries(input.value.headers)
83
- .filter((entry): entry is [string, string] => typeof entry[1] === "string")
84
- .map(async ([key, value]) => [
85
- key,
86
- await ConfigVariable.substitute({
87
- text: value,
88
- type: "virtual",
89
- dir: input.dir,
90
- source: input.source,
91
- env: input.env,
92
- }),
93
- ]),
94
- ),
95
- )
96
- : undefined
97
-
98
- return { url, headers }
99
- }
100
-
101
- async function resolveLoadedPlugins<T extends { plugin?: ConfigPluginV1.Spec[] }>(config: T, filepath: string) {
102
- if (!config.plugin) return config
103
- for (let i = 0; i < config.plugin.length; i++) {
104
- // Normalize path-like plugin specs while we still know which config file declared them.
105
- // This prevents `./plugin.ts` from being reinterpreted relative to some later merge location.
106
- config.plugin[i] = await ConfigPlugin.resolvePluginSpec(config.plugin[i], filepath)
107
- }
108
- return config
109
- }
110
-
111
- type Info = ConfigV1.Info & {
112
- // plugin_origins is derived state, not a persisted config field. It keeps each winning plugin spec together
113
- // with the file and scope it came from so later runtime code can make location-sensitive decisions.
114
- plugin_origins?: ConfigPlugin.Origin[]
115
- }
116
-
117
- type State = {
118
- config: Info
119
- directories: string[]
120
- deps: Fiber.Fiber<void>[]
121
- consoleState: ConsoleState
122
- }
123
-
124
- export interface Interface {
125
- readonly get: () => Effect.Effect<Info>
126
- readonly getGlobal: () => Effect.Effect<Info>
127
- readonly getConsoleState: () => Effect.Effect<ConsoleState>
128
- readonly update: (config: Info) => Effect.Effect<void>
129
- readonly updateGlobal: (config: Info) => Effect.Effect<{ info: Info; changed: boolean }>
130
- readonly invalidate: () => Effect.Effect<void>
131
- readonly directories: () => Effect.Effect<string[]>
132
- readonly waitForDependencies: () => Effect.Effect<void>
133
- }
134
-
135
- export class Service extends Context.Service<Service, Interface>()("@anymous/Config") {}
136
-
137
- export const use = serviceUse(Service)
138
-
139
- function globalConfigFile() {
140
- const candidates = ["anymous.jsonc", "anymous.json", "config.json"].map((file) =>
141
- path.join(Global.Path.config, file),
142
- )
143
- for (const file of candidates) {
144
- if (existsSync(file)) return file
145
- }
146
- return candidates[0]
147
- }
148
-
149
- function patchJsonc(input: string, patch: unknown, path: string[] = []): string {
150
- if (!isRecord(patch)) {
151
- const edits = modify(input, path, patch, {
152
- formattingOptions: {
153
- insertSpaces: true,
154
- tabSize: 2,
155
- },
156
- })
157
- return applyEdits(input, edits)
158
- }
159
-
160
- return Object.entries(patch).reduce((result, [key, value]) => patchJsonc(result, value, [...path, key]), input)
161
- }
162
-
163
- function writable(info: Info) {
164
- const { plugin_origins: _plugin_origins, ...next } = info
165
- return next
166
- }
167
-
168
- function writableGlobal(info: Info) {
169
- const next = writable(info)
170
- // When a user changes config from a value back to default in the Desktop app, we don't want to leave a blank `"shell": "",` key
171
- if ("shell" in next && next.shell === "") return { ...next, shell: undefined }
172
- return next
173
- }
174
-
175
- const layer = Layer.effect(
176
- Service,
177
- Effect.gen(function* () {
178
- const fs = yield* FSUtil.Service
179
- const authSvc = yield* Auth.Service
180
- const accountSvc = yield* Account.Service
181
- const env = yield* Env.Service
182
- const npmSvc = yield* Npm.Service
183
- const http = yield* HttpClient.HttpClient
184
-
185
- const readConfigFile = (filepath: string) => fs.readFileStringSafe(filepath).pipe(Effect.orDie)
186
-
187
- const fetchRemoteJson = Effect.fnUntraced(function* <S extends Schema.Top>(
188
- url: string,
189
- headers: Record<string, string> | undefined,
190
- schema: S,
191
- loginOrigin: string,
192
- ) {
193
- const response = yield* HttpClient.filterStatusOk(withTransientReadRetry(http))
194
- .execute(
195
- HttpClientRequest.get(url).pipe(HttpClientRequest.acceptJson, HttpClientRequest.setHeaders(headers ?? {})),
196
- )
197
- .pipe(
198
- Effect.catch((error) => Effect.die(new Error(`failed to fetch remote config from ${url}: ${String(error)}`))),
199
- )
200
- const body = yield* response.text.pipe(
201
- Effect.catch((error) => Effect.die(new Error(`failed to read remote config from ${url}: ${String(error)}`))),
202
- )
203
- // An auth proxy can answer with an HTML login page at HTTP 200 (passes filterStatusOk); treat it as a re-auth error, not a decode failure.
204
- const contentType = (response.headers["content-type"] ?? "").toLowerCase()
205
- if (contentType.includes("html") || /^\s*<!doctype|^\s*<html/i.test(body)) {
206
- return yield* Effect.die(new RemoteAuthError({ url: loginOrigin, remote: url }))
207
- }
208
- return yield* Schema.decodeEffect(Schema.fromJsonString(schema))(body).pipe(
209
- Effect.catch((error) => Effect.die(new Error(`failed to decode remote config from ${url}: ${String(error)}`))),
210
- )
211
- })
212
-
213
- const loadConfig = Effect.fnUntraced(function* (
214
- text: string,
215
- options: { path: string } | { dir: string; source: string },
216
- env?: Record<string, string>,
217
- ) {
218
- const source = "path" in options ? options.path : options.source
219
- const expanded = yield* Effect.promise(() =>
220
- ConfigVariable.substitute(
221
- "path" in options
222
- ? { text, type: "path", path: options.path, env }
223
- : { text, type: "virtual", ...options, env },
224
- ),
225
- )
226
- const parsed = ConfigParse.jsonc(expanded, source)
227
- const data = ConfigParse.schema(ConfigV1.Info, normalizeLoadedConfig(parsed), source)
228
- if (!("path" in options)) return data
229
-
230
- yield* Effect.promise(() => resolveLoadedPlugins(data, options.path))
231
- if (!data.$schema) {
232
- data.$schema = "https://anymous-cli.vercel.app/config.json"
233
- const updated = text.replace(/^\s*\{/, '{\n "$schema": "https://anymous-cli.vercel.app/config.json",')
234
- yield* fs.writeFileString(options.path, updated).pipe(Effect.catch(() => Effect.void))
235
- }
236
- return data
237
- })
238
-
239
- const loadFile = Effect.fnUntraced(function* (filepath: string, env?: Record<string, string>) {
240
- yield* Effect.logInfo("loading", { path: filepath })
241
- const text = yield* readConfigFile(filepath)
242
- if (!text) return {} as Info
243
- return yield* loadConfig(text, { path: filepath }, env)
244
- })
245
-
246
- const loadGlobal = Effect.fnUntraced(function* (env?: Record<string, string>) {
247
- let result: Info = {}
248
- // Seed the default global config with the schema for editor completion, but avoid writing when the user
249
- // explicitly routes config through env-provided paths or content.
250
- if (!Flag.ANYMOUS_CONFIG && !Flag.ANYMOUS_CONFIG_DIR && !Flag.ANYMOUS_CONFIG_CONTENT) {
251
- const file = globalConfigFile()
252
- if (!existsSync(file)) {
253
- yield* fs
254
- .writeWithDirs(file, JSON.stringify({ $schema: "https://anymous-cli.vercel.app/config.json" }, null, 2))
255
- .pipe(Effect.catch(() => Effect.void))
256
- }
257
- }
258
- const [configJson, anymousJson, anymousJsonc] = yield* Effect.all(
259
- [
260
- loadFile(path.join(Global.Path.config, "config.json"), env),
261
- loadFile(path.join(Global.Path.config, "anymous.json"), env),
262
- loadFile(path.join(Global.Path.config, "anymous.jsonc"), env),
263
- ],
264
- { concurrency: 3 },
265
- )
266
- result = mergeConfig(result, configJson)
267
- result = mergeConfig(result, anymousJson)
268
- result = mergeConfig(result, anymousJsonc)
269
-
270
- const legacy = path.join(Global.Path.config, "config")
271
- if (existsSync(legacy)) {
272
- yield* Effect.promise(() =>
273
- import(pathToFileURL(legacy).href, { with: { type: "toml" } })
274
- .then(async (mod) => {
275
- const { provider, model, ...rest } = mod.default
276
- if (provider && model) result.model = `${provider}/${model}`
277
- result["$schema"] = "https://anymous-cli.vercel.app/config.json"
278
- result = mergeConfig(result, rest)
279
- await fsNode.writeFile(path.join(Global.Path.config, "config.json"), JSON.stringify(result, null, 2))
280
- await fsNode.unlink(legacy)
281
- })
282
- .catch(() => {}),
283
- )
284
- }
285
-
286
- return result
287
- })
288
-
289
- const [cachedGlobal, invalidateGlobal] = yield* Effect.cachedInvalidateWithTTL(
290
- loadGlobal().pipe(
291
- Effect.tapError((error) =>
292
- Effect.logError("failed to load global config, using defaults", { error: String(error) }),
293
- ),
294
- Effect.orElseSucceed((): Info => ({})),
295
- ),
296
- Duration.infinity,
297
- )
298
-
299
- const getGlobal = Effect.fn("Config.getGlobal")(function* () {
300
- return yield* cachedGlobal
301
- })
302
-
303
- const ensureGitignore = Effect.fn("Config.ensureGitignore")(function* (dir: string) {
304
- yield* fs.ensureDir(dir)
305
- const gitignore = path.join(dir, ".gitignore")
306
- const hasIgnore = yield* fs.existsSafe(gitignore)
307
- if (!hasIgnore) {
308
- yield* fs
309
- .writeFileString(
310
- gitignore,
311
- ["node_modules", "package.json", "package-lock.json", "bun.lock", ".gitignore"].join("\n"),
312
- )
313
- .pipe(
314
- Effect.catchIf(
315
- (e) => e.reason._tag === "PermissionDenied",
316
- () => Effect.void,
317
- ),
318
- )
319
- }
320
- })
321
-
322
- const loadInstanceState = Effect.fn("Config.loadInstanceState")(
323
- function* (ctx: InstanceContext) {
324
- const auth = yield* authSvc.all().pipe(Effect.orDie)
325
-
326
- let result: Info = {}
327
- const authEnv: Record<string, string> = {}
328
- const consoleManagedProviders = new Set<string>()
329
- let activeOrgName: string | undefined
330
-
331
- const pluginScopeForSource = Effect.fnUntraced(function* (source: string) {
332
- if (source.startsWith("http://") || source.startsWith("https://")) return "global"
333
- if (source === "ANYMOUS_CONFIG_CONTENT") return "local"
334
- if (containsPath(source, ctx)) return "local"
335
- return "global"
336
- })
337
-
338
- const mergePluginOrigins = Effect.fnUntraced(function* (
339
- source: string,
340
- // mergePluginOrigins receives raw Specs from one config source, before provenance for this merge step
341
- // is attached.
342
- list: ConfigPluginV1.Spec[] | undefined,
343
- // Scope can be inferred from the source path, but some callers already know whether the config should
344
- // behave as global or local and can pass that explicitly.
345
- kind?: ConfigPlugin.Scope,
346
- ) {
347
- if (!list?.length) return
348
- const hit = kind ?? (yield* pluginScopeForSource(source))
349
- // Merge newly seen plugin origins with previously collected ones, then dedupe by plugin identity while
350
- // keeping the winning source/scope metadata for downstream installs, writes, and diagnostics.
351
- const plugins = ConfigPlugin.deduplicatePluginOrigins([
352
- ...(result.plugin_origins ?? []),
353
- ...list.map((spec) => ({ spec, source, scope: hit })),
354
- ])
355
- result.plugin = plugins.map((item) => item.spec)
356
- result.plugin_origins = plugins
357
- })
358
-
359
- const merge = (source: string, next: Info, kind?: ConfigPlugin.Scope) => {
360
- result = mergeConfigConcatArrays(result, next)
361
- return mergePluginOrigins(source, next.plugin, kind)
362
- }
363
-
364
- for (const [key, value] of Object.entries(auth)) {
365
- if (value.type === "wellknown") {
366
- const url = key.replace(/\/+$/, "")
367
- authEnv[value.key] = value.token
368
- const wellknownURL = `${url}/.well-known/anymous`
369
- yield* Effect.logDebug("fetching remote config", { url: wellknownURL })
370
- const wellknown = yield* fetchRemoteJson(wellknownURL, undefined, ConfigV1.WellKnown, url)
371
- const remote = yield* Effect.promise(() =>
372
- substituteWellKnownRemoteConfig({
373
- value: wellknown.remote_config,
374
- dir: url,
375
- source: wellknownURL,
376
- env: authEnv,
377
- }),
378
- )
379
- const fetchedConfig = remote
380
- ? yield* Effect.gen(function* () {
381
- yield* Effect.logDebug("fetching remote config", { url: remote.url })
382
- const data = yield* fetchRemoteJson(remote.url, remote.headers, Schema.Json, url)
383
- if (isRecord(data) && isRecord(data.config)) return data.config
384
- if (isRecord(data)) return data
385
- return yield* Effect.die(
386
- new Error(`failed to decode remote config from ${remote.url}: expected object`),
387
- )
388
- })
389
- : {}
390
- const remoteConfig = mergeConfig(isRecord(wellknown.config) ? wellknown.config : {}, fetchedConfig)
391
- if (!remoteConfig.$schema) remoteConfig.$schema = "https://anymous-cli.vercel.app/config.json"
392
- const source = wellknownURL
393
- const next = yield* loadConfig(
394
- JSON.stringify(remoteConfig),
395
- {
396
- dir: path.dirname(source),
397
- source,
398
- },
399
- authEnv,
400
- )
401
- yield* merge(source, next, "global")
402
- yield* Effect.logDebug("loaded remote config from well-known", { url })
403
- }
404
- }
405
-
406
- const global = Object.keys(authEnv).length ? yield* loadGlobal(authEnv) : yield* getGlobal()
407
- yield* merge(Global.Path.config, global, "global")
408
-
409
- if (Flag.ANYMOUS_CONFIG) {
410
- yield* merge(Flag.ANYMOUS_CONFIG, yield* loadFile(Flag.ANYMOUS_CONFIG, authEnv))
411
- yield* Effect.logDebug("loaded custom config", { path: Flag.ANYMOUS_CONFIG })
412
- }
413
-
414
- if (!Flag.ANYMOUS_DISABLE_PROJECT_CONFIG) {
415
- for (const file of yield* ConfigPaths.files("anymous", ctx.directory, ctx.worktree).pipe(Effect.orDie)) {
416
- yield* merge(file, yield* loadFile(file, authEnv), "local")
417
- }
418
- }
419
-
420
- result.agent = result.agent || {}
421
- result.mode = result.mode || {}
422
- result.plugin = result.plugin || []
423
-
424
- const directories = yield* ConfigPaths.directories(ctx.directory, ctx.worktree)
425
-
426
- if (Flag.ANYMOUS_CONFIG_DIR) {
427
- yield* Effect.logDebug("loading config from ANYMOUS_CONFIG_DIR", { path: Flag.ANYMOUS_CONFIG_DIR })
428
- }
429
-
430
- const deps: Fiber.Fiber<void>[] = []
431
-
432
- for (const dir of directories) {
433
- if (dir.endsWith(".anymous") || dir === Flag.ANYMOUS_CONFIG_DIR) {
434
- for (const file of ["anymous.json", "anymous.jsonc"]) {
435
- const source = path.join(dir, file)
436
- yield* Effect.logDebug(`loading config from ${source}`)
437
- yield* merge(source, yield* loadFile(source, authEnv))
438
- result.agent ??= {}
439
- result.mode ??= {}
440
- result.plugin ??= []
441
- }
442
- }
443
-
444
- yield* ensureGitignore(dir).pipe(Effect.orDie)
445
-
446
- const dep = yield* npmSvc
447
- .install(dir, {
448
- add: [
449
- {
450
- name: "@anymous-ai/plugin",
451
- version: InstallationLocal ? undefined : InstallationVersion,
452
- },
453
- ],
454
- })
455
- .pipe(
456
- Effect.exit,
457
- Effect.tap((exit) =>
458
- Exit.isFailure(exit)
459
- ? Effect.logWarning("background dependency install failed", { dir, error: String(exit.cause) })
460
- : Effect.void,
461
- ),
462
- Effect.asVoid,
463
- Effect.forkDetach,
464
- )
465
- deps.push(dep)
466
-
467
- result.command = mergeDeep(result.command ?? {}, yield* Effect.promise(() => ConfigCommand.load(dir)))
468
- result.agent = mergeDeep(result.agent ?? {}, yield* Effect.promise(() => ConfigAgent.load(dir)))
469
- result.agent = mergeDeep(result.agent ?? {}, yield* Effect.promise(() => ConfigAgent.loadMode(dir)))
470
- // Auto-discovered plugins under `.anymous/plugin(s)` are already local files, so ConfigPlugin.load
471
- // returns normalized Specs and we only need to attach origin metadata here.
472
- const list = yield* Effect.promise(() => ConfigPlugin.load(dir))
473
- yield* mergePluginOrigins(dir, list)
474
- }
475
-
476
- if (process.env.ANYMOUS_CONFIG_CONTENT) {
477
- const source = "ANYMOUS_CONFIG_CONTENT"
478
- const next = yield* loadConfig(process.env.ANYMOUS_CONFIG_CONTENT, {
479
- dir: ctx.directory,
480
- source,
481
- })
482
- yield* merge(source, next, "local")
483
- yield* Effect.logDebug("loaded custom config from ANYMOUS_CONFIG_CONTENT")
484
- }
485
-
486
- const activeAccount = Option.getOrUndefined(
487
- yield* accountSvc.active().pipe(Effect.catch(() => Effect.succeed(Option.none()))),
488
- )
489
- if (activeAccount?.active_org_id) {
490
- const accountID = activeAccount.id
491
- const orgID = activeAccount.active_org_id
492
- const url = activeAccount.url
493
- yield* Effect.gen(function* () {
494
- const [configOpt, tokenOpt] = yield* Effect.all(
495
- [accountSvc.config(accountID, orgID), accountSvc.token(accountID)],
496
- { concurrency: 2 },
497
- )
498
- if (Option.isSome(tokenOpt)) {
499
- process.env["ANYMOUS_CONSOLE_TOKEN"] = tokenOpt.value
500
- yield* env.set("ANYMOUS_CONSOLE_TOKEN", tokenOpt.value)
501
- }
502
-
503
- if (Option.isSome(configOpt)) {
504
- const source = `${url}/api/config`
505
- const next = yield* loadConfig(JSON.stringify(configOpt.value), {
506
- dir: path.dirname(source),
507
- source,
508
- })
509
- for (const providerID of Object.keys(next.provider ?? {})) {
510
- consoleManagedProviders.add(providerID)
511
- }
512
- yield* merge(source, next, "global")
513
- }
514
- }).pipe(
515
- Effect.withSpan("Config.loadActiveOrgConfig"),
516
- Effect.catch((err) =>
517
- Effect.logDebug("failed to fetch remote account config", {
518
- error: err instanceof Error ? err.message : String(err),
519
- }),
520
- ),
521
- )
522
- }
523
-
524
- const managedDir = ConfigManaged.managedConfigDir()
525
- if (existsSync(managedDir)) {
526
- for (const file of ["anymous.json", "anymous.jsonc"]) {
527
- const source = path.join(managedDir, file)
528
- yield* merge(source, yield* loadFile(source), "global")
529
- }
530
- }
531
-
532
- // macOS managed preferences (.mobileconfig deployed via MDM) override everything
533
- const managed = yield* Effect.promise(() => ConfigManaged.readManagedPreferences())
534
- if (managed) {
535
- result = mergeConfigConcatArrays(
536
- result,
537
- yield* loadConfig(managed.text, {
538
- dir: path.dirname(managed.source),
539
- source: managed.source,
540
- }),
541
- )
542
- }
543
-
544
- for (const [name, mode] of Object.entries(result.mode ?? {})) {
545
- result.agent = mergeDeep(result.agent ?? {}, {
546
- [name]: {
547
- ...mode,
548
- mode: "primary" as const,
549
- },
550
- })
551
- }
552
-
553
- if (Flag.ANYMOUS_PERMISSION) {
554
- try {
555
- result.permission = mergeDeep(result.permission ?? {}, JSON.parse(Flag.ANYMOUS_PERMISSION))
556
- } catch (err) {
557
- yield* Effect.logWarning("ANYMOUS_PERMISSION contains invalid JSON, skipping", { err })
558
- }
559
- }
560
-
561
- if (result.tools) {
562
- const perms: Record<string, ConfigPermissionV1.Action> = {}
563
- for (const [tool, enabled] of Object.entries(result.tools)) {
564
- const action: ConfigPermissionV1.Action = enabled ? "allow" : "deny"
565
- if (tool === "write" || tool === "edit" || tool === "patch") {
566
- perms.edit = action
567
- continue
568
- }
569
- perms[tool] = action
570
- }
571
- result.permission = mergeDeep(perms, result.permission ?? {})
572
- }
573
-
574
- if (!result.username) {
575
- try {
576
- result.username = os.userInfo().username || "user"
577
- } catch (err) {
578
- yield* Effect.logWarning("failed to read system username, using fallback", { err })
579
- result.username = "user"
580
- }
581
- }
582
-
583
- if (result.autoshare === true && !result.share) {
584
- result.share = "auto"
585
- }
586
-
587
- if (Flag.ANYMOUS_DISABLE_AUTOCOMPACT) {
588
- result.compaction = { ...result.compaction, auto: false }
589
- }
590
- if (Flag.ANYMOUS_DISABLE_PRUNE) {
591
- result.compaction = { ...result.compaction, prune: false }
592
- }
593
-
594
- return {
595
- config: result,
596
- directories,
597
- deps,
598
- consoleState: {
599
- consoleManagedProviders: Array.from(consoleManagedProviders),
600
- activeOrgName,
601
- switchableOrgCount: 0,
602
- },
603
- }
604
- },
605
- Effect.provideService(FSUtil.Service, fs),
606
- )
607
-
608
- const state = yield* InstanceState.make<State>(
609
- Effect.fn("Config.state")(function* (ctx) {
610
- return yield* loadInstanceState(ctx).pipe(Effect.orDie)
611
- }),
612
- )
613
-
614
- const get = Effect.fn("Config.get")(function* () {
615
- return yield* InstanceState.use(state, (s) => s.config)
616
- })
617
-
618
- const directories = Effect.fn("Config.directories")(function* () {
619
- return yield* InstanceState.use(state, (s) => s.directories)
620
- })
621
-
622
- const getConsoleState = Effect.fn("Config.getConsoleState")(function* () {
623
- return yield* InstanceState.use(state, (s) => s.consoleState)
624
- })
625
-
626
- const waitForDependencies = Effect.fn("Config.waitForDependencies")(function* () {
627
- yield* InstanceState.useEffect(state, (s) =>
628
- Effect.forEach(s.deps, Fiber.join, { concurrency: "unbounded" }).pipe(Effect.asVoid),
629
- )
630
- })
631
-
632
- const update = Effect.fn("Config.update")(function* (config: Info) {
633
- const dir = yield* InstanceState.directory
634
- const file = path.join(dir, "config.json")
635
- const existing = yield* loadFile(file)
636
- yield* fs
637
- .writeFileString(file, JSON.stringify(mergeDeep(writable(existing), writable(config)), null, 2))
638
- .pipe(Effect.orDie)
639
- })
640
-
641
- const invalidate = Effect.fn("Config.invalidate")(function* () {
642
- yield* invalidateGlobal
643
- })
644
-
645
- const updateGlobal = Effect.fn("Config.updateGlobal")(function* (config: Info) {
646
- const file = globalConfigFile()
647
- const before = (yield* readConfigFile(file)) ?? "{}"
648
- const patch = writableGlobal(config)
649
-
650
- let next: Info
651
- let changed: boolean
652
- if (!file.endsWith(".jsonc")) {
653
- const existing = ConfigParse.schema(ConfigV1.Info, ConfigParse.jsonc(before, file), file)
654
- const merged = mergeDeep(writable(existing), patch)
655
- const serialized = JSON.stringify(merged, null, 2)
656
- changed = serialized !== before
657
- if (changed) yield* fs.writeFileString(file, serialized).pipe(Effect.orDie)
658
- next = merged
659
- } else {
660
- const updated = patchJsonc(before, patch)
661
- next = ConfigParse.schema(ConfigV1.Info, ConfigParse.jsonc(updated, file), file)
662
- changed = updated !== before
663
- if (changed) yield* fs.writeFileString(file, updated).pipe(Effect.orDie)
664
- }
665
-
666
- if (changed) yield* invalidate()
667
- return { info: next, changed }
668
- })
669
-
670
- return Service.of({
671
- get,
672
- getGlobal,
673
- getConsoleState,
674
- update,
675
- updateGlobal,
676
- invalidate,
677
- directories,
678
- waitForDependencies,
679
- })
680
- }),
681
- )
682
-
683
- export const node = LayerNode.make({
684
- service: Service,
685
- layer: layer,
686
- deps: [FSUtil.node, Auth.node, Account.node, Env.node, Npm.node, httpClient],
687
- })
688
-
689
- export * as Config from "./config"