crow-central-agency 0.25.14 → 0.26.0

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 (201) hide show
  1. package/README.md +4 -1
  2. package/dist/_shared/index.js +1 -1
  3. package/dist/_shared/schemas/agent.schema.js +82 -21
  4. package/dist/_shared/schemas/permission.schema.js +2 -1
  5. package/dist/_shared/schemas/system-capabilities.schema.js +7 -0
  6. package/dist/_shared/schemas/websocket.schema.js +1 -1
  7. package/dist/_shared/utils/resolve-model.js +2 -1
  8. package/dist/bootstrap.js +34 -45
  9. package/dist/config/constants.js +2 -0
  10. package/dist/config/env.js +7 -0
  11. package/dist/core/error/app-error.types.js +1 -0
  12. package/dist/core/store/file-object-store-provider.js +2 -1
  13. package/dist/core/store/folder-file-store-provider.js +2 -1
  14. package/dist/mcp/agents/agents-mcp-server.js +7 -13
  15. package/dist/mcp/agents/get-last-agent-message.js +1 -1
  16. package/dist/mcp/agents/super-agent-mcp-server.js +8 -7
  17. package/dist/mcp/artifacts/artifacts-mcp-server.js +17 -39
  18. package/dist/mcp/audio/audio-mcp-server.js +5 -10
  19. package/dist/mcp/claude-mcp-adapter.js +28 -0
  20. package/dist/mcp/copilot-mcp-adapter.js +42 -0
  21. package/dist/mcp/crow-mcp-manager-utils.js +10 -0
  22. package/dist/mcp/crow-mcp-manager.js +51 -66
  23. package/dist/mcp/feed/feed-mcp-server.js +10 -21
  24. package/dist/mcp/gmail/gmail-mcp-server.js +25 -72
  25. package/dist/mcp/google-calendar/google-calendar-mcp-server.js +15 -36
  26. package/dist/mcp/google-contacts/google-contacts-mcp-server.js +8 -16
  27. package/dist/mcp/places/geocode-place.js +77 -0
  28. package/dist/mcp/places/get-place-details.js +32 -0
  29. package/dist/mcp/places/places-format-utils.js +83 -0
  30. package/dist/mcp/places/places-mcp-server.js +18 -0
  31. package/dist/mcp/places/search-nearby-places.js +62 -0
  32. package/dist/mcp/reminders/reminders-mcp-server.js +10 -20
  33. package/dist/mcp/tasks/super-tasks-mcp-server.js +9 -13
  34. package/dist/mcp/tasks/tasks-mcp-server.js +7 -13
  35. package/dist/public/assets/arc-adBOpW_3.js +1 -0
  36. package/dist/public/assets/architecture-7EHR7CIX-BM3uZ41G.js +1 -0
  37. package/dist/public/assets/architectureDiagram-3BPJPVTR-CyYDwXdT.js +36 -0
  38. package/dist/public/assets/blockDiagram-GPEHLZMM-BaTbFS6g.js +132 -0
  39. package/dist/public/assets/{c4Diagram-AAUBKEIU-CfNw2F8Y.js → c4Diagram-AAUBKEIU-Bp3MvOdk.js} +6 -6
  40. package/dist/public/assets/channel-WwfMT9OL.js +1 -0
  41. package/dist/public/assets/chunk-2J33WTMH-BQLD_96K.js +1 -0
  42. package/dist/public/assets/chunk-4BX2VUAB-CsjEa7Xy.js +1 -0
  43. package/dist/public/assets/chunk-55IACEB6-DZGb1zVE.js +1 -0
  44. package/dist/public/assets/{chunk-727SXJPM-DuZqS4MG.js → chunk-727SXJPM-UOO-PL29.js} +6 -6
  45. package/dist/public/assets/chunk-AQP2D5EJ-DDokG4xF.js +231 -0
  46. package/dist/public/assets/{chunk-FMBD7UC4-BmSnKVIn.js → chunk-FMBD7UC4-BZ_ezk5U.js} +1 -1
  47. package/dist/public/assets/chunk-ND2GUHAM-Bjp0gfDO.js +1 -0
  48. package/dist/public/assets/chunk-QZHKN3VN-D5S04sRp.js +1 -0
  49. package/dist/public/assets/classDiagram-4FO5ZUOK-BdhGo_Iv.js +1 -0
  50. package/dist/public/assets/classDiagram-v2-Q7XG4LA2-BdhGo_Iv.js +1 -0
  51. package/dist/public/assets/cose-bilkent-S5V4N54A-BsELH7vp.js +1 -0
  52. package/dist/public/assets/{cytoscape.esm-C8j07I8O.js → cytoscape.esm-DRHT7IHm.js} +2 -2
  53. package/dist/public/assets/dagre-BM42HDAG-BiSg5NvA.js +4 -0
  54. package/dist/public/assets/{dagre-CdwzCXQr.js → dagre-Bx709z4p.js} +1 -1
  55. package/dist/public/assets/diagram-2AECGRRQ-C9T0YKoZ.js +43 -0
  56. package/dist/public/assets/diagram-5GNKFQAL-BnMtpQjO.js +10 -0
  57. package/dist/public/assets/diagram-KO2AKTUF-Q7ns-0Z5.js +3 -0
  58. package/dist/public/assets/diagram-LMA3HP47-BDs1Rb7q.js +24 -0
  59. package/dist/public/assets/diagram-OG6HWLK6-CzDIN69n.js +24 -0
  60. package/dist/public/assets/erDiagram-TEJ5UH35-CCgWxhuG.js +85 -0
  61. package/dist/public/assets/eventmodeling-FCH6USID-Dq2SBRIu.js +1 -0
  62. package/dist/public/assets/flowDiagram-I6XJVG4X-jkLE8x4R.js +162 -0
  63. package/dist/public/assets/ganttDiagram-6RSMTGT7-DFB_D6AI.js +292 -0
  64. package/dist/public/assets/gitGraph-WXDBUCRP-BOsTFEOS.js +1 -0
  65. package/dist/public/assets/gitGraphDiagram-PVQCEYII-J9LUumhG.js +106 -0
  66. package/dist/public/assets/index-Bod4VHkZ.js +732 -0
  67. package/dist/public/assets/index-DdDKmqq6.css +1 -0
  68. package/dist/public/assets/info-J43DQDTF-8-SxO_Yc.js +1 -0
  69. package/dist/public/assets/infoDiagram-5YYISTIA-xkuCMtOz.js +2 -0
  70. package/dist/public/assets/{ishikawaDiagram-YF4QCWOH-BA-_CtvR.js → ishikawaDiagram-YF4QCWOH-Dn0DKdcA.js} +6 -6
  71. package/dist/public/assets/{journeyDiagram-JHISSGLW-f1neaHqp.js → journeyDiagram-JHISSGLW-D05e1p3k.js} +6 -6
  72. package/dist/public/assets/kanban-definition-UN3LZRKU-Dq2uULlK.js +89 -0
  73. package/dist/public/assets/linear-Bjh0J03y.js +1 -0
  74. package/dist/public/assets/mermaid-parser.core-D4hh7fAl.js +161 -0
  75. package/dist/public/assets/{mindmap-definition-RKZ34NQL-DZkPdbNS.js → mindmap-definition-RKZ34NQL-DJsoshgW.js} +30 -30
  76. package/dist/public/assets/{ordinal-BDTCIhXR.js → ordinal-hYBb2elL.js} +1 -1
  77. package/dist/public/assets/packet-YPE3B663-BT8zBOD4.js +1 -0
  78. package/dist/public/assets/pie-LRSECV5Y-JmIGhqyU.js +1 -0
  79. package/dist/public/assets/pieDiagram-4H26LBE5-CjSQqA7Z.js +30 -0
  80. package/dist/public/assets/{quadrantDiagram-W4KKPZXB-B6zQ9hKH.js → quadrantDiagram-W4KKPZXB-B8gTTwP5.js} +6 -6
  81. package/dist/public/assets/radar-GUYGQ44K-BGxf9Glp.js +1 -0
  82. package/dist/public/assets/requirementDiagram-4Y6WPE33-yillybNW.js +84 -0
  83. package/dist/public/assets/sankeyDiagram-5OEKKPKP-DykcjOS-.js +40 -0
  84. package/dist/public/assets/sequenceDiagram-3UESZ5HK-C3J4dvIw.js +162 -0
  85. package/dist/public/assets/stateDiagram-AJRCARHV-Bx7ADTMy.js +1 -0
  86. package/dist/public/assets/stateDiagram-v2-BHNVJYJU-CAhRgBeY.js +1 -0
  87. package/dist/public/assets/timeline-definition-PNZ67QCA-DY6XOJNR.js +120 -0
  88. package/dist/public/assets/treeView-BLDUP644-uOGy7zUG.js +1 -0
  89. package/dist/public/assets/treemap-LRROVOQU-C-csMv2z.js +1 -0
  90. package/dist/public/assets/vennDiagram-CIIHVFJN-Bqvgn2qM.js +34 -0
  91. package/dist/public/assets/wardley-L42UT6IY-wGZ-nS_N.js +1 -0
  92. package/dist/public/assets/wardleyDiagram-YWT4CUSO-DW-nQKs1.js +78 -0
  93. package/dist/public/assets/{xychartDiagram-2RQKCTM6-CMAXWBmj.js → xychartDiagram-2RQKCTM6-BL2gcO0L.js} +7 -7
  94. package/dist/public/index.html +2 -16
  95. package/dist/routes/agent.routes.js +7 -12
  96. package/dist/routes/system.routes.js +6 -1
  97. package/dist/runner/agent-runner-factory.js +13 -0
  98. package/dist/runner/agent-runner.js +46 -192
  99. package/dist/runner/agent-runner.types.js +3 -1
  100. package/dist/runner/claude-code-agent-runner.js +217 -0
  101. package/dist/runner/github-copilot-agent-runner.js +331 -0
  102. package/dist/runner/github-copilot-stream-processor.js +233 -0
  103. package/dist/runner/stream-processor.js +100 -60
  104. package/dist/sensors/geolocation-sensor.js +15 -31
  105. package/dist/server/error-handler.js +1 -0
  106. package/dist/services/agent-registry.js +32 -2
  107. package/dist/services/copilot/copilot-client-manager.js +96 -0
  108. package/dist/services/places/osm/osm-opening-hours-parser.js +132 -0
  109. package/dist/services/places/osm/osm-overpass-client.js +81 -0
  110. package/dist/services/places/osm/osm-overpass-query-builder.js +54 -0
  111. package/dist/services/places/osm/osm-photon-client.js +66 -0
  112. package/dist/services/places/osm/osm-photon-client.types.js +43 -0
  113. package/dist/services/places/osm/osm-places-adapter.js +401 -0
  114. package/dist/services/places/osm/osm-places-adapter.types.js +6 -0
  115. package/dist/services/places/osm/osm-tag-mapping.js +102 -0
  116. package/dist/services/places/places-manager-utils.js +20 -0
  117. package/dist/services/places/places-manager.js +50 -0
  118. package/dist/services/places/places-manager.types.js +49 -0
  119. package/dist/services/runtime/agent-runtime-manager.js +60 -30
  120. package/dist/services/session/github-copilot-session-transformer.js +100 -0
  121. package/dist/services/session/session-manager.js +82 -36
  122. package/dist/services/session/session-message-transformer.js +48 -12
  123. package/dist/utils/fs-utils.js +28 -0
  124. package/package.json +10 -5
  125. package/dist/public/assets/arc-CsY_zjlK.js +0 -1
  126. package/dist/public/assets/architecture-7EHR7CIX-tMtXFVEB.js +0 -1
  127. package/dist/public/assets/architectureDiagram-3BPJPVTR-BfGAPq2z.js +0 -36
  128. package/dist/public/assets/array-BCJ35G43.js +0 -1
  129. package/dist/public/assets/blockDiagram-GPEHLZMM-DoCXJ5ls.js +0 -132
  130. package/dist/public/assets/channel-Dd0F8Asv.js +0 -1
  131. package/dist/public/assets/chunk-2J33WTMH-3331Pgxl.js +0 -1
  132. package/dist/public/assets/chunk-3OPIFGDE-BKv-wmbR.js +0 -62
  133. package/dist/public/assets/chunk-4BX2VUAB-BMyZq3AL.js +0 -1
  134. package/dist/public/assets/chunk-4EGX6M5U-sKH2Isf8.js +0 -1
  135. package/dist/public/assets/chunk-55IACEB6-KxLP_rA2.js +0 -1
  136. package/dist/public/assets/chunk-5DO6E6H7-DVriMWxp.js +0 -1
  137. package/dist/public/assets/chunk-5ZQYHXKU-DPF6Nbp6.js +0 -2
  138. package/dist/public/assets/chunk-AQP2D5EJ-Cn4xG-Ry.js +0 -231
  139. package/dist/public/assets/chunk-BR22UD5L-BCm2xrxa.js +0 -1
  140. package/dist/public/assets/chunk-BSJP7CBP-BR3QhkOV.js +0 -1
  141. package/dist/public/assets/chunk-CSCIHK7Q-DLKpWijG.js +0 -123
  142. package/dist/public/assets/chunk-FHYWG6QK-B_z4diOF.js +0 -1
  143. package/dist/public/assets/chunk-KSCS5N6A-lSKMV-28.js +0 -10
  144. package/dist/public/assets/chunk-L5ZTLDWV-CGRen0bj.js +0 -1
  145. package/dist/public/assets/chunk-MPE355IW-BrU23f3r.js +0 -1
  146. package/dist/public/assets/chunk-MZUSXYTE-BGj-wpbJ.js +0 -1
  147. package/dist/public/assets/chunk-N66VUXT2-Bx9F_D4P.js +0 -1
  148. package/dist/public/assets/chunk-ND2GUHAM-8gjQJdQa.js +0 -1
  149. package/dist/public/assets/chunk-NNHCCRGN-DSaPFNsL.js +0 -159
  150. package/dist/public/assets/chunk-NZK2D7GU-N89m32gx.js +0 -1
  151. package/dist/public/assets/chunk-O5CBEL6O-PSoVuMlj.js +0 -70
  152. package/dist/public/assets/chunk-PUPMXCY4-C2l0dHY4.js +0 -1
  153. package/dist/public/assets/chunk-QZHKN3VN-a8z_MdJs.js +0 -1
  154. package/dist/public/assets/chunk-UIBZB4QT-DXVjm6Jo.js +0 -1
  155. package/dist/public/assets/chunk-WCWK7LTN-zc10zcLo.js +0 -1
  156. package/dist/public/assets/classDiagram-4FO5ZUOK-BUl9xlUL.js +0 -1
  157. package/dist/public/assets/classDiagram-v2-Q7XG4LA2-D1CQ-gDz.js +0 -1
  158. package/dist/public/assets/cose-bilkent-S5V4N54A-DOWSzIsN.js +0 -1
  159. package/dist/public/assets/dagre-BM42HDAG-Ce7Ld63g.js +0 -4
  160. package/dist/public/assets/diagram-2AECGRRQ-CX8foJPq.js +0 -43
  161. package/dist/public/assets/diagram-5GNKFQAL-DA78CQem.js +0 -10
  162. package/dist/public/assets/diagram-KO2AKTUF-DAUGVDbr.js +0 -3
  163. package/dist/public/assets/diagram-LMA3HP47-xHMjy8aE.js +0 -24
  164. package/dist/public/assets/diagram-OG6HWLK6-DlRO3Ayl.js +0 -24
  165. package/dist/public/assets/dist-BfHOg9lx.js +0 -1
  166. package/dist/public/assets/erDiagram-TEJ5UH35-CZqcN6px.js +0 -85
  167. package/dist/public/assets/eventmodeling-FCH6USID-Cmphiy0Z.js +0 -1
  168. package/dist/public/assets/flowDiagram-I6XJVG4X-DlOZbuGG.js +0 -162
  169. package/dist/public/assets/ganttDiagram-6RSMTGT7-CaDG38zZ.js +0 -292
  170. package/dist/public/assets/gitGraph-WXDBUCRP-CABAU2x_.js +0 -1
  171. package/dist/public/assets/gitGraphDiagram-PVQCEYII-CL-N79e7.js +0 -106
  172. package/dist/public/assets/index-DmdHg7Be.js +0 -470
  173. package/dist/public/assets/index-EsNd-fN-.css +0 -1
  174. package/dist/public/assets/info-J43DQDTF-CtHtznhp.js +0 -1
  175. package/dist/public/assets/infoDiagram-5YYISTIA-BW8XbP1C.js +0 -2
  176. package/dist/public/assets/kanban-definition-UN3LZRKU-C8TVdEvL.js +0 -89
  177. package/dist/public/assets/line-RIsgg21t.js +0 -1
  178. package/dist/public/assets/linear-751DW27F.js +0 -1
  179. package/dist/public/assets/mermaid-parser.core-CcqYIDrD.js +0 -4
  180. package/dist/public/assets/packet-YPE3B663-DmtvbI4l.js +0 -1
  181. package/dist/public/assets/path-CIRGLb_6.js +0 -1
  182. package/dist/public/assets/pie-LRSECV5Y-Y82O9nng.js +0 -1
  183. package/dist/public/assets/pieDiagram-4H26LBE5-BBx1uSsh.js +0 -30
  184. package/dist/public/assets/radar-GUYGQ44K-BHcHsGeF.js +0 -1
  185. package/dist/public/assets/requirementDiagram-4Y6WPE33-C35Fc9Mo.js +0 -84
  186. package/dist/public/assets/rough.esm-C6nrIGLg.js +0 -1
  187. package/dist/public/assets/sankeyDiagram-5OEKKPKP-DPJgtc19.js +0 -40
  188. package/dist/public/assets/sequenceDiagram-3UESZ5HK-DO2aCVNa.js +0 -162
  189. package/dist/public/assets/src-g536F3ys.js +0 -1
  190. package/dist/public/assets/stateDiagram-AJRCARHV-Dtf4GcS-.js +0 -1
  191. package/dist/public/assets/stateDiagram-v2-BHNVJYJU-BWXbQBcB.js +0 -1
  192. package/dist/public/assets/timeline-definition-PNZ67QCA-ar2DXF9S.js +0 -120
  193. package/dist/public/assets/treeView-BLDUP644-Cmu4mPLp.js +0 -1
  194. package/dist/public/assets/treemap-LRROVOQU-_N62KlUg.js +0 -1
  195. package/dist/public/assets/vennDiagram-CIIHVFJN-B7tt3Tsv.js +0 -34
  196. package/dist/public/assets/wardley-L42UT6IY-DWSXD3L4.js +0 -1
  197. package/dist/public/assets/wardleyDiagram-YWT4CUSO-CdG42xCG.js +0 -78
  198. /package/dist/public/assets/{defaultLocale-CIS5GEjP.js → defaultLocale-C8Fc0cco.js} +0 -0
  199. /package/dist/public/assets/{graphlib-B0DVs0bw.js → graphlib-B8gBHxth.js} +0 -0
  200. /package/dist/public/assets/{init-BMBYmmUa.js → init-D6jRqBbL.js} +0 -0
  201. /package/dist/public/assets/{katex-pVJiI_rc.js → katex-C4eR7coU.js} +0 -0
