@swarmdo/cli 1.4.8 → 1.6.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 +9 -6
- package/dist/src/commands/compact.d.ts +16 -0
- package/dist/src/commands/compact.d.ts.map +1 -0
- package/dist/src/commands/compact.js +106 -0
- package/dist/src/commands/compact.js.map +1 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +26 -24
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +10 -3
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/integrations.d.ts +14 -0
- package/dist/src/commands/integrations.d.ts.map +1 -0
- package/dist/src/commands/integrations.js +158 -0
- package/dist/src/commands/integrations.js.map +1 -0
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +50 -1
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/providers.d.ts.map +1 -1
- package/dist/src/commands/providers.js +3 -0
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/release.d.ts +15 -0
- package/dist/src/commands/release.d.ts.map +1 -0
- package/dist/src/commands/release.js +241 -0
- package/dist/src/commands/release.js.map +1 -0
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +14 -0
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/transcript.d.ts.map +1 -1
- package/dist/src/commands/transcript.js +82 -1
- package/dist/src/commands/transcript.js.map +1 -1
- package/dist/src/commands/usage.d.ts.map +1 -1
- package/dist/src/commands/usage.js +80 -1
- package/dist/src/commands/usage.js.map +1 -1
- package/dist/src/compact/compact.d.ts +60 -0
- package/dist/src/compact/compact.d.ts.map +1 -0
- package/dist/src/compact/compact.js +170 -0
- package/dist/src/compact/compact.js.map +1 -0
- package/dist/src/config-lint/lint.d.ts.map +1 -1
- package/dist/src/config-lint/lint.js +11 -1
- package/dist/src/config-lint/lint.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/statusline-generator.js +6 -6
- package/dist/src/integrations/integrations.d.ts +54 -0
- package/dist/src/integrations/integrations.d.ts.map +1 -0
- package/dist/src/integrations/integrations.js +162 -0
- package/dist/src/integrations/integrations.js.map +1 -0
- package/dist/src/mcp-tools/agent-execute-core.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-execute-core.js +25 -3
- package/dist/src/mcp-tools/agent-execute-core.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +8 -8
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/memory/graph-edge-writer.d.ts +12 -0
- package/dist/src/memory/graph-edge-writer.d.ts.map +1 -1
- package/dist/src/memory/graph-edge-writer.js +32 -1
- package/dist/src/memory/graph-edge-writer.js.map +1 -1
- package/dist/src/memory-vault/watch.d.ts +32 -0
- package/dist/src/memory-vault/watch.d.ts.map +1 -0
- package/dist/src/memory-vault/watch.js +66 -0
- package/dist/src/memory-vault/watch.js.map +1 -0
- package/dist/src/providers/openrouter-config.d.ts +91 -0
- package/dist/src/providers/openrouter-config.d.ts.map +1 -0
- package/dist/src/providers/openrouter-config.js +186 -0
- package/dist/src/providers/openrouter-config.js.map +1 -0
- package/dist/src/release/release.d.ts +72 -0
- package/dist/src/release/release.d.ts.map +1 -0
- package/dist/src/release/release.js +86 -0
- package/dist/src/release/release.js.map +1 -0
- package/dist/src/resilience/backoff.d.ts +23 -0
- package/dist/src/resilience/backoff.d.ts.map +1 -0
- package/dist/src/resilience/backoff.js +30 -0
- package/dist/src/resilience/backoff.js.map +1 -0
- package/dist/src/swarmvector/model-router.d.ts.map +1 -1
- package/dist/src/swarmvector/model-router.js +14 -0
- package/dist/src/swarmvector/model-router.js.map +1 -1
- package/dist/src/transcript/search.d.ts +39 -0
- package/dist/src/transcript/search.d.ts.map +1 -0
- package/dist/src/transcript/search.js +67 -0
- package/dist/src/transcript/search.js.map +1 -0
- package/dist/src/usage/diff.d.ts +69 -0
- package/dist/src/usage/diff.d.ts.map +1 -0
- package/dist/src/usage/diff.js +112 -0
- package/dist/src/usage/diff.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -3
- package/plugins/swarmdo-metaharness/scripts/smoke.sh +11 -11
- package/plugins/swarmdo-metaharness/scripts/test-mcp-tools.mjs +16 -2
- package/vendor/cli-core/dist/src/index.js +1 -1
- package/vendor/cli-core/dist/src/index.js.map +1 -1
- package/vendor/neural/dist/flash-attention.d.ts +1 -1
- package/vendor/neural/dist/flash-attention.js +1 -1
- package/vendor/shared/dist/hooks/safety/git-commit.js +1 -1
- package/vendor/shared/dist/hooks/safety/git-commit.js.map +1 -1
- package/vendor/shared/dist/mcp/transport/http.d.ts.map +1 -1
- package/vendor/shared/dist/mcp/transport/http.js +8 -1
- package/vendor/shared/dist/mcp/transport/http.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-config.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAGtD,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX;wDACoD;IACpD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAE1E;AAED;2DAC2D;AAC3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CA0C/D;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,oBAAoB,EAAE,CAE9F;AAED,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAElE;gFACgF;AAChF,eAAO,MAAM,kBAAkB,EAAE,WAiBhC,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;6EAC6E;AAC7E,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,CAmB/F;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3D,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;uFACuF;AACvF,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUvI;AAED;0EAC0E;AAC1E,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,WAAW,CAY7E"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openrouter-config.ts — configurable OpenRouter model pool for swarms.
|
|
3
|
+
*
|
|
4
|
+
* The execution core has dispatched to OpenRouter since #2042, but only via
|
|
5
|
+
* env vars and a single default slug. This module makes the integration
|
|
6
|
+
* CONFIGURABLE: users declare the OpenRouter models they want their agent
|
|
7
|
+
* swarms to draw from in swarmdo.config.json, each mapped to a routing tier,
|
|
8
|
+
* and the router selects among same-tier candidates by Thompson sampling —
|
|
9
|
+
* the concrete consumer for the ADR-149 per-modelId priors.
|
|
10
|
+
*
|
|
11
|
+
* "openrouter": {
|
|
12
|
+
* "enabled": true,
|
|
13
|
+
* "models": [
|
|
14
|
+
* { "id": "meta-llama/llama-3.3-70b-instruct", "tier": "haiku" },
|
|
15
|
+
* { "id": "deepseek/deepseek-chat", "tier": "sonnet" },
|
|
16
|
+
* { "id": "anthropic/claude-opus-4-5", "tier": "opus" }
|
|
17
|
+
* ],
|
|
18
|
+
* "defaultModel": "anthropic/claude-sonnet-4-6"
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* Everything here is pure (validation, filtering, sampling with injectable
|
|
22
|
+
* randomness) except loadOpenRouterConfig, a thin fs reader.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'node:fs';
|
|
25
|
+
import * as path from 'node:path';
|
|
26
|
+
const TIERS = ['haiku', 'sonnet', 'opus'];
|
|
27
|
+
const DEFAULTS = {
|
|
28
|
+
enabled: false,
|
|
29
|
+
apiKeyEnv: 'OPENROUTER_API_KEY',
|
|
30
|
+
baseUrl: 'https://openrouter.ai/api',
|
|
31
|
+
models: [],
|
|
32
|
+
};
|
|
33
|
+
/** OpenRouter slugs are provider/model paths ('org/name[:variant]'). */
|
|
34
|
+
export function isOpenRouterSlug(model) {
|
|
35
|
+
return typeof model === 'string' && /^[\w.-]+\/[\w.:-]+$/.test(model);
|
|
36
|
+
}
|
|
37
|
+
/** Validate the raw `openrouter` config section. Tolerant at the boundary:
|
|
38
|
+
* bad entries are dropped with a warning, never thrown. */
|
|
39
|
+
export function parseOpenRouterConfig(raw) {
|
|
40
|
+
const warnings = [];
|
|
41
|
+
if (raw === undefined || raw === null)
|
|
42
|
+
return { config: { ...DEFAULTS }, warnings };
|
|
43
|
+
if (typeof raw !== 'object' || Array.isArray(raw)) {
|
|
44
|
+
return { config: { ...DEFAULTS }, warnings: ['openrouter: expected an object — section ignored'] };
|
|
45
|
+
}
|
|
46
|
+
const o = raw;
|
|
47
|
+
const config = { ...DEFAULTS, models: [] };
|
|
48
|
+
config.enabled = o.enabled === true;
|
|
49
|
+
if (typeof o.apiKeyEnv === 'string' && o.apiKeyEnv.trim())
|
|
50
|
+
config.apiKeyEnv = o.apiKeyEnv.trim();
|
|
51
|
+
if (typeof o.baseUrl === 'string' && /^https?:\/\//.test(o.baseUrl))
|
|
52
|
+
config.baseUrl = o.baseUrl.replace(/\/$/, '');
|
|
53
|
+
else if (o.baseUrl !== undefined)
|
|
54
|
+
warnings.push('openrouter.baseUrl: not an http(s) URL — using default');
|
|
55
|
+
if (typeof o.defaultModel === 'string' && isOpenRouterSlug(o.defaultModel))
|
|
56
|
+
config.defaultModel = o.defaultModel;
|
|
57
|
+
else if (o.defaultModel !== undefined)
|
|
58
|
+
warnings.push(`openrouter.defaultModel: "${String(o.defaultModel)}" is not an OpenRouter slug (org/model) — ignored`);
|
|
59
|
+
const rawModels = Array.isArray(o.models) ? o.models : [];
|
|
60
|
+
if (o.models !== undefined && !Array.isArray(o.models))
|
|
61
|
+
warnings.push('openrouter.models: expected an array — ignored');
|
|
62
|
+
const seen = new Set();
|
|
63
|
+
for (const [i, m] of rawModels.entries()) {
|
|
64
|
+
if (typeof m === 'string') {
|
|
65
|
+
// shorthand: bare slug, no tier
|
|
66
|
+
if (isOpenRouterSlug(m) && !seen.has(m)) {
|
|
67
|
+
config.models.push({ id: m });
|
|
68
|
+
seen.add(m);
|
|
69
|
+
}
|
|
70
|
+
else
|
|
71
|
+
warnings.push(`openrouter.models[${i}]: "${m}" is not a valid slug or is a duplicate — dropped`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!m || typeof m !== 'object') {
|
|
75
|
+
warnings.push(`openrouter.models[${i}]: not an object — dropped`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const e = m;
|
|
79
|
+
if (typeof e.id !== 'string' || !isOpenRouterSlug(e.id)) {
|
|
80
|
+
warnings.push(`openrouter.models[${i}]: missing/invalid id (want 'org/model' slug) — dropped`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (seen.has(e.id)) {
|
|
84
|
+
warnings.push(`openrouter.models[${i}]: duplicate id "${e.id}" — dropped`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const entry = { id: e.id };
|
|
88
|
+
if (e.tier !== undefined) {
|
|
89
|
+
if (typeof e.tier === 'string' && TIERS.includes(e.tier))
|
|
90
|
+
entry.tier = e.tier;
|
|
91
|
+
else {
|
|
92
|
+
warnings.push(`openrouter.models[${i}]: tier "${String(e.tier)}" not in ${TIERS.join('|')} — entry kept untiered`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (typeof e.note === 'string')
|
|
96
|
+
entry.note = e.note;
|
|
97
|
+
config.models.push(entry);
|
|
98
|
+
seen.add(e.id);
|
|
99
|
+
}
|
|
100
|
+
return { config, warnings };
|
|
101
|
+
}
|
|
102
|
+
/** Models eligible to serve a tier. */
|
|
103
|
+
export function modelsForTier(cfg, tier) {
|
|
104
|
+
return cfg.models.filter((m) => m.tier === tier);
|
|
105
|
+
}
|
|
106
|
+
/** Default Beta sampler via two Gamma(α,1)/Gamma(β,1) draws (Marsaglia-Tsang
|
|
107
|
+
* for shape ≥ 1, boost trick below 1). Deterministic tests inject their own. */
|
|
108
|
+
export const defaultBetaSampler = (alpha, beta) => {
|
|
109
|
+
const gamma = (shape) => {
|
|
110
|
+
if (shape < 1)
|
|
111
|
+
return gamma(shape + 1) * Math.pow(Math.random() || 1e-12, 1 / shape);
|
|
112
|
+
const d = shape - 1 / 3;
|
|
113
|
+
const c = 1 / Math.sqrt(9 * d);
|
|
114
|
+
for (;;) {
|
|
115
|
+
const u1 = Math.random() || 1e-12;
|
|
116
|
+
const u2 = Math.random() || 1e-12;
|
|
117
|
+
const n = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
|
|
118
|
+
const v = Math.pow(1 + c * n, 3);
|
|
119
|
+
if (v <= 0)
|
|
120
|
+
continue;
|
|
121
|
+
if (Math.log(u2) < 0.5 * n * n + d - d * v + d * Math.log(v))
|
|
122
|
+
return d * v;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const a = gamma(alpha);
|
|
126
|
+
const b = gamma(beta);
|
|
127
|
+
return a / (a + b || 1e-12);
|
|
128
|
+
};
|
|
129
|
+
/** Thompson-sample a concrete OpenRouter model for a tier from the
|
|
130
|
+
* user-configured pool. Returns null when disabled or no tier candidates. */
|
|
131
|
+
export function pickOpenRouterModel({ cfg, tier, priors, sample }) {
|
|
132
|
+
if (!cfg.enabled)
|
|
133
|
+
return null;
|
|
134
|
+
const candidates = modelsForTier(cfg, tier);
|
|
135
|
+
if (candidates.length === 0)
|
|
136
|
+
return null;
|
|
137
|
+
if (candidates.length === 1) {
|
|
138
|
+
return { model: candidates[0].id, reason: `only configured ${tier}-tier model`, candidates: 1 };
|
|
139
|
+
}
|
|
140
|
+
const draw = sample ?? defaultBetaSampler;
|
|
141
|
+
let best = null;
|
|
142
|
+
for (const c of candidates) {
|
|
143
|
+
const p = priors?.[c.id] ?? { alpha: 1, beta: 1 };
|
|
144
|
+
const score = draw(Math.max(p.alpha, 1e-9), Math.max(p.beta, 1e-9));
|
|
145
|
+
if (!best || score > best.score)
|
|
146
|
+
best = { id: c.id, score };
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
model: best.id,
|
|
150
|
+
reason: `Thompson pick among ${candidates.length} configured ${tier}-tier models`,
|
|
151
|
+
candidates: candidates.length,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** Full precedence for the execution path:
|
|
155
|
+
* explicit slug > tier pick from the configured pool > config defaultModel > null. */
|
|
156
|
+
export function resolveOpenRouterModel({ requested, tier, cfg, priors, sample }) {
|
|
157
|
+
if (isOpenRouterSlug(requested))
|
|
158
|
+
return { model: requested, source: 'explicit' };
|
|
159
|
+
const effectiveTier = tier ?? (requested && TIERS.includes(requested) ? requested : undefined);
|
|
160
|
+
if (effectiveTier) {
|
|
161
|
+
const picked = pickOpenRouterModel({ cfg, tier: effectiveTier, priors, sample });
|
|
162
|
+
if (picked)
|
|
163
|
+
return { model: picked.model, source: picked.reason };
|
|
164
|
+
}
|
|
165
|
+
if (cfg.enabled && cfg.defaultModel)
|
|
166
|
+
return { model: cfg.defaultModel, source: 'config defaultModel' };
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
/** Thin reader: swarmdo.config.json's `openrouter` section from cwd (or an
|
|
170
|
+
* ancestor repo root). Absent/broken files yield the disabled default. */
|
|
171
|
+
export function loadOpenRouterConfig(cwd = process.cwd()) {
|
|
172
|
+
for (const dir of [cwd, path.resolve(cwd, '..'), path.resolve(cwd, '../..')]) {
|
|
173
|
+
const p = path.join(dir, 'swarmdo.config.json');
|
|
174
|
+
try {
|
|
175
|
+
if (!fs.existsSync(p))
|
|
176
|
+
continue;
|
|
177
|
+
const parsed = JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
178
|
+
return parseOpenRouterConfig(parsed?.openrouter);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return { config: { ...DEFAULTS }, warnings: [`openrouter: failed to read ${p} — integration disabled`] };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { config: { ...DEFAULTS }, warnings: [] };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=openrouter-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-config.js","sourceRoot":"","sources":["../../../src/providers/openrouter-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* release.ts — plan the whole swarmdo release train as data.
|
|
3
|
+
*
|
|
4
|
+
* The proven flow (first executed by hand for v1.4.8) is nine steps: bump the
|
|
5
|
+
* version trio + lockfile, sync the doc version strings, commit+push, build,
|
|
6
|
+
* stage the self-contained @swarmdo/cli, publish both packages, verify the
|
|
7
|
+
* registry, tag, and cut a GitHub release with `swarmdo changelog` notes.
|
|
8
|
+
* This module turns that into a PURE planner — inputs in, an ordered list of
|
|
9
|
+
* typed steps out — so the plan is unit-testable and the command layer only
|
|
10
|
+
* interprets steps (dry-run prints them; --confirm executes them).
|
|
11
|
+
*/
|
|
12
|
+
export interface ReleaseInput {
|
|
13
|
+
/** current version from v3/@swarmdo/cli/package.json (trio source of truth) */
|
|
14
|
+
current: string;
|
|
15
|
+
/** 'patch' | 'minor' | 'major' | explicit 'x.y.z' */
|
|
16
|
+
bump: string;
|
|
17
|
+
/** absolute repo root */
|
|
18
|
+
repoRoot: string;
|
|
19
|
+
/** skip npm publish steps (still bumps/commits/tags) */
|
|
20
|
+
skipPublish?: boolean;
|
|
21
|
+
/** skip the gh release step */
|
|
22
|
+
skipGhRelease?: boolean;
|
|
23
|
+
/** skip the live-site deploy (docs-sync rule says DON'T unless the release truly has zero user-facing surface) */
|
|
24
|
+
skipSite?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export type ReleaseStep = {
|
|
27
|
+
kind: 'bump-json';
|
|
28
|
+
file: string;
|
|
29
|
+
version: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'bump-lock';
|
|
32
|
+
file: string;
|
|
33
|
+
version: string;
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'sync-docs';
|
|
36
|
+
version: string;
|
|
37
|
+
files: string[];
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'exec';
|
|
40
|
+
title: string;
|
|
41
|
+
cmd: string;
|
|
42
|
+
args: string[];
|
|
43
|
+
cwd: string;
|
|
44
|
+
} | {
|
|
45
|
+
kind: 'verify-npm';
|
|
46
|
+
packages: string[];
|
|
47
|
+
version: string;
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'gh-release';
|
|
50
|
+
tag: string;
|
|
51
|
+
notesFrom: string;
|
|
52
|
+
} | {
|
|
53
|
+
kind: 'deploy-site';
|
|
54
|
+
version: string;
|
|
55
|
+
};
|
|
56
|
+
export interface ReleasePlan {
|
|
57
|
+
current: string;
|
|
58
|
+
next: string;
|
|
59
|
+
tag: string;
|
|
60
|
+
steps: ReleaseStep[];
|
|
61
|
+
}
|
|
62
|
+
export declare function parseVersion(v: string): [number, number, number];
|
|
63
|
+
export declare function nextVersion(current: string, bump: string): string;
|
|
64
|
+
/** The version trio + lockfile, relative to the repo root. */
|
|
65
|
+
export declare const TRIO_FILES: string[];
|
|
66
|
+
export declare const LOCK_FILE = "package-lock.json";
|
|
67
|
+
/** Docs whose version strings ride along with every release. */
|
|
68
|
+
export declare const DOC_FILES: string[];
|
|
69
|
+
export declare function planRelease(input: ReleaseInput): ReleasePlan;
|
|
70
|
+
/** One-line human rendering of a step (for the dry-run plan). */
|
|
71
|
+
export declare function renderStep(s: ReleaseStep): string;
|
|
72
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/release/release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kHAAkH;IAClH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAGtD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAID,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAIhE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAajE;AAED,8DAA8D;AAC9D,eAAO,MAAM,UAAU,UAItB,CAAC;AACF,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAC7C,gEAAgE;AAChE,eAAO,MAAM,SAAS,UAAmD,CAAC;AAE1E,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAgC5D;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAUjD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* release.ts — plan the whole swarmdo release train as data.
|
|
3
|
+
*
|
|
4
|
+
* The proven flow (first executed by hand for v1.4.8) is nine steps: bump the
|
|
5
|
+
* version trio + lockfile, sync the doc version strings, commit+push, build,
|
|
6
|
+
* stage the self-contained @swarmdo/cli, publish both packages, verify the
|
|
7
|
+
* registry, tag, and cut a GitHub release with `swarmdo changelog` notes.
|
|
8
|
+
* This module turns that into a PURE planner — inputs in, an ordered list of
|
|
9
|
+
* typed steps out — so the plan is unit-testable and the command layer only
|
|
10
|
+
* interprets steps (dry-run prints them; --confirm executes them).
|
|
11
|
+
*/
|
|
12
|
+
const SEMVER = /^(\d+)\.(\d+)\.(\d+)$/;
|
|
13
|
+
export function parseVersion(v) {
|
|
14
|
+
const m = SEMVER.exec(v.trim());
|
|
15
|
+
if (!m)
|
|
16
|
+
throw new Error(`not a stable semver version: "${v}" (expected x.y.z)`);
|
|
17
|
+
return [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
18
|
+
}
|
|
19
|
+
export function nextVersion(current, bump) {
|
|
20
|
+
const [maj, min, pat] = parseVersion(current);
|
|
21
|
+
switch (bump) {
|
|
22
|
+
case 'patch': return `${maj}.${min}.${pat + 1}`;
|
|
23
|
+
case 'minor': return `${maj}.${min + 1}.0`;
|
|
24
|
+
case 'major': return `${maj + 1}.0.0`;
|
|
25
|
+
default: {
|
|
26
|
+
const [nmaj, nmin, npat] = parseVersion(bump); // throws on junk
|
|
27
|
+
const cmp = nmaj - maj || nmin - min || npat - pat;
|
|
28
|
+
if (cmp <= 0)
|
|
29
|
+
throw new Error(`explicit version ${bump} must be greater than current ${current}`);
|
|
30
|
+
return bump;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** The version trio + lockfile, relative to the repo root. */
|
|
35
|
+
export const TRIO_FILES = [
|
|
36
|
+
'v3/@swarmdo/cli/package.json',
|
|
37
|
+
'package.json',
|
|
38
|
+
'swarmdo/package.json',
|
|
39
|
+
];
|
|
40
|
+
export const LOCK_FILE = 'package-lock.json';
|
|
41
|
+
/** Docs whose version strings ride along with every release. */
|
|
42
|
+
export const DOC_FILES = ['CLAUDE.md', 'README.md', 'website/index.html'];
|
|
43
|
+
export function planRelease(input) {
|
|
44
|
+
const next = nextVersion(input.current, input.bump);
|
|
45
|
+
const tag = `v${next}`;
|
|
46
|
+
const root = input.repoRoot;
|
|
47
|
+
const cli = `${root}/v3/@swarmdo/cli`;
|
|
48
|
+
const steps = [];
|
|
49
|
+
for (const f of TRIO_FILES)
|
|
50
|
+
steps.push({ kind: 'bump-json', file: f, version: next });
|
|
51
|
+
steps.push({ kind: 'bump-lock', file: LOCK_FILE, version: next });
|
|
52
|
+
steps.push({ kind: 'sync-docs', version: next, files: DOC_FILES });
|
|
53
|
+
steps.push({ kind: 'exec', title: 'commit release', cmd: 'git', args: ['commit', '-am', `release: ${tag}`], cwd: root });
|
|
54
|
+
steps.push({ kind: 'exec', title: 'push main', cmd: 'git', args: ['push', 'origin', 'main'], cwd: root });
|
|
55
|
+
if (!input.skipPublish) {
|
|
56
|
+
steps.push({ kind: 'exec', title: 'build @swarmdo/cli', cmd: 'npm', args: ['run', 'build'], cwd: cli });
|
|
57
|
+
steps.push({ kind: 'exec', title: 'stage standalone cli', cmd: 'node', args: ['scripts/build-standalone.mjs'], cwd: cli });
|
|
58
|
+
// NOTE: publish runs from INSIDE dist-standalone — `npm publish <folder>`
|
|
59
|
+
// from the package dir would trip the intentional prepublishOnly guard
|
|
60
|
+
steps.push({ kind: 'exec', title: 'publish @swarmdo/cli', cmd: 'npm', args: ['publish'], cwd: `${cli}/dist-standalone` });
|
|
61
|
+
steps.push({ kind: 'exec', title: 'publish swarmdo umbrella', cmd: 'npm', args: ['publish'], cwd: root });
|
|
62
|
+
steps.push({ kind: 'verify-npm', packages: ['@swarmdo/cli', 'swarmdo'], version: next });
|
|
63
|
+
}
|
|
64
|
+
steps.push({ kind: 'exec', title: 'tag', cmd: 'git', args: ['tag', tag, 'main'], cwd: root });
|
|
65
|
+
steps.push({ kind: 'exec', title: 'push tag', cmd: 'git', args: ['push', 'origin', tag], cwd: root });
|
|
66
|
+
if (!input.skipGhRelease) {
|
|
67
|
+
steps.push({ kind: 'gh-release', tag, notesFrom: `v${input.current}` });
|
|
68
|
+
}
|
|
69
|
+
if (!input.skipSite) {
|
|
70
|
+
steps.push({ kind: 'deploy-site', version: next });
|
|
71
|
+
}
|
|
72
|
+
return { current: input.current, next, tag, steps };
|
|
73
|
+
}
|
|
74
|
+
/** One-line human rendering of a step (for the dry-run plan). */
|
|
75
|
+
export function renderStep(s) {
|
|
76
|
+
switch (s.kind) {
|
|
77
|
+
case 'bump-json': return `bump ${s.file} → ${s.version}`;
|
|
78
|
+
case 'bump-lock': return `bump ${s.file} (version + packages."") → ${s.version}`;
|
|
79
|
+
case 'sync-docs': return `sync version strings → ${s.version} in ${s.files.join(', ')}`;
|
|
80
|
+
case 'exec': return `${s.title}: ${s.cmd} ${s.args.join(' ')} (${s.cwd})`;
|
|
81
|
+
case 'verify-npm': return `verify npm: ${s.packages.join(', ')} @latest === ${s.version}`;
|
|
82
|
+
case 'gh-release': return `gh release ${s.tag} with \`swarmdo changelog\` notes since ${s.notesFrom}`;
|
|
83
|
+
case 'deploy-site': return `deploy website → SwarmDo/swarmdo.com (copy working copy, push, curl-verify swarmdo.com serves ${s.version})`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/release/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* backoff.ts — exponential backoff with full jitter for retryable provider
|
|
3
|
+
* failures (429 / 5xx / timeouts).
|
|
4
|
+
*
|
|
5
|
+
* The ADR-149 fallback chain retried instantly; a provider-level 429 is
|
|
6
|
+
* usually account-wide, so an immediate re-call burns the attempt. Standard
|
|
7
|
+
* remedy (AWS architecture blog, anthropic SDK internals): exponential base
|
|
8
|
+
* with FULL jitter, capped. Pure — the jitter source is injectable so tests
|
|
9
|
+
* are deterministic.
|
|
10
|
+
*/
|
|
11
|
+
export interface BackoffOptions {
|
|
12
|
+
/** first-attempt base delay (default 1000ms) */
|
|
13
|
+
baseMs?: number;
|
|
14
|
+
/** hard cap per delay (default 8000ms) */
|
|
15
|
+
capMs?: number;
|
|
16
|
+
/** jitter source mapping an upper bound to a value in [0, bound); injectable for tests */
|
|
17
|
+
jitter?: (boundMs: number) => number;
|
|
18
|
+
}
|
|
19
|
+
/** Delay before retry `attempt` (0-based): full-jitter exp backoff. */
|
|
20
|
+
export declare function computeBackoffMs(attempt: number, opts?: BackoffOptions): number;
|
|
21
|
+
export declare function isRetryableError(errText: string | null | undefined): boolean;
|
|
22
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../../src/resilience/backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CAMnF;AAQD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* backoff.ts — exponential backoff with full jitter for retryable provider
|
|
3
|
+
* failures (429 / 5xx / timeouts).
|
|
4
|
+
*
|
|
5
|
+
* The ADR-149 fallback chain retried instantly; a provider-level 429 is
|
|
6
|
+
* usually account-wide, so an immediate re-call burns the attempt. Standard
|
|
7
|
+
* remedy (AWS architecture blog, anthropic SDK internals): exponential base
|
|
8
|
+
* with FULL jitter, capped. Pure — the jitter source is injectable so tests
|
|
9
|
+
* are deterministic.
|
|
10
|
+
*/
|
|
11
|
+
/** Delay before retry `attempt` (0-based): full-jitter exp backoff. */
|
|
12
|
+
export function computeBackoffMs(attempt, opts = {}) {
|
|
13
|
+
const base = opts.baseMs ?? 1000;
|
|
14
|
+
const cap = opts.capMs ?? 8000;
|
|
15
|
+
const jitter = opts.jitter ?? ((bound) => Math.random() * bound);
|
|
16
|
+
const bound = Math.min(cap, base * 2 ** Math.max(0, attempt));
|
|
17
|
+
return Math.floor(jitter(bound));
|
|
18
|
+
}
|
|
19
|
+
/** Retryable-failure classifier shared with the fallback chain. */
|
|
20
|
+
// \b only guards the numeric codes ('5031' must not match); the word classes
|
|
21
|
+
// match as substrings because providers emit snake_case ('overloaded_error',
|
|
22
|
+
// 'rate_limited') where \b fails before the underscore
|
|
23
|
+
const RETRYABLE = /\b(429|500|502|503|504)\b|timeout|overloaded|rate.?limit|ECONNRESET|ETIMEDOUT/i;
|
|
24
|
+
export function isRetryableError(errText) {
|
|
25
|
+
return RETRYABLE.test(errText ?? '');
|
|
26
|
+
}
|
|
27
|
+
export function sleep(ms) {
|
|
28
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../../src/resilience/backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAuB,EAAE;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,mEAAmE;AACnE,6EAA6E;AAC7E,6EAA6E;AAC7E,uDAAuD;AACvD,MAAM,SAAS,GAAG,gFAAgF,CAAC;AAEnG,MAAM,UAAU,gBAAgB,CAAC,OAAkC;IACjE,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../../src/swarmvector/model-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;
|
|
1
|
+
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../../src/swarmvector/model-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
* @module model-router
|
|
38
38
|
*/
|
|
39
39
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
40
|
+
import { loadOpenRouterConfig, pickOpenRouterModel } from '../providers/openrouter-config.js';
|
|
40
41
|
import { dirname, join } from 'path';
|
|
41
42
|
// ----------------------------------------------------------------------------
|
|
42
43
|
// Lazy module loaders — initialised once per process. The dynamic-import calls
|
|
@@ -104,6 +105,19 @@ function resolveExecutionProvider(model) {
|
|
|
104
105
|
(!hasAnthropic && hasOpenRouter && explicit !== 'anthropic');
|
|
105
106
|
if (!wantOR)
|
|
106
107
|
return { provider: 'anthropic' };
|
|
108
|
+
// Configurable pool first (swarmdo.config.json `openrouter.models`): when
|
|
109
|
+
// the user declared tier-mapped models, the swarm selects among them —
|
|
110
|
+
// Thompson sampling with uniform priors at this layer; per-modelId priors
|
|
111
|
+
// (ADR-149) refine the pick where callers hold router state.
|
|
112
|
+
if (model === 'haiku' || model === 'sonnet' || model === 'opus') {
|
|
113
|
+
try {
|
|
114
|
+
const { config } = loadOpenRouterConfig();
|
|
115
|
+
const picked = pickOpenRouterModel({ cfg: config, tier: model });
|
|
116
|
+
if (picked)
|
|
117
|
+
return { provider: 'openrouter', openrouterModel: picked.model };
|
|
118
|
+
}
|
|
119
|
+
catch { /* pool unavailable — fall through to alts */ }
|
|
120
|
+
}
|
|
107
121
|
const alts = loadOpenRouterAlts();
|
|
108
122
|
if (!alts)
|
|
109
123
|
return { provider: 'openrouter' }; // OR provider but no alt slug
|