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.
- package/README.md +35 -1
- package/dist/_shared/index.js +2 -1
- package/dist/_shared/schemas/agent-message.schema.js +9 -0
- package/dist/_shared/schemas/agent.schema.js +8 -1
- package/dist/_shared/schemas/system-capabilities.schema.js +12 -0
- package/dist/bootstrap.js +3 -1
- package/dist/config/constants.js +4 -0
- package/dist/config/env.js +3 -0
- package/dist/container.js +12 -1
- package/dist/core/error/app-error.types.js +1 -0
- package/dist/feed/simply-feed-manager.js +4 -10
- package/dist/feed/system-prompts.js +1 -1
- package/dist/public/assets/{arc-DxFSFBJN.js → arc-CWcgwC0V.js} +1 -1
- package/dist/public/assets/architecture-YZFGNWBL-ezfTnWVi.js +1 -0
- package/dist/public/assets/{architectureDiagram-Q4EWVU46-SeuiKVbG.js → architectureDiagram-Q4EWVU46-Hzz_E5-8.js} +1 -1
- package/dist/public/assets/{blockDiagram-DXYQGD6D-CTRl4_t2.js → blockDiagram-DXYQGD6D-cJiNsaLA.js} +1 -1
- package/dist/public/assets/{c4Diagram-AHTNJAMY-DtCkuX8V.js → c4Diagram-AHTNJAMY-C8-_3XAz.js} +1 -1
- package/dist/public/assets/channel-DbM4kSP-.js +1 -0
- package/dist/public/assets/{chunk-2KRD3SAO-BTS8lb2g.js → chunk-2KRD3SAO-hNrE6Fhb.js} +1 -1
- package/dist/public/assets/{chunk-4BX2VUAB-DfLhnyVw.js → chunk-4BX2VUAB-CyuizFOU.js} +1 -1
- package/dist/public/assets/{chunk-4TB4RGXK-BRtZK7pt.js → chunk-4TB4RGXK-Dps1Wnxb.js} +1 -1
- package/dist/public/assets/{chunk-55IACEB6-DBUSiHt1.js → chunk-55IACEB6-D4EeyXif.js} +1 -1
- package/dist/public/assets/{chunk-67CJDMHE-GP0b3w7n.js → chunk-67CJDMHE-BJgwVRSb.js} +1 -1
- package/dist/public/assets/{chunk-7N4EOEYR-xVTzZdKC.js → chunk-7N4EOEYR-BamzAjP6.js} +1 -1
- package/dist/public/assets/{chunk-AA7GKIK3-B31jjRaG.js → chunk-AA7GKIK3-4A2PAbvw.js} +1 -1
- package/dist/public/assets/{chunk-CIAEETIT-CUyHWZ1V.js → chunk-CIAEETIT-Cdrfoz9N.js} +1 -1
- package/dist/public/assets/{chunk-EDXVE4YY-IQR6c3lv.js → chunk-EDXVE4YY-pw0Fyb74.js} +1 -1
- package/dist/public/assets/{chunk-FMBD7UC4-Deh5BGpu.js → chunk-FMBD7UC4-B73wYTDE.js} +1 -1
- package/dist/public/assets/{chunk-FOC6F5B3-CNw7fLM4.js → chunk-FOC6F5B3-C-k80GjN.js} +1 -1
- package/dist/public/assets/{chunk-K5T4RW27-fHwoBfBl.js → chunk-K5T4RW27-02-aUFo6.js} +1 -1
- package/dist/public/assets/{chunk-KGLVRYIC-BAs43SfF.js → chunk-KGLVRYIC-gnUUZi9X.js} +1 -1
- package/dist/public/assets/{chunk-LIHQZDEY-Dr1ywMhr.js → chunk-LIHQZDEY-ClkZaJX6.js} +1 -1
- package/dist/public/assets/{chunk-ORNJ4GCN-Yd_u12Gn.js → chunk-ORNJ4GCN-Co01V-Ft.js} +1 -1
- package/dist/public/assets/{chunk-OYMX7WX6-7vDFaji6.js → chunk-OYMX7WX6-DDDB98j6.js} +1 -1
- package/dist/public/assets/chunk-QZHKN3VN-DesUjsTI.js +1 -0
- package/dist/public/assets/{chunk-YZCP3GAM-DfVWqRKe.js → chunk-YZCP3GAM-DG5u50aq.js} +1 -1
- package/dist/public/assets/classDiagram-6PBFFD2Q-Zhl3bAAO.js +1 -0
- package/dist/public/assets/classDiagram-v2-HSJHXN6E-DJo0qw9K.js +1 -0
- package/dist/public/assets/clone-AsOJeT1y.js +1 -0
- package/dist/public/assets/{cose-bilkent-S5V4N54A-BpOlI4lr.js → cose-bilkent-S5V4N54A-BeQ2fw6I.js} +1 -1
- package/dist/public/assets/{dagre-Pkmo7x8f.js → dagre-BOQpPiEO.js} +1 -1
- package/dist/public/assets/{dagre-KV5264BT-DX_Z3fVj.js → dagre-KV5264BT-D59IU6Kl.js} +1 -1
- package/dist/public/assets/{diagram-5BDNPKRD-CL7YnZXc.js → diagram-5BDNPKRD-DjSt96Vd.js} +1 -1
- package/dist/public/assets/{diagram-G4DWMVQ6-BSLFlB6_.js → diagram-G4DWMVQ6-BIUmVPmV.js} +1 -1
- package/dist/public/assets/{diagram-MMDJMWI5-DkQopSrS.js → diagram-MMDJMWI5-CwYCJc8U.js} +1 -1
- package/dist/public/assets/{diagram-TYMM5635-RcK4oCav.js → diagram-TYMM5635-FcLyspOI.js} +1 -1
- package/dist/public/assets/{erDiagram-SMLLAGMA-CmIUK6Js.js → erDiagram-SMLLAGMA-BrrsxNSv.js} +1 -1
- package/dist/public/assets/{flatten-BoEv3EhA.js → flatten-DahVKBbC.js} +1 -1
- package/dist/public/assets/{flowDiagram-DWJPFMVM-DgEKurz-.js → flowDiagram-DWJPFMVM-DRY3NPE7.js} +1 -1
- package/dist/public/assets/{ganttDiagram-T4ZO3ILL-BnKfonrP.js → ganttDiagram-T4ZO3ILL-D3zgaTy9.js} +1 -1
- package/dist/public/assets/gitGraph-7Q5UKJZL-DYK5FwuK.js +1 -0
- package/dist/public/assets/{gitGraphDiagram-UUTBAWPF-Oq9xmLSI.js → gitGraphDiagram-UUTBAWPF-zg2nx9lJ.js} +1 -1
- package/dist/public/assets/{graphlib-BjZxhnO_.js → graphlib-D8pGHa62.js} +1 -1
- package/dist/public/assets/index-CfsAB1GR.css +1 -0
- package/dist/public/assets/index-DxDvQqD3.js +733 -0
- package/dist/public/assets/info-OMHHGYJF-L7JaN6uh.js +1 -0
- package/dist/public/assets/{infoDiagram-42DDH7IO-CcXFHRFc.js → infoDiagram-42DDH7IO-CRoYGVce.js} +1 -1
- package/dist/public/assets/{ishikawaDiagram-UXIWVN3A-C1JcEJH1.js → ishikawaDiagram-UXIWVN3A-Cxpb00_M.js} +1 -1
- package/dist/public/assets/{journeyDiagram-VCZTEJTY-CEU58ybi.js → journeyDiagram-VCZTEJTY-BqIFQj3F.js} +1 -1
- package/dist/public/assets/{kanban-definition-6JOO6SKY-DbXrWEzC.js → kanban-definition-6JOO6SKY-CbaAd8Pt.js} +1 -1
- package/dist/public/assets/{linear-CioACqZF.js → linear-Bk4AIQFb.js} +1 -1
- package/dist/public/assets/{mermaid-parser.core-qXHqd0OW.js → mermaid-parser.core-B6CvLttS.js} +2 -2
- package/dist/public/assets/{mindmap-definition-QFDTVHPH-CoKYgnWb.js → mindmap-definition-QFDTVHPH-CHTNRZyG.js} +1 -1
- package/dist/public/assets/packet-4T2RLAQJ-DBSkkBZ5.js +1 -0
- package/dist/public/assets/pie-ZZUOXDRM-C4UhUDir.js +1 -0
- package/dist/public/assets/{pieDiagram-DEJITSTG-CfK8-F1N.js → pieDiagram-DEJITSTG-CjrUVyNR.js} +1 -1
- package/dist/public/assets/{quadrantDiagram-34T5L4WZ-D5qJo5aV.js → quadrantDiagram-34T5L4WZ-8a518uXc.js} +1 -1
- package/dist/public/assets/radar-PYXPWWZC-DFkf3JQp.js +1 -0
- package/dist/public/assets/{reduce-C04LiHRL.js → reduce-DbfHsVRc.js} +1 -1
- package/dist/public/assets/{requirementDiagram-MS252O5E-Bc6o-V4Q.js → requirementDiagram-MS252O5E-BWd5xTIp.js} +1 -1
- package/dist/public/assets/{sankeyDiagram-XADWPNL6--5dAk6WT.js → sankeyDiagram-XADWPNL6-D35UAmHI.js} +1 -1
- package/dist/public/assets/{sequenceDiagram-FGHM5R23-BJAb16ie.js → sequenceDiagram-FGHM5R23-B2t5aLiU.js} +1 -1
- package/dist/public/assets/{stateDiagram-FHFEXIEX-CNwxRykA.js → stateDiagram-FHFEXIEX-BQhhAjm9.js} +1 -1
- package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-D2D1BRlV.js +1 -0
- package/dist/public/assets/{timeline-definition-GMOUNBTQ-BgtW64Qj.js → timeline-definition-GMOUNBTQ-q-ZFF7ju.js} +1 -1
- package/dist/public/assets/treeView-SZITEDCU-D2ywS8Aa.js +1 -0
- package/dist/public/assets/treemap-W4RFUUIX-BaBddW3r.js +1 -0
- package/dist/public/assets/{vennDiagram-DHZGUBPP-Dcvu5q5a.js → vennDiagram-DHZGUBPP-CxS7J9vF.js} +1 -1
- package/dist/public/assets/wardley-RL74JXVD-CgfeWrGf.js +1 -0
- package/dist/public/assets/{wardleyDiagram-NUSXRM2D-B6Y65qN1.js → wardleyDiagram-NUSXRM2D-D3oQBxHb.js} +1 -1
- package/dist/public/assets/{xychartDiagram-5P7HB3ND-DOyuE388.js → xychartDiagram-5P7HB3ND-CcB-1rnM.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/routes/agent.routes.js +16 -0
- package/dist/routes/generation.routes.js +1 -1
- package/dist/routes/system.routes.js +34 -0
- package/dist/routines/inter-agent-task-routine.js +1 -1
- package/dist/routines/task-dispatch-routine.js +1 -1
- package/dist/runner/agent-runner.js +1 -1
- package/dist/server/error-handler.js +1 -0
- package/dist/services/content-generation/audio-generation-service.js +27 -0
- package/dist/services/{text-generation/text-generation-service.types.js → content-generation/content-generation.types.js} +10 -1
- package/dist/services/{text-generation → content-generation}/md-generation.js +1 -1
- package/dist/services/content-generation/provider/google-provider.js +382 -0
- package/dist/services/{text-generation → content-generation}/provider/openai-provider.js +77 -22
- package/dist/services/{text-generation → content-generation}/text-generation-service.js +8 -1
- package/dist/services/runtime/agent-runtime-manager.js +28 -0
- package/dist/services/session/session-manager.js +110 -0
- package/package.json +2 -1
- package/dist/public/assets/architecture-YZFGNWBL-BtzsnXeQ.js +0 -1
- package/dist/public/assets/channel-BjaSnD0u.js +0 -1
- package/dist/public/assets/chunk-QZHKN3VN-DtO085mY.js +0 -1
- package/dist/public/assets/classDiagram-6PBFFD2Q-ZUKbNKdt.js +0 -1
- package/dist/public/assets/classDiagram-v2-HSJHXN6E-BjirQ1z-.js +0 -1
- package/dist/public/assets/clone-DjOI7n66.js +0 -1
- package/dist/public/assets/gitGraph-7Q5UKJZL-BlvjQtWL.js +0 -1
- package/dist/public/assets/index-B_bqUrIc.js +0 -733
- package/dist/public/assets/index-BntlXc11.css +0 -1
- package/dist/public/assets/info-OMHHGYJF-C4zUowWY.js +0 -1
- package/dist/public/assets/packet-4T2RLAQJ-Bgsrkq__.js +0 -1
- package/dist/public/assets/pie-ZZUOXDRM-avqE6X4o.js +0 -1
- package/dist/public/assets/radar-PYXPWWZC-CH83AdGy.js +0 -1
- package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-swYvCAsp.js +0 -1
- package/dist/public/assets/treeView-SZITEDCU-BoJpbPQz.js +0 -1
- package/dist/public/assets/treemap-W4RFUUIX-D-gpApbj.js +0 -1
- 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
|
-
|
|
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
|
|
package/dist/_shared/index.js
CHANGED
|
@@ -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);
|
package/dist/config/constants.js
CHANGED
|
@@ -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 */
|
package/dist/config/env.js
CHANGED
|
@@ -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 {
|
|
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/
|
|
8
|
-
import {
|
|
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
|
|
492
|
-
|
|
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 +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-
|
|
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};
|