package/README.md CHANGED
@@ -6,7 +6,8 @@ Use it to build research crews, monitoring watchdogs, content pipelines, support
6
6
 
7
7
  ## Features
8
8
 
9
- - **Multi-agent dashboard** - run many Claude Code agents in parallel, each with its own workspace, model, persona, and tool set.
9
+ - **Multi-agent dashboard** - run many agents in parallel, each with its own workspace, model, persona, and tool set. Agents can be backed by Claude Code or GitHub Copilot.
10
+ - **GitHub Copilot agents** - alongside Claude Code, agents can run on the GitHub Copilot SDK using your Copilot subscription. Enabled by default; toggle off with `DISABLE_GITHUB_COPILOT`.
10
11
  - **Agent coordination** - compose agents into layered relationships that produce and share artifacts, adaptable to a wide range of workflows and scenarios.
11
12
  - **Flexible triggers** - ad-hoc chat, assigned tasks, reminders, or scheduled prompts on configurable day-of-week / time-of-day windows.
12
13
  - **Rich configuration** - per-agent MCP servers, permission modes, Discord bots, RSS feeds (with optional LLM summarization), and AI-assisted persona / `AGENT.md` generation.
@@ -98,6 +99,8 @@ See `.env.example` for the full list, including:
98
99
  - `CROW_SYSTEM_AGENT_NAME` — display name for the built-in Crow system agent (default: `Crow`).
