crow-central-agency 0.25.0 → 0.25.2

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 (115) hide show
  1. package/README.md +35 -1
  2. package/dist/_shared/index.js +2 -1
  3. package/dist/_shared/schemas/agent-message.schema.js +9 -0
  4. package/dist/_shared/schemas/agent.schema.js +8 -1
  5. package/dist/_shared/schemas/system-capabilities.schema.js +12 -0
  6. package/dist/bootstrap.js +3 -1
  7. package/dist/config/constants.js +4 -0
  8. package/dist/config/env.js +3 -0
  9. package/dist/container.js +12 -1
  10. package/dist/core/error/app-error.types.js +1 -0
  11. package/dist/feed/simply-feed-manager.js +4 -10
  12. package/dist/feed/system-prompts.js +1 -1
  13. package/dist/public/assets/{arc-DxFSFBJN.js → arc-CWcgwC0V.js} +1 -1
  14. package/dist/public/assets/architecture-YZFGNWBL-ezfTnWVi.js +1 -0
  15. package/dist/public/assets/{architectureDiagram-Q4EWVU46-SeuiKVbG.js → architectureDiagram-Q4EWVU46-Hzz_E5-8.js} +1 -1
  16. package/dist/public/assets/{blockDiagram-DXYQGD6D-CTRl4_t2.js → blockDiagram-DXYQGD6D-cJiNsaLA.js} +1 -1
  17. package/dist/public/assets/{c4Diagram-AHTNJAMY-DtCkuX8V.js → c4Diagram-AHTNJAMY-C8-_3XAz.js} +1 -1
  18. package/dist/public/assets/channel-DbM4kSP-.js +1 -0
  19. package/dist/public/assets/{chunk-2KRD3SAO-BTS8lb2g.js → chunk-2KRD3SAO-hNrE6Fhb.js} +1 -1
  20. package/dist/public/assets/{chunk-4BX2VUAB-DfLhnyVw.js → chunk-4BX2VUAB-CyuizFOU.js} +1 -1
  21. package/dist/public/assets/{chunk-4TB4RGXK-BRtZK7pt.js → chunk-4TB4RGXK-Dps1Wnxb.js} +1 -1
  22. package/dist/public/assets/{chunk-55IACEB6-DBUSiHt1.js → chunk-55IACEB6-D4EeyXif.js} +1 -1
  23. package/dist/public/assets/{chunk-67CJDMHE-GP0b3w7n.js → chunk-67CJDMHE-BJgwVRSb.js} +1 -1
  24. package/dist/public/assets/{chunk-7N4EOEYR-xVTzZdKC.js → chunk-7N4EOEYR-BamzAjP6.js} +1 -1
  25. package/dist/public/assets/{chunk-AA7GKIK3-B31jjRaG.js → chunk-AA7GKIK3-4A2PAbvw.js} +1 -1
  26. package/dist/public/assets/{chunk-CIAEETIT-CUyHWZ1V.js → chunk-CIAEETIT-Cdrfoz9N.js} +1 -1
  27. package/dist/public/assets/{chunk-EDXVE4YY-IQR6c3lv.js → chunk-EDXVE4YY-pw0Fyb74.js} +1 -1
  28. package/dist/public/assets/{chunk-FMBD7UC4-Deh5BGpu.js → chunk-FMBD7UC4-B73wYTDE.js} +1 -1
  29. package/dist/public/assets/{chunk-FOC6F5B3-CNw7fLM4.js → chunk-FOC6F5B3-C-k80GjN.js} +1 -1
  30. package/dist/public/assets/{chunk-K5T4RW27-fHwoBfBl.js → chunk-K5T4RW27-02-aUFo6.js} +1 -1
  31. package/dist/public/assets/{chunk-KGLVRYIC-BAs43SfF.js → chunk-KGLVRYIC-gnUUZi9X.js} +1 -1
  32. package/dist/public/assets/{chunk-LIHQZDEY-Dr1ywMhr.js → chunk-LIHQZDEY-ClkZaJX6.js} +1 -1
  33. package/dist/public/assets/{chunk-ORNJ4GCN-Yd_u12Gn.js → chunk-ORNJ4GCN-Co01V-Ft.js} +1 -1
  34. package/dist/public/assets/{chunk-OYMX7WX6-7vDFaji6.js → chunk-OYMX7WX6-DDDB98j6.js} +1 -1
  35. package/dist/public/assets/chunk-QZHKN3VN-DesUjsTI.js +1 -0
  36. package/dist/public/assets/{chunk-YZCP3GAM-DfVWqRKe.js → chunk-YZCP3GAM-DG5u50aq.js} +1 -1
  37. package/dist/public/assets/classDiagram-6PBFFD2Q-Zhl3bAAO.js +1 -0
  38. package/dist/public/assets/classDiagram-v2-HSJHXN6E-DJo0qw9K.js +1 -0
  39. package/dist/public/assets/clone-AsOJeT1y.js +1 -0
  40. package/dist/public/assets/{cose-bilkent-S5V4N54A-BpOlI4lr.js → cose-bilkent-S5V4N54A-BeQ2fw6I.js} +1 -1
  41. package/dist/public/assets/{dagre-Pkmo7x8f.js → dagre-BOQpPiEO.js} +1 -1
  42. package/dist/public/assets/{dagre-KV5264BT-DX_Z3fVj.js → dagre-KV5264BT-D59IU6Kl.js} +1 -1
  43. package/dist/public/assets/{diagram-5BDNPKRD-CL7YnZXc.js → diagram-5BDNPKRD-DjSt96Vd.js} +1 -1
  44. package/dist/public/assets/{diagram-G4DWMVQ6-BSLFlB6_.js → diagram-G4DWMVQ6-BIUmVPmV.js} +1 -1
  45. package/dist/public/assets/{diagram-MMDJMWI5-DkQopSrS.js → diagram-MMDJMWI5-CwYCJc8U.js} +1 -1
  46. package/dist/public/assets/{diagram-TYMM5635-RcK4oCav.js → diagram-TYMM5635-FcLyspOI.js} +1 -1
  47. package/dist/public/assets/{erDiagram-SMLLAGMA-CmIUK6Js.js → erDiagram-SMLLAGMA-BrrsxNSv.js} +1 -1
  48. package/dist/public/assets/{flatten-BoEv3EhA.js → flatten-DahVKBbC.js} +1 -1
  49. package/dist/public/assets/{flowDiagram-DWJPFMVM-DgEKurz-.js → flowDiagram-DWJPFMVM-DRY3NPE7.js} +1 -1
  50. package/dist/public/assets/{ganttDiagram-T4ZO3ILL-BnKfonrP.js → ganttDiagram-T4ZO3ILL-D3zgaTy9.js} +1 -1
  51. package/dist/public/assets/gitGraph-7Q5UKJZL-DYK5FwuK.js +1 -0
  52. package/dist/public/assets/{gitGraphDiagram-UUTBAWPF-Oq9xmLSI.js → gitGraphDiagram-UUTBAWPF-zg2nx9lJ.js} +1 -1
  53. package/dist/public/assets/{graphlib-BjZxhnO_.js → graphlib-D8pGHa62.js} +1 -1
  54. package/dist/public/assets/index-CfsAB1GR.css +1 -0
  55. package/dist/public/assets/index-DxDvQqD3.js +733 -0
  56. package/dist/public/assets/info-OMHHGYJF-L7JaN6uh.js +1 -0
  57. package/dist/public/assets/{infoDiagram-42DDH7IO-CcXFHRFc.js → infoDiagram-42DDH7IO-CRoYGVce.js} +1 -1
  58. package/dist/public/assets/{ishikawaDiagram-UXIWVN3A-C1JcEJH1.js → ishikawaDiagram-UXIWVN3A-Cxpb00_M.js} +1 -1
  59. package/dist/public/assets/{journeyDiagram-VCZTEJTY-CEU58ybi.js → journeyDiagram-VCZTEJTY-BqIFQj3F.js} +1 -1
  60. package/dist/public/assets/{kanban-definition-6JOO6SKY-DbXrWEzC.js → kanban-definition-6JOO6SKY-CbaAd8Pt.js} +1 -1
  61. package/dist/public/assets/{linear-CioACqZF.js → linear-Bk4AIQFb.js} +1 -1
  62. package/dist/public/assets/{mermaid-parser.core-qXHqd0OW.js → mermaid-parser.core-B6CvLttS.js} +2 -2
  63. package/dist/public/assets/{mindmap-definition-QFDTVHPH-CoKYgnWb.js → mindmap-definition-QFDTVHPH-CHTNRZyG.js} +1 -1
  64. package/dist/public/assets/packet-4T2RLAQJ-DBSkkBZ5.js +1 -0
  65. package/dist/public/assets/pie-ZZUOXDRM-C4UhUDir.js +1 -0
  66. package/dist/public/assets/{pieDiagram-DEJITSTG-CfK8-F1N.js → pieDiagram-DEJITSTG-CjrUVyNR.js} +1 -1
  67. package/dist/public/assets/{quadrantDiagram-34T5L4WZ-D5qJo5aV.js → quadrantDiagram-34T5L4WZ-8a518uXc.js} +1 -1
  68. package/dist/public/assets/radar-PYXPWWZC-DFkf3JQp.js +1 -0
  69. package/dist/public/assets/{reduce-C04LiHRL.js → reduce-DbfHsVRc.js} +1 -1
  70. package/dist/public/assets/{requirementDiagram-MS252O5E-Bc6o-V4Q.js → requirementDiagram-MS252O5E-BWd5xTIp.js} +1 -1
  71. package/dist/public/assets/{sankeyDiagram-XADWPNL6--5dAk6WT.js → sankeyDiagram-XADWPNL6-D35UAmHI.js} +1 -1
  72. package/dist/public/assets/{sequenceDiagram-FGHM5R23-BJAb16ie.js → sequenceDiagram-FGHM5R23-B2t5aLiU.js} +1 -1
  73. package/dist/public/assets/{stateDiagram-FHFEXIEX-CNwxRykA.js → stateDiagram-FHFEXIEX-BQhhAjm9.js} +1 -1
  74. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-D2D1BRlV.js +1 -0
  75. package/dist/public/assets/{timeline-definition-GMOUNBTQ-BgtW64Qj.js → timeline-definition-GMOUNBTQ-q-ZFF7ju.js} +1 -1
  76. package/dist/public/assets/treeView-SZITEDCU-D2ywS8Aa.js +1 -0
  77. package/dist/public/assets/treemap-W4RFUUIX-BaBddW3r.js +1 -0
  78. package/dist/public/assets/{vennDiagram-DHZGUBPP-Dcvu5q5a.js → vennDiagram-DHZGUBPP-CxS7J9vF.js} +1 -1
  79. package/dist/public/assets/wardley-RL74JXVD-CgfeWrGf.js +1 -0
  80. package/dist/public/assets/{wardleyDiagram-NUSXRM2D-B6Y65qN1.js → wardleyDiagram-NUSXRM2D-D3oQBxHb.js} +1 -1
  81. package/dist/public/assets/{xychartDiagram-5P7HB3ND-DOyuE388.js → xychartDiagram-5P7HB3ND-CcB-1rnM.js} +1 -1
  82. package/dist/public/index.html +2 -2
  83. package/dist/routes/agent.routes.js +16 -0
  84. package/dist/routes/generation.routes.js +1 -1
  85. package/dist/routes/system.routes.js +34 -0
  86. package/dist/routines/inter-agent-task-routine.js +1 -1
  87. package/dist/routines/task-dispatch-routine.js +1 -1
  88. package/dist/runner/agent-runner.js +1 -1
  89. package/dist/server/error-handler.js +1 -0
  90. package/dist/services/content-generation/audio-generation-service.js +27 -0
  91. package/dist/services/{text-generation/text-generation-service.types.js → content-generation/content-generation.types.js} +10 -1
  92. package/dist/services/{text-generation → content-generation}/md-generation.js +1 -1
  93. package/dist/services/content-generation/provider/google-provider.js +382 -0
  94. package/dist/services/{text-generation → content-generation}/provider/openai-provider.js +77 -22
  95. package/dist/services/{text-generation → content-generation}/text-generation-service.js +8 -1
  96. package/dist/services/runtime/agent-runtime-manager.js +28 -0
  97. package/dist/services/session/session-manager.js +110 -0
  98. package/package.json +2 -1
  99. package/dist/public/assets/architecture-YZFGNWBL-BtzsnXeQ.js +0 -1
  100. package/dist/public/assets/channel-BjaSnD0u.js +0 -1
  101. package/dist/public/assets/chunk-QZHKN3VN-DtO085mY.js +0 -1
  102. package/dist/public/assets/classDiagram-6PBFFD2Q-ZUKbNKdt.js +0 -1
  103. package/dist/public/assets/classDiagram-v2-HSJHXN6E-BjirQ1z-.js +0 -1
  104. package/dist/public/assets/clone-DjOI7n66.js +0 -1
  105. package/dist/public/assets/gitGraph-7Q5UKJZL-BlvjQtWL.js +0 -1
  106. package/dist/public/assets/index-B_bqUrIc.js +0 -733
  107. package/dist/public/assets/index-BntlXc11.css +0 -1
  108. package/dist/public/assets/info-OMHHGYJF-C4zUowWY.js +0 -1
  109. package/dist/public/assets/packet-4T2RLAQJ-Bgsrkq__.js +0 -1
  110. package/dist/public/assets/pie-ZZUOXDRM-avqE6X4o.js +0 -1
  111. package/dist/public/assets/radar-PYXPWWZC-CH83AdGy.js +0 -1
  112. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-swYvCAsp.js +0 -1
  113. package/dist/public/assets/treeView-SZITEDCU-BoJpbPQz.js +0 -1
  114. package/dist/public/assets/treemap-W4RFUUIX-D-gpApbj.js +0 -1
  115. package/dist/public/assets/wardley-RL74JXVD-DABuns1t.js +0 -1
