@wrongstack/runtime 0.284.0 → 0.285.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.
@@ -1,9 +1,9 @@
1
- interface ClipboardImage {
1
+ export interface ClipboardImage {
2
2
  base64: string;
3
3
  mediaType: 'image/png';
4
4
  bytes: number;
5
5
  }
6
- declare function readClipboardImage(): Promise<ClipboardImage | null>;
6
+ export declare function readClipboardImage(): Promise<ClipboardImage | null>;
7
7
  /**
8
8
  * Read plain text from the system clipboard. Returns `null` when the clipboard
9
9
  * holds no text (or only an image), the read failed, or the platform is
@@ -11,6 +11,5 @@ declare function readClipboardImage(): Promise<ClipboardImage | null>;
11
11
  * Ctrl+V to the app as a control byte rather than performing a native paste, so
12
12
  * we read the clipboard ourselves.
13
13
  */
14
- declare function readClipboardText(): Promise<string | null>;
15
-
16
- export { type ClipboardImage, readClipboardImage, readClipboardText };
14
+ export declare function readClipboardText(): Promise<string | null>;
15
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../src/clipboard.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAMzE;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BhE"}
package/dist/clipboard.js CHANGED
@@ -1,11 +1,10 @@
1
- import { spawn } from 'child_process';
2
- import { randomUUID } from 'crypto';
3
- import * as fs from 'fs/promises';
4
- import * as os from 'os';
5
- import * as path from 'path';
6
- import { buildChildEnv } from '@wrongstack/core';
7
-
8
1
  // src/clipboard.ts
2
+ import { spawn } from "node:child_process";
3
+ import { randomUUID } from "node:crypto";
4
+ import * as fs from "node:fs/promises";
5
+ import * as os from "node:os";
6
+ import * as path from "node:path";
7
+ import { buildChildEnv } from "@wrongstack/core";
9
8
  var MAX_IMAGE_BYTES = 10 * 1024 * 1024;
10
9
  async function readClipboardImage() {
11
10
  const platform = process.platform;
@@ -177,7 +176,8 @@ function runCmdToFile(cmd, args, outPath) {
177
176
  });
178
177
  });
179
178
  }
180
-
181
- export { readClipboardImage, readClipboardText };
179
+ export {
180
+ readClipboardImage,
181
+ readClipboardText
182
+ };
182
183
  //# sourceMappingURL=clipboard.js.map