99
100
  - `STATIC_PATH` — override the directory served as frontend assets (auto-detected from the published bundle).
100
101
  - `CLAUDE_CLI_PATH` — explicit path to the Claude Code CLI binary when it is not on `PATH`.
102
+ - `DISABLE_GITHUB_COPILOT` — set to `true` (or `1`) to skip starting the Copilot SDK client at boot, so GitHub Copilot is reported unavailable everywhere. Defaults to `false`.
103
+ - `COPILOT_CLI_PATH` — override the Copilot CLI runtime the SDK spawns (read directly by `@github/copilot-sdk`); leave unset to use the bundled runtime.
101
104
  - `CLOSED_TASK_RETENTION_DAYS` — how long to keep closed tasks before pruning on startup (default: `30`).
102
105
  - `FEED_ITEM_RETENTION_DAYS` / `FEED_REFRESH_IN_MINUTES` — feed item retention window and refresh cadence.
103
106
  - `TEXT_GENERATION_*` — optional OpenAI-compatible endpoint that enables the AI-assisted persona / `AGENT.md` generation features in the agent editor.
@@ -1,4 +1,4 @@
1
- export { CLAUDE_MODELS, CLAUDE_CODE_MODEL_OPTIONS, DEFAULT_MODEL, AgentIdSchema, AgentConfigSchema, AgentConfigTemplateSchema, CreateAgentInputSchema, UpdateAgentInputSchema, ToolConfigSchema, PermissionModeSchema, SettingSourceSchema, LoopConfigSchema, ConfiguredFeedSchema, MAX_LOOP_TIMES, PERMISSION_MODE, SETTING_SOURCE, DEFAULT_SETTING_SOURCES, TOOL_MODE, DEFAULT_AVAILABLE_TOOLS, SUBAGENT_TOOL_NAME, AGENT_TYPE, } from "./schemas/agent.schema.js";
1
+ export { CLAUDE_MODELS, GITHUB_COPILOT_MODELS, CLAUDE_CODE_MODEL_OPTIONS, ModelOptionSchema, CLAUDE_DEFAULT_MODEL, COPILOT_DEFAULT_MODEL, AgentIdSchema, AgentConfigSchema, AgentConfigTemplateSchema, CreateAgentInputSchema, UpdateAgentInputSchema, ToolConfigSchema, PermissionModeSchema, SettingSourceSchema, LoopConfigSchema, ConfiguredFeedSchema, MAX_LOOP_TIMES, PERMISSION_MODE, SETTING_SOURCE, DEFAULT_SETTING_SOURCES, TOOL_MODE, DEFAULT_CLAUDE_CODE_AVAILABLE_TOOLS, DEFAULT_GITHUB_COPILOT_AVAILABLE_TOOLS, DEFAULT_AVAILABLE_TOOLS_BY_TYPE, SUBAGENT_TOOL_NAME, AGENT_TYPE, } from "./schemas/agent.schema.js";
2
2
  export { SchedulerTimeSchema, DAY_OF_WEEK, DayOfWeekSchema, TimeModeSchema, TIME_MODE, } from "./schemas/scheduler.schema.js";
3
3
  export { createApiSuccessSchema, ApiErrorSchema, } from "./schemas/api-response.schema.js";
4
4
  export { SessionUsageSchema, PendingPermissionInfoSchema, AgentRuntimeStateSchema, AgentActivitySchema, AGENT_ACTIVITY_TYPE, AGENT_STATUS, } from "./schemas/agent-runtime-state.schema.js";
@@ -5,17 +5,38 @@ export const CLAUDE_MODELS = {
5
5
  HAIKU: "claude-haiku-4-5",
6
6
  SONNET: "claude-sonnet-4-6",
7
7
  SONNET_4_5: "claude-sonnet-4-5",
8
- OPUS: "claude-opus-4-7",
8
+ OPUS: "claude-opus-4-8",
9
+ OPUS_4_7: "claude-opus-4-7",
9
10
  OPUS_4_6: "claude-opus-4-6",
10
11
  OPUS_4_5: "claude-opus-4-5",
12
+ FABLE: "claude-fable-5",
11
13
  };