package/README.md CHANGED
@@ -92,11 +92,45 @@ See `.env.example` for the full list, including:
92
92
 
93
93
  - `HOST` / `PORT` — server bind address (defaults: `localhost:3101`). Keep `HOST=localhost` and front the server with a secure tunnel for remote access rather than binding to `0.0.0.0`.
94
94
  - `CORS_ORIGINS` — only needed when the frontend is served from a different origin (e.g. during frontend dev). Single-box deployments can leave it unset.
95
+ - `LOG_LEVEL` — log verbosity (defaults to `debug` in development, `info` otherwise).
95
96
  - `CROW_SYSTEM_PATH` — directory for Crow's file-based storage. Defaults to `~/.crow`.
97
+ - `CROW_SYSTEM_AGENT_NAME` — display name for the built-in Crow system agent (default: `Crow`).
98
+ - `STATIC_PATH` — override the directory served as frontend assets (auto-detected from the published bundle).
99
+ - `CLAUDE_CLI_PATH` — explicit path to the Claude Code CLI binary when it is not on `PATH`.
100
+ - `CLOSED_TASK_RETENTION_DAYS` — how long to keep closed tasks before pruning on startup (default: `30`).
101
+ - `FEED_ITEM_RETENTION_DAYS` / `FEED_REFRESH_IN_MINUTES` — feed item retention window and refresh cadence.
96
102
  - `TEXT_GENERATION_*` — optional OpenAI-compatible endpoint that enables the AI-assisted persona / `AGENT.md` generation features in the agent editor.