183
- //# sourceMappingURL=clipboard.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../src/clipboard.ts"],"names":[],"mappings":"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","file":"clipboard.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport interface ClipboardImage {\n base64: string;\n mediaType: 'image/png';\n bytes: number;\n}\n\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024;\n\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\n const platform = process.platform;\n if (platform === 'win32') return readWindows();\n if (platform === 'darwin') return readDarwin();\n if (platform === 'linux') return readLinux();\n return null;\n}\n\n/**\n * Read plain text from the system clipboard. Returns `null` when the clipboard\n * holds no text (or only an image), the read failed, or the platform is\n * unsupported. Used by the TUI's Ctrl+V handler: terminals in raw mode deliver\n * Ctrl+V to the app as a control byte rather than performing a native paste, so\n * we read the clipboard ourselves.\n */\nexport async function readClipboardText(): Promise<string | null> {\n const platform = process.platform;\n if (platform === 'win32') {\n // -Raw preserves embedded newlines; force UTF-8 so non-ASCII survives the\n // pipe. PowerShell appends one trailing newline to stdout — strip it.\n const ps = '[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-Clipboard -Raw';\n const out = await runCmd('powershell', ['-NoProfile', '-Command', ps]);\n if (out == null) return null;\n const text = out.replace(/\\r?\\n$/, '');\n return text.length > 0 ? text : null;\n }\n if (platform === 'darwin') {\n const out = await runCmd('pbpaste', []);\n return out && out.length > 0 ? out : null;\n }\n if (platform === 'linux') {\n const tries: Array<[string, string[]]> = [\n ['wl-paste', ['--no-newline']],\n ['xclip', ['-selection', 'clipboard', '-o']],\n ];\n for (const [cmd, args] of tries) {\n const out = await runCmd(cmd, args);\n if (out && out.length > 0) return out;\n }\n return null;\n }\n return null;\n}\n\nasync function readWindows(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `wstack-clip-${randomUUID()}.png`);\n const ps = [\n 'Add-Type -AssemblyName System.Windows.Forms',\n 'Add-Type -AssemblyName System.Drawing',\n '$img = [System.Windows.Forms.Clipboard]::GetImage()',\n 'if ($img -eq $null) { Write-Output \"NO_IMAGE\"; exit 0 }',\n `$img.Save('${tmp.replace(/\\\\/g, '\\\\\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png)`,\n 'Write-Output \"OK\"',\n ].join('; ');\n const out = await runCmd('powershell', ['-NoProfile', '-Command', ps]);\n if (!out || out.trim() === 'NO_IMAGE') return null;\n if (!out.includes('OK')) return null;\n return readPngFile(tmp);\n}\n\nasync function readDarwin(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `wstack-clip-${randomUUID()}.png`);\n const script = [\n 'try',\n ` set the_file to (open for access POSIX file \"${tmp}\" with write permission)`,\n ' write (the clipboard as «class PNGf») to the_file',\n ' close access the_file',\n 'on error',\n ' try',\n ' close access POSIX file \"' + tmp + '\"',\n ' end try',\n ' return \"NO_IMAGE\"',\n 'end try',\n 'return \"OK\"',\n ].join('\\n');\n const out = await runCmd('osascript', ['-e', script]);\n if (out?.trim() !== 'OK') return null;\n return readPngFile(tmp);\n}\n\nasync function readLinux(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `wstack-clip-${randomUUID()}.png`);\n const tries: Array<[string, string[]]> = [\n ['wl-paste', ['--type', 'image/png']],\n ['xclip', ['-selection', 'clipboard', '-t', 'image/png', '-o']],\n ];\n for (const [cmd, args] of tries) {\n const ok = await runCmdToFile(cmd, args, tmp).catch(() => false);\n if (ok) return readPngFile(tmp);\n }\n return null;\n}\n\nasync function readPngFile(p: string): Promise<ClipboardImage | null> {\n try {\n const buf = await fs.readFile(p);\n if (buf.length === 0) {\n await fs.unlink(p).catch(() => undefined);\n return null;\n }\n if (buf.length > MAX_IMAGE_BYTES) {\n await fs.unlink(p).catch(() => undefined);\n throw new Error(`Clipboard image exceeds ${MAX_IMAGE_BYTES / 1024 / 1024}MB limit`);\n }\n if (buf[0] !== 0x89 || buf[1] !== 0x50 || buf[2] !== 0x4e || buf[3] !== 0x47) {\n await fs.unlink(p).catch(() => undefined);\n return null;\n }\n await fs.unlink(p).catch(() => undefined);\n return { base64: buf.toString('base64'), mediaType: 'image/png', bytes: buf.length };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\n/**\n * Hard ceiling for a clipboard subprocess. Reading the clipboard must never\n * hang the TUI: on a headless/loaded CI runner the PowerShell/xclip/wl-paste\n * read can stall indefinitely (no display, slow shell start). After this we\n * kill the child and resolve the safe default.\n */\nconst CLIPBOARD_CMD_TIMEOUT_MS = 5_000;\n\nfunction runCmd(cmd: string, args: string[]): Promise<string | null> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, {\n env: buildChildEnv(),\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let out = '';\n let settled = false;\n let killedByTimeout = false;\n const finish = (value: string | null) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n clearTimeout(killCap);\n resolve(value);\n };\n const timer = setTimeout(() => {\n killedByTimeout = true;\n child.kill('SIGTERM');\n }, CLIPBOARD_CMD_TIMEOUT_MS);\n // Safety cap: if the child ignores SIGTERM, do not hang forever.\n const killCap = setTimeout(() => finish(null), CLIPBOARD_CMD_TIMEOUT_MS + 2_000);\n child.stdout.on('data', (c) => {\n out += String(c);\n });\n child.on('error', () => finish(null));\n child.on('exit', (code) => {\n if (killedByTimeout) return finish(null);\n finish(code === 0 ? out : null);\n });\n });\n}\n\nfunction runCmdToFile(cmd: string, args: string[], outPath: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, {\n env: buildChildEnv(),\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n const chunks: Buffer[] = [];\n let settled = false;\n let killedByTimeout = false;\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n clearTimeout(killCap);\n resolve(value);\n };\n const timer = setTimeout(() => {\n killedByTimeout = true;\n child.kill('SIGTERM');\n }, CLIPBOARD_CMD_TIMEOUT_MS);\n // Safety cap: if the child ignores SIGTERM, do not hang forever.\n const killCap = setTimeout(() => finish(false), CLIPBOARD_CMD_TIMEOUT_MS + 2_000);\n child.stdout.on('data', (c: Buffer) => chunks.push(c));\n child.on('error', () => finish(false));\n child.on('exit', async (code) => {\n if (killedByTimeout) return finish(false);\n if (code !== 0 || chunks.length === 0) return finish(false);\n try {\n await fs.writeFile(outPath, Buffer.concat(chunks));\n finish(true);\n } catch {\n finish(false);\n }\n });\n });\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/clipboard.ts"],
4
+ "sourcesContent": ["import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport interface ClipboardImage {\n base64: string;\n mediaType: 'image/png';\n bytes: number;\n}\n\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024;\n\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\n const platform = process.platform;\n if (platform === 'win32') return readWindows();\n if (platform === 'darwin') return readDarwin();\n if (platform === 'linux') return readLinux();\n return null;\n}\n\n/**\n * Read plain text from the system clipboard. Returns `null` when the clipboard\n * holds no text (or only an image), the read failed, or the platform is\n * unsupported. Used by the TUI's Ctrl+V handler: terminals in raw mode deliver\n * Ctrl+V to the app as a control byte rather than performing a native paste, so\n * we read the clipboard ourselves.\n */\nexport async function readClipboardText(): Promise<string | null> {\n const platform = process.platform;\n if (platform === 'win32') {\n // -Raw preserves embedded newlines; force UTF-8 so non-ASCII survives the\n // pipe. PowerShell appends one trailing newline to stdout \u2014 strip it.\n const ps = '[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-Clipboard -Raw';\n const out = await runCmd('powershell', ['-NoProfile', '-Command', ps]);\n if (out == null) return null;\n const text = out.replace(/\\r?\\n$/, '');\n return text.length > 0 ? text : null;\n }\n if (platform === 'darwin') {\n const out = await runCmd('pbpaste', []);\n return out && out.length > 0 ? out : null;\n }\n if (platform === 'linux') {\n const tries: Array<[string, string[]]> = [\n ['wl-paste', ['--no-newline']],\n ['xclip', ['-selection', 'clipboard', '-o']],\n ];\n for (const [cmd, args] of tries) {\n const out = await runCmd(cmd, args);\n if (out && out.length > 0) return out;\n }\n return null;\n }\n return null;\n}\n\nasync function readWindows(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `wstack-clip-${randomUUID()}.png`);\n const ps = [\n 'Add-Type -AssemblyName System.Windows.Forms',\n 'Add-Type -AssemblyName System.Drawing',\n '$img = [System.Windows.Forms.Clipboard]::GetImage()',\n 'if ($img -eq $null) { Write-Output \"NO_IMAGE\"; exit 0 }',\n `$img.Save('${tmp.replace(/\\\\/g, '\\\\\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png)`,\n 'Write-Output \"OK\"',\n ].join('; ');\n const out = await runCmd('powershell', ['-NoProfile', '-Command', ps]);\n if (!out || out.trim() === 'NO_IMAGE') return null;\n if (!out.includes('OK')) return null;\n return readPngFile(tmp);\n}\n\nasync function readDarwin(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `wstack-clip-${randomUUID()}.png`);\n const script = [\n 'try',\n ` set the_file to (open for access POSIX file \"${tmp}\" with write permission)`,\n ' write (the clipboard as \u00ABclass PNGf\u00BB) to the_file',\n ' close access the_file',\n 'on error',\n ' try',\n ' close access POSIX file \"' + tmp + '\"',\n ' end try',\n ' return \"NO_IMAGE\"',\n 'end try',\n 'return \"OK\"',\n ].join('\\n');\n const out = await runCmd('osascript', ['-e', script]);\n if (out?.trim() !== 'OK') return null;\n return readPngFile(tmp);\n}\n\nasync function readLinux(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `wstack-clip-${randomUUID()}.png`);\n const tries: Array<[string, string[]]> = [\n ['wl-paste', ['--type', 'image/png']],\n ['xclip', ['-selection', 'clipboard', '-t', 'image/png', '-o']],\n ];\n for (const [cmd, args] of tries) {\n const ok = await runCmdToFile(cmd, args, tmp).catch(() => false);\n if (ok) return readPngFile(tmp);\n }\n return null;\n}\n\nasync function readPngFile(p: string): Promise<ClipboardImage | null> {\n try {\n const buf = await fs.readFile(p);\n if (buf.length === 0) {\n await fs.unlink(p).catch(() => undefined);\n return null;\n }\n if (buf.length > MAX_IMAGE_BYTES) {\n await fs.unlink(p).catch(() => undefined);\n throw new Error(`Clipboard image exceeds ${MAX_IMAGE_BYTES / 1024 / 1024}MB limit`);\n }\n if (buf[0] !== 0x89 || buf[1] !== 0x50 || buf[2] !== 0x4e || buf[3] !== 0x47) {\n await fs.unlink(p).catch(() => undefined);\n return null;\n }\n await fs.unlink(p).catch(() => undefined);\n return { base64: buf.toString('base64'), mediaType: 'image/png', bytes: buf.length };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\n/**\n * Hard ceiling for a clipboard subprocess. Reading the clipboard must never\n * hang the TUI: on a headless/loaded CI runner the PowerShell/xclip/wl-paste\n * read can stall indefinitely (no display, slow shell start). After this we\n * kill the child and resolve the safe default.\n */\nconst CLIPBOARD_CMD_TIMEOUT_MS = 5_000;\n\nfunction runCmd(cmd: string, args: string[]): Promise<string | null> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, {\n env: buildChildEnv(),\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let out = '';\n let settled = false;\n let killedByTimeout = false;\n const finish = (value: string | null) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n clearTimeout(killCap);\n resolve(value);\n };\n const timer = setTimeout(() => {\n killedByTimeout = true;\n child.kill('SIGTERM');\n }, CLIPBOARD_CMD_TIMEOUT_MS);\n // Safety cap: if the child ignores SIGTERM, do not hang forever.\n const killCap = setTimeout(() => finish(null), CLIPBOARD_CMD_TIMEOUT_MS + 2_000);\n child.stdout.on('data', (c) => {\n out += String(c);\n });\n child.on('error', () => finish(null));\n child.on('exit', (code) => {\n if (killedByTimeout) return finish(null);\n finish(code === 0 ? out : null);\n });\n });\n}\n\nfunction runCmdToFile(cmd: string, args: string[], outPath: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, {\n env: buildChildEnv(),\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n const chunks: Buffer[] = [];\n let settled = false;\n let killedByTimeout = false;\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n clearTimeout(killCap);\n resolve(value);\n };\n const timer = setTimeout(() => {\n killedByTimeout = true;\n child.kill('SIGTERM');\n }, CLIPBOARD_CMD_TIMEOUT_MS);\n // Safety cap: if the child ignores SIGTERM, do not hang forever.\n const killCap = setTimeout(() => finish(false), CLIPBOARD_CMD_TIMEOUT_MS + 2_000);\n child.stdout.on('data', (c: Buffer) => chunks.push(c));\n child.on('error', () => finish(false));\n child.on('exit', async (code) => {\n if (killedByTimeout) return finish(false);\n if (code !== 0 || chunks.length === 0) return finish(false);\n try {\n await fs.writeFile(outPath, Buffer.concat(chunks));\n finish(true);\n } catch {\n finish(false);\n }\n });\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ import { type Config, Container, type DefaultSystemPromptBuilderOptions, type EventBus, type Logger, type ModelsRegistry, type Tool, type WstackPaths } from '@wrongstack/core';
2
+ export interface CreateContainerOptions {
3
+ config: Config;
4
+ wpaths: WstackPaths;
5
+ logger: Logger;
6
+ modelsRegistry: ModelsRegistry;
7
+ /**
8
+ * Optional event bus — passed to DefaultMemoryStore so plugins and
9
+ * subsystems can react to memory mutations in real time.
10
+ */
11
+ events?: EventBus | undefined;
12
+ permission?: {
13
+ yolo?: boolean | undefined;
14
+ yoloDestructive?: boolean | undefined;
15
+ /** @deprecated Use `yoloDestructive`. */
16
+ forceAllYolo?: boolean | undefined;
17
+ /** Deprecated compatibility flag; YOLO no longer prompts by destructiveness. */
18
+ confirmDestructive?: boolean | undefined;
19
+ promptDelegate?: (tool: Tool, input: unknown, suggestedPattern: string) => Promise<'yes' | 'no' | 'always' | 'deny'>;
20
+ };
21
+ compactor?: {
22
+ preserveK?: number | undefined;
23
+ eliseThreshold?: number | undefined;
24
+ };
25
+ systemPrompt?: Partial<DefaultSystemPromptBuilderOptions> | undefined;
26
+ /** Bundled skills directory path (resolved at boot time). */
27
+ bundledSkillsDir?: string | undefined;
28
+ /** Bundled prompt dataset directory path (`<core>/data/prompts`, resolved at boot). */
29
+ bundledPromptsDir?: string | undefined;
30
+ }
31
+ /**
32
+ * Create a Container pre-bound with all default service implementations.
33
+ * Both CLI and WebUI use this factory so container wiring stays in one place.
34
+ */
35
+ export declare function createDefaultContainer(opts: CreateContainerOptions): Container;
36
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,SAAS,EAaT,KAAK,iCAAiC,EACtC,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,cAAc,EAEnB,KAAK,IAAI,EACT,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAQ1B,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC3B,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACtC,yCAAyC;QACzC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACnC,gFAAgF;QAChF,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACzC,cAAc,CAAC,EAAE,CACf,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,EACd,gBAAgB,EAAE,MAAM,KACrB,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;KAChD,CAAC;IACF,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACpF,YAAY,CAAC,EAAE,OAAO,CAAC,iCAAiC,CAAC,GAAG,SAAS,CAAC;IACtE,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS,CA4I9E"}
@@ -0,0 +1,25 @@
1
+ import { Agent, type AgentFactory, type Container, type ModelsRegistry, type ProviderRegistry, type SessionWriter, ToolRegistry } from '@wrongstack/core';
2
+ export interface LightSubagentFactoryDeps {
3
+ /** DI container — used to resolve configStore / tokenCounter / scrubber / prompt builder. */
4
+ container: Container;
5
+ /** Provider registry (already populated by the host) used to build per-subagent providers. */
6
+ providerRegistry: ProviderRegistry;
7
+ /** Full tool registry — each subagent gets an isolated clone of it. */
8
+ toolRegistry: ToolRegistry;
9
+ /** Optional models catalog used to gate per-subagent reasoning settings. */
10
+ modelsRegistry?: ModelsRegistry | undefined;
11
+ /** Parent session writer; subagent events are interleaved via a guarded shim. */
12
+ session: SessionWriter;
13
+ /** Project root anchor. */
14
+ projectRoot: string;
15
+ /** Default cwd when a SubagentConfig doesn't pin one (worktree path otherwise). */
16
+ cwd?: string | undefined;
17
+ }
18
+ /**
19
+ * Retrieve and abort a light subagent's AbortController (stored in ctx.meta
20
+ * by makeLightSubagentFactory). Idempotent — calling abort() on an already-aborted
21
+ * signal is a no-op.
22
+ */
23
+ export declare function abortLightSubagent(agent: Agent): void;
24
+ export declare function makeLightSubagentFactory(deps: LightSubagentFactoryDeps): AgentFactory;
25
+ //# sourceMappingURL=light-subagent-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-subagent-factory.d.ts","sourceRoot":"","sources":["../../src/fleet/light-subagent-factory.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,EACL,KAAK,YAAY,EAKjB,KAAK,SAAS,EAKd,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAIrB,KAAK,aAAa,EAMlB,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,wBAAwB;IACvC,6FAA6F;IAC7F,SAAS,EAAE,SAAS,CAAC;IACrB,8FAA8F;IAC9F,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,uEAAuE;IACvE,YAAY,EAAE,YAAY,CAAC;IAC3B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,iFAAiF;IACjF,OAAO,EAAE,aAAa,CAAC;IACvB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAcD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAGrD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,wBAAwB,GAAG,YAAY,CAqIrF"}
package/dist/host.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { PluginAPI, Agent, Context, EventBus, ToolRegistry, ProviderRegistry, SlashCommandRegistry, SessionWriter, ExtensionRegistry } from '@wrongstack/core';
2
- import { WrongStackPack } from './pack.js';
3
-
4
- interface RuntimeHost {
1
+ import type { Agent, Context, EventBus, ExtensionRegistry, PluginAPI, ProviderRegistry, SessionWriter, SlashCommandRegistry, ToolRegistry } from '@wrongstack/core';
2
+ import type { WrongStackPack } from './pack.js';
3
+ export interface RuntimeHost {
5
4
  agent: Agent;
6
5
  context: Context;
7
6
  events: EventBus;
@@ -12,7 +11,7 @@ interface RuntimeHost {
12
11
  extensions?: ExtensionRegistry | undefined;
13
12
  shutdown(): Promise<void>;
14
13
  }
15
- interface RuntimeHostParts {
14
+ export interface RuntimeHostParts {
16
15
  agent: Agent;
17
16
  context: Context;
18
17
  events: EventBus;
@@ -23,21 +22,20 @@ interface RuntimeHostParts {
23
22
  extensions?: ExtensionRegistry | undefined;
24
23
  shutdown?: (() => void | Promise<void>) | undefined;
25
24
  }
26
- declare function createRuntimeHostFromParts(parts: RuntimeHostParts): RuntimeHost;
27
- interface ApplyPackOptions {
25
+ export declare function createRuntimeHostFromParts(parts: RuntimeHostParts): RuntimeHost;
26
+ export interface ApplyPackOptions {
28
27
  owner?: string | undefined;
29
28
  api?: PluginAPI | undefined;
30
29
  }
31
- interface AppliedPack {
30
+ export interface AppliedPack {
32
31
  pack: WrongStackPack;
33
32
  owner: string;
34
33
  teardown(): Promise<void>;
35
34
  }
36
- declare function applyWrongStackPack(host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {
35
+ export declare function applyWrongStackPack(host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {
37
36
  extensions?: ExtensionRegistry | undefined;
38
37
  }, pack: WrongStackPack, opts?: ApplyPackOptions): Promise<AppliedPack>;
39
- declare function applyWrongStackPacks(host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {
38
+ export declare function applyWrongStackPacks(host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {
40
39
  extensions?: ExtensionRegistry | undefined;
41
40
  }, packs: readonly WrongStackPack[], opts?: ApplyPackOptions): Promise<AppliedPack[]>;
42
-
43
- export { type AppliedPack, type ApplyPackOptions, type RuntimeHost, type RuntimeHostParts, applyWrongStackPack, applyWrongStackPacks, createRuntimeHostFromParts };
41
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,QAAQ,EACR,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,oBAAoB,CAAC;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,oBAAoB,CAAC;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACrD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAc/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,WAAW,GAAG,eAAe,CAAC,GAAG;IACjE,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC5C,EACD,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,WAAW,CAAC,CA0FtB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,WAAW,GAAG,eAAe,CAAC,GAAG;IACjE,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC5C,EACD,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAwBxB"}
package/dist/host.js CHANGED
@@ -109,7 +109,9 @@ async function applyWrongStackPacks(host, packs, opts = {}) {
109
109
  throw err;
110
110
  }
111
111
  }
112
-
113
- export { applyWrongStackPack, applyWrongStackPacks, createRuntimeHostFromParts };
112
+ export {
113
+ applyWrongStackPack,
114
+ applyWrongStackPacks,
115
+ createRuntimeHostFromParts
116
+ };
114
117
  //# sourceMappingURL=host.js.map
115
- //# sourceMappingURL=host.js.map
package/dist/host.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../src/host.ts"],"names":[],"mappings":"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","file":"host.js","sourcesContent":["import type {\n Agent,\n Context,\n EventBus,\n ExtensionRegistry,\n PluginAPI,\n ProviderRegistry,\n SessionWriter,\n SlashCommandRegistry,\n ToolRegistry,\n} from '@wrongstack/core';\nimport type { WrongStackPack } from './pack.js';\n\nexport interface RuntimeHost {\n agent: Agent;\n context: Context;\n events: EventBus;\n tools: ToolRegistry;\n providers: ProviderRegistry;\n slashCommands: SlashCommandRegistry;\n session: SessionWriter;\n extensions?: ExtensionRegistry | undefined;\n shutdown(): Promise<void>;\n}\n\nexport interface RuntimeHostParts {\n agent: Agent;\n context: Context;\n events: EventBus;\n tools: ToolRegistry;\n providers: ProviderRegistry;\n slashCommands: SlashCommandRegistry;\n session: SessionWriter;\n extensions?: ExtensionRegistry | undefined;\n shutdown?: (() => void | Promise<void>) | undefined;\n}\n\nexport function createRuntimeHostFromParts(parts: RuntimeHostParts): RuntimeHost {\n return {\n agent: parts.agent,\n context: parts.context,\n events: parts.events,\n tools: parts.tools,\n providers: parts.providers,\n slashCommands: parts.slashCommands,\n session: parts.session,\n extensions: parts.extensions,\n async shutdown() {\n await parts.shutdown?.();\n },\n };\n}\n\nexport interface ApplyPackOptions {\n owner?: string | undefined;\n api?: PluginAPI | undefined;\n}\n\nexport interface AppliedPack {\n pack: WrongStackPack;\n owner: string;\n teardown(): Promise<void>;\n}\n\nexport async function applyWrongStackPack(\n host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {\n extensions?: ExtensionRegistry | undefined;\n },\n pack: WrongStackPack,\n opts: ApplyPackOptions = {},\n): Promise<AppliedPack> {\n const owner = opts.owner ?? pack.name;\n const unregisterExtensions: Array<() => void> = [];\n\n // Track registered tool names, command names, and provider types so teardown\n // can reverse everything in registration order.\n const registeredToolNames: string[] = [];\n const registeredCommandNames: string[] = [];\n const registeredProviderTypes: string[] = [];\n\n if (pack.tools) {\n const tools = [...pack.tools];\n host.tools.registerAllOrThrow(tools, owner);\n for (const t of tools) registeredToolNames.push(t.name);\n }\n if (pack.providers) {\n const providers = [...pack.providers];\n host.providers.registerAll(providers);\n for (const p of providers) registeredProviderTypes.push(p.type);\n }\n if (pack.slashCommands) {\n const cmds = [...pack.slashCommands];\n host.slashCommands.registerAll(cmds, owner);\n // SlashCommandRegistry stores plugin-owned commands under `${owner}:${name}`;\n // track the real lookup key so teardown can unregister them.\n for (const c of cmds)\n registeredCommandNames.push(owner === 'core' ? c.name : `${owner}:${c.name}`);\n }\n if (pack.extensions && host.extensions) {\n for (const ext of pack.extensions) {\n unregisterExtensions.push(host.extensions.register(ext));\n }\n }\n\n // If setup() throws after registration, roll back everything we registered above.\n // This makes applyWrongStackPack() transactional from the caller's perspective —\n // either the pack is fully applied or it is not.\n if (pack.setup) {\n if (!opts.api) {\n throw new Error(`Pack \"${pack.name}\" defines setup() but no PluginAPI was provided`);\n }\n try {\n await pack.setup(opts.api);\n } catch (setupErr) {\n // Roll back in reverse order: extensions first, then commands,\n // then tools, then providers. Extensions are unregistered before\n // tools/commands because extensions may depend on those capabilities;\n // tearing them down first avoids dangling refs.\n for (let i = unregisterExtensions.length - 1; i >= 0; i--) {\n unregisterExtensions[i]!();\n }\n for (let i = registeredCommandNames.length - 1; i >= 0; i--) {\n host.slashCommands.unregister(registeredCommandNames[i]!);\n }\n for (let i = registeredToolNames.length - 1; i >= 0; i--) {\n host.tools.unregister(registeredToolNames[i]!);\n }\n for (let i = registeredProviderTypes.length - 1; i >= 0; i--) {\n host.providers.unregister(registeredProviderTypes[i]!);\n }\n throw setupErr;\n }\n }\n\n return {\n pack,\n owner,\n async teardown() {\n for (let i = unregisterExtensions.length - 1; i >= 0; i--) {\n unregisterExtensions[i]!();\n }\n // Unregister commands, tools, and providers so the same pack can be\n // re-loaded cleanly without name/type conflicts.\n for (let i = registeredCommandNames.length - 1; i >= 0; i--) {\n host.slashCommands.unregister(registeredCommandNames[i]!);\n }\n for (let i = registeredToolNames.length - 1; i >= 0; i--) {\n host.tools.unregister(registeredToolNames[i]!);\n }\n for (let i = registeredProviderTypes.length - 1; i >= 0; i--) {\n host.providers.unregister(registeredProviderTypes[i]!);\n }\n if (pack.teardown) {\n if (!opts.api) {\n throw new Error(`Pack \"${pack.name}\" defines teardown() but no PluginAPI was provided`);\n }\n await pack.teardown(opts.api);\n }\n },\n };\n}\n\nexport async function applyWrongStackPacks(\n host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {\n extensions?: ExtensionRegistry | undefined;\n },\n packs: readonly WrongStackPack[],\n opts: ApplyPackOptions = {},\n): Promise<AppliedPack[]> {\n const applied: AppliedPack[] = [];\n try {\n for (const pack of packs) {\n applied.push(await applyWrongStackPack(host, pack, opts));\n }\n return applied;\n } catch (err) {\n // Roll back already-mounted packs. Surface teardown failures via\n // process.emitWarning so they don't mask the original error but\n // remain visible — a silent teardown failure can leave state\n // half-initialized in ways that make the next run fail mysteriously.\n for (let i = applied.length - 1; i >= 0; i--) {\n const mounted = applied[i]!;\n await mounted.teardown().catch((teardownErr) => {\n const detail = teardownErr instanceof Error ? teardownErr.message : String(teardownErr);\n process.emitWarning(\n `Pack teardown during error rollback failed: ${detail}`,\n 'PackRollbackWarning',\n );\n });\n }\n throw err;\n }\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/host.ts"],
4
+ "sourcesContent": ["import type {\n Agent,\n Context,\n EventBus,\n ExtensionRegistry,\n PluginAPI,\n ProviderRegistry,\n SessionWriter,\n SlashCommandRegistry,\n ToolRegistry,\n} from '@wrongstack/core';\nimport type { WrongStackPack } from './pack.js';\n\nexport interface RuntimeHost {\n agent: Agent;\n context: Context;\n events: EventBus;\n tools: ToolRegistry;\n providers: ProviderRegistry;\n slashCommands: SlashCommandRegistry;\n session: SessionWriter;\n extensions?: ExtensionRegistry | undefined;\n shutdown(): Promise<void>;\n}\n\nexport interface RuntimeHostParts {\n agent: Agent;\n context: Context;\n events: EventBus;\n tools: ToolRegistry;\n providers: ProviderRegistry;\n slashCommands: SlashCommandRegistry;\n session: SessionWriter;\n extensions?: ExtensionRegistry | undefined;\n shutdown?: (() => void | Promise<void>) | undefined;\n}\n\nexport function createRuntimeHostFromParts(parts: RuntimeHostParts): RuntimeHost {\n return {\n agent: parts.agent,\n context: parts.context,\n events: parts.events,\n tools: parts.tools,\n providers: parts.providers,\n slashCommands: parts.slashCommands,\n session: parts.session,\n extensions: parts.extensions,\n async shutdown() {\n await parts.shutdown?.();\n },\n };\n}\n\nexport interface ApplyPackOptions {\n owner?: string | undefined;\n api?: PluginAPI | undefined;\n}\n\nexport interface AppliedPack {\n pack: WrongStackPack;\n owner: string;\n teardown(): Promise<void>;\n}\n\nexport async function applyWrongStackPack(\n host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {\n extensions?: ExtensionRegistry | undefined;\n },\n pack: WrongStackPack,\n opts: ApplyPackOptions = {},\n): Promise<AppliedPack> {\n const owner = opts.owner ?? pack.name;\n const unregisterExtensions: Array<() => void> = [];\n\n // Track registered tool names, command names, and provider types so teardown\n // can reverse everything in registration order.\n const registeredToolNames: string[] = [];\n const registeredCommandNames: string[] = [];\n const registeredProviderTypes: string[] = [];\n\n if (pack.tools) {\n const tools = [...pack.tools];\n host.tools.registerAllOrThrow(tools, owner);\n for (const t of tools) registeredToolNames.push(t.name);\n }\n if (pack.providers) {\n const providers = [...pack.providers];\n host.providers.registerAll(providers);\n for (const p of providers) registeredProviderTypes.push(p.type);\n }\n if (pack.slashCommands) {\n const cmds = [...pack.slashCommands];\n host.slashCommands.registerAll(cmds, owner);\n // SlashCommandRegistry stores plugin-owned commands under `${owner}:${name}`;\n // track the real lookup key so teardown can unregister them.\n for (const c of cmds)\n registeredCommandNames.push(owner === 'core' ? c.name : `${owner}:${c.name}`);\n }\n if (pack.extensions && host.extensions) {\n for (const ext of pack.extensions) {\n unregisterExtensions.push(host.extensions.register(ext));\n }\n }\n\n // If setup() throws after registration, roll back everything we registered above.\n // This makes applyWrongStackPack() transactional from the caller's perspective \u2014\n // either the pack is fully applied or it is not.\n if (pack.setup) {\n if (!opts.api) {\n throw new Error(`Pack \"${pack.name}\" defines setup() but no PluginAPI was provided`);\n }\n try {\n await pack.setup(opts.api);\n } catch (setupErr) {\n // Roll back in reverse order: extensions first, then commands,\n // then tools, then providers. Extensions are unregistered before\n // tools/commands because extensions may depend on those capabilities;\n // tearing them down first avoids dangling refs.\n for (let i = unregisterExtensions.length - 1; i >= 0; i--) {\n unregisterExtensions[i]!();\n }\n for (let i = registeredCommandNames.length - 1; i >= 0; i--) {\n host.slashCommands.unregister(registeredCommandNames[i]!);\n }\n for (let i = registeredToolNames.length - 1; i >= 0; i--) {\n host.tools.unregister(registeredToolNames[i]!);\n }\n for (let i = registeredProviderTypes.length - 1; i >= 0; i--) {\n host.providers.unregister(registeredProviderTypes[i]!);\n }\n throw setupErr;\n }\n }\n\n return {\n pack,\n owner,\n async teardown() {\n for (let i = unregisterExtensions.length - 1; i >= 0; i--) {\n unregisterExtensions[i]!();\n }\n // Unregister commands, tools, and providers so the same pack can be\n // re-loaded cleanly without name/type conflicts.\n for (let i = registeredCommandNames.length - 1; i >= 0; i--) {\n host.slashCommands.unregister(registeredCommandNames[i]!);\n }\n for (let i = registeredToolNames.length - 1; i >= 0; i--) {\n host.tools.unregister(registeredToolNames[i]!);\n }\n for (let i = registeredProviderTypes.length - 1; i >= 0; i--) {\n host.providers.unregister(registeredProviderTypes[i]!);\n }\n if (pack.teardown) {\n if (!opts.api) {\n throw new Error(`Pack \"${pack.name}\" defines teardown() but no PluginAPI was provided`);\n }\n await pack.teardown(opts.api);\n }\n },\n };\n}\n\nexport async function applyWrongStackPacks(\n host: Pick<RuntimeHost, 'tools' | 'providers' | 'slashCommands'> & {\n extensions?: ExtensionRegistry | undefined;\n },\n packs: readonly WrongStackPack[],\n opts: ApplyPackOptions = {},\n): Promise<AppliedPack[]> {\n const applied: AppliedPack[] = [];\n try {\n for (const pack of packs) {\n applied.push(await applyWrongStackPack(host, pack, opts));\n }\n return applied;\n } catch (err) {\n // Roll back already-mounted packs. Surface teardown failures via\n // process.emitWarning so they don't mask the original error but\n // remain visible \u2014 a silent teardown failure can leave state\n // half-initialized in ways that make the next run fail mysteriously.\n for (let i = applied.length - 1; i >= 0; i--) {\n const mounted = applied[i]!;\n await mounted.teardown().catch((teardownErr) => {\n const detail = teardownErr instanceof Error ? teardownErr.message : String(teardownErr);\n process.emitWarning(\n `Pack teardown during error rollback failed: ${detail}`,\n 'PackRollbackWarning',\n );\n });\n }\n throw err;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/index.d.ts CHANGED
@@ -1,64 +1,25 @@
1
- import { Config, WstackPaths, Logger, ModelsRegistry, EventBus, Tool, DefaultSystemPromptBuilderOptions, Container, ProviderRegistry, ToolRegistry, SessionWriter, AgentFactory } from '@wrongstack/core';
2
- export { DefaultSystemPromptBuilder, DefaultSystemPromptBuilderOptions } from '@wrongstack/core';
3
- export * from '@wrongstack/core/defaults';
4
- export { DefaultPathResolver, DefaultTokenCounter } from '@wrongstack/core/infrastructure';
5
- export { ClipboardImage, readClipboardImage, readClipboardText } from './clipboard.js';
6
- export { AppliedPack, ApplyPackOptions, RuntimeHost, RuntimeHostParts, applyWrongStackPack, applyWrongStackPacks, createRuntimeHostFromParts } from './host.js';
7
- export { ProbeOptions, ProbeResult, probeLocalLlm } from './probe.js';
8
- export { WrongStackPack } from './pack.js';
9
- export { ImageInputUnsupportedError, ToolVisionAdapterOptions, VISION_IMAGE_KEYS, VISION_MEDIA_TYPE_KEYS, VISION_PATH_KEYS, VISION_PROMPT_KEYS, VisionAdapter, VisionAdapterInput, VisionAdapters, VisionRoutingOptions, VisionRoutingResult, VisionUrlBlockedError, createToolVisionAdapters, routeImagesForModel } from './vision.js';
10
-
11
- interface CreateContainerOptions {
12
- config: Config;
13
- wpaths: WstackPaths;
14
- logger: Logger;
15
- modelsRegistry: ModelsRegistry;
16
- /**
17
- * Optional event bus — passed to DefaultMemoryStore so plugins and
18
- * subsystems can react to memory mutations in real time.
19
- */
20
- events?: EventBus | undefined;
21
- permission?: {
22
- yolo?: boolean | undefined;
23
- yoloDestructive?: boolean | undefined;
24
- /** @deprecated Use `yoloDestructive`. */
25
- forceAllYolo?: boolean | undefined;
26
- /** When true, destructive ops prompt even in YOLO mode. */
27
- confirmDestructive?: boolean | undefined;
28
- promptDelegate?: (tool: Tool, input: unknown, suggestedPattern: string) => Promise<'yes' | 'no' | 'always' | 'deny'>;
29
- };
30
- compactor?: {
31
- preserveK?: number | undefined;
32
- eliseThreshold?: number | undefined;
33
- };
34
- systemPrompt?: Partial<DefaultSystemPromptBuilderOptions> | undefined;
35
- /** Bundled skills directory path (resolved at boot time). */
36
- bundledSkillsDir?: string | undefined;
37
- /** Bundled prompt dataset directory path (`<core>/data/prompts`, resolved at boot). */
38
- bundledPromptsDir?: string | undefined;
39
- }
40
1
  /**
41
- * Create a Container pre-bound with all default service implementations.
42
- * Both CLI and WebUI use this factory so container wiring stays in one place.
2
+ * @wrongstack/runtime
3
+ *
4
+ * Transitional home for concrete runtime implementations.
5
+ *
6
+ * The long-term package boundary is:
7
+ * - @wrongstack/core: kernel, agent runtime, registries, public contracts.
8
+ * - @wrongstack/runtime: default storage, security, config, observability,
9
+ * compaction, models, skills, and host composition helpers.
10
+ *
11
+ * For this first refactor slice, the implementations still physically live in
12
+ * @wrongstack/core and are re-exported here. That gives hosts a stable import
13
+ * target while later moves can happen behind this facade.
43
14
  */
44
- declare function createDefaultContainer(opts: CreateContainerOptions): Container;
45
-
46
- interface LightSubagentFactoryDeps {
47
- /** DI container — used to resolve configStore / tokenCounter / scrubber / prompt builder. */
48
- container: Container;
49
- /** Provider registry (already populated by the host) used to build per-subagent providers. */
50
- providerRegistry: ProviderRegistry;
51
- /** Full tool registry each subagent gets an isolated clone of it. */
52
- toolRegistry: ToolRegistry;
53
- /** Optional models catalog used to gate per-subagent reasoning settings. */
54
- modelsRegistry?: ModelsRegistry | undefined;
55
- /** Parent session writer; subagent events are interleaved via a guarded shim. */
56
- session: SessionWriter;
57
- /** Project root anchor. */
58
- projectRoot: string;
59
- /** Default cwd when a SubagentConfig doesn't pin one (worktree path otherwise). */
60
- cwd?: string | undefined;
61
- }
62
- declare function makeLightSubagentFactory(deps: LightSubagentFactoryDeps): AgentFactory;
63
-
64
- export { type CreateContainerOptions, type LightSubagentFactoryDeps, createDefaultContainer, makeLightSubagentFactory };
15
+ export { DefaultSystemPromptBuilder, type DefaultSystemPromptBuilderOptions, } from '@wrongstack/core';
16
+ export * from '@wrongstack/core/defaults';
17
+ export { DefaultPathResolver, DefaultTokenCounter, } from '@wrongstack/core/infrastructure';
18
+ export * from './clipboard.js';
19
+ export * from './container.js';
20
+ export { type LightSubagentFactoryDeps, makeLightSubagentFactory, } from './fleet/light-subagent-factory.js';
21
+ export * from './host.js';
22
+ export { type ProbeOptions, type ProbeResult, probeLocalLlm } from './local-llm-probe.js';
23
+ export * from './pack.js';
24
+ export * from './vision.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,GACvC,MAAM,kBAAkB,CAAC;AAC1B,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,KAAK,wBAAwB,EAC7B,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1F,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,17 +1,20 @@
1
- import { buildChildEnv, Container, DefaultConfigStore, TOKENS, DefaultSecretScrubber, DefaultRetryPolicy, DefaultErrorHandler, DefaultModeStore, DefaultSessionStore, DefaultMemoryStore, DefaultSkillLoader, DefaultPromptLoader, DefaultSystemPromptBuilder, DefaultPermissionPolicy, createStrategyCompactor, EventBus, resolveSubagentModelTarget, ToolRegistry, Context, createDefaultPipelines, applyModelRuntime, mergeModelRuntime, WIDE_SUBAGENT_CAPABILITIES, AutoApprovePermissionPolicy, ToolExecutor, Agent, createFallbackModelExtension, assertNotPrivateHost } from '@wrongstack/core';
2
- export { DefaultSystemPromptBuilder } from '@wrongstack/core';
3
- export * from '@wrongstack/core/defaults';
4
- import { DefaultTokenCounter } from '@wrongstack/core/infrastructure';
5
- export { DefaultPathResolver, DefaultTokenCounter } from '@wrongstack/core/infrastructure';
6
- import { spawn } from 'child_process';
7
- import { randomUUID } from 'crypto';
8
- import * as fs from 'fs/promises';
9
- import * as os from 'os';
10
- import * as path from 'path';
11
- import { buildRecoveryStrategies } from '@wrongstack/core/execution';
12
- import { getSessionRegistry } from '@wrongstack/core/storage';
13
-
14
1
  // src/index.ts
2
+ import {
3
+ DefaultSystemPromptBuilder as DefaultSystemPromptBuilder2
4
+ } from "@wrongstack/core";
5
+ export * from "@wrongstack/core/defaults";
6
+ import {
7
+ DefaultPathResolver,
8
+ DefaultTokenCounter as DefaultTokenCounter2
9
+ } from "@wrongstack/core/infrastructure";
10
+
11
+ // src/clipboard.ts
12
+ import { spawn } from "node:child_process";
13
+ import { randomUUID } from "node:crypto";
14
+ import * as fs from "node:fs/promises";
15
+ import * as os from "node:os";
16
+ import * as path from "node:path";
17
+ import { buildChildEnv } from "@wrongstack/core";
15
18
  var MAX_IMAGE_BYTES = 10 * 1024 * 1024;
16
19
  async function readClipboardImage() {
17
20
  const platform = process.platform;
@@ -183,6 +186,28 @@ function runCmdToFile(cmd, args, outPath) {
183
186
  });
184
187
  });
185
188
  }
189
+
190
+ // src/container.ts
191
+ import {
192
+ Container,
193
+ createStrategyCompactor,
194
+ DefaultConfigStore,
195
+ DefaultErrorHandler,
196
+ DefaultMemoryStore,
197
+ DefaultModeStore,
198
+ DefaultPermissionPolicy,
199
+ DefaultPromptLoader,
200
+ DefaultRetryPolicy,
201
+ DefaultSecretScrubber,
202
+ DefaultSessionStore,
203
+ DefaultSkillLoader,
204
+ DefaultSystemPromptBuilder,
205
+ TOKENS
206
+ } from "@wrongstack/core";
207
+ import { buildRecoveryStrategies } from "@wrongstack/core/execution";
208
+ import { DefaultTokenCounter } from "@wrongstack/core/infrastructure";
209
+ import { getSessionRegistry } from "@wrongstack/core/storage";
210
+ import { SuperMemoryStore } from "@wrongstack/super-memory";
186
211
  function createDefaultContainer(opts) {
187
212
  const { config, wpaths, logger, modelsRegistry } = opts;
188
213
  const container = new Container();
@@ -239,7 +264,11 @@ function createDefaultContainer(opts) {
239
264
  }
240
265
  })
241
266
  );
242
- const memoryStore = new DefaultMemoryStore({ paths: wpaths, events: opts.events });
267
+ const memoryStore = config.superMemory?.enabled === false ? new DefaultMemoryStore({ paths: wpaths, events: opts.events }) : new SuperMemoryStore({
268
+ projectRoot: wpaths.projectRoot,
269
+ directory: config.superMemory?.storage?.directory,
270
+ events: opts.events
271
+ });
243
272
  container.bind(TOKENS.MemoryStore, () => memoryStore);
244
273
  const skillLoader = new DefaultSkillLoader({
245
274
  paths: wpaths,
@@ -303,17 +332,35 @@ function createDefaultContainer(opts) {
303
332
  );
304
333
  return container;
305
334
  }
335
+
336
+ // src/fleet/light-subagent-factory.ts
337
+ import { randomUUID as randomUUID2 } from "node:crypto";
338
+ import {
339
+ Agent,
340
+ AutoApprovePermissionPolicy,
341
+ applyModelRuntime,
342
+ Context,
343
+ createDefaultPipelines,
344
+ createFallbackModelExtension,
345
+ EventBus,
346
+ mergeModelRuntime,
347
+ resolveSubagentModelTarget,
348
+ TOKENS as TOKENS2,
349
+ ToolExecutor,
350
+ ToolRegistry,
351
+ WIDE_SUBAGENT_CAPABILITIES
352
+ } from "@wrongstack/core";
306
353
  var SUBAGENT_BASELINE = "You are a subagent executing one delegated task end-to-end. Work autonomously with your tools; do not ask for confirmation on routine in-project actions. Keep output concise.";
307
354
  var _SUBAGENT_ABORT = "wrongstack:subagent-abort-controller";
308
355
  function makeLightSubagentFactory(deps) {
309
- const configStore = deps.container.resolve(TOKENS.ConfigStore);
310
- const tokenCounter = deps.container.resolve(TOKENS.TokenCounter);
311
- const secretScrubber = deps.container.resolve(TOKENS.SecretScrubber);
312
- const systemPromptBuilder = deps.container.resolve(TOKENS.SystemPromptBuilder);
356
+ const configStore = deps.container.resolve(TOKENS2.ConfigStore);
357
+ const tokenCounter = deps.container.resolve(TOKENS2.TokenCounter);
358
+ const secretScrubber = deps.container.resolve(TOKENS2.SecretScrubber);
359
+ const systemPromptBuilder = deps.container.resolve(TOKENS2.SystemPromptBuilder);
313
360
  return async (subCfg) => {
314
361
  const events = new EventBus();
315
362
  const config = configStore.get();
316
- const modelsRegistry = deps.modelsRegistry ?? deps.container.safeResolve(TOKENS.ModelsRegistry);
363
+ const modelsRegistry = deps.modelsRegistry ?? deps.container.safeResolve(TOKENS2.ModelsRegistry);
317
364
  const matrixTarget = subCfg.model ? void 0 : resolveSubagentModelTarget(config, subCfg.role);
318
365
  const effProvider = subCfg.provider ?? matrixTarget?.provider ?? config.provider;
319
366
  const effModel = subCfg.model ?? matrixTarget?.model ?? config.model;
@@ -472,7 +519,7 @@ function makeSubagentSessionShim(parent) {
472
519
  };
473
520
  }
474
521
  function cryptoId() {
475
- return randomUUID().slice(0, 8);
522
+ return randomUUID2().slice(0, 8);
476
523
  }
477
524
 
478
525
  // src/host.ts
@@ -687,6 +734,12 @@ async function probeLocalLlm(opts) {
687
734
  modelIds
688
735
  };
689
736
  }
737
+
738
+ // src/vision.ts
739
+ import * as fs2 from "node:fs/promises";
740
+ import * as os2 from "node:os";
741
+ import * as path2 from "node:path";
742
+ import { assertNotPrivateHost } from "@wrongstack/core";
690
743
  var ImageInputUnsupportedError = class extends Error {
691
744
  constructor(opts) {
692
745
  const target = [opts.providerId, opts.model].filter(Boolean).join("/") || "current model";
@@ -855,8 +908,8 @@ async function buildToolPayload(tool, image, prompt = "Describe this image for a
855
908
  const p = await writeTempImage(data, mediaType);
856
909
  payload[pathKey] = p;
857
910
  cleanup = async () => {
858
- await fs.unlink(p).catch(() => void 0);
859
- await fs.rmdir(path.dirname(p)).catch(() => void 0);
911
+ await fs2.unlink(p).catch(() => void 0);
912
+ await fs2.rmdir(path2.dirname(p)).catch(() => void 0);
860
913
  };
861
914
  } else if ("image" in props) {
862
915
  payload.image = image.source.type === "base64" ? { type: "base64", mediaType, media_type: mediaType, data } : { type: "url", url };
@@ -888,9 +941,9 @@ function firstPresent(props, keys) {
888
941
  }
889
942
  async function writeTempImage(data, mediaType) {
890
943
  const ext = mediaType.includes("jpeg") || mediaType.includes("jpg") ? "jpg" : "png";
891
- const dir = await fs.mkdtemp(path.join(os.tmpdir(), "wstack-vision-"));
892
- const file = path.join(dir, `image.${ext}`);
893
- await fs.writeFile(file, data, "base64");
944
+ const dir = await fs2.mkdtemp(path2.join(os2.tmpdir(), "wstack-vision-"));
945
+ const file = path2.join(dir, `image.${ext}`);
946
+ await fs2.writeFile(file, data, "base64");
894
947
  return file;
895
948
  }
896
949
  function schemaProperties(tool) {
@@ -914,7 +967,25 @@ function stringifyToolResult(value) {
914
967
  }
915
968
  return JSON.stringify(value);
916
969
  }
917
-
918
- export { ImageInputUnsupportedError, VISION_IMAGE_KEYS, VISION_MEDIA_TYPE_KEYS, VISION_PATH_KEYS, VISION_PROMPT_KEYS, VisionUrlBlockedError, applyWrongStackPack, applyWrongStackPacks, createDefaultContainer, createRuntimeHostFromParts, createToolVisionAdapters, makeLightSubagentFactory, probeLocalLlm, readClipboardImage, readClipboardText, routeImagesForModel };
970
+ export {
971
+ DefaultPathResolver,
972
+ DefaultSystemPromptBuilder2 as DefaultSystemPromptBuilder,
973
+ DefaultTokenCounter2 as DefaultTokenCounter,
974
+ ImageInputUnsupportedError,
975
+ VISION_IMAGE_KEYS,
976
+ VISION_MEDIA_TYPE_KEYS,
977
+ VISION_PATH_KEYS,
978
+ VISION_PROMPT_KEYS,
979
+ VisionUrlBlockedError,
980
+ applyWrongStackPack,
981
+ applyWrongStackPacks,
982
+ createDefaultContainer,
983
+ createRuntimeHostFromParts,
984
+ createToolVisionAdapters,
985
+ makeLightSubagentFactory,
986
+ probeLocalLlm,
987
+ readClipboardImage,
988
+ readClipboardText,
989
+ routeImagesForModel
990
+ };
919
991
  //# sourceMappingURL=index.js.map
920
- //# sourceMappingURL=index.js.map