14
+ export const GITHUB_COPILOT_MODELS = {
15
+ AUTO: "auto",
16
+ HAIKU: "claude-haiku-4.5",
17
+ SONNET: "claude-sonnet-4.6",
18
+ OPUS: "claude-opus-4.8",
19
+ GPT_5_5: "gpt-5.5",
20
+ GPT_5_4: "gpt-5.4",
21
+ GPT_5_3_CODEX: "gpt-5.3-codex",
22
+ GPT_5_4_MINI: "gpt-5.4-mini",
23
+ GPT_5_MINI: "gpt-5-mini",
24
+ };
25
+ /** A selectable agent model, surfaced to the editor's model picker. */
26
+ export const ModelOptionSchema = z.object({
27
+ value: z.string(),
28
+ label: z.string(),
29
+ });
12
30
  export const CLAUDE_CODE_MODEL_OPTIONS = [
13
31
  { value: CLAUDE_MODELS.SONNET, label: "Claude Sonnet 4.6" },
14
- { value: CLAUDE_MODELS.OPUS, label: "Claude Opus 4.7" },
32
+ { value: CLAUDE_MODELS.OPUS, label: "Claude Opus 4.8" },
33
+ { value: CLAUDE_MODELS.OPUS_4_7, label: "Claude Opus 4.7" },
15
34
  { value: CLAUDE_MODELS.HAIKU, label: "Claude Haiku 4.5" },
35
+ { value: CLAUDE_MODELS.FABLE, label: "Claude Fable 5" },
16
36
  ];
17
37
  /** Default model for new agents */
18
- export const DEFAULT_MODEL = CLAUDE_MODELS.SONNET;
38
+ export const CLAUDE_DEFAULT_MODEL = CLAUDE_MODELS.SONNET;
39
+ export const COPILOT_DEFAULT_MODEL = GITHUB_COPILOT_MODELS.AUTO;
19
40
  /**
20
41
  * Tool configuration modes for agent tool availability.
21
42
  */
