@stackbone/cli 0.5.1 → 0.5.3
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/CHANGELOG.md +28 -0
- package/main.js +165 -19
- package/package.json +1 -1
- package/stackbone-cli-0.5.3.tgz +0 -0
- package/stackbone-cli-0.5.1.tgz +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.5.3] - 2026-09-25
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`stackbone dev` failed at `Starting docker services` with `401 UNAUTHORIZED`
|
|
15
|
+
from quay.io.** MinIO closed anonymous pulls of `minio/minio` there too, after
|
|
16
|
+
Docker Hub. The compose files `stackbone dev` and `stackbone package` write now
|
|
17
|
+
pull the community fork `pgsty/minio:RELEASE.2026-08-04T00-00-00Z`, which needs
|
|
18
|
+
no account (PLA-1794).
|
|
19
|
+
|
|
20
|
+
## [0.5.2] - 2026-09-23
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **A fresh `stackbone init` failed `npm install` with `ERESOLVE`.** The scaffold
|
|
25
|
+
pinned `zod@4.4.3`, while its own `@workflow/world@5.0.0-beta.11` peer-requires
|
|
26
|
+
exactly `zod@4.3.6`. pnpm only warns about a peer conflict, so it went
|
|
27
|
+
unnoticed. The shell template, its `workflows` member and the deep-agent
|
|
28
|
+
dependency map now all pin `4.3.6` (PLA-1653).
|
|
29
|
+
|
|
30
|
+
- **`init [dir]` help said omitting the positional scaffolds in place.** It
|
|
31
|
+
creates a subdirectory; pass `.` to scaffold in the current directory.
|
|
32
|
+
|
|
33
|
+
- **`stackbone dev` re-parsed a url connector spec on every action and every
|
|
34
|
+
trigger tick.** The parsed spec is now kept in process while its text is
|
|
35
|
+
unchanged. For Microsoft Graph's 42 MB spec, an introspection drops from about
|
|
36
|
+
6 s to under 50 ms after the first one (PLA-1714).
|
|
37
|
+
|
|
10
38
|
## [0.5.1] - 2026-09-17
|
|
11
39
|
|
|
12
40
|
### Fixed
|
package/main.js
CHANGED
|
@@ -15739,7 +15739,7 @@ var emulatorCors = (allowlist) => cors({
|
|
|
15739
15739
|
var STACKBONE_CLI_BUILD_VERSION, EMULATOR_CAPABILITY_ROUTES, EMULATOR_CAPABILITIES, buildContractResponse;
|
|
15740
15740
|
var init_contract = __esmMin((() => {
|
|
15741
15741
|
init_src$19();
|
|
15742
|
-
STACKBONE_CLI_BUILD_VERSION = "0.5.
|
|
15742
|
+
STACKBONE_CLI_BUILD_VERSION = "0.5.3";
|
|
15743
15743
|
EMULATOR_CAPABILITY_ROUTES = {
|
|
15744
15744
|
"database.postgres_direct": "/api/db",
|
|
15745
15745
|
"rag.basic": "/api/rag",
|
|
@@ -30698,6 +30698,70 @@ var init_spec_cache_key = __esmMin((() => {
|
|
|
30698
30698
|
SPEC_CACHE_KEY_NAMESPACE = "connect:spec";
|
|
30699
30699
|
}));
|
|
30700
30700
|
//#endregion
|
|
30701
|
+
//#region ../../libs/runtime/connect-broker/src/lib/cache/spec-digest.ts
|
|
30702
|
+
/**
|
|
30703
|
+
* The digest a spec document is known by: sha256 of its text, hex. One function
|
|
30704
|
+
* for both sides of PLA-1714 — the cache that vouches for a document by its
|
|
30705
|
+
* digest and the introspection memo that keys a parse on it — because two
|
|
30706
|
+
* spellings of "the hash of the text" is how a vouched digest stops matching.
|
|
30707
|
+
*/
|
|
30708
|
+
function specTextDigest(text) {
|
|
30709
|
+
return createHash("sha256").update(text).digest("hex");
|
|
30710
|
+
}
|
|
30711
|
+
var init_spec_digest = __esmMin((() => {}));
|
|
30712
|
+
//#endregion
|
|
30713
|
+
//#region ../../libs/runtime/connect-broker/src/lib/cache/digest-tracking-spec-cache.ts
|
|
30714
|
+
/**
|
|
30715
|
+
* Wrap `shared` so it remembers the digest of each document it writes or reads.
|
|
30716
|
+
* `now`, `maxAgeMs` and `maxEntries` are injected so the bounds are provable in
|
|
30717
|
+
* tests without a real clock or thirty-two documents.
|
|
30718
|
+
*/
|
|
30719
|
+
function trackSpecDigests(shared, options = {}) {
|
|
30720
|
+
const now = options.now ?? (() => Date.now());
|
|
30721
|
+
const maxAgeMs = options.maxAgeMs ?? 6e5;
|
|
30722
|
+
const maxEntries = options.maxEntries ?? 32;
|
|
30723
|
+
const digests = /* @__PURE__ */ new Map();
|
|
30724
|
+
const remember = (key, text, ttlMs) => {
|
|
30725
|
+
digests.delete(key);
|
|
30726
|
+
digests.set(key, {
|
|
30727
|
+
digest: specTextDigest(text),
|
|
30728
|
+
expiresAt: now() + Math.min(ttlMs, maxAgeMs)
|
|
30729
|
+
});
|
|
30730
|
+
while (digests.size > maxEntries) {
|
|
30731
|
+
const oldest = digests.keys().next();
|
|
30732
|
+
if (oldest.done === true) break;
|
|
30733
|
+
digests.delete(oldest.value);
|
|
30734
|
+
}
|
|
30735
|
+
};
|
|
30736
|
+
return {
|
|
30737
|
+
async digestOf(key) {
|
|
30738
|
+
const held = digests.get(key);
|
|
30739
|
+
if (held === void 0) return null;
|
|
30740
|
+
if (held.expiresAt <= now()) {
|
|
30741
|
+
digests.delete(key);
|
|
30742
|
+
return null;
|
|
30743
|
+
}
|
|
30744
|
+
return held.digest;
|
|
30745
|
+
},
|
|
30746
|
+
async get(key) {
|
|
30747
|
+
const text = await shared.get(key);
|
|
30748
|
+
if (text !== null) remember(key, text, maxAgeMs);
|
|
30749
|
+
return text;
|
|
30750
|
+
},
|
|
30751
|
+
async set(key, value, ttlMs) {
|
|
30752
|
+
await shared.set(key, value, ttlMs);
|
|
30753
|
+
if (ttlMs > 0) remember(key, value, ttlMs);
|
|
30754
|
+
},
|
|
30755
|
+
async evict(key) {
|
|
30756
|
+
digests.delete(key);
|
|
30757
|
+
await shared.evict(key);
|
|
30758
|
+
}
|
|
30759
|
+
};
|
|
30760
|
+
}
|
|
30761
|
+
var init_digest_tracking_spec_cache = __esmMin((() => {
|
|
30762
|
+
init_spec_digest();
|
|
30763
|
+
}));
|
|
30764
|
+
//#endregion
|
|
30701
30765
|
//#region ../../libs/runtime/connect-broker/src/lib/executor/credential-placement.ts
|
|
30702
30766
|
/**
|
|
30703
30767
|
* Apply the broker-minted token to EVERY placement the connector declares, all
|
|
@@ -36659,10 +36723,17 @@ function redactUrl(raw) {
|
|
|
36659
36723
|
async function resolveSpecDocument(specSource, deps = {}) {
|
|
36660
36724
|
if (specSource === void 0) throw new Error("connector definition has no specSource to introspect");
|
|
36661
36725
|
if (specSource.kind === "inline") return specSource.document;
|
|
36726
|
+
return parseSpecText(await (await fetchSpec(specSource, deps)).text(), specSource.url);
|
|
36727
|
+
}
|
|
36728
|
+
/** Fetch a `url` specSource through the injected `fetch`, refusing a non-2xx. */
|
|
36729
|
+
async function fetchSpec(specSource, deps) {
|
|
36662
36730
|
if (deps.fetch === void 0) throw new Error(`connector specSource is a url ("${redactUrl(specSource.url)}") but no fetch was injected to resolve it`);
|
|
36663
36731
|
const response = deps.policy !== void 0 ? await deps.fetch(specSource.url, deps.headers, deps.policy) : deps.headers !== void 0 ? await deps.fetch(specSource.url, deps.headers) : await deps.fetch(specSource.url);
|
|
36664
36732
|
if (!response.ok) throw new Error(`fetching connector spec from "${redactUrl(specSource.url)}" failed with status ${response.status}`);
|
|
36665
|
-
|
|
36733
|
+
return response;
|
|
36734
|
+
}
|
|
36735
|
+
/** Parse fetched spec text as JSON, falling back to YAML. `url` only feeds the error. */
|
|
36736
|
+
function parseSpecText(body, url) {
|
|
36666
36737
|
let doc;
|
|
36667
36738
|
try {
|
|
36668
36739
|
doc = JSON.parse(body);
|
|
@@ -36673,9 +36744,46 @@ async function resolveSpecDocument(specSource, deps = {}) {
|
|
|
36673
36744
|
doc = void 0;
|
|
36674
36745
|
}
|
|
36675
36746
|
}
|
|
36676
|
-
if (doc === null || typeof doc !== "object") throw new Error(`connector spec fetched from "${redactUrl(
|
|
36747
|
+
if (doc === null || typeof doc !== "object") throw new Error(`connector spec fetched from "${redactUrl(url)}" is not valid JSON or YAML`);
|
|
36677
36748
|
return doc;
|
|
36678
36749
|
}
|
|
36750
|
+
/** The protocol introspector's own output for a parsed document, with no extras. */
|
|
36751
|
+
function introspectDocument(protocol, document) {
|
|
36752
|
+
if (protocol === "openapi") return Promise.resolve(introspectOpenApi(document));
|
|
36753
|
+
return introspectMcpTools({ listToolsResult: document });
|
|
36754
|
+
}
|
|
36755
|
+
/** A held parse by memo key, refreshed as most recently used. */
|
|
36756
|
+
function heldIntrospection(key) {
|
|
36757
|
+
const held = baseIntrospections.get(key);
|
|
36758
|
+
if (held !== void 0) {
|
|
36759
|
+
baseIntrospections.delete(key);
|
|
36760
|
+
baseIntrospections.set(key, held);
|
|
36761
|
+
}
|
|
36762
|
+
return held;
|
|
36763
|
+
}
|
|
36764
|
+
async function introspectBase(def, deps) {
|
|
36765
|
+
const source = def.specSource;
|
|
36766
|
+
if (source?.kind !== "url") return introspectDocument(def.protocol, await resolveSpecDocument(source, deps));
|
|
36767
|
+
const response = await fetchSpec(source, deps);
|
|
36768
|
+
if (response.digest !== void 0) {
|
|
36769
|
+
const held = heldIntrospection(`${def.protocol}:${response.digest}`);
|
|
36770
|
+
if (held !== void 0) return held;
|
|
36771
|
+
}
|
|
36772
|
+
const text = await response.text();
|
|
36773
|
+
const key = `${def.protocol}:${specTextDigest(text)}`;
|
|
36774
|
+
const held = heldIntrospection(key);
|
|
36775
|
+
if (held !== void 0) return held;
|
|
36776
|
+
const parsing = Promise.resolve().then(() => introspectDocument(def.protocol, parseSpecText(text, source.url))).catch((err) => {
|
|
36777
|
+
if (baseIntrospections.get(key) === parsing) baseIntrospections.delete(key);
|
|
36778
|
+
throw err;
|
|
36779
|
+
});
|
|
36780
|
+
baseIntrospections.set(key, parsing);
|
|
36781
|
+
if (baseIntrospections.size > 16) {
|
|
36782
|
+
const oldest = baseIntrospections.keys().next().value;
|
|
36783
|
+
if (oldest !== void 0) baseIntrospections.delete(oldest);
|
|
36784
|
+
}
|
|
36785
|
+
return parsing;
|
|
36786
|
+
}
|
|
36679
36787
|
/**
|
|
36680
36788
|
* Resolve a connector's spec document and dispatch it to the right introspector
|
|
36681
36789
|
* for its `protocol`. Returns the normalized `IntrospectionResult` —
|
|
@@ -36693,17 +36801,19 @@ async function resolveSpecDocument(specSource, deps = {}) {
|
|
|
36693
36801
|
* not dropping information silently.
|
|
36694
36802
|
*/
|
|
36695
36803
|
async function introspectConnector(def, deps = {}) {
|
|
36696
|
-
const
|
|
36697
|
-
if (def.protocol === "openapi") return appendExtraQueryParams(appendExtraOperations(
|
|
36698
|
-
const result = await introspectMcpTools({ listToolsResult: document });
|
|
36804
|
+
const result = await introspectBase(def, deps);
|
|
36805
|
+
if (def.protocol === "openapi") return appendExtraQueryParams(appendExtraOperations(result, def.extraOperations), def.extraQueryParams);
|
|
36699
36806
|
if (def.extraOperations === void 0 || def.extraOperations.length === 0) return result;
|
|
36700
36807
|
return {
|
|
36701
36808
|
...result,
|
|
36702
36809
|
warnings: [...result.warnings, `extraOperations: ignored — connector '${def.id}' speaks mcp, whose surface is tools, not operations`]
|
|
36703
36810
|
};
|
|
36704
36811
|
}
|
|
36812
|
+
var baseIntrospections;
|
|
36705
36813
|
var init_spec_introspection = __esmMin((() => {
|
|
36706
36814
|
init_src$4();
|
|
36815
|
+
init_spec_digest();
|
|
36816
|
+
baseIntrospections = /* @__PURE__ */ new Map();
|
|
36707
36817
|
}));
|
|
36708
36818
|
//#endregion
|
|
36709
36819
|
//#region ../../libs/runtime/connect-broker/src/lib/executor/spec-request.ts
|
|
@@ -36828,6 +36938,26 @@ function createCachingSpecFetch(options) {
|
|
|
36828
36938
|
fetch: async (url, headers, policy) => {
|
|
36829
36939
|
fromCache = false;
|
|
36830
36940
|
pending = null;
|
|
36941
|
+
const fromNetwork = () => policy !== void 0 ? fetch(url, headers, policy) : headers !== void 0 ? fetch(url, headers) : fetch(url);
|
|
36942
|
+
const digest = cache.digestOf ? await cache.digestOf(key).catch(() => null) : null;
|
|
36943
|
+
if (digest !== null) {
|
|
36944
|
+
fromCache = true;
|
|
36945
|
+
return {
|
|
36946
|
+
ok: true,
|
|
36947
|
+
status: 200,
|
|
36948
|
+
digest,
|
|
36949
|
+
text: async () => {
|
|
36950
|
+
const held = await cache.get(key).catch(() => null);
|
|
36951
|
+
if (held !== null) return held;
|
|
36952
|
+
const response = await fromNetwork();
|
|
36953
|
+
if (!response.ok) throw new Error(`the cached connector spec is gone and re-fetching it failed with status ${response.status}`);
|
|
36954
|
+
const body = await response.text();
|
|
36955
|
+
fromCache = false;
|
|
36956
|
+
pending = body;
|
|
36957
|
+
return body;
|
|
36958
|
+
}
|
|
36959
|
+
};
|
|
36960
|
+
}
|
|
36831
36961
|
const hit = await cache.get(key).catch(() => null);
|
|
36832
36962
|
if (hit !== null) {
|
|
36833
36963
|
fromCache = true;
|
|
@@ -36837,7 +36967,7 @@ function createCachingSpecFetch(options) {
|
|
|
36837
36967
|
text: async () => hit
|
|
36838
36968
|
};
|
|
36839
36969
|
}
|
|
36840
|
-
const response =
|
|
36970
|
+
const response = await fromNetwork();
|
|
36841
36971
|
if (!response.ok) return response;
|
|
36842
36972
|
const body = await response.text();
|
|
36843
36973
|
pending = body;
|
|
@@ -38636,6 +38766,8 @@ var init_src$3 = __esmMin((() => {
|
|
|
38636
38766
|
init_redis_spec_cache();
|
|
38637
38767
|
init_in_memory_spec_cache();
|
|
38638
38768
|
init_spec_cache_key();
|
|
38769
|
+
init_digest_tracking_spec_cache();
|
|
38770
|
+
init_spec_digest();
|
|
38639
38771
|
init_cached_spec_fetch();
|
|
38640
38772
|
init_get_token();
|
|
38641
38773
|
init_src$20();
|
|
@@ -53269,6 +53401,10 @@ var DEV_CONNECT_ENCRYPTION_KEY = "dev-only-encryption-key";
|
|
|
53269
53401
|
* branch: a compose with no Redis and a single-process self-host box both land on
|
|
53270
53402
|
* the Map and must keep behaving exactly as they do today.
|
|
53271
53403
|
*
|
|
53404
|
+
* Both are wrapped in `trackSpecDigests` (PLA-1714): the box remembers the digest
|
|
53405
|
+
* of each spec it holds, so a trigger tick reuses the parsed document without
|
|
53406
|
+
* pulling it out of Redis — 42 MB per tick for Microsoft Graph.
|
|
53407
|
+
*
|
|
53272
53408
|
* `lazyConnect`, and it matters: a box whose Redis is unreachable must still boot
|
|
53273
53409
|
* and still serve actions. `createCachingSpecFetch` swallows every cache error, so
|
|
53274
53410
|
* a dead Redis makes introspection slower — the miss path this cache replaced —
|
|
@@ -53276,12 +53412,12 @@ var DEV_CONNECT_ENCRYPTION_KEY = "dev-only-encryption-key";
|
|
|
53276
53412
|
*/
|
|
53277
53413
|
var createBoxSpecCache = (redisUrl, deps = {}) => {
|
|
53278
53414
|
if (redisUrl === void 0 || redisUrl === "") return {
|
|
53279
|
-
cache: createInMemorySpecCache(),
|
|
53415
|
+
cache: trackSpecDigests(createInMemorySpecCache()),
|
|
53280
53416
|
close: async () => void 0
|
|
53281
53417
|
};
|
|
53282
53418
|
const redis = (deps.connect ?? defaultSpecCacheRedis)(redisUrl);
|
|
53283
53419
|
return {
|
|
53284
|
-
cache: new RedisSpecCache(redis),
|
|
53420
|
+
cache: trackSpecDigests(new RedisSpecCache(redis)),
|
|
53285
53421
|
close: async () => {
|
|
53286
53422
|
await redis.quit().catch(() => void 0);
|
|
53287
53423
|
}
|
|
@@ -54992,7 +55128,8 @@ var createConnectHandlers = (opts) => {
|
|
|
54992
55128
|
const specCache = {
|
|
54993
55129
|
get: async (key) => (await shared()).specCache.get(key),
|
|
54994
55130
|
set: async (key, value, ttlMs) => (await shared()).specCache.set(key, value, ttlMs),
|
|
54995
|
-
evict: async (key) => (await shared()).specCache.evict(key)
|
|
55131
|
+
evict: async (key) => (await shared()).specCache.evict(key),
|
|
55132
|
+
digestOf: async (key) => await (await shared()).specCache.digestOf?.(key) ?? null
|
|
54996
55133
|
};
|
|
54997
55134
|
const registry = opts.registry ?? createRegistryStore();
|
|
54998
55135
|
const agentWire = {
|
|
@@ -72671,7 +72808,7 @@ var gitignore_raw_default = "# >>> stackbone >>>\n.stackbone/\nnode_modules/\ndi
|
|
|
72671
72808
|
var npmrc_raw_default = "# A hoisted (npm-like) node_modules layout so the emulator resolves ONE copy of\n# each externalized runtime dep (@stackbone/sdk, deepagents, @langchain/*) — a\n# second inlined copy would split the SDK's AsyncLocalStorage and empty per-run logs.\nnode-linker=hoisted\n";
|
|
72672
72809
|
//#endregion
|
|
72673
72810
|
//#region src/services/scaffold/templates/shell/package.json.tmpl?raw
|
|
72674
|
-
var package_json_default$1 = "{\n \"name\": \"{{name}}\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"description\": \"A Stackbone multi-agent workspace: N in-process deep agents + N Workflow SDK workflows.\",\n \"scripts\": {\n \"dev\": \"stackbone dev\",\n \"build\": \"stackbone build\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"1.2.8\",\n \"@langchain/langgraph\": \"1.4.7\",\n \"@langchain/langgraph-checkpoint-postgres\": \"1.0.4\",\n \"@langchain/openai\": \"1.5.3\",\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"@workflow/world\": \"5.0.0-beta.11\",\n \"deepagents\": \"1.10.5\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.
|
|
72811
|
+
var package_json_default$1 = "{\n \"name\": \"{{name}}\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"description\": \"A Stackbone multi-agent workspace: N in-process deep agents + N Workflow SDK workflows.\",\n \"scripts\": {\n \"dev\": \"stackbone dev\",\n \"build\": \"stackbone build\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"1.2.8\",\n \"@langchain/langgraph\": \"1.4.7\",\n \"@langchain/langgraph-checkpoint-postgres\": \"1.0.4\",\n \"@langchain/openai\": \"1.5.3\",\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"@workflow/world\": \"5.0.0-beta.11\",\n \"deepagents\": \"1.10.5\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"24.x\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260523.1\"\n },\n \"packageManager\": \"pnpm@9.0.0\",\n \"workspaces\": [\"workflows\"],\n \"engines\": {\n \"node\": \"24.x\"\n }\n}\n";
|
|
72675
72812
|
//#endregion
|
|
72676
72813
|
//#region src/services/scaffold/templates/shell/pnpm-workspace.yaml?raw
|
|
72677
72814
|
var pnpm_workspace_default = "packages:\n - 'workflows'\n";
|
|
@@ -72680,7 +72817,7 @@ var pnpm_workspace_default = "packages:\n - 'workflows'\n";
|
|
|
72680
72817
|
var tsconfig_default$1 = "{\n \"compilerOptions\": {\n \"module\": \"nodenext\",\n \"moduleResolution\": \"nodenext\",\n \"target\": \"esnext\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"noEmit\": true,\n \"types\": [\"node\"]\n }\n}\n";
|
|
72681
72818
|
//#endregion
|
|
72682
72819
|
//#region src/services/scaffold/templates/shell/workflows/package.json.tmpl?raw
|
|
72683
|
-
var package_json_default = "{\n \"name\": \"workflows\",\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"typecheck\": \"tsgo\"\n },\n \"dependencies\": {\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.
|
|
72820
|
+
var package_json_default = "{\n \"name\": \"workflows\",\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"typecheck\": \"tsgo\"\n },\n \"dependencies\": {\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"24.x\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260523.1\"\n },\n \"engines\": {\n \"node\": \"24.x\"\n }\n}\n";
|
|
72684
72821
|
//#endregion
|
|
72685
72822
|
//#region src/services/scaffold/templates/shell/workflows/tsconfig.json?raw
|
|
72686
72823
|
var tsconfig_default = "{\n \"compilerOptions\": {\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"target\": \"esnext\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"noEmit\": true,\n \"types\": [\"node\"]\n },\n \"include\": [\"**/*.ts\", \"../.stackbone/**/*.d.ts\"]\n}\n";
|
|
@@ -72748,7 +72885,10 @@ var DEEP_AGENT_GROUP = "deep-agents";
|
|
|
72748
72885
|
* resolvable from the workspace root so the host resolves ONE copy alongside the
|
|
72749
72886
|
* agent's `@langchain/*`. `zod` is usually already pinned by the workspace shell —
|
|
72750
72887
|
* {@link mergeMissingWorkspaceDeps} never overwrites an existing version, so it is
|
|
72751
|
-
* included only as a safety net for a hand-built workspace.
|
|
72888
|
+
* included only as a safety net for a hand-built workspace. Its value is not free:
|
|
72889
|
+
* the shell's `@workflow/world` peer-requires ONE exact `zod`, and npm refuses to
|
|
72890
|
+
* install a workspace that pins another (PLA-1653), so this entry must stay equal to
|
|
72891
|
+
* the two `package.json.tmpl` pins. `scaffold.spec.ts` fails if the three drift.
|
|
72752
72892
|
*/
|
|
72753
72893
|
var DEEP_AGENT_WORKSPACE_DEPS = Object.freeze({
|
|
72754
72894
|
"@langchain/core": "1.2.8",
|
|
@@ -72756,7 +72896,7 @@ var DEEP_AGENT_WORKSPACE_DEPS = Object.freeze({
|
|
|
72756
72896
|
"@langchain/langgraph-checkpoint-postgres": "1.0.4",
|
|
72757
72897
|
"@langchain/openai": "1.5.3",
|
|
72758
72898
|
deepagents: "1.10.5",
|
|
72759
|
-
zod: "4.
|
|
72899
|
+
zod: "4.3.6"
|
|
72760
72900
|
});
|
|
72761
72901
|
/**
|
|
72762
72902
|
* Generate the FilePlan for a deep agent named `name`: just `deep-agents/<name>/
|
|
@@ -76663,8 +76803,15 @@ var REDIS_IMAGE$1 = "redis:7-alpine";
|
|
|
76663
76803
|
*
|
|
76664
76804
|
* Same image and pin as `stackbone dev`'s compose, so the emulator and the
|
|
76665
76805
|
* deliverable run the identical backend.
|
|
76806
|
+
*
|
|
76807
|
+
* The community fork, not `minio/minio`. MinIO closed anonymous pulls of its own
|
|
76808
|
+
* image on Docker Hub (2026-09-12, PLA-1423) and then on quay.io (401 on every
|
|
76809
|
+
* tag by 2026-09-25, PLA-1794). A first-run `stackbone dev`, and the operator
|
|
76810
|
+
* running a packaged folder, pull with no credentials. `pgsty/minio` publishes
|
|
76811
|
+
* amd64 + arm64, keeps the upstream entrypoint and ships `mc` and `sh`, which the
|
|
76812
|
+
* healthcheck and the bucket-init container call.
|
|
76666
76813
|
*/
|
|
76667
|
-
var MINIO_IMAGE
|
|
76814
|
+
var MINIO_IMAGE = "pgsty/minio:RELEASE.2026-08-04T00-00-00Z";
|
|
76668
76815
|
/** Access key the bundled MinIO is created with. The secret is generated per package. */
|
|
76669
76816
|
var MINIO_ACCESS_KEY = "stackbone";
|
|
76670
76817
|
/** Bucket the init container creates, and the agent's `STACKBONE_S3_BUCKET`. */
|
|
@@ -76762,7 +76909,7 @@ var renderInfraServices = () => ` postgres:
|
|
|
76762
76909
|
minio:
|
|
76763
76910
|
# S3-compatible object storage: the agent's own files (\`client.storage\`), the
|
|
76764
76911
|
# originals managed RAG ingests, and what Studio's file browser lists.
|
|
76765
|
-
image: ${MINIO_IMAGE
|
|
76912
|
+
image: ${MINIO_IMAGE}
|
|
76766
76913
|
command: ['server', '/data']
|
|
76767
76914
|
environment:
|
|
76768
76915
|
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
|
|
@@ -76805,7 +76952,7 @@ var renderInfraServices = () => ` postgres:
|
|
|
76805
76952
|
# alphabet contains \`-\`, so about one packaged folder in 64 minted one. One
|
|
76806
76953
|
# of them took \`next\` red on 2026-08-31 (run 33430510314) on a
|
|
76807
76954
|
# comments-only commit.
|
|
76808
|
-
image: ${MINIO_IMAGE
|
|
76955
|
+
image: ${MINIO_IMAGE}
|
|
76809
76956
|
restart: 'no'
|
|
76810
76957
|
depends_on:
|
|
76811
76958
|
minio:
|
|
@@ -80033,7 +80180,6 @@ var readStackboneConfig = async (cwd) => readJsonFile(stackboneConfigPath(cwd),
|
|
|
80033
80180
|
//#region src/dev/compose-template.ts
|
|
80034
80181
|
var POSTGRES_IMAGE = "pgvector/pgvector:pg17";
|
|
80035
80182
|
var REDIS_IMAGE = "redis:7-alpine";
|
|
80036
|
-
var MINIO_IMAGE = "quay.io/minio/minio:RELEASE.2025-03-12T18-04-18Z";
|
|
80037
80183
|
var PGVECTOR_INIT_SQL = `-- Generated by stackbone dev. Runs once on Postgres first boot via
|
|
80038
80184
|
-- /docker-entrypoint-initdb.d. The queue extension is gone (BullMQ over Redis
|
|
80039
80185
|
-- is the only job engine); only pgvector is enabled here.
|
|
@@ -85456,7 +85602,7 @@ var createInitCommand = (ctx) => defineCommand({
|
|
|
85456
85602
|
args: {
|
|
85457
85603
|
dir: {
|
|
85458
85604
|
type: "positional",
|
|
85459
|
-
description: "Target subdirectory.
|
|
85605
|
+
description: "Target subdirectory. Pass `.` to scaffold into the current directory; omitted, a new subdirectory is created, named after --name (or after the current directory).",
|
|
85460
85606
|
required: false
|
|
85461
85607
|
},
|
|
85462
85608
|
with: {
|
package/package.json
CHANGED
|
Binary file
|
package/stackbone-cli-0.5.1.tgz
DELETED
|
Binary file
|