@elie-laloum/outpost 1.1.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/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.fr.md +251 -0
- package/README.md +226 -0
- package/ROADMAP.md +34 -0
- package/SECURITY.md +15 -0
- package/dist/application/campaign.d.ts +33 -0
- package/dist/application/campaign.js +195 -0
- package/dist/application/campaign.js.map +1 -0
- package/dist/application/execution.d.ts +48 -0
- package/dist/application/execution.js +322 -0
- package/dist/application/execution.js.map +1 -0
- package/dist/application/interactive-brief.d.ts +3 -0
- package/dist/application/interactive-brief.js +35 -0
- package/dist/application/interactive-brief.js.map +1 -0
- package/dist/application/outpost.d.ts +91 -0
- package/dist/application/outpost.js +629 -0
- package/dist/application/outpost.js.map +1 -0
- package/dist/application/remote-workspace.d.ts +11 -0
- package/dist/application/remote-workspace.js +264 -0
- package/dist/application/remote-workspace.js.map +1 -0
- package/dist/application/tasks.d.ts +17 -0
- package/dist/application/tasks.js +36 -0
- package/dist/application/tasks.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +94 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/scaffold.d.ts +28 -0
- package/dist/cli/scaffold.js +169 -0
- package/dist/cli/scaffold.js.map +1 -0
- package/dist/cli/starters.d.ts +3 -0
- package/dist/cli/starters.js +34 -0
- package/dist/cli/starters.js.map +1 -0
- package/dist/domain/backlog.d.ts +16 -0
- package/dist/domain/backlog.js +23 -0
- package/dist/domain/backlog.js.map +1 -0
- package/dist/domain/errors.d.ts +11 -0
- package/dist/domain/errors.js +37 -0
- package/dist/domain/errors.js.map +1 -0
- package/dist/domain/ports.d.ts +183 -0
- package/dist/domain/ports.js +2 -0
- package/dist/domain/ports.js.map +1 -0
- package/dist/domain/prompts.d.ts +22 -0
- package/dist/domain/prompts.js +45 -0
- package/dist/domain/prompts.js.map +1 -0
- package/dist/domain/response.d.ts +37 -0
- package/dist/domain/response.js +50 -0
- package/dist/domain/response.js.map +1 -0
- package/dist/domain/workflow.d.ts +68 -0
- package/dist/domain/workflow.js +246 -0
- package/dist/domain/workflow.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/abort.d.ts +1 -0
- package/dist/infrastructure/abort.js +16 -0
- package/dist/infrastructure/abort.js.map +1 -0
- package/dist/infrastructure/conversations.d.ts +30 -0
- package/dist/infrastructure/conversations.js +222 -0
- package/dist/infrastructure/conversations.js.map +1 -0
- package/dist/infrastructure/files.d.ts +5 -0
- package/dist/infrastructure/files.js +85 -0
- package/dist/infrastructure/files.js.map +1 -0
- package/dist/infrastructure/git.d.ts +14 -0
- package/dist/infrastructure/git.js +304 -0
- package/dist/infrastructure/git.js.map +1 -0
- package/dist/infrastructure/journal.d.ts +10 -0
- package/dist/infrastructure/journal.js +53 -0
- package/dist/infrastructure/journal.js.map +1 -0
- package/dist/infrastructure/process.d.ts +6 -0
- package/dist/infrastructure/process.js +133 -0
- package/dist/infrastructure/process.js.map +1 -0
- package/dist/infrastructure/reporter.d.ts +10 -0
- package/dist/infrastructure/reporter.js +47 -0
- package/dist/infrastructure/reporter.js.map +1 -0
- package/dist/infrastructure/settings.d.ts +3 -0
- package/dist/infrastructure/settings.js +41 -0
- package/dist/infrastructure/settings.js.map +1 -0
- package/dist/infrastructure/shutdown.d.ts +1 -0
- package/dist/infrastructure/shutdown.js +67 -0
- package/dist/infrastructure/shutdown.js.map +1 -0
- package/dist/infrastructure/terminal.d.ts +11 -0
- package/dist/infrastructure/terminal.js +19 -0
- package/dist/infrastructure/terminal.js.map +1 -0
- package/dist/infrastructure/transfer.d.ts +3 -0
- package/dist/infrastructure/transfer.js +29 -0
- package/dist/infrastructure/transfer.js.map +1 -0
- package/dist/providers/agents.d.ts +17 -0
- package/dist/providers/agents.js +204 -0
- package/dist/providers/agents.js.map +1 -0
- package/dist/providers/backlogs.d.ts +9 -0
- package/dist/providers/backlogs.js +82 -0
- package/dist/providers/backlogs.js.map +1 -0
- package/dist/providers/cloud-files.d.ts +4 -0
- package/dist/providers/cloud-files.js +66 -0
- package/dist/providers/cloud-files.js.map +1 -0
- package/dist/providers/container.d.ts +21 -0
- package/dist/providers/container.js +310 -0
- package/dist/providers/container.js.map +1 -0
- package/dist/providers/daytona.d.ts +10 -0
- package/dist/providers/daytona.js +153 -0
- package/dist/providers/daytona.js.map +1 -0
- package/dist/providers/docker.d.ts +3 -0
- package/dist/providers/docker.js +3 -0
- package/dist/providers/docker.js.map +1 -0
- package/dist/providers/factories.d.ts +9 -0
- package/dist/providers/factories.js +12 -0
- package/dist/providers/factories.js.map +1 -0
- package/dist/providers/local.d.ts +4 -0
- package/dist/providers/local.js +64 -0
- package/dist/providers/local.js.map +1 -0
- package/dist/providers/podman.d.ts +3 -0
- package/dist/providers/podman.js +3 -0
- package/dist/providers/podman.js.map +1 -0
- package/dist/providers/vercel.d.ts +9 -0
- package/dist/providers/vercel.js +158 -0
- package/dist/providers/vercel.js.map +1 -0
- package/dist/providers/versions.d.ts +4 -0
- package/dist/providers/versions.js +5 -0
- package/dist/providers/versions.js.map +1 -0
- package/docs/api.md +147 -0
- package/docs/architecture.md +21 -0
- package/docs/migration-1.1.fr.md +44 -0
- package/docs/migration-1.1.md +38 -0
- package/docs/operations.md +101 -0
- package/docs/providers.md +119 -0
- package/docs/workflows.md +101 -0
- package/package.json +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/application/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { OutpostError, invariant, positive } from \"../domain/errors.ts\";\nimport type {\n AgentAdapter,\n AgentObservation,\n SandboxLease,\n Usage,\n WorkspaceRecord,\n} from \"../domain/ports.ts\";\nimport { prepareBrief, validateBrief, type Brief } from \"../domain/prompts.ts\";\nimport { ResponseError, type ResponseSpec } from \"../domain/response.ts\";\nimport { shell } from \"../infrastructure/process.ts\";\nimport type { Logging } from \"../infrastructure/journal.ts\";\n\nexport interface DispatchOptions<T = undefined> {\n readonly agent?: AgentAdapter;\n readonly logging?: Logging;\n readonly label?: string;\n readonly brief: Brief;\n readonly passes?: number;\n readonly until?: string | readonly string[];\n readonly idleMs?: number;\n readonly idleWarningMs?: number;\n readonly settleMs?: number;\n readonly deadlineMs?: number;\n readonly expansionMs?: number;\n readonly signal?: AbortSignal;\n readonly continuation?: { readonly id: string; readonly fork?: boolean };\n readonly response?: ResponseSpec<T>;\n readonly observe?: (event: AgentObservation) => void;\n readonly warn?: (message: string) => void;\n readonly diagnostic?: (message: string) => void;\n}\n\nexport interface Turn {\n readonly text: string;\n readonly status: number;\n readonly conversation?: string;\n readonly transcript?: string;\n readonly usage: Usage;\n readonly durationMs: number;\n}\n\nexport interface Execution<T> {\n readonly text: string;\n readonly turns: readonly Turn[];\n readonly usage: Usage;\n readonly conversation?: string;\n readonly value: T;\n readonly completed: boolean;\n readonly completion?: string;\n}\n\nexport function notify<T>(\n observer: ((value: T) => void) | undefined,\n value: T,\n): void {\n try {\n observer?.(value);\n } catch {\n /* Observers cannot change execution outcomes. */\n }\n}\n\nexport async function renderBrief(\n brief: Brief,\n workspace: WorkspaceRecord,\n lease: SandboxLease,\n host: boolean,\n options: Pick<\n DispatchOptions,\n \"signal\" | \"expansionMs\" | \"warn\" | \"diagnostic\"\n >,\n): Promise<string> {\n if (brief.text !== undefined) return brief.text;\n const source = await readFile(resolve(brief.file), \"utf8\");\n const prepared = prepareBrief(source, brief.values, {\n WORK_BRANCH: workspace.branch,\n BASE_BRANCH: workspace.baseBranch,\n });\n if (prepared.unused.length)\n notify(\n options.warn,\n `Unused prompt variables: ${prepared.unused.join(\", \")}`,\n );\n const controller = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal;\n const pending = prepared.fragments.map(async (fragment) => {\n if (fragment.kind === \"literal\") return fragment.value;\n try {\n const command = host\n ? shell(fragment.value)\n : { executable: \"sh\", arguments: [\"-c\", fragment.value] };\n const result = await lease.invoke({\n ...command,\n signal,\n deadlineMs: options.expansionMs ?? 30_000,\n });\n if (result.status !== 0)\n throw new OutpostError(\"prompt\", \"Prompt command failed\", {\n command: fragment.value,\n ...result,\n });\n notify(\n options.diagnostic,\n `Prompt command expanded to approximately ${Math.ceil(result.stdout.length / 4)} tokens`,\n );\n return result.stdout.trimEnd();\n } catch (cause) {\n controller.abort(cause);\n throw cause;\n }\n });\n const results = await Promise.allSettled(pending);\n const failure = results.find((result) => result.status === \"rejected\");\n if (failure?.status === \"rejected\") throw failure.reason;\n return results\n .map((result) => (result as PromiseFulfilledResult<string>).value)\n .join(\"\");\n}\n\nexport function validateDispatch(options: DispatchOptions<unknown>): void {\n options.signal?.throwIfAborted();\n validateBrief(options.brief);\n positive(options.passes ?? 1, \"passes\");\n invariant(\n Number.isSafeInteger(options.passes ?? 1),\n \"passes must be an integer\",\n );\n for (const key of [\n \"idleMs\",\n \"idleWarningMs\",\n \"settleMs\",\n \"deadlineMs\",\n \"expansionMs\",\n ] as const)\n if (options[key] !== undefined) positive(options[key], key);\n if (options.response || options.continuation)\n invariant(\n (options.passes ?? 1) === 1,\n \"Structured responses and continuations require one pass\",\n );\n const markers =\n options.until === undefined\n ? []\n : typeof options.until === \"string\"\n ? [options.until]\n : options.until;\n invariant(\n markers.every((marker) => marker.length > 0),\n \"Completion markers cannot be empty\",\n );\n}\n\nexport async function preflightDispatch(\n options: DispatchOptions<unknown>,\n _repository: string,\n agent?: AgentAdapter,\n): Promise<void> {\n validateDispatch(options);\n if (!options.response) return;\n if (options.response.repairs > 0)\n invariant(\n agent?.resumable ?? !!(agent?.conversations || agent?.storage),\n \"Response repair requires an adapter that supports continuation\",\n );\n const brief = options.brief;\n const text = brief.text ?? (await readFile(resolve(brief.file!), \"utf8\"));\n const resolved = text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (token, key: string) =>\n brief.values?.[key] === undefined ? token : String(brief.values[key]),\n );\n invariant(\n resolved.includes(`<${options.response.tag}>`),\n `Brief must request an opening <${options.response.tag}> tag`,\n );\n}\n\nasync function turn(\n lease: SandboxLease,\n agent: AgentAdapter,\n prompt: string,\n options: DispatchOptions<unknown>,\n continuation: DispatchOptions[\"continuation\"],\n markers: readonly string[],\n pass: number,\n): Promise<Turn> {\n const start = Date.now();\n const controller = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal;\n let idle: NodeJS.Timeout | undefined, settle: NodeJS.Timeout | undefined;\n let pending = \"\",\n text = \"\",\n conversation: string | undefined,\n failure: string | undefined;\n let finalText: string | undefined,\n rawTail = \"\",\n lastActivity = Date.now();\n let usage: Usage = { input: 0, cached: 0, output: 0 };\n let completed = false;\n const refresh = () => {\n lastActivity = Date.now();\n clearTimeout(idle);\n clearTimeout(settle);\n if (!completed)\n idle = setTimeout(\n () =>\n controller.abort(\n new OutpostError(\n \"timeout\",\n \"Agent produced no output before the idle deadline\",\n ),\n ),\n options.idleMs ?? 600_000,\n );\n if (completed)\n settle = setTimeout(\n () => controller.abort(\"completion\"),\n options.settleMs ?? 60_000,\n );\n };\n const consume = (line: string) => {\n const at = new Date().toISOString();\n notify(options.observe, { kind: \"raw\", value: line, pass, at });\n for (const event of agent.events(line)) {\n if (event.kind === \"text\") text += event.text;\n if (event.kind === \"result\") finalText = event.text;\n if (event.kind === \"conversation\") conversation = event.id;\n if (event.kind === \"failure\") failure = event.message;\n if (event.kind === \"usage\")\n usage = {\n input: usage.input + event.tokens.input,\n cached: usage.cached + event.tokens.cached,\n output: usage.output + event.tokens.output,\n ...(usage.cacheCreated !== undefined ||\n event.tokens.cacheCreated !== undefined\n ? {\n cacheCreated:\n (usage.cacheCreated ?? 0) + (event.tokens.cacheCreated ?? 0),\n }\n : {}),\n };\n if (event.kind !== \"raw\") notify(options.observe, { ...event, pass, at });\n }\n completed = markers.some((marker) => (finalText ?? text).includes(marker));\n };\n const warningInterval = options.idleWarningMs ?? 60_000;\n const warnings = setInterval(() => {\n if (Date.now() - lastActivity >= warningInterval) {\n const message = `Agent has been idle for ${Math.floor((Date.now() - lastActivity) / 1000)} seconds`;\n notify(options.warn, message);\n notify(options.observe, {\n kind: \"warning\",\n message,\n pass,\n at: new Date().toISOString(),\n });\n }\n }, warningInterval);\n refresh();\n let status = 0;\n try {\n const command = agent.request({\n text: prompt,\n ...(continuation ? { continuation } : {}),\n });\n const result = await lease.invoke({\n ...command,\n signal,\n deadlineMs: options.deadlineMs ?? 3_600_000,\n observe(channel, chunk) {\n if (channel === \"stdout\") {\n rawTail = (rawTail + chunk).slice(-65_536);\n pending += chunk;\n let end: number;\n while ((end = pending.indexOf(\"\\n\")) >= 0) {\n consume(pending.slice(0, end));\n pending = pending.slice(end + 1);\n }\n if (pending.length > 16_777_216)\n controller.abort(\n new OutpostError(\"process\", \"Agent emitted an oversized event\"),\n );\n }\n refresh();\n },\n });\n status = result.status;\n if (pending) consume(pending);\n if (status !== 0)\n throw new OutpostError(\"process\", `Agent exited with status ${status}`, {\n ...result,\n conversation,\n });\n } catch (cause) {\n options.signal?.throwIfAborted();\n if (controller.signal.reason !== \"completion\")\n throw controller.signal.reason instanceof OutpostError\n ? controller.signal.reason\n : cause;\n notify(\n options.warn,\n \"Agent remained active after completion; its command was stopped and trailing output retained\",\n );\n } finally {\n clearTimeout(idle);\n clearTimeout(settle);\n clearInterval(warnings);\n }\n if (failure) throw new OutpostError(\"process\", failure, { conversation });\n return {\n text: finalText ?? (text || rawTail),\n status,\n usage,\n durationMs: Date.now() - start,\n ...(conversation ? { conversation } : {}),\n };\n}\n\nexport async function execute<T>(\n workspace: WorkspaceRecord,\n lease: SandboxLease,\n agent: AgentAdapter,\n host: boolean,\n options: DispatchOptions<T>,\n afterTurn?: (turn: Turn) => Promise<Turn>,\n): Promise<Execution<T>> {\n validateDispatch(options);\n const markers =\n options.until === undefined\n ? [\"<outpost>done</outpost>\"]\n : typeof options.until === \"string\"\n ? [options.until]\n : options.until;\n const turns: Turn[] = [];\n let value: T = undefined as T,\n completed = false,\n continuation = options.continuation;\n let repair: string | undefined;\n const attempts = options.response\n ? 1 + options.response.repairs\n : (options.passes ?? 1);\n for (let index = 0; index < attempts; index++) {\n notify(options.observe, {\n kind: \"phase\",\n name: \"preparing prompt\",\n agent: agent.name,\n branch: workspace.branch,\n directory: workspace.directory,\n pass: index + 1,\n at: new Date().toISOString(),\n });\n const prompt =\n repair ??\n (await renderBrief(options.brief, workspace, lease, host, options));\n if (options.response && !repair)\n invariant(\n prompt.includes(`<${options.response.tag}>`),\n `Brief must request an opening <${options.response.tag}> tag`,\n );\n notify(options.observe, {\n kind: \"prompt\",\n text: prompt,\n pass: index + 1,\n at: new Date().toISOString(),\n });\n notify(options.observe, {\n kind: \"phase\",\n name: \"running\",\n agent: agent.name,\n branch: workspace.branch,\n pass: index + 1,\n at: new Date().toISOString(),\n });\n const finished = await turn(\n lease,\n agent,\n prompt,\n options,\n continuation,\n markers,\n index + 1,\n );\n const current = afterTurn ? await afterTurn(finished) : finished;\n turns.push(current);\n notify(options.observe, {\n kind: \"summary\",\n durationMs: current.durationMs,\n status: current.status,\n tokens: current.usage,\n pass: index + 1,\n at: new Date().toISOString(),\n });\n completed = markers.some((marker) => current.text.includes(marker));\n if (options.response) {\n try {\n value = await options.response.read(current.text);\n completed = true;\n break;\n } catch (error) {\n if (!(error instanceof ResponseError)) throw error;\n error.recovery = {\n conversation: current.conversation,\n branch: workspace.branch,\n directory: workspace.directory,\n turns,\n };\n if (index + 1 >= attempts || !current.conversation) throw error;\n continuation = { id: current.conversation };\n repair = [\n `Correct the response inside <${options.response.tag}> and </${options.response.tag}>.`,\n `Validation failure: ${error.message}`,\n `Previous content: ${error.raw ?? \"No complete tagged response was returned.\"}`,\n `Cause: ${error.cause instanceof Error ? error.cause.message : (JSON.stringify(error.cause) ?? \"unspecified\")}`,\n `Further repair attempts after this one: ${attempts - index - 2}.`,\n \"Do not edit files, run commands or continue implementation. Only return the corrected response.\",\n ].join(\"\\n\");\n }\n } else if (completed) break;\n }\n const conversation = turns.at(-1)?.conversation;\n const completion = markers.find((marker) =>\n turns.at(-1)?.text.includes(marker),\n );\n return {\n text: turns.map((item) => item.text).join(\"\\n\"),\n turns,\n value,\n completed,\n ...(completion ? { completion } : {}),\n ...(conversation ? { conversation } : {}),\n usage: turns.reduce(\n (sum, item) => ({\n input: sum.input + item.usage.input,\n cached: sum.cached + item.usage.cached,\n output: sum.output + item.usage.output,\n ...(sum.cacheCreated !== undefined ||\n item.usage.cacheCreated !== undefined\n ? {\n cacheCreated:\n (sum.cacheCreated ?? 0) + (item.usage.cacheCreated ?? 0),\n }\n : {}),\n }),\n { input: 0, cached: 0, output: 0 } as Usage,\n ),\n };\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Brief } from "../domain/prompts.ts";
|
|
2
|
+
export type VariableQuestion = (key: string, signal?: AbortSignal) => Promise<string>;
|
|
3
|
+
export declare function completeBrief(brief: Brief | undefined, signal?: AbortSignal, ask?: VariableQuestion): Promise<Brief | undefined>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { invariant } from "../domain/errors.js";
|
|
4
|
+
export async function completeBrief(brief, signal, ask) {
|
|
5
|
+
signal?.throwIfAborted();
|
|
6
|
+
if (!brief || brief.file === undefined)
|
|
7
|
+
return brief;
|
|
8
|
+
const source = await readFile(brief.file, "utf8");
|
|
9
|
+
const supplied = {
|
|
10
|
+
...brief.values,
|
|
11
|
+
};
|
|
12
|
+
const missing = [
|
|
13
|
+
...new Set([...source.matchAll(/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g)].map((match) => match[1])),
|
|
14
|
+
].filter((key) => !["WORK_BRANCH", "BASE_BRANCH"].includes(key) && supplied[key] == null);
|
|
15
|
+
if (!missing.length)
|
|
16
|
+
return brief;
|
|
17
|
+
invariant(ask || process.stdin.isTTY, `Missing prompt variables: ${missing.join(", ")}. Provide brief.values or an ask callback outside an interactive terminal.`);
|
|
18
|
+
const terminal = ask
|
|
19
|
+
? undefined
|
|
20
|
+
: createInterface({ input: process.stdin, output: process.stdout });
|
|
21
|
+
try {
|
|
22
|
+
for (const key of missing) {
|
|
23
|
+
signal?.throwIfAborted();
|
|
24
|
+
supplied[key] = ask
|
|
25
|
+
? await ask(key, signal)
|
|
26
|
+
: await terminal.question(`${key}: `, signal ? { signal } : {});
|
|
27
|
+
}
|
|
28
|
+
signal?.throwIfAborted();
|
|
29
|
+
return { file: brief.file, values: supplied };
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
terminal?.close();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=interactive-brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-brief.js","sourceRoot":"","sources":["../../src/application/interactive-brief.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOhD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAwB,EACxB,MAAoB,EACpB,GAAsB;IAEtB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAA8C;QAC1D,GAAG,KAAK,CAAC,MAAM;KAChB,CAAC;IACF,MAAM,OAAO,GAAG;QACd,GAAG,IAAI,GAAG,CACR,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC,CAAC,GAAG,CACjE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CACrB,CACF;KACF,CAAC,MAAM,CACN,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CACzE,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClC,SAAS,CACP,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAC1B,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,4EAA4E,CAC5H,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG;gBACjB,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;gBACxB,CAAC,CAAC,MAAM,QAAS,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAA2B,EAAE,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,QAAQ,EAAE,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport type { Brief, PromptVariables } from \"../domain/prompts.ts\";\nimport { invariant } from \"../domain/errors.ts\";\n\nexport type VariableQuestion = (\n key: string,\n signal?: AbortSignal,\n) => Promise<string>;\n\nexport async function completeBrief(\n brief: Brief | undefined,\n signal?: AbortSignal,\n ask?: VariableQuestion,\n): Promise<Brief | undefined> {\n signal?.throwIfAborted();\n if (!brief || brief.file === undefined) return brief;\n const source = await readFile(brief.file, \"utf8\");\n const supplied: Record<string, string | number | boolean> = {\n ...brief.values,\n };\n const missing = [\n ...new Set(\n [...source.matchAll(/\\{\\{\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\}\\}/g)].map(\n (match) => match[1]!,\n ),\n ),\n ].filter(\n (key) =>\n ![\"WORK_BRANCH\", \"BASE_BRANCH\"].includes(key) && supplied[key] == null,\n );\n if (!missing.length) return brief;\n invariant(\n ask || process.stdin.isTTY,\n `Missing prompt variables: ${missing.join(\", \")}. Provide brief.values or an ask callback outside an interactive terminal.`,\n );\n const terminal = ask\n ? undefined\n : createInterface({ input: process.stdin, output: process.stdout });\n try {\n for (const key of missing) {\n signal?.throwIfAborted();\n supplied[key] = ask\n ? await ask(key, signal)\n : await terminal!.question(`${key}: `, signal ? { signal } : {});\n }\n signal?.throwIfAborted();\n return { file: brief.file, values: supplied as PromptVariables };\n } finally {\n terminal?.close();\n }\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { AgentAdapter, BranchPolicy, Command, CommandResult, Commit, Disposal, LifecycleHooks, SandboxProvider, StageLimits, WorkspaceRecord } from "../domain/ports.ts";
|
|
2
|
+
import type { Brief } from "../domain/prompts.ts";
|
|
3
|
+
import { type Logging } from "../infrastructure/journal.ts";
|
|
4
|
+
import { type DispatchOptions, type Execution } from "./execution.ts";
|
|
5
|
+
import { type VariableQuestion } from "./interactive-brief.ts";
|
|
6
|
+
export interface WorkspaceOptions {
|
|
7
|
+
readonly signal?: AbortSignal;
|
|
8
|
+
readonly repository?: string;
|
|
9
|
+
readonly branch?: BranchPolicy;
|
|
10
|
+
readonly copies?: readonly string[];
|
|
11
|
+
readonly limits?: StageLimits;
|
|
12
|
+
readonly label?: string;
|
|
13
|
+
readonly hooks?: LifecycleHooks;
|
|
14
|
+
}
|
|
15
|
+
export interface Workspace extends WorkspaceRecord {
|
|
16
|
+
dispatch<T = undefined>(options: Omit<SandboxOptions, Exclude<keyof WorkspaceOptions, "hooks" | "label"> | "workspace"> & DispatchOptions<T> & {
|
|
17
|
+
readonly agent: AgentAdapter;
|
|
18
|
+
}): Promise<DispatchResult<T>>;
|
|
19
|
+
sandbox(options?: Omit<SandboxOptions, Exclude<keyof WorkspaceOptions, "hooks" | "label"> | "workspace">): Promise<Sandbox>;
|
|
20
|
+
attach(options: Omit<SandboxOptions, Exclude<keyof WorkspaceOptions, "hooks" | "label"> | "workspace"> & AttachOptions & {
|
|
21
|
+
readonly agent: AgentAdapter;
|
|
22
|
+
}): Promise<AttachResult>;
|
|
23
|
+
close(options?: {
|
|
24
|
+
readonly preserve?: boolean;
|
|
25
|
+
}): Promise<Disposal>;
|
|
26
|
+
integrate(): Promise<void>;
|
|
27
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export declare function openWorkspace(options?: WorkspaceOptions): Promise<Workspace>;
|
|
30
|
+
export interface SandboxOptions extends WorkspaceOptions {
|
|
31
|
+
readonly includeUncommitted?: boolean;
|
|
32
|
+
readonly agent?: AgentAdapter;
|
|
33
|
+
readonly provider?: SandboxProvider;
|
|
34
|
+
readonly workspace?: Workspace;
|
|
35
|
+
readonly hooks?: LifecycleHooks;
|
|
36
|
+
readonly signal?: AbortSignal;
|
|
37
|
+
readonly logging?: Logging;
|
|
38
|
+
readonly bootstrap?: boolean;
|
|
39
|
+
readonly conversationHome?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface AttachOptions {
|
|
42
|
+
readonly ask?: VariableQuestion;
|
|
43
|
+
readonly agent?: AgentAdapter;
|
|
44
|
+
readonly brief?: Brief;
|
|
45
|
+
readonly continuation?: {
|
|
46
|
+
readonly id: string;
|
|
47
|
+
readonly fork?: boolean;
|
|
48
|
+
};
|
|
49
|
+
readonly signal?: AbortSignal;
|
|
50
|
+
readonly terminal?: Command["terminal"];
|
|
51
|
+
}
|
|
52
|
+
export interface AttachResult extends CommandResult, Disposal {
|
|
53
|
+
readonly commits: readonly Commit[];
|
|
54
|
+
readonly branch: string;
|
|
55
|
+
readonly directory: string;
|
|
56
|
+
}
|
|
57
|
+
export interface DispatchResult<T> extends Execution<T> {
|
|
58
|
+
readonly branch: string;
|
|
59
|
+
readonly directory: string;
|
|
60
|
+
readonly commits: readonly Commit[];
|
|
61
|
+
readonly transcript?: string;
|
|
62
|
+
readonly log?: string;
|
|
63
|
+
readonly retainedDirectory?: string;
|
|
64
|
+
resume<U = undefined>(options: ContinuationOptions<U>): Promise<DispatchResult<U>>;
|
|
65
|
+
fork<U = undefined>(options: ContinuationOptions<U>): Promise<DispatchResult<U>>;
|
|
66
|
+
}
|
|
67
|
+
export type ContinuationOptions<T = undefined> = DispatchOptions<T> & Omit<SandboxOptions, "agent">;
|
|
68
|
+
export interface WarmDispatchResult<T> extends Omit<DispatchResult<T>, "resume" | "fork"> {
|
|
69
|
+
resume<U = undefined>(options: DispatchOptions<U>): Promise<WarmDispatchResult<U>>;
|
|
70
|
+
fork<U = undefined>(options: DispatchOptions<U>): Promise<WarmDispatchResult<U>>;
|
|
71
|
+
}
|
|
72
|
+
export interface Sandbox {
|
|
73
|
+
readonly workspace: Workspace;
|
|
74
|
+
readonly root: string;
|
|
75
|
+
dispatch<T = undefined>(options: DispatchOptions<T>): Promise<WarmDispatchResult<T>>;
|
|
76
|
+
resume<T = undefined>(id: string, options: DispatchOptions<T>): Promise<WarmDispatchResult<T>>;
|
|
77
|
+
fork<T = undefined>(id: string, options: DispatchOptions<T>): Promise<WarmDispatchResult<T>>;
|
|
78
|
+
attach(options?: AttachOptions): Promise<AttachResult>;
|
|
79
|
+
command(command: Command): Promise<CommandResult>;
|
|
80
|
+
close(options?: {
|
|
81
|
+
readonly preserve?: boolean;
|
|
82
|
+
}): Promise<Disposal>;
|
|
83
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export declare function createSandbox(options?: SandboxOptions): Promise<Sandbox>;
|
|
86
|
+
export declare function dispatch<T = undefined>(options: SandboxOptions & DispatchOptions<T> & {
|
|
87
|
+
readonly agent: AgentAdapter;
|
|
88
|
+
}): Promise<DispatchResult<T>>;
|
|
89
|
+
export declare function attach(options: SandboxOptions & AttachOptions & {
|
|
90
|
+
readonly agent: AgentAdapter;
|
|
91
|
+
}): Promise<AttachResult>;
|