@@ -28,32 +49,63 @@ export const TOOL_MODE = {
28
49
  /** The SDK tool name used to launch a subagent */
29
50
  export const SUBAGENT_TOOL_NAME = "Agent";
30
51
  /**
31
- * Default available tools for new agent creation.
52
+ * Default builtin tool catalog for Claude Code agents.
32
53
  */
33
- export const DEFAULT_AVAILABLE_TOOLS = [
54
+ export const DEFAULT_CLAUDE_CODE_AVAILABLE_TOOLS = [
34
55
  "AskUserQuestion",
35
56
  "Bash",
57
+ "CronCreate",
58
+ "CronDelete",
59
+ "CronList",
60
+ "Edit",
61
+ "EnterPlanMode",
62
+ "EnterWorktree",
63
+ "ExitPlanMode",
64
+ "ExitWorktree",
36
65
  "Glob",
37
66
  "Grep",
67
+ "LSP",
68
+ "Monitor",
69
+ "NotebookEdit",
70
+ "PowerShell",
71
+ "PushNotification",
38
72
  "Read",
39
- "Edit",
40
- "Write",
41
- "WebFetch",
42
- "WebSearch",
73
+ "RemoteTrigger",
74
+ "ScheduleWakeup",
75
+ "Skill",
43
76
  "Task",
77
+ "TaskCreate",
78
+ "TaskGet",
79
+ "TaskList",
44
80
  "TaskOutput",
45
81
  "TaskStop",
46
- "TodoWrite",
47
- "NotebookEdit",
48
- "Skill",
49
- "EnterPlanMode",
50
- "ExitPlanMode",
51
- "EnterWorktree",
52
- "ExitWorktree",
53
- "CronCreate",
54
- "CronDelete",
55
- "CronList",
82
+ "TaskUpdate",
56
83
  "ToolSearch",
84
+ "WebFetch",
85
+ "WebSearch",
86
+ "Workflow",
87
+ "Write",
88
+ ];
89
+ /**
90
+ * Default builtin tool catalog for GitHub Copilot agents.
91
+ */
92
+ export const DEFAULT_GITHUB_COPILOT_AVAILABLE_TOOLS = [
93
+ "bash",
94
+ "write_bash",
95
+ "read_bash",
96
+ "stop_bash",
97
+ "list_bash",
98
+ "view",
99
+ "create",
100
+ "edit",
101
+ "web_fetch",
102
+ "report_intent",
103
+ "fetch_copilot_cli_documentation",
104
+ "skill",
105
+ "ask_user",
106
+ "grep",
107
+ "glob",
108
+ "task",
57
109
  ];
58
110
  /**
59
111
  * Setting sources matching SDK SettingSource type.
@@ -83,6 +135,13 @@ export const PERMISSION_MODE = {
83
135
  };
84
136
  export const AGENT_TYPE = {
85
137
  CLAUDE_CODE: "CLAUDE_CODE",
138
+ GITHUB_COPILOT: "GITHUB_COPILOT",
139
+ };
140
+ export const AgentTypeSchema = z.enum([AGENT_TYPE.CLAUDE_CODE, AGENT_TYPE.GITHUB_COPILOT]);
141
+ /** Default builtin tool catalog per provider, used to seed new agents and the editor's tool picker. */
142
+ export const DEFAULT_AVAILABLE_TOOLS_BY_TYPE = {
143
+ [AGENT_TYPE.CLAUDE_CODE]: DEFAULT_CLAUDE_CODE_AVAILABLE_TOOLS,
144
+ [AGENT_TYPE.GITHUB_COPILOT]: DEFAULT_GITHUB_COPILOT_AVAILABLE_TOOLS,
86
145
  };
87
146
  export const AgentIdSchema = z.uuid();
88
147
  /** Maximum number of time entries allowed in a loop config */
@@ -125,12 +184,12 @@ export const AgentVoiceConfigSchema = z.object({
125
184
  */
126
185
  export const AgentConfigSchema = z.object({
127
186
  id: AgentIdSchema,
128
- type: z.enum([AGENT_TYPE.CLAUDE_CODE]).default(AGENT_TYPE.CLAUDE_CODE),
187
+ type: AgentTypeSchema.default(AGENT_TYPE.CLAUDE_CODE),
129
188
  name: z.string().min(1).max(64),
130
189
  description: z.string().optional(),
131
190
  workspace: z.string().min(1).optional(),
132
191
  persona: z.string().optional(),
133
- model: z.string().default(DEFAULT_MODEL),
192
+ model: z.string().default(CLAUDE_DEFAULT_MODEL),
134
193
  permissionMode: PermissionModeSchema.default(PERMISSION_MODE.DEFAULT),
135
194
  settingSources: z.array(SettingSourceSchema).default([...DEFAULT_SETTING_SOURCES]),
136
195
  availableTools: z.array(z.string()).optional(),
@@ -157,6 +216,7 @@ export const AgentConfigSchema = z.object({
157
216
  * Input for creating a new agent - only required fields
158
217
  */
159
218
  export const CreateAgentInputSchema = z.object({
219
+ type: AgentTypeSchema.default(AGENT_TYPE.CLAUDE_CODE),
160
220
  name: z.string().min(1).max(50),
161
221
  description: z.string().optional(),
162
222
  workspace: z.string().min(1).optional(),
@@ -199,6 +259,7 @@ export const UpdateAgentInputSchema = z.object({
199
259
  agentMd: z.string().optional(),
200
260
  });
201
261
  export const AgentConfigTemplateSchema = AgentConfigSchema.pick({
262
+ type: true,
202
263
  description: true,
203
264
  workspace: true,
204
265
  persona: true,
@@ -3,6 +3,7 @@ import { z } from "zod";
3
3
  export const PERMISSION_DECISION = {
4
4
  ALLOW: "allow",
5
5
  DENY: "deny",
6
+ ALLOW_ALWAYS: "allow_always",
6
7
  };
7
8
  /**
8
9
  * Schema for a permission request broadcast to clients
@@ -19,6 +20,6 @@ export const PermissionRequestSchema = z.object({
19
20
  */
20
21
  export const PermissionResponseSchema = z.object({
21
22
  requestId: z.string(),
22
- decision: z.enum([PERMISSION_DECISION.ALLOW, PERMISSION_DECISION.DENY]),
23
+ decision: z.enum([PERMISSION_DECISION.ALLOW, PERMISSION_DECISION.DENY, PERMISSION_DECISION.ALLOW_ALWAYS]),
23
24
  });
24
25
  //# sourceMappingURL=permission.schema.js.map
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { ModelOptionSchema } from "./agent.schema.js";
2
3
  /**
3
4
  * Server-side feature flags surfaced to the UI so it can enable/disable
4
5
  * features whose backing services are configured via environment variables.
@@ -8,5 +9,11 @@ export const SystemCapabilitiesSchema = z.object({
8
9
  audioGeneration: z.boolean(),
9
10
  /** True when the chat-completion text generation provider is configured (powers persona / AGENT.md generation). */
10
11
  textGeneration: z.boolean(),
12
+ /** True when the shared Copilot SDK client started successfully (Copilot agents can run). */
13
+ copilotAvailable: z.boolean(),
14
+ /** Models selectable for Claude Code agents. */
15
+ claudeSupportedModels: z.array(ModelOptionSchema),
16
+ /** Models selectable for Copilot agents, fetched from the SDK; empty when Copilot is unavailable. */
17
+ copilotSupportedModels: z.array(ModelOptionSchema),
11
18
  });
12
19
  //# sourceMappingURL=system-capabilities.schema.js.map
@@ -56,7 +56,7 @@ export const PermissionResponseWsSchema = z.object({
56
56
  type: z.literal("permission_response"),
57
57
  agentId: z.string(),
58
58
  toolUseId: z.string(),
59
- decision: z.enum([PERMISSION_DECISION.ALLOW, PERMISSION_DECISION.DENY]),
59
+ decision: z.enum([PERMISSION_DECISION.ALLOW, PERMISSION_DECISION.DENY, PERMISSION_DECISION.ALLOW_ALWAYS]),
60
60
  message: z.string().optional(),
61
61
  });
62
62
  export const ClientMessageSchema = z.discriminatedUnion("type", [
@@ -7,8 +7,9 @@ export const MODEL_ALIASES = {
7
7
  [CLAUDE_MODELS.OPUS_4_5]: CLAUDE_MODELS.OPUS,
8
8
  [CLAUDE_MODELS.OPUS_4_6]: CLAUDE_MODELS.OPUS,
9
9
  };
10
+ export const COPILOT_MODEL_ALIASES = {};
10
11
  /** Resolve a potentially retired model ID to its current successor. */
11
12
  export function resolveModel(model) {
12
- return MODEL_ALIASES[model] ?? model;
13
+ return MODEL_ALIASES[model] ?? COPILOT_MODEL_ALIASES[model] ?? model;
13
14
  }
14
15
  //# sourceMappingURL=resolve-model.js.map
package/dist/bootstrap.js CHANGED
@@ -8,17 +8,18 @@ import { registerAgentRoutes } from "./routes/agent.routes.js";
8
8
  import { AgentRegistry } from "./services/agent-registry.js";
9
9
  import { AgentRuntimeManager } from "./services/runtime/agent-runtime-manager.js";
10
10
  import { SessionManager } from "./services/session/session-manager.js";
11
+ import { CopilotClientManager } from "./services/copilot/copilot-client-manager.js";
11
12
  import { WsBroadcaster } from "./services/ws-broadcaster.js";
12
13
  import { ArtifactManager } from "./services/artifact/artifact-manager.js";
14
+ import { PlacesManager } from "./services/places/places-manager.js";
13
15
  import { setupWebSocket } from "./server/setup-websocket.js";
14
16
  import { registerArtifactRoutes } from "./routes/artifact.routes.js";
15
- import { ARTIFACTS_MCP_SERVER_NAME, createArtifactsMcpServer } from "./mcp/artifacts/artifacts-mcp-server.js";
16
- import { createAgentsMcpServer, CROW_AGENTS_MCP_SERVER_NAME } from "./mcp/agents/agents-mcp-server.js";
17
- import { createSuperAgentMcpServer, CROW_SUPER_AGENT_MCP_SERVER_NAME } from "./mcp/agents/super-agent-mcp-server.js";
18
- import { createTasksMcpServer, CROW_TASKS_MCP_SERVER_NAME } from "./mcp/tasks/tasks-mcp-server.js";
19
- import { createSuperTasksMcpServer, CROW_SUPER_TASKS_MCP_SERVER_NAME } from "./mcp/tasks/super-tasks-mcp-server.js";
20
- import { REMINDERS_MCP_SERVER_NAME, createRemindersMcpServer } from "./mcp/reminders/reminders-mcp-server.js";
21
- import { CROW_SYSTEM_AGENT_ID, CROW_TASK_DISPATCHER_AGENT_ID } from "./_shared/index.js";
17
+ import { getArtifactsMcpServerDefinition } from "./mcp/artifacts/artifacts-mcp-server.js";
18
+ import { getAgentsMcpServerDefinition } from "./mcp/agents/agents-mcp-server.js";
19
+ import { getSuperAgentMcpServerDefinition } from "./mcp/agents/super-agent-mcp-server.js";
20
+ import { getTasksMcpServerDefinition } from "./mcp/tasks/tasks-mcp-server.js";
21
+ import { getSuperTasksMcpServerDefinition } from "./mcp/tasks/super-tasks-mcp-server.js";
22
+ import { getRemindersMcpServerDefinition } from "./mcp/reminders/reminders-mcp-server.js";
22
23
  import { FileObjectStoreProvider } from "./core/store/file-object-store-provider.js";
23
24
  import { CrowScheduler } from "./services/crow-scheduler.js";
24
25
  import { SystemSettingsManager } from "./services/system-settings-manager.js";
@@ -53,14 +54,15 @@ import { FolderFileStoreProvider } from "./core/store/folder-file-store-provider
53
54
  import { SimplyFeedManager } from "./feed/simply-feed-manager.js";
54
55
  import { registerFeedRoutes } from "./routes/feed.routes.js";
55
56
  import { registerSystemSettingsRoutes } from "./routes/system-settings.routes.js";
56
- import { createFeedMcpServer, FEED_MCP_SERVER_NAME } from "./mcp/feed/feed-mcp-server.js";
57
- import { createAudioMcpServer, CROW_AUDIO_MCP_SERVER_NAME } from "./mcp/audio/audio-mcp-server.js";
57
+ import { getFeedMcpServerDefinition } from "./mcp/feed/feed-mcp-server.js";
58
+ import { getAudioMcpServerDefinition } from "./mcp/audio/audio-mcp-server.js";
58
59
  import { ConnectorManager } from "./connectors/connector-manager.js";
59
60
  import { GoogleConnector } from "./connectors/google-connector.js";
60
61
  import { registerConnectorsRoutes } from "./routes/connectors.routes.js";
61
- import { getGmailMcpServerDefinition, GMAIL_MCP_SERVER_NAME } from "./mcp/gmail/gmail-mcp-server.js";
62
- import { getGoogleCalendarMcpServerDefinition, GOOGLE_CALENDAR_MCP_SERVER_NAME, } from "./mcp/google-calendar/google-calendar-mcp-server.js";
63
- import { getGoogleContactsMcpServerDefinition, GOOGLE_CONTACTS_MCP_SERVER_NAME, } from "./mcp/google-contacts/google-contacts-mcp-server.js";
62
+ import { getGmailMcpServerDefinition } from "./mcp/gmail/gmail-mcp-server.js";
63
+ import { getGoogleCalendarMcpServerDefinition } from "./mcp/google-calendar/google-calendar-mcp-server.js";
64
+ import { getGoogleContactsMcpServerDefinition } from "./mcp/google-contacts/google-contacts-mcp-server.js";
65
+ import { getPlacesMcpServerDefinition } from "./mcp/places/places-mcp-server.js";
64
66
  /**
65
67
  * Bootstrap the application - create services with constructor deps, start server.
66
68
  * No event wiring here - services own their own listeners.
@@ -86,14 +88,17 @@ export async function bootstrap(options) {
86
88
  const feedManager = new SimplyFeedManager(storeProvider, folderFileProvider, crowScheduler);
87
89
  const artifactManager = new ArtifactManager(storeProvider, registry, circleManager);
88
90
  await artifactManager.initialize();
91
+ const placesManager = new PlacesManager();
89
92
  const connectorManager = new ConnectorManager(storeProvider, registry, crowScheduler);
90
93
  connectorManager.registerConnector(new GoogleConnector());
91
- const sessionManager = new SessionManager(storeProvider);
94
+ const copilotClientManager = new CopilotClientManager();
95
+ await copilotClientManager.initialize();
96
+ const sessionManager = new SessionManager(storeProvider, copilotClientManager);
92
97
  const messageQueue = new MessageQueueManager();
93
98
  const mcpManager = new CrowMcpManager(storeProvider, systemSettingsManager, registry);
94
99
  await mcpManager.initialize();
95
100
  const sensorManager = new SensorManager(storeProvider);
96
- sensorManager.registerSensor(new GeoLocationSensor());
101
+ sensorManager.registerSensor(new GeoLocationSensor(placesManager));
97
102
  sensorManager.registerSensor(new WeatherSensor());
98
103
  const runtimeManager = new AgentRuntimeManager(storeProvider, broadcaster, registry, mcpManager, sessionManager, messageQueue, taskManager, sensorManager, circleManager);
99
104
  await runtimeManager.initialize();
@@ -117,36 +122,19 @@ export async function bootstrap(options) {
117
122
  await discordBotManager.initialize();
118
123
  const discordRoutine = createDiscordRoutine(discordBotManager, runtimeManager);
119
124
  routineManager.addRoutine(discordRoutine);
120
- // Register MCP server factories
121
- mcpManager.registerMcpServer(ARTIFACTS_MCP_SERVER_NAME, (agentId) => createArtifactsMcpServer(agentId, artifactManager, registry, circleManager, sensorManager));
122
- mcpManager.registerMcpServer(CROW_AGENTS_MCP_SERVER_NAME, (agentId) => createAgentsMcpServer(agentId, registry, runtimeManager, taskManager));
123
- mcpManager.registerMcpServer(CROW_TASKS_MCP_SERVER_NAME, (agentId) => createTasksMcpServer(agentId, taskManager, circleManager, sensorManager));
124
- mcpManager.registerMcpServer(FEED_MCP_SERVER_NAME, (agentId) => createFeedMcpServer(agentId, registry, feedManager, sensorManager, systemSettingsManager));
125
- mcpManager.registerMcpServer(CROW_AUDIO_MCP_SERVER_NAME, (agentId) => createAudioMcpServer(agentId, registry, artifactManager));
126
- mcpManager.registerMcpServer(CROW_SUPER_TASKS_MCP_SERVER_NAME, (agentId) => createSuperTasksMcpServer(agentId, taskManager, registry, circleManager, sensorManager), { allowedAgentIds: [CROW_SYSTEM_AGENT_ID, CROW_TASK_DISPATCHER_AGENT_ID] });
127
- mcpManager.registerMcpServer(CROW_SUPER_AGENT_MCP_SERVER_NAME, (agentId) => createSuperAgentMcpServer(agentId, registry, runtimeManager, sessionManager), { allowedAgentIds: [CROW_SYSTEM_AGENT_ID] });
128
- mcpManager.registerMcpServer(REMINDERS_MCP_SERVER_NAME, (agentId) => createRemindersMcpServer(agentId, crowScheduler, sensorManager));
129
- const gmailMcpDefinition = getGmailMcpServerDefinition(connectorManager, sensorManager);
130
- mcpManager.registerMcpServer(GMAIL_MCP_SERVER_NAME, gmailMcpDefinition.serverFactory, {
131
- hasRequiredConnections: gmailMcpDefinition.hasRequiredConnections,
132
- getConnectionProfiles: gmailMcpDefinition.getConnectionProfiles,
133
- isConfigurable: gmailMcpDefinition.isConfigurable,
134
- displayName: gmailMcpDefinition.displayName,
135
- });
136
- const googleCalendarMcpDefinition = getGoogleCalendarMcpServerDefinition(connectorManager, sensorManager);
137
- mcpManager.registerMcpServer(GOOGLE_CALENDAR_MCP_SERVER_NAME, googleCalendarMcpDefinition.serverFactory, {
138
- hasRequiredConnections: googleCalendarMcpDefinition.hasRequiredConnections,
139
- getConnectionProfiles: googleCalendarMcpDefinition.getConnectionProfiles,
140
- isConfigurable: googleCalendarMcpDefinition.isConfigurable,
141
- displayName: googleCalendarMcpDefinition.displayName,
142
- });
143
- const googleContactsMcpDefinition = getGoogleContactsMcpServerDefinition(connectorManager, sensorManager);
144
- mcpManager.registerMcpServer(GOOGLE_CONTACTS_MCP_SERVER_NAME, googleContactsMcpDefinition.serverFactory, {
145
- hasRequiredConnections: googleContactsMcpDefinition.hasRequiredConnections,
146
- getConnectionProfiles: googleContactsMcpDefinition.getConnectionProfiles,
147
- isConfigurable: googleContactsMcpDefinition.isConfigurable,
148
- displayName: googleContactsMcpDefinition.displayName,
149
- });
125
+ // Register built-in MCP servers
126
+ mcpManager.registerMcpServer(getArtifactsMcpServerDefinition(artifactManager, registry, circleManager, sensorManager));
127
+ mcpManager.registerMcpServer(getAgentsMcpServerDefinition(registry, runtimeManager, taskManager));
128
+ mcpManager.registerMcpServer(getTasksMcpServerDefinition(taskManager, circleManager, sensorManager));
129
+ mcpManager.registerMcpServer(getFeedMcpServerDefinition(registry, feedManager, sensorManager, systemSettingsManager));
130
+ mcpManager.registerMcpServer(getAudioMcpServerDefinition(registry, artifactManager));
131
+ mcpManager.registerMcpServer(getSuperTasksMcpServerDefinition(taskManager, registry, circleManager, sensorManager));
132
+ mcpManager.registerMcpServer(getSuperAgentMcpServerDefinition(registry, runtimeManager, sessionManager));
133
+ mcpManager.registerMcpServer(getRemindersMcpServerDefinition(crowScheduler, sensorManager));
134
+ mcpManager.registerMcpServer(getGmailMcpServerDefinition(connectorManager, sensorManager));
135
+ mcpManager.registerMcpServer(getGoogleCalendarMcpServerDefinition(connectorManager, sensorManager));
136
+ mcpManager.registerMcpServer(getGoogleContactsMcpServerDefinition(connectorManager, sensorManager));
137
+ mcpManager.registerMcpServer(getPlacesMcpServerDefinition(placesManager));
150
138
  await runtimeManager.startRecovery();
151
139
  // Start scheduler
152
140
  crowScheduler.start();
@@ -156,7 +144,7 @@ export async function bootstrap(options) {
156
144
  await setupWebSocket(server, broadcaster, runtimeManager);
157
145
  await registerAuthRoutes(server);
158
146
  await registerHealthRoutes(server);
159
- await registerSystemRoutes(server);
147
+ await registerSystemRoutes(server, copilotClientManager);
160
148
  await registerAgentRoutes(server, registry, runtimeManager, sessionManager, storeProvider, connectorManager, mcpManager);
161
149
  await registerArtifactRoutes(server, artifactManager);
162
150
  await registerTaskRoutes(server, taskManager, registry);
@@ -177,6 +165,7 @@ export async function bootstrap(options) {
177
165
  crowScheduler.stop();
178
166
  await discordBotManager.destroy();
179
167
  await server.close();
168
+ await copilotClientManager.dispose();
180
169
  await shutdownTelemetry();
181
170
  process.exit(0);
182
171
  };
@@ -15,6 +15,8 @@ export const WS_HEARTBEAT_INTERVAL_MS = 30 * 1000;
15
15
  export const ARTIFACT_TIMESTAMP_WINDOW_MS = 5 * 60 * 1000;
16
16
  /** Default message sent to the agent when a tool permission is denied without a typed response */
17
17
  export const DEFAULT_PERMISSION_DENY_MESSAGE = "Permission denied by user";
18
+ /** Denial reason used when an agent runs with permission prompting suppressed (Claude "dontAsk" mode). */
19
+ export const PERMISSION_USER_UNAVAILABLE_MESSAGE = "Permission denied: no user is available to approve this request";
18
20
  /** Subdirectory name under CROW_SYSTEM_PATH for per-agent folders */
19
21
  export const AGENTS_DIR_NAME = "agents";
20
22
  /** Subdirectory name under CROW_SYSTEM_PATH for per-circle folders */
@@ -10,6 +10,10 @@ function getOptional(key, defaultValue) {
10
10
  function getOptionalNumber(key, defaultValue) {
11
11
  return process.env[key] ? parseInt(process.env[key], 10) : defaultValue;
12
12
  }
13
+ function getBoolean(key) {
14
+ const value = process.env[key]?.trim().toLowerCase();
15
+ return value === "true" || value === "1";
16
+ }
13
17
  function expandPath(filePath) {
14
18
  if (filePath.startsWith("~")) {
15
19
  return path.join(os.homedir(), filePath.slice(1));
@@ -52,6 +56,7 @@ export const env = {
52
56
  STATIC_PATH: expandPath(getOptional("STATIC_PATH") ?? DEFAULT_STATIC_DIR),
53
57
  CROW_SYSTEM_AGENT_NAME: getOptional("CROW_SYSTEM_AGENT_NAME"),
54
58
  CLAUDE_CLI_PATH: getOptional("CLAUDE_CLI_PATH"),
59
+ DISABLE_GITHUB_COPILOT: getBoolean("DISABLE_GITHUB_COPILOT"),
55
60
  CLOSED_TASK_RETENTION_DAYS: getOptionalNumber("CLOSED_TASK_RETENTION_DAYS", 30),
56
61
  FEED_ITEM_RETENTION_DAYS: getOptionalNumber("FEED_ITEM_RETENTION_DAYS", 30),
57
62
  FEED_REFRESH_IN_MINUTES: getOptionalNumber("FEED_REFRESH_IN_MINUTES"),
@@ -72,6 +77,8 @@ export const env = {
72
77
  GOOGLE_CONNECTOR_CLIENT_SECRET: getOptional("GOOGLE_CONNECTOR_CLIENT_SECRET"),
73
78
  OAUTH_PENDING_STATE_TTL_MS: getOptionalNumber("OAUTH_PENDING_STATE_TTL_MS", 600_000),
74
79
  GMAIL_CHECK_INTERVAL_IN_MINUTES: getOptionalNumber("GMAIL_CHECK_INTERVAL_IN_MINUTES"),
80
+ PHOTON_API_URL: getOptional("PHOTON_API_URL") ?? "https://photon.komoot.io",
81
+ OVERPASS_INTERPRETER_URL: getOptional("OVERPASS_INTERPRETER_URL") ?? "https://overpass-api.de/api/interpreter",
75
82
  };
76
83
  /**
77
84
  * Eagerly validate all required environment variables. Call once during boot
@@ -34,5 +34,6 @@ export const APP_ERROR_CODES = {
34
34
  FEED_ERROR: "feed_error",
35
35
  FEED_FETCH_ERROR: "feed_fetch_error",
36
36
  FEED_INVALID: "feed_invalid",
37
+ PLACES_SOURCE_NOT_REGISTERED: "places_source_not_registered",
37
38
  };
38
39
  //# sourceMappingURL=app-error.types.js.map
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import path from "node:path";
10
10
  import { logger } from "../../utils/logger.js";
11
- import { readJsonFile, writeJsonFile, assertWithinBase, deleteFile } from "../../utils/fs-utils.js";
11
+ import { readJsonFile, writeJsonFile, assertWithinBase, deleteFile, removeEmptyAncestors, } from "../../utils/fs-utils.js";
12
12
  import { APP_ERROR_CODES } from "../error/app-error.types.js";
13
13
  import { AppError } from "../error/app-error.js";
14
14
  import { STORE_QUERY_OPERATORS, } from "./object-store.types.js";
@@ -86,6 +86,7 @@ export class FileObjectStoreProvider {
86
86
  await this.serializedWithResult(state, async () => {
87
87
  state.data.clear();
88
88
  await deleteFile(state.filePath);
89
+ await removeEmptyAncestors(path.dirname(state.filePath), this.basePath);
89
90
  this.tables.delete(table);
90
91
  });
91
92
  }
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import path from "node:path";
9
9
  import { logger } from "../../utils/logger.js";
10
- import { readJsonFile, writeJsonFile, assertWithinBase, ensureDir, listFiles, deleteFile, removeDir, statFile, } from "../../utils/fs-utils.js";
10
+ import { readJsonFile, writeJsonFile, assertWithinBase, ensureDir, listFiles, deleteFile, removeDir, removeEmptyAncestors, statFile, } from "../../utils/fs-utils.js";
11
11
  import { APP_ERROR_CODES } from "../error/app-error.types.js";
12
12
  import { AppError } from "../error/app-error.js";
13
13
  import { isValidStoreEntry } from "./store-entry-utils.js";
@@ -91,6 +91,7 @@ export class FolderFileStoreProvider {
91
91
  const dirPath = path.join(this.basePath, table);
92
92
  assertWithinBase(dirPath, this.basePath);
93
93
  await removeDir(dirPath);
94
+ await removeEmptyAncestors(path.dirname(dirPath), this.basePath);
94
95
  this.initializedTables.delete(table);
95
96
  }
96
97
  async getMany(table, keys) {
@@ -1,20 +1,14 @@
1
- import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk";
1
+ import { defineMcpTool } from "../crow-mcp-manager-utils.js";
2
2
  import { getListAgentsToolConfig } from "./list-agents.js";
3
3
  import { getInvokeAgentToolConfig } from "./invoke-agent.js";
4
4
  export const CROW_AGENTS_MCP_SERVER_NAME = "crow-agents";
5
- export function createAgentsMcpServer(agentId, registry, runtimeManager, taskManager) {
6
- const listAgents = getListAgentsToolConfig(agentId, registry);
7
- const invokeAgent = getInvokeAgentToolConfig(agentId, registry, runtimeManager, taskManager);
8
- return createSdkMcpServer({
5
+ export function getAgentsMcpServerDefinition(registry, runtimeManager, taskManager) {
6
+ return {
9
7
  name: CROW_AGENTS_MCP_SERVER_NAME,
10
- tools: [
11
- tool(listAgents.name, listAgents.description, listAgents.inputSchema, listAgents.handler, {
12
- annotations: listAgents.annotations,
13
- }),
14
- tool(invokeAgent.name, invokeAgent.description, invokeAgent.inputSchema, invokeAgent.handler, {
15
- annotations: invokeAgent.annotations,
16
- }),
8
+ getTools: (agentId) => [
9
+ defineMcpTool(getListAgentsToolConfig(agentId, registry)),
10
+ defineMcpTool(getInvokeAgentToolConfig(agentId, registry, runtimeManager, taskManager)),
17
11
  ],
18
- });
12
+ };
19
13
  }
20
14
  //# sourceMappingURL=agents-mcp-server.js.map
@@ -27,7 +27,7 @@ export function getLastAgentMessageToolConfig(agentId, registry, runtimeManager,
27
27
  }
28
28
  try {
29
29
  const workspace = registry.resolveWorkspace(targetAgent);
30
- const messages = await sessionManager.loadMessages(state.sessionId, workspace);
30
+ const messages = await sessionManager.loadMessages(targetAgent.type, state.sessionId, workspace);
31
31
  let lastAssistantMessage;
32
32
  for (let index = messages.length - 1; index >= 0; index--) {
33
33
  if (messages[index].role === AGENT_MESSAGE_ROLE.AGENT) {
@@ -2,16 +2,17 @@
2
2
  * Super-agent MCP server — privileged tools available only to the Crow system agent.
3
3
  * Provides tools for inspecting other agents' state and messages.
4
4
  */
5
- import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk";
5
+ import { CROW_SYSTEM_AGENT_ID } from "../../_shared/index.js";
6
+ import { defineMcpTool } from "../crow-mcp-manager-utils.js";
6
7
  import { getLastAgentMessageToolConfig } from "./get-last-agent-message.js";
7
8
  export const CROW_SUPER_AGENT_MCP_SERVER_NAME = "crow-super-agent";
8
- export function createSuperAgentMcpServer(agentId, registry, runtimeManager, sessionManager) {
9
- const getLastAgentMessage = getLastAgentMessageToolConfig(agentId, registry, runtimeManager, sessionManager);
10
- return createSdkMcpServer({
9
+ export function getSuperAgentMcpServerDefinition(registry, runtimeManager, sessionManager) {
10
+ return {
11
11
  name: CROW_SUPER_AGENT_MCP_SERVER_NAME,
12
- tools: [
13
- tool(getLastAgentMessage.name, getLastAgentMessage.description, getLastAgentMessage.inputSchema, getLastAgentMessage.handler, { annotations: getLastAgentMessage.annotations }),
12
+ allowedAgentIds: [CROW_SYSTEM_AGENT_ID],
13
+ getTools: (agentId) => [
14
+ defineMcpTool(getLastAgentMessageToolConfig(agentId, registry, runtimeManager, sessionManager)),
14
15
  ],
15
- });
16
+ };
16
17
  }
17
18
  //# sourceMappingURL=super-agent-mcp-server.js.map
@@ -1,4 +1,4 @@
1
- import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk";
1
+ import { defineMcpTool } from "../crow-mcp-manager-utils.js";
2
2
  import { getWriteArtifactToolConfig } from "./write-artifact.js";
3
3
  import { getEditArtifactToolConfig } from "./edit-artifact.js";
4
4
  import { getReadArtifactToolConfig } from "./read-artifact.js";
@@ -12,45 +12,23 @@ import { getListCircleArtifactsToolConfig } from "./list-circle-artifacts.js";
12
12
  import { getDeleteCircleArtifactToolConfig } from "./delete-circle-artifact.js";
13
13
  import { getFindContentInCircleArtifactToolConfig } from "./find-content-in-circle-artifact.js";
14
14
  export const ARTIFACTS_MCP_SERVER_NAME = "crow-artifacts";
15
- export function createArtifactsMcpServer(agentId, artifactManager, registry, circleManager, sensorManager) {
16
- const writeArtifact = getWriteArtifactToolConfig(agentId, artifactManager, sensorManager);
17
- const editArtifact = getEditArtifactToolConfig(agentId, artifactManager, sensorManager);
18
- const readArtifact = getReadArtifactToolConfig(agentId, artifactManager, registry, circleManager, sensorManager);
19
- const listArtifacts = getListArtifactsToolConfig(agentId, artifactManager, registry, circleManager, sensorManager);
20
- const deleteArtifact = getDeleteArtifactToolConfig(agentId, artifactManager);
21
- const findContentInArtifact = getFindContentInArtifactToolConfig(agentId, artifactManager);
22
- const writeCircleArtifact = getWriteCircleArtifactToolConfig(agentId, artifactManager, sensorManager);
23
- const editCircleArtifact = getEditCircleArtifactToolConfig(agentId, artifactManager, sensorManager);
24
- const readCircleArtifact = getReadCircleArtifactToolConfig(agentId, artifactManager, sensorManager);
25
- const listCircleArtifacts = getListCircleArtifactsToolConfig(agentId, artifactManager, sensorManager);
26
- const deleteCircleArtifact = getDeleteCircleArtifactToolConfig(agentId, artifactManager);
27
- const findContentInCircleArtifact = getFindContentInCircleArtifactToolConfig(agentId, artifactManager);
28
- return createSdkMcpServer({
15
+ export function getArtifactsMcpServerDefinition(artifactManager, registry, circleManager, sensorManager) {
16
+ return {
29
17
  name: ARTIFACTS_MCP_SERVER_NAME,
30
- tools: [
31
- tool(writeArtifact.name, writeArtifact.description, writeArtifact.inputSchema, writeArtifact.handler, {
32
- annotations: writeArtifact.annotations,
33
- }),
34
- tool(editArtifact.name, editArtifact.description, editArtifact.inputSchema, editArtifact.handler, {
35
- annotations: editArtifact.annotations,
36
- }),
37
- tool(readArtifact.name, readArtifact.description, readArtifact.inputSchema, readArtifact.handler, {
38
- annotations: readArtifact.annotations,
39
- }),
40
- tool(listArtifacts.name, listArtifacts.description, listArtifacts.inputSchema, listArtifacts.handler, {
41
- annotations: listArtifacts.annotations,
42
- }),
43
- tool(deleteArtifact.name, deleteArtifact.description, deleteArtifact.inputSchema, deleteArtifact.handler, {
44
- annotations: deleteArtifact.annotations,
45
- }),
46
- tool(findContentInArtifact.name, findContentInArtifact.description, findContentInArtifact.inputSchema, findContentInArtifact.handler, { annotations: findContentInArtifact.annotations }),
47
- tool(writeCircleArtifact.name, writeCircleArtifact.description, writeCircleArtifact.inputSchema, writeCircleArtifact.handler, { annotations: writeCircleArtifact.annotations }),
48
- tool(editCircleArtifact.name, editCircleArtifact.description, editCircleArtifact.inputSchema, editCircleArtifact.handler, { annotations: editCircleArtifact.annotations }),
49
- tool(readCircleArtifact.name, readCircleArtifact.description, readCircleArtifact.inputSchema, readCircleArtifact.handler, { annotations: readCircleArtifact.annotations }),
50
- tool(listCircleArtifacts.name, listCircleArtifacts.description, listCircleArtifacts.inputSchema, listCircleArtifacts.handler, { annotations: listCircleArtifacts.annotations }),
51
- tool(deleteCircleArtifact.name, deleteCircleArtifact.description, deleteCircleArtifact.inputSchema, deleteCircleArtifact.handler, { annotations: deleteCircleArtifact.annotations }),
52
- tool(findContentInCircleArtifact.name, findContentInCircleArtifact.description, findContentInCircleArtifact.inputSchema, findContentInCircleArtifact.handler, { annotations: findContentInCircleArtifact.annotations }),
18
+ getTools: (agentId) => [
19
+ defineMcpTool(getWriteArtifactToolConfig(agentId, artifactManager, sensorManager)),
20
+ defineMcpTool(getEditArtifactToolConfig(agentId, artifactManager, sensorManager)),
21
+ defineMcpTool(getReadArtifactToolConfig(agentId, artifactManager, registry, circleManager, sensorManager)),
22
+ defineMcpTool(getListArtifactsToolConfig(agentId, artifactManager, registry, circleManager, sensorManager)),
23
+ defineMcpTool(getDeleteArtifactToolConfig(agentId, artifactManager)),
24
+ defineMcpTool(getFindContentInArtifactToolConfig(agentId, artifactManager)),
25
+ defineMcpTool(getWriteCircleArtifactToolConfig(agentId, artifactManager, sensorManager)),
26
+ defineMcpTool(getEditCircleArtifactToolConfig(agentId, artifactManager, sensorManager)),
27
+ defineMcpTool(getReadCircleArtifactToolConfig(agentId, artifactManager, sensorManager)),
28
+ defineMcpTool(getListCircleArtifactsToolConfig(agentId, artifactManager, sensorManager)),
29
+ defineMcpTool(getDeleteCircleArtifactToolConfig(agentId, artifactManager)),
30
+ defineMcpTool(getFindContentInCircleArtifactToolConfig(agentId, artifactManager)),
53
31
  ],
54
- });
32
+ };
55
33
  }
56
34
  //# sourceMappingURL=artifacts-mcp-server.js.map
@@ -1,15 +1,10 @@
1
- import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk";
1
+ import { defineMcpTool } from "../crow-mcp-manager-utils.js";
2
2
  import { getGenerateAudioToolConfig } from "./generate-audio.js";
3
3
  export const CROW_AUDIO_MCP_SERVER_NAME = "crow-audio";
4
- export function createAudioMcpServer(agentId, registry, artifactManager) {
5
- const generateAudio = getGenerateAudioToolConfig(agentId, registry, artifactManager);
6
- return createSdkMcpServer({
4
+ export function getAudioMcpServerDefinition(registry, artifactManager) {
5
+ return {
7
6
  name: CROW_AUDIO_MCP_SERVER_NAME,
8
- tools: [
9
- tool(generateAudio.name, generateAudio.description, generateAudio.inputSchema, generateAudio.handler, {
10
- annotations: generateAudio.annotations,
11
- }),
12
- ],
13
- });
7
+ getTools: (agentId) => [defineMcpTool(getGenerateAudioToolConfig(agentId, registry, artifactManager))],
8
+ };
14
9
  }
15
10
  //# sourceMappingURL=audio-mcp-server.js.map