97
103
  - `FEED_TEXT_GENERATION_*` — optional OpenAI-compatible endpoint used by the feed manager to summarize feed items into a consistent length for better agent consumption.
104
+ - `AUDIO_GENERATION_*` — optional Gemini TTS configuration that powers the play-message button on the agent console. See [Audio generation](#audio-generation) below.
98
105
  - `OTEL_*` — optional OpenTelemetry export.
99
- - `ANTHROPIC_API_KEY` — Anthropic API key.
106
+
107
+ ## Audio generation
108
+
109
+ Crow can synthesize agent text messages to speech and play them back in the
110
+ agent console (per-message play button) or dashboard.
111
+
112
+ ### Configuration
113
+
114
+ The feature is **opt-in** — the play button only works when all three audio
115
+ env vars are set. Add to `.env`:
116
+
117
+ ```bash
118
+ AUDIO_GENERATION_PROVIDER=GOOGLE
119
+ AUDIO_GENERATION_API_KEY=<your Google API key>
120
+ AUDIO_GENERATION_MODEL=gemini-2.5-flash-preview-tts
121
+ ```
122
+
123
+ Per-agent overrides (voice name + style prompt) live in the **Voice Config**
124
+ section of the agent editor. When the agent's voice is changed after audio
125
+ was already generated, the next play regenerates with the new voice.
126
+
127
+ ### Google API key requirements
128
+
129
+ The `AUDIO_GENERATION_API_KEY` must be a Google API key with access to the
130
+ **Gemini API**.
131
+
132
+ You can use the same key as `TEXT_GENERATION_API_KEY` if that is also a
133
+ Gemini-backed configuration, but the two are read independently.
100
134
 
101
135
  ## OpenTelemetry
102
136
 
@@ -4,7 +4,7 @@ export { createApiSuccessSchema, ApiErrorSchema, } from "./schemas/api-response.
4
4
  export { SessionUsageSchema, PendingPermissionInfoSchema, AgentRuntimeStateSchema, AgentActivitySchema, AGENT_ACTIVITY_TYPE, AGENT_STATUS, } from "./schemas/agent-runtime-state.schema.js";
5
5
  export { ClientMessageSchema, ServerMessageSchema, SendMessageSchema, InjectMessageSchema, PermissionResponseWsSchema, AgentTextWsMessageSchema, AgentActivityWsMessageSchema, AgentResultWsMessageSchema, AgentStatusWsMessageSchema, AgentUpdatedWsMessageSchema, AgentUsageWsMessageSchema, PermissionRequestWsMessageSchema, PermissionCancelledWsMessageSchema, ErrorWsMessageSchema, AgentMessageWsMessageSchema, AgentToolProgressWsMessageSchema, TaskAddedWsMessageSchema, TaskUpdatedWsMessageSchema, TaskAssignedWsMessageSchema, TaskStateChangedWsMessageSchema, TaskDeletedWsMessageSchema, CircleCreatedWsMessageSchema, CircleUpdatedWsMessageSchema, CircleDeletedWsMessageSchema, RelationshipCreatedWsMessageSchema, RelationshipDeletedWsMessageSchema, CLIENT_MESSAGE_TYPE, SERVER_MESSAGE_TYPE, } from "./schemas/websocket.schema.js";
6
6
  export { PERMISSION_DECISION, PermissionRequestSchema, PermissionResponseSchema, } from "./schemas/permission.schema.js";
7
- export { AgentMessageSchema, AGENT_MESSAGE_ROLE, AGENT_MESSAGE_TYPE, } from "./schemas/agent-message.schema.js";
7
+ export { AgentMessageSchema, MessageAnnotationSchema, AGENT_MESSAGE_ROLE, AGENT_MESSAGE_TYPE, } from "./schemas/agent-message.schema.js";
8
8
  export { ARTIFACT_TYPE, ARTIFACT_CONTENT_TYPE, ArtifactTypeSchema, ArtifactContentTypeSchema, ArtifactMetadataSchema, } from "./schemas/artifact.schema.js";
9
9
  export { AGENT_TASK_STATE, AGENT_TASK_SOURCE_TYPE, AgentTaskStateSchema, AgentTaskSourceSchema, AgentTaskItemSchema, AgentTaskDatabaseSchema, CreateTaskInputSchema, UpdateTaskInputSchema, UpdateTaskStateInputSchema, AssignTaskInputSchema, } from "./schemas/agent-task.schema.js";
10
10
  export { MCP_CONFIG_TYPE, McpServerConfigSchema, CreateMcpConfigInputSchema, UpdateMcpConfigInputSchema, } from "./schemas/mcp-config.schema.js";
@@ -12,6 +12,7 @@ export { SensorInfoSchema } from "./schemas/sensor.schema.js";
12
12
  export { AddFeedInputSchema, DetectFeedsInputSchema, } from "./schemas/feed.schema.js";
13
13
  export { DiscordConfigSchema } from "./schemas/discord-config.schema.js";
14
14
  export { SuperCrowSettingsSchema, UpdateSuperCrowSettingsInputSchema, DashboardSettingsSchema, UpdateDashboardSettingsInputSchema, } from "./schemas/system-settings.schema.js";
15
+ export { SystemCapabilitiesSchema } from "./schemas/system-capabilities.schema.js";
15
16
  export { applyAgentOrder } from "./utils/apply-agent-order.js";
16
17
  export { MODEL_ALIASES, resolveModel } from "./utils/resolve-model.js";
17
18
  export { BASE_CIRCLE_ID, BASE_CIRCLE_NAME } from "./constants/system-circle.js";
@@ -9,6 +9,14 @@ export const AGENT_MESSAGE_TYPE = {
9
9
  THINKING: "THINKING",
10
10
  TOOL_USE: "TOOL_USE",
11
11
  };
12
+ export const MessageAnnotationSchema = z.object({
13
+ id: z.string(),
14
+ hasAudioMessage: z.boolean().optional(),
15
+ voiceName: z.string().optional(),
16
+ audioMimeType: z.string().optional(),
17
+ audioSampleRate: z.number().optional(),
18
+ durationMs: z.number().optional(),
19
+ });
12
20
  /** Shared base fields for all agent messages */
13
21
  const AgentMessageBase = z.object({
14
22
  /** Unique message identifier (derived from SDK SessionMessage uuid) */
@@ -17,6 +25,7 @@ const AgentMessageBase = z.object({
17
25
  content: z.string(),
18
26
  /** Timestamp for ordering */
19
27
  timestamp: z.number(),
28
+ annotations: MessageAnnotationSchema.omit({ id: true }).optional(),
20
29
  });
21
30
  /** User or agent text message */
22
31
  const TextMessageSchema = AgentMessageBase.extend({
@@ -116,12 +116,16 @@ export const ToolConfigSchema = z.object({
116
116
  autoApprovedTools: z.array(z.string()).optional(),
117
117
  disallowedTools: z.array(z.string()).optional(),
118
118
  });
119
+ export const AgentVoiceConfigSchema = z.object({
120
+ voiceName: z.string().optional(),
121
+ stylePrompt: z.string().optional(),
122
+ });
119
123
  /**
120
124
  * Full agent configuration - persisted to disk in agents.json
121
125
  */
122
126
  export const AgentConfigSchema = z.object({
123
127
  id: AgentIdSchema,
124
- type: z.enum([AGENT_TYPE.CLAUDE_CODE]),
128
+ type: z.enum([AGENT_TYPE.CLAUDE_CODE]).default(AGENT_TYPE.CLAUDE_CODE),
125
129
  name: z.string().min(1).max(64),
126
130
  description: z.string().optional(),
127
131
  workspace: z.string().min(1).optional(),
@@ -131,6 +135,7 @@ export const AgentConfigSchema = z.object({
131
135
  settingSources: z.array(SettingSourceSchema).default([...DEFAULT_SETTING_SOURCES]),
132
136
  availableTools: z.array(z.string()).optional(),
133
137
  toolConfig: ToolConfigSchema.default({ mode: TOOL_MODE.UNRESTRICTED }),
138
+ agentVoiceConfig: AgentVoiceConfigSchema.optional(),
134
139
  /** IDs of user-configured MCP servers enabled for this agent */
135
140
  mcpServerIds: z.array(z.string()).optional(),
136
141
  configuredFeeds: z.array(ConfiguredFeedSchema).optional(),
@@ -159,6 +164,7 @@ export const CreateAgentInputSchema = z.object({
159
164
  permissionMode: PermissionModeSchema.optional(),
160
165
  settingSources: z.array(SettingSourceSchema).optional(),
161
166
  toolConfig: ToolConfigSchema.optional(),
167
+ agentVoiceConfig: AgentVoiceConfigSchema.optional(),
162
168
  mcpServerIds: z.array(z.string()).optional(),
163
169
  configuredFeeds: z.array(ConfiguredFeedSchema).optional(),
164
170
  sensorIds: z.array(z.string()).optional(),
@@ -179,6 +185,7 @@ export const UpdateAgentInputSchema = z.object({
179
185
  permissionMode: PermissionModeSchema.optional(),
180
186
  settingSources: z.array(SettingSourceSchema).optional(),
181
187
  toolConfig: ToolConfigSchema.optional(),
188
+ agentVoiceConfig: AgentVoiceConfigSchema.optional(),
182
189
  mcpServerIds: z.array(z.string()).optional(),
183
190
  configuredFeeds: z.array(ConfiguredFeedSchema).optional(),
184
191
  sensorIds: z.array(z.string()).optional(),
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Server-side feature flags surfaced to the UI so it can enable/disable
4
+ * features whose backing services are configured via environment variables.
5
+ */
6
+ export const SystemCapabilitiesSchema = z.object({
7
+ /** True when the audio generation provider, API key, and model are all configured. */
8
+ audioGeneration: z.boolean(),
9
+ /** True when the chat-completion text generation provider is configured (powers persona / AGENT.md generation). */
10
+ textGeneration: z.boolean(),
11
+ });
12
+ //# sourceMappingURL=system-capabilities.schema.js.map
package/dist/bootstrap.js CHANGED
@@ -3,6 +3,7 @@ import { logger } from "./utils/logger.js";
3
3
  import { createServer } from "./server/create-server.js";
4
4
  import { registerAuthRoutes } from "./routes/auth.routes.js";
5
5
  import { registerHealthRoutes } from "./routes/health.routes.js";
6
+ import { registerSystemRoutes } from "./routes/system.routes.js";
6
7
  import { registerAgentRoutes } from "./routes/agent.routes.js";
7
8
  import { AgentRegistry } from "./services/agent-registry.js";
8
9
  import { AgentRuntimeManager } from "./services/runtime/agent-runtime-manager.js";
@@ -77,7 +78,7 @@ export async function bootstrap(options) {
77
78
  const feedManager = new SimplyFeedManager(storeProvider, folderFileProvider, crowScheduler);
78
79
  const artifactManager = new ArtifactManager(storeProvider, registry, circleManager);
79
80
  await artifactManager.initialize();
80
- const sessionManager = new SessionManager();
81
+ const sessionManager = new SessionManager(storeProvider);
81
82
  const messageQueue = new MessageQueueManager();
82
83
  const mcpManager = new CrowMcpManager(storeProvider, systemSettingsManager, registry);
83
84
  await mcpManager.initialize();
@@ -120,6 +121,7 @@ export async function bootstrap(options) {
120
121
  await setupWebSocket(server, broadcaster, runtimeManager);
121
122
  await registerAuthRoutes(server);
122
123
  await registerHealthRoutes(server);
124
+ await registerSystemRoutes(server);
123
125
  await registerAgentRoutes(server, registry, runtimeManager, sessionManager, storeProvider);
124
126
  await registerArtifactRoutes(server, artifactManager);
125
127
  await registerTaskRoutes(server, taskManager, registry);
@@ -21,6 +21,10 @@ export const AGENTS_DIR_NAME = "agents";
21
21
  export const CIRCLES_DIR_NAME = "circles";
22
22
  /** Subdirectory name under each agent's folder for artifact files */
23
23
  export const AGENT_ARTIFACTS_DIR_NAME = "artifacts";
24
+ /** Subdirectory name under CROW_SYSTEM_PATH for per-session proprietary data (annotations, audio) */
25
+ export const SESSIONS_DIR_NAME = "sessions";
26
+ /** Subdirectory name under each session's folder for audio binaries associated with messages */
27
+ export const SESSION_AUDIO_DIR_NAME = "audio";
24
28
  /** Filename for the per-agent instruction file */
25
29
  export const AGENT_MD_FILENAME = "AGENT.md";
26
30
  /** Filename for the per-agent message queue */
@@ -59,6 +59,9 @@ export const env = {
59
59
  FEED_TEXT_GENERATION_API_KEY: getOptional("FEED_TEXT_GENERATION_API_KEY"),
60
60
  FEED_TEXT_GENERATION_BASE_URL: getOptional("FEED_TEXT_GENERATION_BASE_URL"),
61
61
  FEED_TEXT_GENERATION_MODEL: getOptional("FEED_TEXT_GENERATION_MODEL"),
62
+ AUDIO_GENERATION_PROVIDER: getOptional("AUDIO_GENERATION_PROVIDER"),
63
+ AUDIO_GENERATION_API_KEY: getOptional("AUDIO_GENERATION_API_KEY"),
64
+ AUDIO_GENERATION_MODEL: getOptional("AUDIO_GENERATION_MODEL", "gemini-3.1-flash-tts-preview"),
62
65
  };
63
66
  /**
64
67
  * Eagerly validate all required environment variables. Call once during boot
package/dist/container.js CHANGED
@@ -2,7 +2,8 @@ import { LLM_PROVIDER_TYPE } from "./config/constants.js";
2
2
  import { env } from "./config/env.js";
3
3
  import { AppError } from "./core/error/app-error.js";
4
4
  import { APP_ERROR_CODES } from "./core/error/app-error.types.js";
5
- import { OpenAIProvider } from "./services/text-generation/provider/openai-provider.js";
5
+ import { GoogleAIProvider } from "./services/content-generation/provider/google-provider.js";
6
+ import { OpenAIProvider } from "./services/content-generation/provider/openai-provider.js";
6
7
  const DEFAULT_API_KEY = "not-needed";
7
8
  const PROVIDER_BASE_URLS = {
8
9
  [LLM_PROVIDER_TYPE.GOOGLE]: "https://generativelanguage.googleapis.com/v1beta/openai",
@@ -31,6 +32,16 @@ class Container {
31
32
  return new OpenAIProvider({ baseUrl, apiKey: env.TEXT_GENERATION_API_KEY ?? DEFAULT_API_KEY });
32
33
  });
33
34
  }
35
+ get audioGenProvider() {
36
+ return this.singleton("audioGen", () => {
37
+ const provider = env.AUDIO_GENERATION_PROVIDER;
38
+ const apiKey = env.AUDIO_GENERATION_API_KEY;
39
+ if (provider !== LLM_PROVIDER_TYPE.GOOGLE || !apiKey) {
40
+ throw new AppError("Audio generation provider not available", APP_ERROR_CODES.NOT_SUPPORTED);
41
+ }
42
+ return new GoogleAIProvider(apiKey);
43
+ });
44
+ }
34
45
  get feedTextGenProvider() {
35
46
  return this.singleton("feedTextGen", () => {
36
47
  const provider = env.FEED_TEXT_GENERATION_PROVIDER;
@@ -28,6 +28,7 @@ export const APP_ERROR_CODES = {
28
28
  CIRCULAR_MEMBERSHIP: "circular_membership",
29
29
  LAST_CIRCLE_MEMBERSHIP: "last_circle_membership",
30
30
  TEXT_GEN_PROVIDER_ERROR: "text_gen_provider_error",
31
+ AUDIO_GEN_NO_DATA: "audio_gen_no_data",
31
32
  FEED_ERROR: "feed_error",
32
33
  FEED_FETCH_ERROR: "feed_fetch_error",
33
34
  FEED_INVALID: "feed_invalid",
@@ -4,8 +4,8 @@ import { QUERY_USER_PROMPT, SUMMARY_SYSTEM_PROMPT, SUMMARY_USER_PROMPT } from ".
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { STORE_QUERY_OPERATORS } from "../core/store/object-store.types.js";
6
6
  import { generateId } from "../utils/id-utils.js";
7
- import { MessageRoles } from "../services/text-generation/text-generation-service.types.js";
8
- import { streamTextGeneration } from "../services/text-generation/text-generation-service.js";
7
+ import { MessageRoles } from "../services/content-generation/content-generation.types.js";
8
+ import { textGeneration } from "../services/content-generation/text-generation-service.js";
9
9
  import { env } from "../config/env.js";
10
10
  import { createMessageContentFromTemplate, createModelMessage } from "../utils/message-template.js";
11
11
  import { container } from "../container.js";
@@ -488,14 +488,8 @@ export class SimplyFeedManager extends EventBus {
488
488
  return undefined;
489
489
  }
490
490
  async generateResponse(prompt, options) {
491
- const stream = streamTextGeneration(env.FEED_TEXT_GENERATION_MODEL ?? "default", [createModelMessage(prompt, MessageRoles.user)], { ...options, provider: container.feedTextGenProvider });
492
- let result = "";
493
- for await (const event of stream) {
494
- if (event.type === "messagedone") {
495
- result = event.content;
496
- }
497
- }
498
- return result;
491
+ const response = await textGeneration(env.FEED_TEXT_GENERATION_MODEL ?? "default", [createModelMessage(prompt, MessageRoles.user)], { ...options, provider: container.feedTextGenProvider });
492
+ return response.message.content ?? "";
499
493
  }
500
494
  createFeed(feedUrl) {
501
495
  return {
@@ -1,4 +1,4 @@
1
- import { MessageRoles } from "../services/text-generation/text-generation-service.types.js";
1
+ import { MessageRoles } from "../services/content-generation/content-generation.types.js";
2
2
  export const SUMMARY_SYSTEM_PROMPT = {
3
3
  role: MessageRoles.system,
4
4
  content: [
@@ -1 +1 @@
1
- import{n as e,t}from"./path-yo4Xej8w.js";import{Ct as n,St as r,_t as i,bt as a,dt as o,ft as s,ht as c,mt as l,pt as u,vt as d,xt as f,yt as p}from"./index-B_bqUrIc.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,i,a,o,s){var c=e-n,l=t-i,u=(s?o:-o)/r(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=i+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=a-o,w=m*_-g*h,T=(x<0?-1:1)*r(d(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(a/C-1),y11:D*(a/C-1)}}function x(){var d=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+d.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-i,_=T.apply(this,arguments)-i,v=o(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>n-1e-12)D.moveTo(h*c(g),h*f(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*c(_),m*f(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):r(m*m+h*h)),R=p(o(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=u(L/m*f(I)),W=u(L/h*f(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*c(A),K=h*f(A),q=m*c(N),J=m*f(N);if(R>1e-12){var Y=h*c(j),X=h*f(j),Z=m*c(M),Q=m*f(M),$;if(v<a)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/f(s((ee*ne+te*re)/(r(ee*ee+te*te)*r(ne*ne+re*re)))/2),ae=r($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,l(V.y01,V.x01),l(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,l(V.y01,V.x01),l(V.y11,V.x11),!k),D.arc(0,0,h,l(V.cy+V.y11,V.cx+V.x11),l(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,l(H.y11,H.x11),l(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,l(V.y01,V.x01),l(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,l(V.y01,V.x01),l(V.y11,V.x11),!k),D.arc(0,0,m,l(V.cy+V.y11,V.cx+V.x11),l(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,l(H.y11,H.x11),l(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+d.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-a/2;return[c(t)*e,f(t)*e]},k.innerRadius=function(t){return arguments.length?(d=typeof t==`function`?t:e(+t),k):d},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-yo4Xej8w.js";import{Ct as n,St as r,_t as i,bt as a,dt as o,ft as s,ht as c,mt as l,pt as u,vt as d,xt as f,yt as p}from"./index-DxDvQqD3.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,i,a,o,s){var c=e-n,l=t-i,u=(s?o:-o)/r(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=i+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=a-o,w=m*_-g*h,T=(x<0?-1:1)*r(d(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(a/C-1),y11:D*(a/C-1)}}function x(){var d=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+d.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-i,_=T.apply(this,arguments)-i,v=o(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>n-1e-12)D.moveTo(h*c(g),h*f(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*c(_),m*f(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):r(m*m+h*h)),R=p(o(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=u(L/m*f(I)),W=u(L/h*f(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*c(A),K=h*f(A),q=m*c(N),J=m*f(N);if(R>1e-12){var Y=h*c(j),X=h*f(j),Z=m*c(M),Q=m*f(M),$;if(v<a)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/f(s((ee*ne+te*re)/(r(ee*ee+te*te)*r(ne*ne+re*re)))/2),ae=r($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,l(V.y01,V.x01),l(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,l(V.y01,V.x01),l(V.y11,V.x11),!k),D.arc(0,0,h,l(V.cy+V.y11,V.cx+V.x11),l(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,l(H.y11,H.x11),l(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,l(V.y01,V.x01),l(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,l(V.y01,V.x01),l(V.y11,V.x11),!k),D.arc(0,0,m,l(V.cy+V.y11,V.cx+V.x11),l(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,l(H.y11,H.x11),l(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+d.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-a/2;return[c(t)*e,f(t)*e]},k.innerRadius=function(t){return arguments.length?(d=typeof t==`function`?t:e(+t),k):d},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -0,0 +1 @@
1
+ import"./chunk-K5T4RW27-02-aUFo6.js";import{n as e}from"./chunk-7N4EOEYR-BamzAjP6.js";export{e as createArchitectureServices};