swarmdo 1.54.1 → 1.58.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/helpers/statusline.cjs +10 -3
- package/README.md +4 -3
- package/package.json +1 -1
- package/v3/@swarmdo/cli/dist/src/command-usage/usage.d.ts +74 -0
- package/v3/@swarmdo/cli/dist/src/command-usage/usage.js +161 -0
- package/v3/@swarmdo/cli/dist/src/commands/commands.d.ts +19 -0
- package/v3/@swarmdo/cli/dist/src/commands/commands.js +107 -0
- package/v3/@swarmdo/cli/dist/src/commands/index.js +7 -3
- package/v3/@swarmdo/cli/dist/src/commands/usage.js +57 -1
- package/v3/@swarmdo/cli/dist/src/comms/store.d.ts +11 -1
- package/v3/@swarmdo/cli/dist/src/comms/store.js +16 -2
- package/v3/@swarmdo/cli/dist/src/init/statusline-generator.js +9 -2
- package/v3/@swarmdo/cli/dist/src/integrations/integrations.js +19 -8
- package/v3/@swarmdo/cli/dist/src/mcp-tools/comms-tools.js +4 -4
- package/v3/@swarmdo/cli/dist/src/usage/transcript-friction.d.ts +77 -0
- package/v3/@swarmdo/cli/dist/src/usage/transcript-friction.js +151 -0
- package/v3/@swarmdo/cli/package.json +1 -1
- package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
- package/v3/@swarmdo/codex/dist/cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
- package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
- package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +4 -1
- package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
- package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
- package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
- package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
- package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
- package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
- package/v3/@swarmdo/shared/dist/mcp/transport/http.js +8 -1
- package/.claude/settings.local.json +0 -7
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +0 -138
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +0 -418
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +0 -15
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +0 -240
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +0 -7
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +0 -508
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +0 -54
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +0 -46
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +0 -18
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +0 -28
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +0 -5
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +0 -35
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +0 -11
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +0 -9
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +0 -5
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +0 -12
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +0 -44
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +0 -117
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +0 -70
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +0 -194
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +0 -69
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +0 -139
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +0 -34
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +0 -101
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +0 -10
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +0 -10
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +0 -64
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +0 -70
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +0 -44
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +0 -79
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +0 -37
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +0 -39
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +0 -67
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +0 -58
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +0 -45
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +0 -63
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +0 -26
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +0 -17
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +0 -51
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +0 -110
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +0 -13
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +0 -25
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +0 -11
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +0 -11
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +0 -27
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +0 -6
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +0 -6
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +0 -41
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +0 -64
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +0 -8
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +0 -703
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +0 -23
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +0 -239
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +0 -17
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +0 -42
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +0 -18
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +0 -45
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +0 -50
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +0 -47
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +0 -17
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +0 -40
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +0 -18
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +0 -51
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +0 -214
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +0 -595
- package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +0 -76
- package/v3/@swarmdo/testing/dist/fixtures/agents.js +0 -158
- package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +0 -157
- package/v3/@swarmdo/testing/dist/fixtures/configurations.js +0 -337
- package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/fixtures/index.js +0 -17
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +0 -329
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +0 -714
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +0 -159
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +0 -262
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +0 -290
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +0 -547
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +0 -289
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +0 -534
- package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +0 -106
- package/v3/@swarmdo/testing/dist/fixtures/tasks.js +0 -229
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +0 -213
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +0 -435
- package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +0 -135
- package/v3/@swarmdo/testing/dist/helpers/assertions.js +0 -217
- package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +0 -96
- package/v3/@swarmdo/testing/dist/helpers/create-mock.js +0 -164
- package/v3/@swarmdo/testing/dist/helpers/index.d.ts +0 -14
- package/v3/@swarmdo/testing/dist/helpers/index.js +0 -22
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +0 -323
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +0 -350
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +0 -271
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +0 -446
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +0 -142
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +0 -205
- package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +0 -190
- package/v3/@swarmdo/testing/dist/helpers/test-application.js +0 -138
- package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +0 -274
- package/v3/@swarmdo/testing/dist/helpers/test-utils.js +0 -456
- package/v3/@swarmdo/testing/dist/index.d.ts +0 -42
- package/v3/@swarmdo/testing/dist/index.js +0 -66
- package/v3/@swarmdo/testing/dist/mocks/index.d.ts +0 -8
- package/v3/@swarmdo/testing/dist/mocks/index.js +0 -10
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +0 -206
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +0 -575
- package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +0 -287
- package/v3/@swarmdo/testing/dist/mocks/mock-services.js +0 -563
- package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +0 -109
- package/v3/@swarmdo/testing/dist/regression/api-contract.js +0 -374
- package/v3/@swarmdo/testing/dist/regression/index.d.ts +0 -18
- package/v3/@swarmdo/testing/dist/regression/index.js +0 -18
- package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +0 -67
- package/v3/@swarmdo/testing/dist/regression/integration-regression.js +0 -334
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +0 -106
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +0 -268
- package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +0 -124
- package/v3/@swarmdo/testing/dist/regression/regression-runner.js +0 -227
- package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +0 -73
- package/v3/@swarmdo/testing/dist/regression/security-regression.js +0 -258
- package/v3/@swarmdo/testing/dist/setup.d.ts +0 -43
- package/v3/@swarmdo/testing/dist/setup.js +0 -91
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +0 -433
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +0 -352
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +0 -206
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +0 -839
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +0 -428
- package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +0 -38
- package/v3/@swarmdo/testing/dist/v2-compat/index.js +0 -41
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +0 -419
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +0 -34
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.js +0 -372
|
@@ -166,7 +166,7 @@ function resolveCliBin() {
|
|
|
166
166
|
];
|
|
167
167
|
try {
|
|
168
168
|
const binDir = path.dirname(process.execPath);
|
|
169
|
-
const globalModuleDirs = [path.join(binDir, '..', 'lib', 'node_modules'), path.join(binDir, 'node_modules')];
|
|
169
|
+
const globalModuleDirs = [path.join(binDir, '..', 'lib', 'node_modules'), path.join(binDir, 'node_modules'), '/opt/homebrew/lib/node_modules', '/usr/local/lib/node_modules'];
|
|
170
170
|
for (const prefix of [process.env.npm_config_prefix, process.env.PREFIX, path.join(home, '.npm-global')]) {
|
|
171
171
|
if (prefix) globalModuleDirs.push(path.join(prefix, 'lib', 'node_modules'));
|
|
172
172
|
}
|
|
@@ -209,6 +209,13 @@ function writeCache(data) {
|
|
|
209
209
|
* and only counted ADRs in v3/implementation/adrs/ (missed v3/docs/adr/).
|
|
210
210
|
*/
|
|
211
211
|
function getStatuslineData() {
|
|
212
|
+
// SWARMDO_STATUSLINE_NO_CLI: skip the CLI-delegation fork and render from local
|
|
213
|
+
// reads + stdin only. A cold render otherwise forks the hooks-statusline CLI
|
|
214
|
+
// (now more reachable via the global-node_modules probes below), and that fork
|
|
215
|
+
// can disturb the stdin cost payload; skipping it keeps renders fast, hermetic,
|
|
216
|
+
// and subprocess-free. Set by the statusline tests; usable by anyone who wants
|
|
217
|
+
// a no-fork statusline.
|
|
218
|
+
if (process.env.SWARMDO_STATUSLINE_NO_CLI) return buildLocalFallback();
|
|
212
219
|
const cached = readCache();
|
|
213
220
|
if (cached) return cached;
|
|
214
221
|
|
|
@@ -592,7 +599,7 @@ function getPkgVersion() {
|
|
|
592
599
|
// (bin/node_modules) layouts.
|
|
593
600
|
try {
|
|
594
601
|
const binDir = path.dirname(process.execPath);
|
|
595
|
-
const globalModuleDirs = [path.join(binDir, '..', 'lib', 'node_modules'), path.join(binDir, 'node_modules')];
|
|
602
|
+
const globalModuleDirs = [path.join(binDir, '..', 'lib', 'node_modules'), path.join(binDir, 'node_modules'), '/opt/homebrew/lib/node_modules', '/usr/local/lib/node_modules'];
|
|
596
603
|
// #2221 follow-up: a custom npm prefix (e.g. ~/.npm-global) is decoupled from
|
|
597
604
|
// the node binary location, so the binDir-derived probes above all miss. Also
|
|
598
605
|
// probe the npm prefix from the environment and the common ~/.npm-global default.
|
|
@@ -63,23 +63,34 @@ export function crossAgentAgentsMd() {
|
|
|
63
63
|
## What swarmdo gives you
|
|
64
64
|
|
|
65
65
|
This project is wired to **swarmdo** — agent orchestration with persistent
|
|
66
|
-
vector memory, swarm coordination, and 300+ MCP tools.
|
|
66
|
+
vector memory, swarm coordination, cross-agent messaging, and 300+ MCP tools.
|
|
67
|
+
Everything below works the same from Codex, Copilot, pi, or a plain shell —
|
|
68
|
+
not just Claude Code.
|
|
67
69
|
|
|
68
|
-
- **MCP server**: \`swarmdo mcp start\` (stdio
|
|
69
|
-
\`swarmdo integrations install <your-cli>\` wires
|
|
70
|
-
\`memory_search\`, \`memory_store\`, \`swarm_init\`,
|
|
70
|
+
- **MCP server**: \`swarmdo mcp start\` (stdio; serves every tool by default).
|
|
71
|
+
If your CLI supports MCP, \`swarmdo integrations install <your-cli>\` wires
|
|
72
|
+
it. Key tools: \`memory_search\`, \`memory_store\`, \`swarm_init\`,
|
|
73
|
+
\`agent_spawn\`, \`comms_send\` / \`comms_inbox\` (message other agents),
|
|
74
|
+
\`hotspots\` / \`coupling\` / \`ownership\` (git-history analysis).
|
|
71
75
|
- **CLI**: \`npx swarmdo@latest <command>\` — \`memory search -q "topic"\`,
|
|
72
|
-
\`
|
|
76
|
+
\`comms send\` / \`comms inbox\`, \`standup\`, \`hotspots\`, \`coupling\`,
|
|
77
|
+
\`ownership\`, \`hidden-coupling\`, \`task\`, \`hud\`.
|
|
73
78
|
|
|
74
79
|
## Working agreement (any agent)
|
|
75
80
|
|
|
76
81
|
1. **Search memory BEFORE starting**: \`memory_search(query="task keywords")\`
|
|
77
82
|
— patterns with score > 0.7 are load-bearing precedent.
|
|
78
|
-
2. **
|
|
83
|
+
2. **Coordinate through the cross-tool mailbox**: announce the files you're
|
|
84
|
+
about to change with \`comms_send(to="all", message="…")\` and check
|
|
85
|
+
\`comms_inbox\` before overlapping work. Non-Claude agents: set a stable
|
|
86
|
+
identity with \`export SWARMDO_AGENT=<your-name>\` (or pass \`from\` /
|
|
87
|
+
\`--self\`) so replies address you — without it every agent on this host
|
|
88
|
+
shares the hostname identity.
|
|
89
|
+
3. **You are the executor** — swarmdo coordinates and remembers; it never
|
|
79
90
|
writes your code for you.
|
|
80
|
-
|
|
91
|
+
4. **Store what worked AFTER success**:
|
|
81
92
|
\`memory_store(key="pattern-…", value="what worked", namespace="patterns")\`.
|
|
82
|
-
|
|
93
|
+
5. Claude Code users: the same surfaces are namespaced under \`/sDo:\`
|
|
83
94
|
commands and \`/sdo-\` skills.
|
|
84
95
|
|
|
85
96
|
## Do not
|
|
@@ -12,7 +12,7 @@ import { loadMailbox, saveMailbox, resolveSelf, newMessageId, RETENTION } from '
|
|
|
12
12
|
export const commsTools = [
|
|
13
13
|
{
|
|
14
14
|
name: 'comms_send',
|
|
15
|
-
description: 'Send a message to another Claude Code
|
|
15
|
+
description: 'Send a message to another agent session — Claude Code, Codex, Copilot, pi, or any tool on the same repo (a cross-session/cross-tool mailbox). Address "all" to broadcast to every session. Use for multi-agent "multiplayer" coordination; delivery is via a shared file, not the network.',
|
|
16
16
|
category: 'comms',
|
|
17
17
|
inputSchema: {
|
|
18
18
|
type: 'object',
|
|
@@ -20,7 +20,7 @@ export const commsTools = [
|
|
|
20
20
|
to: { type: 'string', description: 'Recipient session name, or "all" to broadcast' },
|
|
21
21
|
message: { type: 'string', description: 'Message body' },
|
|
22
22
|
subject: { type: 'string', description: 'Optional subject line' },
|
|
23
|
-
from: { type: 'string', description: 'Sender name
|
|
23
|
+
from: { type: 'string', description: 'Sender name. Default: this session ($SWARMDO_SESSION, else $SWARMDO_AGENT, else hostname). Non-Claude agents should pass this (or export $SWARMDO_AGENT) so replies address them, not the shared hostname.' },
|
|
24
24
|
},
|
|
25
25
|
required: ['to', 'message'],
|
|
26
26
|
},
|
|
@@ -49,12 +49,12 @@ export const commsTools = [
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
name: 'comms_inbox',
|
|
52
|
-
description: 'List messages other sessions have sent to this
|
|
52
|
+
description: 'List messages other agent sessions (Claude Code, Codex, Copilot, pi, …) have sent to this one — a cross-session/cross-tool mailbox — newest first. Includes "all" broadcasts. Set markRead to acknowledge them.',
|
|
53
53
|
category: 'comms',
|
|
54
54
|
inputSchema: {
|
|
55
55
|
type: 'object',
|
|
56
56
|
properties: {
|
|
57
|
-
to: { type: 'string', description: 'Whose inbox (default: this session)' },
|
|
57
|
+
to: { type: 'string', description: 'Whose inbox (default: this session — $SWARMDO_SESSION, else $SWARMDO_AGENT, else hostname)' },
|
|
58
58
|
unreadOnly: { type: 'boolean', description: 'Only unread messages' },
|
|
59
59
|
from: { type: 'string', description: 'Only messages from this sender' },
|
|
60
60
|
since: { type: 'string', description: 'Only messages after this ISO-8601 timestamp' },
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transcript-friction.ts — interruption + error-category analytics over the same
|
|
3
|
+
* Claude Code transcripts the `usage` command already reads. `usage errors`
|
|
4
|
+
* answers "which tools fail"; this answers "where does Claude waste my turns" —
|
|
5
|
+
* how often you interrupt it (ESC mid-turn), which tool was running when you did,
|
|
6
|
+
* and what KIND of errors dominate (NotFound/Permission/Timeout/Network/Syntax).
|
|
7
|
+
* The interruption axis + human-meaningful error categories are the sniffly
|
|
8
|
+
* (chiphuyen, 1.2k★) headline signals `usage errors` left on the table (#102).
|
|
9
|
+
*
|
|
10
|
+
* The fold is pure and unit-tested; only collectFriction touches the filesystem.
|
|
11
|
+
* Reuses blockText / ParsedLine (transcript-errors) + the transcript plumbing.
|
|
12
|
+
*/
|
|
13
|
+
import { type ParsedLine } from './transcript-errors.js';
|
|
14
|
+
export type ErrorCategory = 'NotFound' | 'Permission' | 'Timeout' | 'Network' | 'Syntax' | 'Other';
|
|
15
|
+
export declare const ERROR_CATEGORIES: ErrorCategory[];
|
|
16
|
+
export interface ToolInterruptions {
|
|
17
|
+
/** tool name that was running when interrupted, or '(idle)' when none was */
|
|
18
|
+
tool: string;
|
|
19
|
+
interruptions: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CategoryShare {
|
|
22
|
+
category: ErrorCategory;
|
|
23
|
+
count: number;
|
|
24
|
+
/** count / totalErrors, 0..1 (0 when no errors) */
|
|
25
|
+
share: number;
|
|
26
|
+
}
|
|
27
|
+
export interface FrictionReport {
|
|
28
|
+
interruptions: number;
|
|
29
|
+
assistantTurns: number;
|
|
30
|
+
/** interruptions / assistantTurns, 0 when no turns (never divides by zero) */
|
|
31
|
+
interruptionRate: number;
|
|
32
|
+
byTool: ToolInterruptions[];
|
|
33
|
+
categories: CategoryShare[];
|
|
34
|
+
totalErrors: number;
|
|
35
|
+
filesScanned: number;
|
|
36
|
+
}
|
|
37
|
+
/** Bucket used when an interruption happened outside any running tool. */
|
|
38
|
+
export declare const IDLE_CONTEXT = "(idle)";
|
|
39
|
+
/**
|
|
40
|
+
* Does a user-role text block read as an ESC interruption sentinel? Matches the
|
|
41
|
+
* whole family at the START of the text (real transcripts show "[Request
|
|
42
|
+
* interrupted by user]", "… for tool use]", "…]", and bare "Request
|
|
43
|
+
* interrupted") — anchored so an incidental mid-sentence mention doesn't count.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isInterruptionText(text: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Map a tool-error message to a human-meaningful category. Order matters:
|
|
48
|
+
* specific buckets come before the broad Syntax catch so e.g. "no such file"
|
|
49
|
+
* lands in NotFound, not Syntax. Everything unmatched is Other. Pure.
|
|
50
|
+
*/
|
|
51
|
+
export declare function classifyError(raw: string): ErrorCategory;
|
|
52
|
+
export interface FrictionAccum {
|
|
53
|
+
interruptions: number;
|
|
54
|
+
assistantTurns: number;
|
|
55
|
+
byTool: Map<string, number>;
|
|
56
|
+
categories: Map<ErrorCategory, number>;
|
|
57
|
+
totalErrors: number;
|
|
58
|
+
/** open tool_use id → name; cleared on its result, or on an interruption */
|
|
59
|
+
openTools: Map<string, string>;
|
|
60
|
+
/** most recent tool_use name (open or already-resolved); reset per turn on an
|
|
61
|
+
* interruption. Used to attribute a "…for tool use]" sentinel even after the
|
|
62
|
+
* interrupted tool's (often synthetic) result already landed. */
|
|
63
|
+
lastToolName: string | null;
|
|
64
|
+
}
|
|
65
|
+
export declare function newFrictionAccum(): FrictionAccum;
|
|
66
|
+
/** Fold one parsed transcript line into the accumulator. Pure (no fs). */
|
|
67
|
+
export declare function foldFriction(acc: FrictionAccum, line: ParsedLine): void;
|
|
68
|
+
export declare function finalizeFriction(acc: FrictionAccum, filesScanned: number): FrictionReport;
|
|
69
|
+
export interface CollectFrictionOptions {
|
|
70
|
+
dirs?: string[];
|
|
71
|
+
since?: string;
|
|
72
|
+
until?: string;
|
|
73
|
+
}
|
|
74
|
+
/** Walk transcripts and produce the friction report. Malformed lines and
|
|
75
|
+
* unreadable files are skipped, never fatal (same discipline as collectUsage). */
|
|
76
|
+
export declare function collectFriction(opts?: CollectFrictionOptions): FrictionReport;
|
|
77
|
+
//# sourceMappingURL=transcript-friction.d.ts.map
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transcript-friction.ts — interruption + error-category analytics over the same
|
|
3
|
+
* Claude Code transcripts the `usage` command already reads. `usage errors`
|
|
4
|
+
* answers "which tools fail"; this answers "where does Claude waste my turns" —
|
|
5
|
+
* how often you interrupt it (ESC mid-turn), which tool was running when you did,
|
|
6
|
+
* and what KIND of errors dominate (NotFound/Permission/Timeout/Network/Syntax).
|
|
7
|
+
* The interruption axis + human-meaningful error categories are the sniffly
|
|
8
|
+
* (chiphuyen, 1.2k★) headline signals `usage errors` left on the table (#102).
|
|
9
|
+
*
|
|
10
|
+
* The fold is pure and unit-tested; only collectFriction touches the filesystem.
|
|
11
|
+
* Reuses blockText / ParsedLine (transcript-errors) + the transcript plumbing.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import { defaultClaudeProjectDirs, findTranscriptFiles, normalizeDateBound } from './transcript-usage.js';
|
|
15
|
+
import { blockText } from './transcript-errors.js';
|
|
16
|
+
export const ERROR_CATEGORIES = ['NotFound', 'Permission', 'Timeout', 'Network', 'Syntax', 'Other'];
|
|
17
|
+
/** Bucket used when an interruption happened outside any running tool. */
|
|
18
|
+
export const IDLE_CONTEXT = '(idle)';
|
|
19
|
+
/**
|
|
20
|
+
* Does a user-role text block read as an ESC interruption sentinel? Matches the
|
|
21
|
+
* whole family at the START of the text (real transcripts show "[Request
|
|
22
|
+
* interrupted by user]", "… for tool use]", "…]", and bare "Request
|
|
23
|
+
* interrupted") — anchored so an incidental mid-sentence mention doesn't count.
|
|
24
|
+
*/
|
|
25
|
+
export function isInterruptionText(text) {
|
|
26
|
+
return /^\s*\[?\s*request interrupted/i.test(text);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Map a tool-error message to a human-meaningful category. Order matters:
|
|
30
|
+
* specific buckets come before the broad Syntax catch so e.g. "no such file"
|
|
31
|
+
* lands in NotFound, not Syntax. Everything unmatched is Other. Pure.
|
|
32
|
+
*/
|
|
33
|
+
export function classifyError(raw) {
|
|
34
|
+
const s = raw.toLowerCase();
|
|
35
|
+
if (/\bnot found\b|no such file|enoent|does not exist|cannot find|doesn'?t exist|\b404\b/.test(s))
|
|
36
|
+
return 'NotFound';
|
|
37
|
+
if (/permission denied|\beacces\b|\beperm\b|not permitted|unauthori[sz]ed|forbidden|\b403\b/.test(s))
|
|
38
|
+
return 'Permission';
|
|
39
|
+
if (/timed ?out|\betimedout\b|timeout|deadline exceeded/.test(s))
|
|
40
|
+
return 'Timeout';
|
|
41
|
+
if (/econnrefused|econnreset|enotfound|network|socket hang|getaddrinfo|fetch failed|\bdns\b/.test(s))
|
|
42
|
+
return 'Network';
|
|
43
|
+
if (/syntax|parse error|unexpected token|invalid |compil|typeerror|referenceerror|cannot read propert/.test(s))
|
|
44
|
+
return 'Syntax';
|
|
45
|
+
return 'Other';
|
|
46
|
+
}
|
|
47
|
+
export function newFrictionAccum() {
|
|
48
|
+
return { interruptions: 0, assistantTurns: 0, byTool: new Map(), categories: new Map(), totalErrors: 0, openTools: new Map(), lastToolName: null };
|
|
49
|
+
}
|
|
50
|
+
/** Fold one parsed transcript line into the accumulator. Pure (no fs). */
|
|
51
|
+
export function foldFriction(acc, line) {
|
|
52
|
+
const role = line.message?.role;
|
|
53
|
+
if (role === 'assistant')
|
|
54
|
+
acc.assistantTurns++;
|
|
55
|
+
const content = line.message?.content;
|
|
56
|
+
if (!Array.isArray(content))
|
|
57
|
+
return;
|
|
58
|
+
for (const b of content) {
|
|
59
|
+
if (!b || typeof b !== 'object')
|
|
60
|
+
continue;
|
|
61
|
+
if (b.type === 'tool_use' && b.id && b.name) {
|
|
62
|
+
acc.openTools.set(b.id, b.name);
|
|
63
|
+
acc.lastToolName = b.name;
|
|
64
|
+
}
|
|
65
|
+
else if (b.type === 'tool_result') {
|
|
66
|
+
if (b.tool_use_id)
|
|
67
|
+
acc.openTools.delete(b.tool_use_id);
|
|
68
|
+
if (b.is_error) {
|
|
69
|
+
acc.totalErrors++;
|
|
70
|
+
const cat = classifyError(blockText(b.content));
|
|
71
|
+
acc.categories.set(cat, (acc.categories.get(cat) ?? 0) + 1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (b.type === 'text' && role === 'user' && typeof b.text === 'string' && isInterruptionText(b.text)) {
|
|
75
|
+
acc.interruptions++;
|
|
76
|
+
// Attribute to: a still-open tool (interrupted mid-execution) → else, when
|
|
77
|
+
// the sentinel says "for tool use", the last tool used even if its
|
|
78
|
+
// (synthetic) result already landed → else idle.
|
|
79
|
+
const open = [...acc.openTools.values()];
|
|
80
|
+
const tool = open.length > 0
|
|
81
|
+
? open[open.length - 1]
|
|
82
|
+
: /for tool use/i.test(b.text) && acc.lastToolName
|
|
83
|
+
? acc.lastToolName
|
|
84
|
+
: IDLE_CONTEXT;
|
|
85
|
+
acc.byTool.set(tool, (acc.byTool.get(tool) ?? 0) + 1);
|
|
86
|
+
acc.openTools.clear(); // an interrupt ends the pending turn
|
|
87
|
+
acc.lastToolName = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function finalizeFriction(acc, filesScanned) {
|
|
92
|
+
const byTool = [...acc.byTool.entries()]
|
|
93
|
+
.map(([tool, interruptions]) => ({ tool, interruptions }))
|
|
94
|
+
.sort((a, b) => b.interruptions - a.interruptions || a.tool.localeCompare(b.tool));
|
|
95
|
+
const categories = [...acc.categories.entries()]
|
|
96
|
+
.map(([category, count]) => ({ category, count, share: acc.totalErrors > 0 ? count / acc.totalErrors : 0 }))
|
|
97
|
+
.sort((a, b) => b.count - a.count || a.category.localeCompare(b.category));
|
|
98
|
+
return {
|
|
99
|
+
interruptions: acc.interruptions,
|
|
100
|
+
assistantTurns: acc.assistantTurns,
|
|
101
|
+
interruptionRate: acc.assistantTurns > 0 ? acc.interruptions / acc.assistantTurns : 0,
|
|
102
|
+
byTool,
|
|
103
|
+
categories,
|
|
104
|
+
totalErrors: acc.totalErrors,
|
|
105
|
+
filesScanned,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Walk transcripts and produce the friction report. Malformed lines and
|
|
109
|
+
* unreadable files are skipped, never fatal (same discipline as collectUsage). */
|
|
110
|
+
export function collectFriction(opts = {}) {
|
|
111
|
+
const dirs = opts.dirs && opts.dirs.length > 0 ? opts.dirs : defaultClaudeProjectDirs();
|
|
112
|
+
const since = normalizeDateBound(opts.since);
|
|
113
|
+
const until = normalizeDateBound(opts.until);
|
|
114
|
+
const acc = newFrictionAccum();
|
|
115
|
+
let filesScanned = 0;
|
|
116
|
+
for (const dir of dirs) {
|
|
117
|
+
for (const { file } of findTranscriptFiles(dir)) {
|
|
118
|
+
filesScanned++;
|
|
119
|
+
let content;
|
|
120
|
+
try {
|
|
121
|
+
content = fs.readFileSync(file, 'utf8');
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
for (const raw of content.split('\n')) {
|
|
127
|
+
if (!raw.trim())
|
|
128
|
+
continue;
|
|
129
|
+
let line;
|
|
130
|
+
try {
|
|
131
|
+
line = JSON.parse(raw);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (since || until) {
|
|
137
|
+
const day = line.timestamp ? line.timestamp.slice(0, 10) : '';
|
|
138
|
+
if (day) {
|
|
139
|
+
if (since && day < since)
|
|
140
|
+
continue;
|
|
141
|
+
if (until && day > until)
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
foldFriction(acc, line);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return finalizeFriction(acc, filesScanned);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=transcript-friction.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swarmdo/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.58.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Swarmdo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -103,7 +103,7 @@ Storage:
|
|
|
103
103
|
Programmatic use:
|
|
104
104
|
import { JsonMemoryBackend, runMemoryCommand } from '@swarmdo/cli-core';
|
|
105
105
|
|
|
106
|
-
Track progress:
|
|
106
|
+
Track progress: the upstream project (see NOTICE)`);
|
|
107
107
|
process.exit(0);
|
|
108
108
|
}
|
|
109
109
|
console.error(`@swarmdo/cli-core: command "${args[0]}" not yet wired into cli-core.
|
|
File without changes
|
|
File without changes
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Provides real-time progress, metrics, and status information.
|
|
6
6
|
*
|
|
7
7
|
* Format matches the working .claude/statusline.sh output:
|
|
8
|
-
* ▊ Swarmdo V3 ●
|
|
8
|
+
* ▊ Swarmdo V3 ● upstream │ ⎇ v3 │ Opus 4.5
|
|
9
9
|
* ─────────────────────────────────────────────────────
|
|
10
10
|
* 🏗️ DDD Domains [●●●●●] 5/5 ⚡ 1.0x → 2.49x-7.47x
|
|
11
11
|
* 🤖 Swarm ◉ [58/15] 👥 0 🟢 CVE 3/3 💾 22282MB 📂 47% 🧠 10%
|
|
@@ -76,7 +76,7 @@ export declare class StatuslineGenerator {
|
|
|
76
76
|
* This avoids the multi-line collision bug where Claude Code's internal status
|
|
77
77
|
* (written at absolute terminal coordinates ~cols 15-25) bleeds into conversation
|
|
78
78
|
*
|
|
79
|
-
* @see
|
|
79
|
+
* @see the upstream project (see NOTICE)
|
|
80
80
|
*/
|
|
81
81
|
generateSingleLine(): string;
|
|
82
82
|
/**
|
|
@@ -84,7 +84,7 @@ export declare class StatuslineGenerator {
|
|
|
84
84
|
* The collision zone is columns 15-25 on the SECOND-TO-LAST line
|
|
85
85
|
* We restructure output so that line has minimal/no content in that zone
|
|
86
86
|
*
|
|
87
|
-
* @see
|
|
87
|
+
* @see the upstream project (see NOTICE)
|
|
88
88
|
*/
|
|
89
89
|
generateSafeStatusline(): string;
|
|
90
90
|
/**
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Provides real-time progress, metrics, and status information.
|
|
6
6
|
*
|
|
7
7
|
* Format matches the working .claude/statusline.sh output:
|
|
8
|
-
* ▊ Swarmdo V3 ●
|
|
8
|
+
* ▊ Swarmdo V3 ● upstream │ ⎇ v3 │ Opus 4.5
|
|
9
9
|
* ─────────────────────────────────────────────────────
|
|
10
10
|
* 🏗️ DDD Domains [●●●●●] 5/5 ⚡ 1.0x → 2.49x-7.47x
|
|
11
11
|
* 🤖 Swarm ◉ [58/15] 👥 0 🟢 CVE 3/3 💾 22282MB 📂 47% 🧠 10%
|
|
@@ -189,7 +189,7 @@ export class StatuslineGenerator {
|
|
|
189
189
|
* This avoids the multi-line collision bug where Claude Code's internal status
|
|
190
190
|
* (written at absolute terminal coordinates ~cols 15-25) bleeds into conversation
|
|
191
191
|
*
|
|
192
|
-
* @see
|
|
192
|
+
* @see the upstream project (see NOTICE)
|
|
193
193
|
*/
|
|
194
194
|
generateSingleLine() {
|
|
195
195
|
if (!this.config.enabled) {
|
|
@@ -212,7 +212,7 @@ export class StatuslineGenerator {
|
|
|
212
212
|
* The collision zone is columns 15-25 on the SECOND-TO-LAST line
|
|
213
213
|
* We restructure output so that line has minimal/no content in that zone
|
|
214
214
|
*
|
|
215
|
-
* @see
|
|
215
|
+
* @see the upstream project (see NOTICE)
|
|
216
216
|
*/
|
|
217
217
|
generateSafeStatusline() {
|
|
218
218
|
if (!this.config.enabled) {
|
|
@@ -55,7 +55,10 @@ describe('AgenticFlowAgent', () => {
|
|
|
55
55
|
});
|
|
56
56
|
expect(result.success).toBe(true);
|
|
57
57
|
expect(result.taskId).toBe('task-1');
|
|
58
|
-
|
|
58
|
+
// ≥0, not >0: a mocked task can complete inside one Date.now() tick on
|
|
59
|
+
// fast runners — the intent is "duration was measured", not "took time"
|
|
60
|
+
expect(result.duration).toBeGreaterThanOrEqual(0);
|
|
61
|
+
expect(typeof result.duration).toBe('number');
|
|
59
62
|
expect(agent.metrics?.tasksCompleted).toBe(1);
|
|
60
63
|
});
|
|
61
64
|
it('should update status during task execution', async () => {
|
|
@@ -20,7 +20,7 @@ import { PolicyEngine } from './application/policy-engine.js';
|
|
|
20
20
|
import { getTrustLevelLabel } from './domain/entities/trust-level.js';
|
|
21
21
|
// ADR-104: real wire transport via agentic-flow loader pattern.
|
|
22
22
|
// ADR-120: midstream-aware loader wraps the agentic-flow loader so
|
|
23
|
-
// when `midstreamer` (
|
|
23
|
+
// when `midstreamer` (upstream/midstream) ships its production QUIC
|
|
24
24
|
// build (Step 1 of ADR-120) and operators opt in with
|
|
25
25
|
// MIDSTREAMER_QUIC_NATIVE=1, the federation transport auto-upgrades.
|
|
26
26
|
// Until then, the wrapper transparently defers to the agentic-flow
|
|
@@ -83,7 +83,7 @@ async function probeMidstreamerTransport(config) {
|
|
|
83
83
|
try {
|
|
84
84
|
// Lazy + indirect so bundlers don't try to resolve at compile time.
|
|
85
85
|
// Prefer the `midstreamer/quic` sub-path (added in midstreamer@0.3.1
|
|
86
|
-
// per upstream
|
|
86
|
+
// per upstream upstream/midstream#81) which exposes
|
|
87
87
|
// `loadQuicTransport` directly without WASM init. Fall back to the
|
|
88
88
|
// root `midstreamer` package for older versions that put the QUIC
|
|
89
89
|
// surface on the default export.
|
|
@@ -112,7 +112,7 @@ async function probeMidstreamerTransport(config) {
|
|
|
112
112
|
// QuicMultistream as a counter-tracking stub with no real UDP, TLS,
|
|
113
113
|
// or protocol — using it would silently downgrade the federation
|
|
114
114
|
// path. midstreamer@0.3.1+ ships a real QUIC transport via
|
|
115
|
-
// `midstreamer/quic` (ADR-120, Step 1 — upstream PR
|
|
115
|
+
// `midstreamer/quic` (ADR-120, Step 1 — upstream PR upstream/midstream#81)
|
|
116
116
|
// and reports `isNative() === true`. Older versions either expose
|
|
117
117
|
// `isStub()` returning true or omit both probes.
|
|
118
118
|
if (typeof surface.isStub === 'function' && surface.isStub()) {
|
|
@@ -34,7 +34,7 @@ export declare class SwarmVectorProvider extends BaseProvider {
|
|
|
34
34
|
protected doHealthCheck(): Promise<HealthCheckResult>;
|
|
35
35
|
/**
|
|
36
36
|
* Build swarmLLM native API query format
|
|
37
|
-
* See:
|
|
37
|
+
* See: the upstream project (see NOTICE)
|
|
38
38
|
*/
|
|
39
39
|
private buildSwarmvectorQuery;
|
|
40
40
|
private buildRequest;
|
|
@@ -410,7 +410,7 @@ export class SwarmVectorProvider extends BaseProvider {
|
|
|
410
410
|
}
|
|
411
411
|
/**
|
|
412
412
|
* Build swarmLLM native API query format
|
|
413
|
-
* See:
|
|
413
|
+
* See: the upstream project (see NOTICE)
|
|
414
414
|
*/
|
|
415
415
|
buildSwarmvectorQuery(request) {
|
|
416
416
|
// swarmLLM uses simple query format, not OpenAI-compatible
|
|
@@ -159,14 +159,14 @@ export declare const SpawnAgentSchema: z.ZodObject<{
|
|
|
159
159
|
timeout: z.ZodOptional<z.ZodNumber>;
|
|
160
160
|
}, "strip", z.ZodTypeAny, {
|
|
161
161
|
type: "coder" | "reviewer" | "tester" | "planner" | "researcher" | "security-architect" | "security-auditor" | "memory-specialist" | "swarm-specialist" | "integration-architect" | "performance-engineer" | "core-architect" | "test-architect" | "queen-coordinator" | "project-coordinator";
|
|
162
|
-
id?: string | undefined;
|
|
163
162
|
config?: Record<string, unknown> | undefined;
|
|
164
163
|
timeout?: number | undefined;
|
|
164
|
+
id?: string | undefined;
|
|
165
165
|
}, {
|
|
166
166
|
type: "coder" | "reviewer" | "tester" | "planner" | "researcher" | "security-architect" | "security-auditor" | "memory-specialist" | "swarm-specialist" | "integration-architect" | "performance-engineer" | "core-architect" | "test-architect" | "queen-coordinator" | "project-coordinator";
|
|
167
|
-
id?: string | undefined;
|
|
168
167
|
config?: Record<string, unknown> | undefined;
|
|
169
168
|
timeout?: number | undefined;
|
|
169
|
+
id?: string | undefined;
|
|
170
170
|
}>;
|
|
171
171
|
/**
|
|
172
172
|
* Task input schema
|
|
@@ -181,13 +181,13 @@ export declare const TaskInputSchema: z.ZodObject<{
|
|
|
181
181
|
taskId: string;
|
|
182
182
|
content: string;
|
|
183
183
|
agentType: "coder" | "reviewer" | "tester" | "planner" | "researcher" | "security-architect" | "security-auditor" | "memory-specialist" | "swarm-specialist" | "integration-architect" | "performance-engineer" | "core-architect" | "test-architect" | "queen-coordinator" | "project-coordinator";
|
|
184
|
-
priority?: "
|
|
184
|
+
priority?: "critical" | "high" | "medium" | "low" | undefined;
|
|
185
185
|
metadata?: Record<string, unknown> | undefined;
|
|
186
186
|
}, {
|
|
187
187
|
taskId: string;
|
|
188
188
|
content: string;
|
|
189
189
|
agentType: "coder" | "reviewer" | "tester" | "planner" | "researcher" | "security-architect" | "security-auditor" | "memory-specialist" | "swarm-specialist" | "integration-architect" | "performance-engineer" | "core-architect" | "test-architect" | "queen-coordinator" | "project-coordinator";
|
|
190
|
-
priority?: "
|
|
190
|
+
priority?: "critical" | "high" | "medium" | "low" | undefined;
|
|
191
191
|
metadata?: Record<string, unknown> | undefined;
|
|
192
192
|
}>;
|
|
193
193
|
/**
|
|
@@ -234,16 +234,16 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
|
|
|
234
234
|
cwd: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
|
|
235
235
|
allowSudo: z.ZodDefault<z.ZodBoolean>;
|
|
236
236
|
}, "strip", z.ZodTypeAny, {
|
|
237
|
-
timeout: number;
|
|
238
237
|
allowedCommands: string[];
|
|
238
|
+
timeout: number;
|
|
239
239
|
maxBuffer: number;
|
|
240
240
|
allowSudo: boolean;
|
|
241
241
|
blockedPatterns?: string[] | undefined;
|
|
242
242
|
cwd?: string | undefined;
|
|
243
243
|
}, {
|
|
244
244
|
allowedCommands: string[];
|
|
245
|
-
timeout?: number | undefined;
|
|
246
245
|
blockedPatterns?: string[] | undefined;
|
|
246
|
+
timeout?: number | undefined;
|
|
247
247
|
maxBuffer?: number | undefined;
|
|
248
248
|
cwd?: string | undefined;
|
|
249
249
|
allowSudo?: boolean | undefined;
|
|
@@ -135,7 +135,7 @@ export class GitCommitHook {
|
|
|
135
135
|
const result = await this.processCommitMessage(message, branchName);
|
|
136
136
|
// Modify the command with the new message
|
|
137
137
|
if (result.success && result.modifiedMessage !== message) {
|
|
138
|
-
const modifiedCommand = command.replace(/-m\s+["'][^"']+["']/, `-m "${result.modifiedMessage.replace(/"/g, '\\"')}"`);
|
|
138
|
+
const modifiedCommand = command.replace(/-m\s+["'][^"']+["']/, `-m "${result.modifiedMessage.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`);
|
|
139
139
|
return {
|
|
140
140
|
...result,
|
|
141
141
|
data: {
|
|
@@ -161,7 +161,14 @@ export class HttpTransport extends EventEmitter {
|
|
|
161
161
|
setupMiddleware() {
|
|
162
162
|
// Security headers
|
|
163
163
|
this.app.use(helmet({
|
|
164
|
-
|
|
164
|
+
// JSON-RPC API serves no HTML, so a strict CSP is inert for responses but
|
|
165
|
+
// satisfies js/insecure-helmet-configuration (disabling CSP is flagged).
|
|
166
|
+
contentSecurityPolicy: {
|
|
167
|
+
directives: {
|
|
168
|
+
defaultSrc: ["'none'"],
|
|
169
|
+
frameAncestors: ["'none'"],
|
|
170
|
+
},
|
|
171
|
+
},
|
|
165
172
|
}));
|
|
166
173
|
// CORS - Secure defaults (no wildcard in production)
|
|
167
174
|
if (this.config.corsEnabled !== false) {
|