@desplega.ai/agent-swarm 1.152.2 → 1.153.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{acp-adapter-pfeje2v5.js → acp-adapter-ahmjxhek.js} +4 -4
- package/dist/{actions-0sttc7f5.js → actions-jzrfpkmn.js} +30 -26
- package/dist/{anthropic-messages-2y8nktar.js → anthropic-messages-9vqsbznt.js} +112 -84
- package/dist/{app-p8teva95.js → app-03na2vwb.js} +9 -6
- package/dist/{assistant-r45jnsrt.js → assistant-hfkxvhgt.js} +31 -27
- package/dist/{azure-openai-responses-f38x2avq.js → azure-openai-responses-04qwdwfq.js} +27 -13
- package/dist/{boot-reembed-je26h5y7.js → boot-reembed-c98xrad3.js} +8 -6
- package/dist/{boot-reembed-1qmybsd4.js → boot-reembed-zt3qm9xn.js} +9 -7
- package/dist/{boot-scrub-logs-gte3h1mm.js → boot-scrub-logs-jcqd8ksj.js} +6 -4
- package/dist/{claude-adapter-csc1mzka.js → claude-adapter-mgryg8g3.js} +17 -15
- package/dist/{claude-managed-adapter-dsmkcrjy.js → claude-managed-adapter-ea2aga6w.js} +3 -3
- package/dist/{claude-sdk-session-fcd6f078.js → claude-sdk-session-jjf4zss1.js} +17 -15
- package/dist/{cli-r2fpe7cx.js → cli-00w2c66p.js} +61 -55
- package/dist/{cli-fm4ytsdk.js → cli-0d9nbqxf.js} +1 -1
- package/dist/cli-0x5qzvkg.js +4279 -0
- package/dist/{cli-d3p82erb.js → cli-18amys3y.js} +9 -9
- package/dist/{cli-wbyk465z.js → cli-1hwnb4hc.js} +1 -1
- package/dist/{cli-xw7vak96.js → cli-3bcmp015.js} +5 -5
- package/dist/cli-3er6gcsn.js +1849 -0
- package/dist/{cli-c4eeb5q2.js → cli-5b6b62tz.js} +1 -1
- package/dist/{cli-4ahpr4sw.js → cli-5mbmvxnn.js} +5 -5
- package/dist/{cli-xy1cchaf.js → cli-5taqtpze.js} +235 -8
- package/dist/{cli-fmy65jdn.js → cli-6ks9xf1n.js} +7 -5
- package/dist/cli-7g9s78jf.js +2827 -0
- package/dist/{cli-jew3jda5.js → cli-7pnz2v6s.js} +2 -2
- package/dist/{cli-r84ctdxn.js → cli-83wkg402.js} +2 -2
- package/dist/{cli-jvy9qgjs.js → cli-a9scg8sv.js} +4 -4
- package/dist/{cli-4yc5d8fk.js → cli-avkd6mqv.js} +50 -0
- package/dist/{cli-ht5rs63n.js → cli-b2g6mzjc.js} +15 -6
- package/dist/{cli-jbmc0r7r.js → cli-bw0dfwkr.js} +1 -1
- package/dist/{cli-8wrympd7.js → cli-bzr0ftht.js} +26 -7
- package/dist/{cli-wpv5rgg2.js → cli-cdq08v3r.js} +2 -2
- package/dist/cli-cgj4hc12.js +18902 -0
- package/dist/cli-d6hk10xx.js +14075 -0
- package/dist/{cli-zvgj5zg8.js → cli-djvxhnc4.js} +31 -3324
- package/dist/{cli-s25avqg9.js → cli-e781c6f9.js} +1 -0
- package/dist/{cli-3bpzj8me.js → cli-eazstkad.js} +2 -2
- package/dist/{cli-s2qjdd6z.js → cli-eetrvv91.js} +1 -1
- package/dist/cli-h38x0qhg.js +6912 -0
- package/dist/{cli-9xvdm3bx.js → cli-h60qfasa.js} +742 -278
- package/dist/{pi-mono-adapter-jcqt71cg.js → cli-ja7mrygn.js} +67343 -101083
- package/dist/{cli-j8dggbcr.js → cli-k0g1sjzm.js} +23 -31
- package/dist/{cli-gphgnvpf.js → cli-m04pt18h.js} +2 -2
- package/dist/{cli-rgvp6r2x.js → cli-mcnhgnn1.js} +193 -4
- package/dist/{cli-j4nv2wqy.js → cli-mzgyhxbe.js} +10 -4
- package/dist/{cli-qn042eh7.js → cli-n0q9b7j4.js} +46 -1870
- package/dist/cli-n7h1kqpf.js +29 -0
- package/dist/{cli-ckz5t2hb.js → cli-nq0kgyxe.js} +5 -5
- package/dist/{cli-z3wkng35.js → cli-qrqhc31j.js} +151 -125
- package/dist/{cli-56h18ng2.js → cli-r8tdds6s.js} +1 -1
- package/dist/{cli-ch38q5z4.js → cli-rj7de4b2.js} +6788 -2541
- package/dist/{cli-qd65dvr6.js → cli-s5s1f2yn.js} +56 -40
- package/dist/{cli-kj76p1ez.js → cli-scwq51gn.js} +13 -7
- package/dist/{cli-2nnd56zt.js → cli-tdh4hjr2.js} +3 -2
- package/dist/{cli-c2mk1kgf.js → cli-v4en75c5.js} +8 -1
- package/dist/{cli-b9dd0h3k.js → cli-vw03hg5t.js} +3 -2
- package/dist/{cli-zvkq5csn.js → cli-ybpp1srm.js} +6 -6
- package/dist/cli-yn0a417a.js +4069 -0
- package/dist/{cli-gpqcs935.js → cli-ysc1kbet.js} +2 -2
- package/dist/{cli-zfzznn7c.js → cli-ytxs7mn1.js} +26 -2
- package/dist/cli-zcsyfw2z.js +3335 -0
- package/dist/{cli-4j8k1m4w.js → cli-zt1227k1.js} +1162 -192
- package/dist/cli-zy5w9gpt.js +230 -0
- package/dist/cli.js +26 -34
- package/dist/{codex-adapter-fxmpsabw.js → codex-adapter-8548daap.js} +12 -11
- package/dist/{codex-session-runner-rr1e47ea.js → codex-session-runner-2dad8p4x.js} +12 -11
- package/dist/{commands-0f5rxz51.js → commands-355dbpa8.js} +6 -4
- package/dist/{db-r3jxf3wy.js → db-4jjvwz1s.js} +6 -4
- package/dist/{dispatcher-06vph6q4.js → dispatcher-ca590nkz.js} +29 -25
- package/dist/dsh-adapter-rgvj6ykp.js +19 -0
- package/dist/{e2b-413b8t4v.js → e2b-93x1k0j5.js} +6 -7
- package/dist/{google-generative-ai-ndjmj5fa.js → google-generative-ai-xtw7tggr.js} +33 -73
- package/dist/{google-vertex-fr665tqs.js → google-vertex-zdqpms6n.js} +38 -68
- package/dist/{handlers-0hgtc910.js → handlers-2y6dqpvf.js} +32 -28
- package/dist/{hook-9kvrv1er.js → hook-0s8knepr.js} +11 -9
- package/dist/{hook-fbfhkat3.js → hook-k0gec254.js} +12 -10
- package/dist/{http-xbyx8k5j.js → http-jp2nb4zw.js} +300 -237
- package/dist/{index-tfsdxyv6.js → index-0wzg3sp3.js} +39 -24
- package/dist/{index-rnyahfn5.js → index-3mq6ce93.js} +29 -25
- package/dist/{index-jsw3aynb.js → index-42s7eezq.js} +29 -25
- package/dist/{cli-pdz9qde4.js → index-9ch1n761.js} +10 -11
- package/dist/{index-gpfn1741.js → index-b56xkbc7.js} +8 -6
- package/dist/{index-66xz5e9j.js → index-h5gs261z.js} +521 -9
- package/dist/{index-2sp0384z.js → index-kkeftv5h.js} +738 -21
- package/dist/{index-sgk50mbg.js → index-s37dbevy.js} +30 -26
- package/dist/index-w097eg0x.js +5 -0
- package/dist/jiti-loader-b4837mtm.js +34 -0
- package/dist/jiti-static-loader-q2g5ds0y.js +31267 -0
- package/dist/{keepalive-s3xpr7sw.js → keepalive-9pfw7t02.js} +8 -6
- package/dist/{lead-rq4n5r16.js → lead-7vcmcdq4.js} +44 -39
- package/dist/{maintenance-f0atj1ab.js → maintenance-x277jbpd.js} +9 -7
- package/dist/{mistral-conversations-qhr84ph3.js → mistral-conversations-zx0kn554.js} +24 -18
- package/dist/{node-x1g4v0pq.js → node-5qtycf6a.js} +16 -11
- package/dist/{oauth-refresh-sweep-q0t3bxre.js → oauth-refresh-sweep-5fwa7th2.js} +7 -5
- package/dist/{onboard-br5j1kch.js → onboard-17sv0f51.js} +103 -35
- package/dist/{openai-codex-responses-wy6a43wd.js → openai-codex-responses-4vjqzvjp.js} +33 -27
- package/dist/{openai-completions-32rdwmze.js → openai-completions-pxsmym7g.js} +52 -64
- package/dist/{openai-responses-6xwf7bzg.js → openai-responses-tmn0rqp0.js} +23 -24
- package/dist/{opencode-adapter-28axqa09.js → opencode-adapter-qbmv4tpy.js} +6 -6
- package/dist/{otel-impl-vdqge2nt.js → otel-impl-srjy4be4.js} +4 -4
- package/dist/{pi-messages-b1mbr6gp.js → pi-messages-txpjj39q.js} +3 -3
- package/dist/pi-mono-adapter-946a0sdd.js +1316 -0
- package/dist/{pricing-refresh-hb3691fd.js → pricing-refresh-vetcm563.js} +8 -6
- package/dist/{rbac-roles-jh280k9g.js → rbac-roles-cfzgr6r1.js} +8 -6
- package/dist/{rbac-roles-t78xt39b.js → rbac-roles-cmxaddmy.js} +7 -5
- package/dist/{render-v2-7p8r2ymg.js → render-v2-f9hzff72.js} +9 -6
- package/dist/{seed-pricing-hf889enh.js → seed-pricing-jggk6rsy.js} +7 -5
- package/dist/{setup-w6mb03jv.js → setup-8mfceb9t.js} +4 -5
- package/dist/virtual-modules-ax661xp0.js +54 -0
- package/dist/{work-objects-nt8gy1kj.js → work-objects-vdsdcczj.js} +32 -28
- package/dist/{worker-dwy617t0.js → worker-cd0nhyv1.js} +44 -39
- package/openapi.json +36 -14
- package/package.json +6 -6
- package/src/be/automation-preflight.ts +6 -4
- package/src/be/extensions/db.ts +35 -4
- package/src/be/models-catalog.ts +2 -0
- package/src/be/modelsdev-cache.json +213 -0
- package/src/be/rbac-audit.ts +2 -0
- package/src/be/seed-pricing.ts +3 -1
- package/src/be/swarm-config-guard.ts +1 -0
- package/src/commands/onboard/compose-generator.ts +6 -1
- package/src/commands/onboard/env-generator.ts +6 -1
- package/src/commands/onboard/manifest.ts +1 -0
- package/src/commands/onboard/steps/integration-slack.tsx +56 -16
- package/src/commands/onboard/steps/review.tsx +5 -0
- package/src/commands/onboard/types.ts +6 -0
- package/src/commands/onboard.tsx +5 -1
- package/src/commands/provider-credentials.ts +14 -2
- package/src/extensions/lifecycle.ts +15 -21
- package/src/http/agents.ts +2 -2
- package/src/http/config.ts +1 -1
- package/src/http/core.ts +5 -3
- package/src/http/extensions.ts +108 -34
- package/src/http/status.ts +22 -10
- package/src/prompts/base-prompt.ts +15 -7
- package/src/providers/claude-managed-models.ts +8 -0
- package/src/providers/codex-models.ts +15 -1
- package/src/providers/dsh-adapter.ts +248 -0
- package/src/providers/index.ts +5 -1
- package/src/providers/modelsdev-reasoning.json +50 -0
- package/src/rbac/legacy-policy.ts +15 -1
- package/src/rbac/types.ts +2 -0
- package/src/server.ts +7 -1
- package/src/slack/app.ts +32 -10
- package/src/slack/config.ts +29 -0
- package/src/telemetry.ts +2 -3
- package/src/tests/agents-harness-provider.test.ts +19 -0
- package/src/tests/agents-list-model-display.test.ts +60 -1
- package/src/tests/base-prompt.test.ts +25 -0
- package/src/tests/claude-managed-adapter.test.ts +6 -0
- package/src/tests/codex-gpt6-release.test.ts +97 -0
- package/src/tests/config-api-only-keys.test.ts +9 -0
- package/src/tests/context-window.test.ts +1 -0
- package/src/tests/dsh-adapter.test.ts +276 -0
- package/src/tests/e2e-nightly-report.test.ts +3 -3
- package/src/tests/e2e-redact.test.ts +2 -0
- package/src/tests/env-flag.test.ts +6 -0
- package/src/tests/extensions-db.test.ts +41 -0
- package/src/tests/extensions-http.test.ts +148 -4
- package/src/tests/extensions-lifecycle.test.ts +18 -0
- package/src/tests/extensions-mcp-tools.test.ts +9 -5
- package/src/tests/internal-ai/complete-structured.test.ts +32 -9
- package/src/tests/internal-ai/credentials.test.ts +4 -4
- package/src/tests/internal-ai/models.test.ts +20 -0
- package/src/tests/migration-046-budgets.test.ts +2 -0
- package/src/tests/model-control.test.ts +2 -2
- package/src/tests/onboard-compose.test.ts +14 -0
- package/src/tests/onboard-env.test.ts +17 -0
- package/src/tests/onboard-manifest.test.ts +12 -0
- package/src/tests/opus-5-5-registry.test.ts +48 -0
- package/src/tests/pricing-refresh.test.ts +1 -1
- package/src/tests/pricing-routes.test.ts +15 -3
- package/src/tests/provider-registration.test.ts +5 -2
- package/src/tests/rbac-admission-e2e.test.ts +54 -0
- package/src/tests/rbac-e2e-helpers.ts +2 -0
- package/src/tests/rbac-engine.test.ts +32 -0
- package/src/tests/rbac-wire-e2e.test.ts +33 -0
- package/src/tests/reasoning-effort.test.ts +8 -0
- package/src/tests/reload-config.test.ts +33 -0
- package/src/tests/session-costs-model-key-normalize.test.ts +1 -0
- package/src/tests/slack-config.test.ts +136 -0
- package/src/tests/slack-mode-lifecycle.test.ts +69 -0
- package/src/tests/status.test.ts +22 -2
- package/src/tests/task-tool-preload-mcp.test.ts +3 -1
- package/src/tests/telemetry-init.test.ts +18 -0
- package/src/tests/workflow-llm.test.ts +3 -3
- package/src/tools/extension-common.ts +4 -0
- package/src/tools/extension-install.ts +1 -1
- package/src/tools/extension-list.ts +4 -3
- package/src/types.ts +17 -8
- package/src/utils/context-window.ts +1 -0
- package/src/utils/credentials.ts +8 -0
- package/src/utils/internal-ai/complete-structured.ts +8 -0
- package/src/utils/internal-ai/models.ts +5 -5
- package/templates/schedules/daily-status-report/content.md +25 -12
- package/templates/schedules/daily-workflow-health-audit/content.md +1 -1
- package/templates/skills/swarm-extensions/content.md +9 -5
- package/dist/cli-4wppfkcm.js +0 -16384
- package/dist/cli-55qrx3q8.js +0 -6041
- package/dist/cli-cg4vnyh4.js +0 -305
- package/dist/cli-jyetr64j.js +0 -52
- package/dist/cli-pp9ax9pa.js +0 -520
- package/dist/cli-qa66qaf0.js +0 -6076
- package/dist/cli-qghpvca2.js +0 -590
- package/dist/cli-rembwgt8.js +0 -861
- package/dist/cli-tcvj7j2r.js +0 -1971
- package/dist/cli-vfcth11k.js +0 -36
- package/dist/cli-w1d1bgkk.js +0 -1422
- package/dist/cli-y6x0gqtg.js +0 -5977
- package/dist/es5-tj3tn4jj.js +0 -844
- package/dist/index-1kq5hw2p.js +0 -467
- package/dist/index-1p8wdstt.js +0 -7
- package/dist/index-8fdjzb2f.js +0 -100
- package/dist/index-bxmwzbgw.js +0 -365
- package/dist/index-nzerxd5z.js +0 -7
- package/dist/index-pyymnzat.js +0 -1168
- package/dist/index-qv6atbab.js +0 -619
- package/dist/index-rja32qa7.js +0 -801
- package/dist/index-tzg5srfp.js +0 -211
- package/dist/index-vhncw983.js +0 -90
- package/dist/index-xk036zsk.js +0 -859
- package/dist/index-zyazbzcb.js +0 -6
- package/dist/{claude-managed-setup-48dwg9bv.js → claude-managed-setup-f5pmsyrp.js} +3 -3
|
@@ -29,6 +29,7 @@ const CONTEXT_WINDOW_DEFAULTS: Record<string, number> = {
|
|
|
29
29
|
// Anthropic Fable / Mythos tier
|
|
30
30
|
"claude-fable-5-1": 1_000_000,
|
|
31
31
|
"claude-mythos-5-1": 1_000_000,
|
|
32
|
+
"claude-opus-5-5": 1_000_000,
|
|
32
33
|
"claude-opus-5": 1_000_000,
|
|
33
34
|
"claude-fable-5": 1_000_000,
|
|
34
35
|
"claude-mythos-5": 1_000_000,
|
package/src/utils/credentials.ts
CHANGED
|
@@ -8,6 +8,7 @@ export const CREDENTIAL_POOL_VARS = [
|
|
|
8
8
|
"OPENAI_API_KEY",
|
|
9
9
|
"CODEX_OAUTH",
|
|
10
10
|
"DEVIN_API_KEY",
|
|
11
|
+
"DEEPSEEK_API_KEY",
|
|
11
12
|
] as const;
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -26,6 +27,7 @@ export const PROVIDER_CREDENTIAL_VARS: Record<string, readonly string[]> = {
|
|
|
26
27
|
pi: ["OPENROUTER_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"],
|
|
27
28
|
codex: ["OPENAI_API_KEY", "CODEX_OAUTH"],
|
|
28
29
|
devin: ["DEVIN_API_KEY"],
|
|
30
|
+
dsh: ["OPENROUTER_API_KEY", "DEEPSEEK_API_KEY"],
|
|
29
31
|
opencode: ["OPENROUTER_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"],
|
|
30
32
|
};
|
|
31
33
|
|
|
@@ -57,6 +59,10 @@ const SLASH_MODEL_PROVIDERS = new Set(["opencode", "pi"]);
|
|
|
57
59
|
export function getModelAwareCredentialVars(provider: string, model?: string): readonly string[] {
|
|
58
60
|
const base = PROVIDER_CREDENTIAL_VARS[provider];
|
|
59
61
|
if (!base) return CREDENTIAL_POOL_VARS;
|
|
62
|
+
// dsh has exact prefix routing; the generic slash rule only filters OpenAI keys.
|
|
63
|
+
if (provider === "dsh" && model) {
|
|
64
|
+
return model.startsWith("openrouter/") ? ["OPENROUTER_API_KEY"] : ["DEEPSEEK_API_KEY"];
|
|
65
|
+
}
|
|
60
66
|
if (!SLASH_MODEL_PROVIDERS.has(provider) || !model) return base;
|
|
61
67
|
if (model.includes("/")) {
|
|
62
68
|
return base.filter((v) => v !== "OPENAI_API_KEY");
|
|
@@ -82,6 +88,8 @@ export function deriveProviderFromKeyType(keyType: string): string {
|
|
|
82
88
|
case "OPENAI_API_KEY":
|
|
83
89
|
case "CODEX_OAUTH":
|
|
84
90
|
return "codex";
|
|
91
|
+
case "DEEPSEEK_API_KEY":
|
|
92
|
+
return "dsh";
|
|
85
93
|
case "DEVIN_API_KEY":
|
|
86
94
|
return "devin";
|
|
87
95
|
default:
|
|
@@ -284,6 +284,14 @@ export async function completeStructured<TZod extends z.ZodTypeAny>(
|
|
|
284
284
|
return null;
|
|
285
285
|
}
|
|
286
286
|
|
|
287
|
+
// Dynamic IDs can be absent even though the typed catalog overload is non-nullable.
|
|
288
|
+
if (!model) {
|
|
289
|
+
console.error(
|
|
290
|
+
scrubSecrets(`internal-ai: unknown model ${provider}/${modelId} (callerTag=${callerTag})`),
|
|
291
|
+
);
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
|
|
287
295
|
// The builtin catalog hardcodes openrouter.ai; OPENROUTER_BASE_URL reroutes
|
|
288
296
|
// through a gateway (pi-ai's stream path uses `model.baseUrl` verbatim).
|
|
289
297
|
// Resolved from the caller's session env when provided — swarm_config
|
|
@@ -17,10 +17,10 @@ export type CredentialKind = "openrouter" | "anthropic" | "openai" | "openai-cod
|
|
|
17
17
|
* shellout, not pi-ai's `getModel`.
|
|
18
18
|
*/
|
|
19
19
|
export const DEFAULT_MODEL: Record<CredentialKind, string> = {
|
|
20
|
-
openrouter: "openrouter/
|
|
20
|
+
openrouter: "openrouter/deepseek/deepseek-v4.1-flash",
|
|
21
21
|
anthropic: "anthropic/claude-haiku-4-5",
|
|
22
|
-
openai: "openai/gpt-
|
|
23
|
-
"openai-codex": "openai-codex/gpt-
|
|
22
|
+
openai: "openai/gpt-6-luna",
|
|
23
|
+
"openai-codex": "openai-codex/gpt-6-luna",
|
|
24
24
|
"claude-cli": "haiku",
|
|
25
25
|
};
|
|
26
26
|
|
|
@@ -35,8 +35,8 @@ export function resolveModelString(kind: CredentialKind): string {
|
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Split a `provider/model-id` string on the FIRST `/` so that OpenRouter
|
|
38
|
-
* compound IDs like `openrouter/
|
|
39
|
-
* `("openrouter", "
|
|
38
|
+
* compound IDs like `openrouter/deepseek/deepseek-v4.1-flash` parse as
|
|
39
|
+
* `("openrouter", "deepseek/deepseek-v4.1-flash")`. Mirrors the existing
|
|
40
40
|
* convention in `src/providers/pi-mono-adapter.ts:161-170`.
|
|
41
41
|
*/
|
|
42
42
|
export function parseModelStr(modelStr: string): [provider: string, modelId: string] {
|
|
@@ -55,26 +55,39 @@ Use the setup milestone data already retrieved from `/status`. Report only integ
|
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
58
|
-
## Phase 2: Post one digest
|
|
58
|
+
## Phase 2: Post one digest — EXCEPTION-ONLY, HARD CEILING 600 CHARACTERS
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
Operator feedback, 2026-09-23, verbatim: "too verbose every day". Brevity is a requirement of this job, not a preference. Count the characters before posting; over 600 ⇒ cut until it fits. A long report is a failed run, not a thorough one.
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
📊 Daily Status Report — [date]
|
|
62
|
+
Post ONE message to your configured admin channel (in-app fallback if none configured).
|
|
64
63
|
|
|
65
|
-
|
|
64
|
+
**Everything healthy ⇒ exactly this one line, nothing else:**
|
|
66
65
|
|
|
67
|
-
Workflows: [X] enabled / [Y] total. [N] hard failures, [M] halted >24h in the last 24h.
|
|
68
|
-
Schedules: [X] enabled / [Y] total. [N] hard failures, [M] didn't fire on time, [K] with ≥3 consecutive errors.
|
|
69
|
-
Agents: [X] online / [Y] total. [names of any agent at/over capacity]. [N] agent-attributed failures in 7d.
|
|
70
|
-
Task failures (7d): [N] needs_setup · [N] gate-refusal · [N] infra · [N] real-defect · [N] unclassified (no reason set).
|
|
71
|
-
Integration setup: [missing credentials from /status], or all verified.
|
|
72
66
|
```
|
|
67
|
+
📊 <MM-DD> — all clear. Workflows <X>/<Y> · schedules <X>/<Y> · agents <X>/<Y> · <N> failures 7d, <N> real defects. Nothing for you.
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Add a line ONLY for something both TRUE and ACTIONABLE. Max 3 lines, one sentence each, no sub-bullets:**
|
|
71
|
+
- an automation in `needs_setup` or an unverified integration — name + `fixUrl`
|
|
72
|
+
- a workflow run halted >24h (Phase 1B)
|
|
73
|
+
- a real defect, or a failure cluster on one agent / schedule / provider
|
|
74
|
+
- a decision only the operator can make — state the options, end on the question
|
|
75
|
+
|
|
76
|
+
More than 3 qualify ⇒ post the 3 that matter and put the rest in the task output.
|
|
77
|
+
|
|
78
|
+
**NEVER in the Slack post** — all of this belongs in `store-progress` output, where the audit trail lives:
|
|
79
|
+
- row counts and "read-only report" notes
|
|
80
|
+
- methodology, query names, script names, phase narration
|
|
81
|
+
- any zero ("0 halted", "all verified", "no data-quality gap") — silence means zero
|
|
82
|
+
- week-over-week trend, unless a class crossed a threshold you name in the same line
|
|
83
|
+
- a finding yesterday's report already carried unchanged
|
|
84
|
+
- numbered explainers or paragraphs of reasoning
|
|
73
85
|
|
|
74
86
|
## Phase 3: Complete
|
|
75
|
-
`store-progress` with `status: "completed"
|
|
87
|
+
`store-progress` with `status: "completed"`. **This is where the detail goes** — every count from Phase 1, the per-class failure breakdown, and the Slack message ts. The Slack post is the headline; the task output is the record. Cutting the post does not mean cutting the work.
|
|
76
88
|
|
|
77
89
|
## Anti-patterns
|
|
78
90
|
- ❌ Modifying anything — this schedule reports, it doesn't fix (that's `daily-workflow-health-audit` for plumbing and `daily-compounding-reflection` for agent/skill/memory evolution).
|
|
79
91
|
- ❌ Folding the unclassified-failure bucket into "real defect" to make the number look more actionable than it is.
|
|
80
|
-
- ❌
|
|
92
|
+
- ❌ Narrating a zero. The all-clear line already covers `needs_setup` and integrations; only a non-verified integration or a real `needs_setup` automation earns its own line.
|
|
93
|
+
- ❌ Exceeding 600 characters, or posting more than one message.
|
|
@@ -170,7 +170,7 @@ Otherwise:
|
|
|
170
170
|
• schedule:<name> — consecutiveErrors=<n>, last error: <lastErrSnippet>
|
|
171
171
|
```
|
|
172
172
|
|
|
173
|
-
Omit any section whose count is 0.
|
|
173
|
+
Omit any section whose count is 0. **HARD CEILING 700 characters — not the 4000-char Slack limit.** (Operator feedback, 2026-09-23: "too verbose every day".) Keep at most the top 3 items across ALL sections combined, one line each; everything else goes in the `store-progress` output, not the post. Over 700 chars ⇒ cut until it fits. A long digest is a failed run, not a thorough one.
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -8,9 +8,13 @@ Do not use an extension for work that one task, one script, or one schedule can
|
|
|
8
8
|
|
|
9
9
|
`extension-install` and `extension-list`. They are deferred. Load them with your harness tool search before the first call.
|
|
10
10
|
|
|
11
|
-
`extension-install` validates the bundle (manifest, imports, typecheck against the hook contract) and stores it.
|
|
11
|
+
`extension-install` validates the bundle (manifest, imports, typecheck against the hook contract) and stores it. Any authenticated agent, including a worker, can install a new bundle. Your agent is recorded as its owner in `createdByAgentId`; `extension-list` exposes that field. Always send your `X-Agent-ID` when using REST so ownership is attributed to you.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Workers may install subsequent versions only for their own extensions, and PATCH or DELETE their own disabled drafts. Ownership stays with the original creator; each version records its writer as `changedByAgentId`. Leads, operators, and dashboard users retain access to all bundles.
|
|
14
|
+
|
|
15
|
+
A new install is disabled and inert. A lead, operator, or dashboard user must enable it with `extension-enable` or `POST /api/extensions/{id}/enable`. Workers cannot enable, disable, or activate versions. Report the extension name and the required activation step.
|
|
16
|
+
|
|
17
|
+
Installing changed files under your existing name stages a new version without activating it. Workers may stage code-only updates while an extension is enabled, but cannot PATCH or change its live config/priority. Ask a lead or operator to make those changes. `EXTENSION_ALLOW_LEAD_ACTIVATION=false` restricts activation to operators/dashboard users.
|
|
14
18
|
|
|
15
19
|
## Get the contract before you write hooks
|
|
16
20
|
|
|
@@ -58,7 +62,7 @@ The bundle is a manifest plus a files map. Version 1 accepts one file, the `asse
|
|
|
58
62
|
Rules for `hooks.ts`:
|
|
59
63
|
|
|
60
64
|
- Import only from `swarm-extension`, `zod`, and `stdlib`. Relative imports, other packages, and dynamic imports are rejected.
|
|
61
|
-
- Export the extension as `default`. Export `config` (a Zod schema) when the extension takes configuration.
|
|
65
|
+
- Export the extension as `default`. Export `config` (a Zod schema) when the extension takes configuration. Activation validates `config` against it.
|
|
62
66
|
- Return `block(reason)` or `modify(data)` from pre hooks. Return nothing to continue.
|
|
63
67
|
- Keep handlers fast. A handler is cancelled after 5 seconds. Five consecutive failures auto-disable the extension.
|
|
64
68
|
- Handlers run outside database transactions and must not assume ordering with other extensions. Use `priority` in `api.on(event, handler, { priority })` when order matters (lower runs first).
|
|
@@ -107,7 +111,7 @@ export default extension;
|
|
|
107
111
|
## Verify
|
|
108
112
|
|
|
109
113
|
1. Call `extension-list` and confirm the name, version, and `enabled: false`.
|
|
110
|
-
2. Report the enable step. After
|
|
114
|
+
2. Report the enable step. After a lead or operator enables it, the dashboard run log shows every dispatch with its result (`continue`, `modify`, `block`, or `error`).
|
|
111
115
|
3. Trigger the event once and confirm the effect (for example, a blocked REST task returns HTTP 422 with your reason).
|
|
112
116
|
|
|
113
117
|
## Common mistakes
|
|
@@ -116,5 +120,5 @@ export default extension;
|
|
|
116
120
|
- Using `import` from a package other than `swarm-extension`, `zod`, or `stdlib`.
|
|
117
121
|
- Returning a plain object instead of `block(...)` or `modify(...)`.
|
|
118
122
|
- Modifying fields the event does not allow. Read the `*Modify` type for that event.
|
|
119
|
-
- Expecting the extension to run after install. It runs only after
|
|
123
|
+
- Expecting the extension to run after install. It runs only after a lead or operator enables it.
|
|
120
124
|
- Blocking tasks from every origin. Check `event.origin` so schedules, workflows, and follow-ups keep working unless you mean to block them.
|