@yanlinglabs/winter-agent-runtime 0.0.27
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/LICENSE +21 -0
- package/NOTICE +41 -0
- package/README.md +64 -0
- package/dist/checkpoint/file-history.d.ts +81 -0
- package/dist/checkpoint/rewind.d.ts +55 -0
- package/dist/checkpoint/seam.d.ts +47 -0
- package/dist/checkpoint/sink.d.ts +66 -0
- package/dist/commands/builtins-listing.d.ts +40 -0
- package/dist/commands/resolver.d.ts +103 -0
- package/dist/commands/seam.d.ts +53 -0
- package/dist/compaction/controller.d.ts +23 -0
- package/dist/compaction/retention.d.ts +35 -0
- package/dist/compaction/seam.d.ts +115 -0
- package/dist/compaction/summarizer.d.ts +79 -0
- package/dist/context/agent-listing.d.ts +39 -0
- package/dist/context/assembler.d.ts +46 -0
- package/dist/context/attachments.d.ts +104 -0
- package/dist/context/dynamic-sections.d.ts +31 -0
- package/dist/context/git-fixture.d.ts +18 -0
- package/dist/context/git-status.d.ts +16 -0
- package/dist/context/imports.d.ts +22 -0
- package/dist/context/injection.d.ts +53 -0
- package/dist/context/memory-key.d.ts +46 -0
- package/dist/context/memory.d.ts +28 -0
- package/dist/context/minimal-prompt.d.ts +5 -0
- package/dist/context/output-styles.d.ts +68 -0
- package/dist/context/plan-mode.d.ts +29 -0
- package/dist/context/request-layout.d.ts +138 -0
- package/dist/context/rules.d.ts +63 -0
- package/dist/context/seam.d.ts +136 -0
- package/dist/context/tool-epoch.d.ts +118 -0
- package/dist/context/winter-code-preset.d.ts +39 -0
- package/dist/context/winter-md.d.ts +81 -0
- package/dist/embedded-host.d.ts +48 -0
- package/dist/embedded-host.js +155 -0
- package/dist/embedded-protocol.d.ts +44 -0
- package/dist/embedded-worker.d.ts +1 -0
- package/dist/embedded-worker.js +74 -0
- package/dist/embedded.d.ts +34 -0
- package/dist/embedded.js +9 -0
- package/dist/engine.d.ts +1298 -0
- package/dist/hooks/additional-context.d.ts +21 -0
- package/dist/hooks/bounds.d.ts +6 -0
- package/dist/hooks/bridge-invoker.d.ts +3 -0
- package/dist/hooks/command-invoker.d.ts +52 -0
- package/dist/hooks/from-config.d.ts +31 -0
- package/dist/hooks/hook-stage.d.ts +25 -0
- package/dist/hooks/input-validator.d.ts +6 -0
- package/dist/hooks/reducer.d.ts +74 -0
- package/dist/hooks/registry.d.ts +33 -0
- package/dist/hooks/runner.d.ts +105 -0
- package/dist/index-584yahed.js +6037 -0
- package/dist/index-97t2rmtf.js +42 -0
- package/dist/index-9qgkpv56.js +27183 -0
- package/dist/index-bef62z3r.js +437 -0
- package/dist/index-rkhh0457.js +187 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +353 -0
- package/dist/main.d.ts +1 -0
- package/dist/mcp/client.d.ts +105 -0
- package/dist/mcp/control-seam.d.ts +25 -0
- package/dist/mcp/control.d.ts +5 -0
- package/dist/mcp/elicitation.d.ts +35 -0
- package/dist/mcp/env.d.ts +12 -0
- package/dist/mcp/lifecycle.d.ts +142 -0
- package/dist/mcp/output-cap.d.ts +15 -0
- package/dist/mcp/state.d.ts +24 -0
- package/dist/mcp/test-fixtures.d.ts +88 -0
- package/dist/mcp/transports/__fixtures__/stdio-server.d.ts +1 -0
- package/dist/mcp/transports/http.d.ts +5 -0
- package/dist/mcp/transports/sdk.d.ts +5 -0
- package/dist/mcp/transports/sse.d.ts +3 -0
- package/dist/mcp/transports/stdio.d.ts +35 -0
- package/dist/mcp/winter-server.d.ts +2 -0
- package/dist/messaging/reference-adapter.d.ts +88 -0
- package/dist/messaging/router.d.ts +8 -0
- package/dist/paths/project-dir-name.d.ts +2 -0
- package/dist/paths/temp.d.ts +25 -0
- package/dist/permissions/approvals.d.ts +107 -0
- package/dist/permissions/auto/caches.d.ts +53 -0
- package/dist/permissions/auto/config.d.ts +37 -0
- package/dist/permissions/auto/engine.d.ts +74 -0
- package/dist/permissions/auto/envelope.d.ts +45 -0
- package/dist/permissions/auto/inheritance.d.ts +27 -0
- package/dist/permissions/edit-recognition.d.ts +30 -0
- package/dist/permissions/evaluator.d.ts +284 -0
- package/dist/permissions/file-rules.d.ts +384 -0
- package/dist/permissions/grammar.d.ts +113 -0
- package/dist/permissions/paths.d.ts +32 -0
- package/dist/permissions/policy-state.d.ts +64 -0
- package/dist/permissions/prompt-stage.d.ts +3 -0
- package/dist/permissions/protected.d.ts +54 -0
- package/dist/permissions/ruleset.d.ts +134 -0
- package/dist/permissions/shell-structure.d.ts +41 -0
- package/dist/plugins/bundle.d.ts +100 -0
- package/dist/plugins/installed.d.ts +30 -0
- package/dist/plugins/loader.d.ts +56 -0
- package/dist/plugins/manifest.d.ts +115 -0
- package/dist/production-wiring.d.ts +340 -0
- package/dist/protocol/channel.d.ts +22 -0
- package/dist/provider/advisor-route.d.ts +47 -0
- package/dist/provider/bridge.d.ts +124 -0
- package/dist/provider/classifier/model-classifier.d.ts +82 -0
- package/dist/provider/classifier/prompt.d.ts +62 -0
- package/dist/provider/classifier/verdict-schema.d.ts +83 -0
- package/dist/provider/credential-api.d.ts +160 -0
- package/dist/provider/family-listing.d.ts +27 -0
- package/dist/provider/first-party.d.ts +4 -0
- package/dist/provider/keychain-store.d.ts +59 -0
- package/dist/provider/lean-prompt.d.ts +7 -0
- package/dist/provider/mock.d.ts +55 -0
- package/dist/provider/scenario-fake.d.ts +96 -0
- package/dist/provider/selection.d.ts +115 -0
- package/dist/provider/session-provider.d.ts +426 -0
- package/dist/provider/slots.d.ts +120 -0
- package/dist/provider/stream-frames.d.ts +25 -0
- package/dist/provider/tool-secret.d.ts +57 -0
- package/dist/rpc/bridge.d.ts +14 -0
- package/dist/rpc/mcp-control.d.ts +26 -0
- package/dist/runtime.d.ts +14 -0
- package/dist/sandbox/profile.d.ts +249 -0
- package/dist/sandbox/spawn.d.ts +139 -0
- package/dist/settings/env-filter.d.ts +52 -0
- package/dist/settings/loaders/hooks.d.ts +44 -0
- package/dist/settings/loaders/mcp-config.d.ts +83 -0
- package/dist/settings/loaders/plugin-mcp.d.ts +3 -0
- package/dist/settings/loaders/strict-plugin-only.d.ts +13 -0
- package/dist/settings/resolve.d.ts +2 -0
- package/dist/settings/sources.d.ts +2 -0
- package/dist/settings/trust.d.ts +36 -0
- package/dist/skills/attachment.d.ts +25 -0
- package/dist/skills/frontmatter.d.ts +64 -0
- package/dist/skills/index.d.ts +16 -0
- package/dist/skills/listing.d.ts +89 -0
- package/dist/skills/loader.d.ts +104 -0
- package/dist/skills/option.d.ts +68 -0
- package/dist/skills/permission-rules.d.ts +21 -0
- package/dist/skills/runtime.d.ts +21 -0
- package/dist/skills/store.d.ts +163 -0
- package/dist/store/continuation-attach.d.ts +44 -0
- package/dist/store/dialect.d.ts +526 -0
- package/dist/store/provider-state.d.ts +188 -0
- package/dist/store/resume.d.ts +92 -0
- package/dist/structured/ajv-seam.d.ts +7 -0
- package/dist/structured/descriptor.d.ts +9 -0
- package/dist/structured/seam.d.ts +51 -0
- package/dist/structured/validator.d.ts +22 -0
- package/dist/subagents/activity.d.ts +13 -0
- package/dist/subagents/availability.d.ts +30 -0
- package/dist/subagents/builtin-agents.d.ts +37 -0
- package/dist/subagents/child-engine.d.ts +198 -0
- package/dist/subagents/child-handle.d.ts +344 -0
- package/dist/subagents/definitions.d.ts +189 -0
- package/dist/subagents/fork.d.ts +55 -0
- package/dist/subagents/git-root.d.ts +1 -0
- package/dist/subagents/limits.d.ts +28 -0
- package/dist/subagents/notification-queue.d.ts +233 -0
- package/dist/subagents/plugin-agents.d.ts +5 -0
- package/dist/subagents/policy.d.ts +46 -0
- package/dist/subagents/register-default-factory.d.ts +66 -0
- package/dist/subagents/resolution.d.ts +56 -0
- package/dist/subagents/restore.d.ts +9 -0
- package/dist/subagents/roster.d.ts +17 -0
- package/dist/subagents/test-fakes.d.ts +12 -0
- package/dist/subagents/tool-pools.d.ts +69 -0
- package/dist/subagents/watchdog.d.ts +13 -0
- package/dist/subagents/workspace.d.ts +27 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.js +194 -0
- package/dist/tools/background-tasks.d.ts +10 -0
- package/dist/tools/descriptors/_shared.d.ts +34 -0
- package/dist/tools/descriptors/advisor.d.ts +1 -0
- package/dist/tools/descriptors/agent.d.ts +47 -0
- package/dist/tools/descriptors/artifact.d.ts +1 -0
- package/dist/tools/descriptors/ask-user-question.d.ts +1 -0
- package/dist/tools/descriptors/bash.d.ts +20 -0
- package/dist/tools/descriptors/claude-design.d.ts +1 -0
- package/dist/tools/descriptors/cron-create.d.ts +1 -0
- package/dist/tools/descriptors/cron-delete.d.ts +1 -0
- package/dist/tools/descriptors/cron-list.d.ts +1 -0
- package/dist/tools/descriptors/edit.d.ts +1 -0
- package/dist/tools/descriptors/end-conversation.d.ts +1 -0
- package/dist/tools/descriptors/enter-plan-mode.d.ts +1 -0
- package/dist/tools/descriptors/enter-worktree.d.ts +1 -0
- package/dist/tools/descriptors/exit-plan-mode.d.ts +1 -0
- package/dist/tools/descriptors/exit-worktree.d.ts +1 -0
- package/dist/tools/descriptors/glob.d.ts +1 -0
- package/dist/tools/descriptors/grep.d.ts +1 -0
- package/dist/tools/descriptors/index.d.ts +59 -0
- package/dist/tools/descriptors/list-agents.d.ts +1 -0
- package/dist/tools/descriptors/list-mcp-resources-tool.d.ts +1 -0
- package/dist/tools/descriptors/lsp.d.ts +1 -0
- package/dist/tools/descriptors/monitor.d.ts +1 -0
- package/dist/tools/descriptors/notebook-edit.d.ts +1 -0
- package/dist/tools/descriptors/powershell.d.ts +1 -0
- package/dist/tools/descriptors/projects.d.ts +1 -0
- package/dist/tools/descriptors/propose-goal.d.ts +1 -0
- package/dist/tools/descriptors/propose-skills.d.ts +1 -0
- package/dist/tools/descriptors/push-notification.d.ts +1 -0
- package/dist/tools/descriptors/read-mcp-resource-dir-tool.d.ts +1 -0
- package/dist/tools/descriptors/read-mcp-resource-tool.d.ts +1 -0
- package/dist/tools/descriptors/read-notifications.d.ts +1 -0
- package/dist/tools/descriptors/read.d.ts +1 -0
- package/dist/tools/descriptors/refresh-mcp-tools.d.ts +1 -0
- package/dist/tools/descriptors/remote-trigger.d.ts +1 -0
- package/dist/tools/descriptors/repl.d.ts +1 -0
- package/dist/tools/descriptors/report-findings.d.ts +1 -0
- package/dist/tools/descriptors/schedule-wakeup.d.ts +1 -0
- package/dist/tools/descriptors/send-feedback.d.ts +1 -0
- package/dist/tools/descriptors/send-message.d.ts +1 -0
- package/dist/tools/descriptors/send-user-file.d.ts +1 -0
- package/dist/tools/descriptors/share-onboarding-guide.d.ts +1 -0
- package/dist/tools/descriptors/show-onboarding-role-picker.d.ts +1 -0
- package/dist/tools/descriptors/skill.d.ts +1 -0
- package/dist/tools/descriptors/structured-output.d.ts +1 -0
- package/dist/tools/descriptors/task-create.d.ts +1 -0
- package/dist/tools/descriptors/task-get.d.ts +1 -0
- package/dist/tools/descriptors/task-list.d.ts +1 -0
- package/dist/tools/descriptors/task-output.d.ts +1 -0
- package/dist/tools/descriptors/task-stop.d.ts +1 -0
- package/dist/tools/descriptors/task-update.d.ts +1 -0
- package/dist/tools/descriptors/todo-write.d.ts +1 -0
- package/dist/tools/descriptors/tool-search.d.ts +1 -0
- package/dist/tools/descriptors/wait-for-mcp-servers.d.ts +1 -0
- package/dist/tools/descriptors/web-fetch.d.ts +8 -0
- package/dist/tools/descriptors/web-search.d.ts +15 -0
- package/dist/tools/descriptors/winter-list-agents.d.ts +1 -0
- package/dist/tools/descriptors/winter-send-message.d.ts +1 -0
- package/dist/tools/descriptors/workflow.d.ts +1 -0
- package/dist/tools/descriptors/write.d.ts +1 -0
- package/dist/tools/impl/_caller.d.ts +14 -0
- package/dist/tools/impl/_domains.d.ts +25 -0
- package/dist/tools/impl/_exa-client.d.ts +122 -0
- package/dist/tools/impl/_exa-session-client.d.ts +23 -0
- package/dist/tools/impl/_inner-model.d.ts +135 -0
- package/dist/tools/impl/_search-budget.d.ts +36 -0
- package/dist/tools/impl/_web-fetch-cache.d.ts +37 -0
- package/dist/tools/impl/_web-fetch-html.d.ts +26 -0
- package/dist/tools/impl/_web-fetch-net.d.ts +99 -0
- package/dist/tools/impl/_web-search-assembler.d.ts +57 -0
- package/dist/tools/impl/advisor.d.ts +37 -0
- package/dist/tools/impl/agent.d.ts +10 -0
- package/dist/tools/impl/ask-user-question.d.ts +5 -0
- package/dist/tools/impl/background-task-runtime.d.ts +272 -0
- package/dist/tools/impl/bash.d.ts +78 -0
- package/dist/tools/impl/cron.d.ts +11 -0
- package/dist/tools/impl/edit.d.ts +1 -0
- package/dist/tools/impl/enter-plan-mode.d.ts +4 -0
- package/dist/tools/impl/enter-worktree.d.ts +25 -0
- package/dist/tools/impl/exit-plan-mode.d.ts +4 -0
- package/dist/tools/impl/exit-worktree.d.ts +4 -0
- package/dist/tools/impl/glob.d.ts +1 -0
- package/dist/tools/impl/grep.d.ts +19 -0
- package/dist/tools/impl/index.d.ts +37 -0
- package/dist/tools/impl/list-agents.d.ts +7 -0
- package/dist/tools/impl/list-mcp-resources-tool.d.ts +9 -0
- package/dist/tools/impl/monitor.d.ts +66 -0
- package/dist/tools/impl/notebook-edit.d.ts +1 -0
- package/dist/tools/impl/push-notification.d.ts +4 -0
- package/dist/tools/impl/read-ladder.d.ts +25 -0
- package/dist/tools/impl/read-mcp-resource-dir-tool.d.ts +9 -0
- package/dist/tools/impl/read-mcp-resource-tool.d.ts +9 -0
- package/dist/tools/impl/read-notifications.d.ts +5 -0
- package/dist/tools/impl/read.d.ts +44 -0
- package/dist/tools/impl/refresh-mcp-tools.d.ts +8 -0
- package/dist/tools/impl/report-findings.d.ts +1 -0
- package/dist/tools/impl/schedule-wakeup.d.ts +2 -0
- package/dist/tools/impl/send-message.d.ts +7 -0
- package/dist/tools/impl/skill.d.ts +5 -0
- package/dist/tools/impl/task-graph.d.ts +1 -0
- package/dist/tools/impl/task-output.d.ts +16 -0
- package/dist/tools/impl/task-stop.d.ts +11 -0
- package/dist/tools/impl/todo-write.d.ts +8 -0
- package/dist/tools/impl/tool-search.d.ts +4 -0
- package/dist/tools/impl/wait-for-mcp-servers.d.ts +29 -0
- package/dist/tools/impl/web-fetch.d.ts +36 -0
- package/dist/tools/impl/web-search.d.ts +30 -0
- package/dist/tools/impl/workflow.d.ts +5 -0
- package/dist/tools/impl/write.d.ts +8 -0
- package/dist/tools/paths-seam.d.ts +6 -0
- package/dist/tools/read-state.d.ts +12 -0
- package/dist/tools/registry.d.ts +423 -0
- package/dist/tools/task-graph-store.d.ts +61 -0
- package/dist/toolsearch/aliases.d.ts +26 -0
- package/dist/toolsearch/exposure.d.ts +30 -0
- package/dist/toolsearch/ranking.d.ts +6 -0
- package/dist/toolsearch/search.d.ts +45 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +5 -0
- package/dist/web/fetchable-url.d.ts +28 -0
- package/dist/web/preapproved-hosts.d.ts +52 -0
- package/dist/web/private-address.d.ts +55 -0
- package/dist/web/session-runtime.d.ts +86 -0
- package/dist/workflows/bridge.d.ts +87 -0
- package/dist/workflows/budget.d.ts +24 -0
- package/dist/workflows/host-registry.d.ts +142 -0
- package/dist/workflows/journal.d.ts +29 -0
- package/dist/workflows/meta.d.ts +45 -0
- package/dist/workflows/registry.d.ts +24 -0
- package/dist/workflows/runtime.d.ts +254 -0
- package/dist/workflows/sandbox.d.ts +49 -0
- package/dist/workflows/script-api.d.ts +58 -0
- package/dist/workflows/seam.d.ts +92 -0
- package/dist/workflows/semaphore.d.ts +16 -0
- package/dist/workflows/store.d.ts +177 -0
- package/dist/workflows/subprocess-entry.d.ts +38 -0
- package/dist/workflows/subprocess-entry.js +14 -0
- package/dist/workflows/transcript.d.ts +56 -0
- package/dist/workflows/types.d.ts +84 -0
- package/dist/workflows/worker-harness.d.ts +45 -0
- package/package.json +76 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
// src/workflows/journal.ts
|
|
2
|
+
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
function promptKey(prompt, opts) {
|
|
5
|
+
return JSON.stringify([prompt, opts ?? null]);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
class RunJournal {
|
|
9
|
+
path;
|
|
10
|
+
constructor(dir, runId) {
|
|
11
|
+
const runDir = join(dir, runId);
|
|
12
|
+
mkdirSync(runDir, { recursive: true, mode: 448 });
|
|
13
|
+
this.path = join(runDir, "journal.jsonl");
|
|
14
|
+
}
|
|
15
|
+
append(promptKeyValue, value) {
|
|
16
|
+
this.appendRaw(JSON.stringify({ promptKey: promptKeyValue, value }) + `
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
appendRaw(line) {
|
|
20
|
+
appendFileSync(this.path, line);
|
|
21
|
+
}
|
|
22
|
+
load() {
|
|
23
|
+
let raw;
|
|
24
|
+
try {
|
|
25
|
+
raw = readFileSync(this.path, "utf8");
|
|
26
|
+
} catch {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const line of raw.split(`
|
|
31
|
+
`)) {
|
|
32
|
+
if (line.trim() === "")
|
|
33
|
+
continue;
|
|
34
|
+
try {
|
|
35
|
+
const parsed = JSON.parse(line);
|
|
36
|
+
if (typeof parsed?.promptKey === "string")
|
|
37
|
+
out.push(parsed);
|
|
38
|
+
} catch {}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// src/workflows/semaphore.ts
|
|
45
|
+
import { cpus } from "node:os";
|
|
46
|
+
var DEFAULT_MAX_CONCURRENCY = 16;
|
|
47
|
+
function resolveConcurrencyCap(cpuCount = cpus().length) {
|
|
48
|
+
return Math.max(1, Math.min(DEFAULT_MAX_CONCURRENCY, cpuCount - 2));
|
|
49
|
+
}
|
|
50
|
+
function makeSemaphore(max) {
|
|
51
|
+
const permits = Math.max(1, Math.floor(max));
|
|
52
|
+
let active = 0;
|
|
53
|
+
const queue = [];
|
|
54
|
+
return {
|
|
55
|
+
acquire: () => new Promise((resolve) => {
|
|
56
|
+
if (active < permits) {
|
|
57
|
+
active++;
|
|
58
|
+
resolve();
|
|
59
|
+
} else {
|
|
60
|
+
queue.push(resolve);
|
|
61
|
+
}
|
|
62
|
+
}),
|
|
63
|
+
release: () => {
|
|
64
|
+
active--;
|
|
65
|
+
const next = queue.shift();
|
|
66
|
+
if (next) {
|
|
67
|
+
active++;
|
|
68
|
+
next();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// src/workflows/script-api.ts
|
|
75
|
+
var AsyncFunction = Object.getPrototypeOf(async function() {}).constructor;
|
|
76
|
+
var guardedMath = new Proxy(Math, {
|
|
77
|
+
get(target, prop, receiver) {
|
|
78
|
+
if (prop === "random") {
|
|
79
|
+
return () => {
|
|
80
|
+
throw new Error("Math.random is withheld for determinism (WS-11 §1.6) -- pass a seed via args");
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return Reflect.get(target, prop, receiver);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
var GuardedDate = new Proxy(Date, {
|
|
87
|
+
get(target, prop, receiver) {
|
|
88
|
+
if (prop === "now") {
|
|
89
|
+
return () => {
|
|
90
|
+
throw new Error("Date.now is withheld for determinism (WS-11 §1.6) -- pass timestamps via args");
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return Reflect.get(target, prop, receiver);
|
|
94
|
+
},
|
|
95
|
+
construct(target, argsList, newTarget) {
|
|
96
|
+
if (argsList.length === 0) {
|
|
97
|
+
throw new Error("argless new Date() is withheld for determinism (WS-11 §1.6) -- pass a timestamp via args");
|
|
98
|
+
}
|
|
99
|
+
const instance = Reflect.construct(target, argsList, newTarget);
|
|
100
|
+
try {
|
|
101
|
+
Object.defineProperty(instance, "constructor", { value: GuardedDate, writable: true, configurable: true, enumerable: false });
|
|
102
|
+
} catch {}
|
|
103
|
+
return instance;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
function transformSource(source) {
|
|
107
|
+
return source.replace(/\bexport\s+(?:const|let|var)\s+meta\s*=/, "__META__.value =").replace(/^[ \t]*export\s+/gm, "");
|
|
108
|
+
}
|
|
109
|
+
var DYNAMIC_IMPORT_RE = /\bimport\s*[(.]/;
|
|
110
|
+
function assertNoDynamicImport(body) {
|
|
111
|
+
if (DYNAMIC_IMPORT_RE.test(body)) {
|
|
112
|
+
throw new Error("`import` is not available to a workflow script -- no filesystem, process, network or import access (WS-11 §1.6); pass what the script needs through `args`");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function runWorkflowScript(deps) {
|
|
116
|
+
const sem = makeSemaphore(deps.concurrency);
|
|
117
|
+
const journal = deps.resumeJournal ?? [];
|
|
118
|
+
const state = { callIndex: 0, diverged: false, dispatched: 0, completed: 0, budget: deps.budget };
|
|
119
|
+
function budgetView() {
|
|
120
|
+
return {
|
|
121
|
+
get total() {
|
|
122
|
+
return state.budget.total;
|
|
123
|
+
},
|
|
124
|
+
spent: () => state.budget.spent,
|
|
125
|
+
remaining: () => state.budget.total === null ? Infinity : Math.max(0, state.budget.total - state.budget.spent)
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async function agent(prompt, opts) {
|
|
129
|
+
const index = state.callIndex++;
|
|
130
|
+
const key = promptKey(String(prompt), opts);
|
|
131
|
+
const cached = journal[index];
|
|
132
|
+
if (!state.diverged && cached !== undefined && cached.promptKey === key)
|
|
133
|
+
return cached.value;
|
|
134
|
+
if (!state.diverged) {
|
|
135
|
+
state.diverged = true;
|
|
136
|
+
deps.reportCachedPrefix?.(index);
|
|
137
|
+
}
|
|
138
|
+
if (state.dispatched >= deps.totalAgentCap) {
|
|
139
|
+
throw new Error(`workflow exceeded the per-run agent cap (${deps.totalAgentCap}) -- ${state.completed} completed before the stop`);
|
|
140
|
+
}
|
|
141
|
+
if (state.budget.total !== null && state.budget.spent >= state.budget.total) {
|
|
142
|
+
throw new Error(`workflow budget exhausted: ${state.budget.spent} of ${state.budget.total} tokens spent -- further agent() calls are refused (WS-11 §1.6)`);
|
|
143
|
+
}
|
|
144
|
+
state.dispatched++;
|
|
145
|
+
await sem.acquire();
|
|
146
|
+
let outcome;
|
|
147
|
+
try {
|
|
148
|
+
outcome = await deps.agent(String(prompt), opts);
|
|
149
|
+
} finally {
|
|
150
|
+
sem.release();
|
|
151
|
+
state.completed++;
|
|
152
|
+
}
|
|
153
|
+
if (outcome.budget !== undefined)
|
|
154
|
+
state.budget = outcome.budget;
|
|
155
|
+
if (!outcome.ok)
|
|
156
|
+
throw new Error(outcome.error);
|
|
157
|
+
return outcome.value;
|
|
158
|
+
}
|
|
159
|
+
function assertItemCap(kind, count) {
|
|
160
|
+
if (count > deps.maxItemsPerCall) {
|
|
161
|
+
throw new Error(`${kind}() was given ${count} items, over the per-call limit of ${deps.maxItemsPerCall} (WS-11 §1.6) -- split the work across calls`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function parallel(thunks) {
|
|
165
|
+
const list = Array.from(thunks ?? []);
|
|
166
|
+
assertItemCap("parallel", list.length);
|
|
167
|
+
return Promise.all(list.map(async (thunk) => {
|
|
168
|
+
try {
|
|
169
|
+
return await thunk();
|
|
170
|
+
} catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
async function pipeline(items, ...stages) {
|
|
176
|
+
const list = Array.from(items ?? []);
|
|
177
|
+
assertItemCap("pipeline", list.length);
|
|
178
|
+
return Promise.all(list.map(async (item, index) => {
|
|
179
|
+
let current = item;
|
|
180
|
+
try {
|
|
181
|
+
for (const stage of stages)
|
|
182
|
+
current = await stage(current, item, index);
|
|
183
|
+
return current;
|
|
184
|
+
} catch {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
async function runBody(source, args, depth) {
|
|
190
|
+
const metaCell = { value: undefined };
|
|
191
|
+
const nested = async (nameOrRef, childArgs) => {
|
|
192
|
+
if (depth >= 1) {
|
|
193
|
+
throw new Error("workflow() nesting is one level deep -- a nested workflow cannot call workflow() itself (WS-11 §1.6)");
|
|
194
|
+
}
|
|
195
|
+
const ref = typeof nameOrRef === "string" ? { name: nameOrRef } : nameOrRef;
|
|
196
|
+
const resolved = await deps.resolveWorkflow(ref, childArgs);
|
|
197
|
+
if (!resolved.ok)
|
|
198
|
+
throw new Error(resolved.error);
|
|
199
|
+
const child = await runBody(resolved.source, childArgs, depth + 1);
|
|
200
|
+
return child.result;
|
|
201
|
+
};
|
|
202
|
+
const scope = {
|
|
203
|
+
agent,
|
|
204
|
+
parallel,
|
|
205
|
+
pipeline,
|
|
206
|
+
phase: (title) => deps.phase(String(title)),
|
|
207
|
+
log: (message) => deps.log(String(message)),
|
|
208
|
+
budget: budgetView(),
|
|
209
|
+
workflow: nested,
|
|
210
|
+
args,
|
|
211
|
+
__META__: metaCell,
|
|
212
|
+
JSON,
|
|
213
|
+
Math: guardedMath,
|
|
214
|
+
Date: GuardedDate,
|
|
215
|
+
Array,
|
|
216
|
+
Object,
|
|
217
|
+
String,
|
|
218
|
+
Number,
|
|
219
|
+
Boolean,
|
|
220
|
+
Promise,
|
|
221
|
+
RegExp,
|
|
222
|
+
Map,
|
|
223
|
+
Set,
|
|
224
|
+
Error,
|
|
225
|
+
Symbol,
|
|
226
|
+
console: {
|
|
227
|
+
log: (...parts) => deps.log(parts.map(stringifyLogPart).join(" ")),
|
|
228
|
+
info: (...parts) => deps.log(parts.map(stringifyLogPart).join(" ")),
|
|
229
|
+
warn: (...parts) => deps.log(parts.map(stringifyLogPart).join(" ")),
|
|
230
|
+
error: (...parts) => deps.log(parts.map(stringifyLogPart).join(" ")),
|
|
231
|
+
debug: (...parts) => deps.log(parts.map(stringifyLogPart).join(" "))
|
|
232
|
+
},
|
|
233
|
+
Bun: undefined,
|
|
234
|
+
process: undefined,
|
|
235
|
+
performance: undefined,
|
|
236
|
+
crypto: undefined,
|
|
237
|
+
require: undefined,
|
|
238
|
+
module: undefined,
|
|
239
|
+
exports: undefined,
|
|
240
|
+
fetch: undefined,
|
|
241
|
+
globalThis: undefined,
|
|
242
|
+
self: undefined,
|
|
243
|
+
global: undefined,
|
|
244
|
+
XMLHttpRequest: undefined,
|
|
245
|
+
WebSocket: undefined,
|
|
246
|
+
Worker: undefined,
|
|
247
|
+
Function: undefined
|
|
248
|
+
};
|
|
249
|
+
const names = Object.keys(scope);
|
|
250
|
+
const body = transformSource(source);
|
|
251
|
+
assertNoDynamicImport(body);
|
|
252
|
+
const compiled = new AsyncFunction(...names, `"use strict";
|
|
253
|
+
${body}`);
|
|
254
|
+
const result = await compiled(...names.map((n) => scope[n]));
|
|
255
|
+
return { meta: metaCell.value, result };
|
|
256
|
+
}
|
|
257
|
+
const outcome = await runBody(deps.source, deps.args, 0);
|
|
258
|
+
if (!state.diverged && journal.length > 0)
|
|
259
|
+
deps.reportCachedPrefix?.(state.callIndex);
|
|
260
|
+
return outcome;
|
|
261
|
+
}
|
|
262
|
+
function stringifyLogPart(part) {
|
|
263
|
+
if (typeof part === "string")
|
|
264
|
+
return part;
|
|
265
|
+
try {
|
|
266
|
+
return JSON.stringify(part) ?? String(part);
|
|
267
|
+
} catch {
|
|
268
|
+
return String(part);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// src/workflows/bridge.ts
|
|
273
|
+
function splitNdjson(buffer) {
|
|
274
|
+
const lines = [];
|
|
275
|
+
let rest = buffer;
|
|
276
|
+
for (;; ) {
|
|
277
|
+
const idx = rest.indexOf(`
|
|
278
|
+
`);
|
|
279
|
+
if (idx < 0)
|
|
280
|
+
break;
|
|
281
|
+
const line = rest.slice(0, idx);
|
|
282
|
+
rest = rest.slice(idx + 1);
|
|
283
|
+
if (line.trim() !== "")
|
|
284
|
+
lines.push(line);
|
|
285
|
+
}
|
|
286
|
+
return { lines, rest };
|
|
287
|
+
}
|
|
288
|
+
function encodeNdjson(value) {
|
|
289
|
+
return JSON.stringify(value) + `
|
|
290
|
+
`;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// src/workflows/subprocess-entry.ts
|
|
294
|
+
var WORKFLOW_WORKER_ARGV_FLAG2 = "__workflow-worker";
|
|
295
|
+
var WORKFLOW_WORKER_BRIDGE_FLAG2 = "--bridge";
|
|
296
|
+
var WORKFLOW_WORKER_NOT_IMPLEMENTED_EXIT_CODE2 = 78;
|
|
297
|
+
var WORKFLOW_WORKER_BROKEN_EXIT_CODE2 = 70;
|
|
298
|
+
async function workflowWorkerMain2(argv, io) {
|
|
299
|
+
if (!argv.includes(WORKFLOW_WORKER_BRIDGE_FLAG2)) {
|
|
300
|
+
io.stderr.write(`winter: ${WORKFLOW_WORKER_ARGV_FLAG2} was invoked without ${WORKFLOW_WORKER_BRIDGE_FLAG2}; there is no parent driving the bridge, so there is nothing to run
|
|
301
|
+
`);
|
|
302
|
+
return WORKFLOW_WORKER_NOT_IMPLEMENTED_EXIT_CODE2;
|
|
303
|
+
}
|
|
304
|
+
const lines = new LineQueue(io.stdin);
|
|
305
|
+
const writes = [];
|
|
306
|
+
const post = (message) => {
|
|
307
|
+
writes.push(writeAndFlush(io.stdout, encodeNdjson(message)));
|
|
308
|
+
};
|
|
309
|
+
let init;
|
|
310
|
+
try {
|
|
311
|
+
const first = await lines.next();
|
|
312
|
+
if (first === undefined)
|
|
313
|
+
throw new Error("stdin closed before the init line arrived");
|
|
314
|
+
init = JSON.parse(first);
|
|
315
|
+
if (typeof init?.source !== "string")
|
|
316
|
+
throw new Error("the init line carries no `source`");
|
|
317
|
+
} catch (err) {
|
|
318
|
+
io.stderr.write(`winter: workflow worker could not read its init line: ${errorText(err)}
|
|
319
|
+
`);
|
|
320
|
+
return WORKFLOW_WORKER_BROKEN_EXIT_CODE2;
|
|
321
|
+
}
|
|
322
|
+
let nextCallId = 1;
|
|
323
|
+
const pending = new Map;
|
|
324
|
+
const call = (build) => new Promise((resolve) => {
|
|
325
|
+
const callId = nextCallId++;
|
|
326
|
+
pending.set(callId, resolve);
|
|
327
|
+
post(build(callId));
|
|
328
|
+
});
|
|
329
|
+
const pump = (async () => {
|
|
330
|
+
for (;; ) {
|
|
331
|
+
const line = await lines.next();
|
|
332
|
+
if (line === undefined)
|
|
333
|
+
return;
|
|
334
|
+
let response;
|
|
335
|
+
try {
|
|
336
|
+
response = JSON.parse(line);
|
|
337
|
+
} catch {
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
const settle = pending.get(response.callId);
|
|
341
|
+
if (settle === undefined)
|
|
342
|
+
continue;
|
|
343
|
+
pending.delete(response.callId);
|
|
344
|
+
settle(response);
|
|
345
|
+
}
|
|
346
|
+
})();
|
|
347
|
+
pump.then(() => {
|
|
348
|
+
for (const [callId, settle] of pending) {
|
|
349
|
+
pending.delete(callId);
|
|
350
|
+
settle({ callId, ok: false, error: "the workflow host closed the bridge" });
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
const agent = async (prompt, opts) => {
|
|
354
|
+
const response = await call((callId) => ({ op: "agent", callId, prompt, ...opts !== undefined ? { opts } : {} }));
|
|
355
|
+
return response.ok ? { ok: true, value: response.value, ...response.budget !== undefined ? { budget: response.budget } : {} } : { ok: false, error: response.error, ...response.budget !== undefined ? { budget: response.budget } : {} };
|
|
356
|
+
};
|
|
357
|
+
const resolveWorkflow = async (ref, args) => {
|
|
358
|
+
const response = await call((callId) => ({ op: "workflow", callId, ref, ...args !== undefined ? { args } : {} }));
|
|
359
|
+
if (!response.ok)
|
|
360
|
+
return { ok: false, error: response.error };
|
|
361
|
+
const source = response.value?.source;
|
|
362
|
+
if (typeof source !== "string")
|
|
363
|
+
return { ok: false, error: `the workflow host returned no source for ${JSON.stringify(ref)}` };
|
|
364
|
+
return { ok: true, source };
|
|
365
|
+
};
|
|
366
|
+
try {
|
|
367
|
+
const { result } = await runWorkflowScript({
|
|
368
|
+
source: init.source,
|
|
369
|
+
args: init.args,
|
|
370
|
+
concurrency: init.concurrency,
|
|
371
|
+
totalAgentCap: init.totalAgentCap,
|
|
372
|
+
maxItemsPerCall: init.maxItemsPerCall,
|
|
373
|
+
budget: init.budget,
|
|
374
|
+
agent,
|
|
375
|
+
resolveWorkflow,
|
|
376
|
+
phase: (title) => post({ op: "phase", title }),
|
|
377
|
+
log: (message) => post({ op: "log", message }),
|
|
378
|
+
reportCachedPrefix: (count) => post({ op: "resumed", cachedPrefix: count }),
|
|
379
|
+
...init.resumeJournal !== undefined ? { resumeJournal: init.resumeJournal } : {}
|
|
380
|
+
});
|
|
381
|
+
post({ op: "done", result });
|
|
382
|
+
} catch (err) {
|
|
383
|
+
post({ op: "error", message: errorText(err) });
|
|
384
|
+
}
|
|
385
|
+
await Promise.all(writes);
|
|
386
|
+
return 0;
|
|
387
|
+
}
|
|
388
|
+
function errorText(err) {
|
|
389
|
+
return err instanceof Error ? err.message : String(err);
|
|
390
|
+
}
|
|
391
|
+
function writeAndFlush(stream, chunk) {
|
|
392
|
+
return new Promise((resolve) => {
|
|
393
|
+
stream.write(chunk, () => resolve());
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
class LineQueue {
|
|
398
|
+
buffer = "";
|
|
399
|
+
ready = [];
|
|
400
|
+
waiters = [];
|
|
401
|
+
ended = false;
|
|
402
|
+
constructor(stream) {
|
|
403
|
+
stream.on("data", (chunk) => {
|
|
404
|
+
this.buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
405
|
+
const { lines, rest } = splitNdjson(this.buffer);
|
|
406
|
+
this.buffer = rest;
|
|
407
|
+
for (const line of lines)
|
|
408
|
+
this.push(line);
|
|
409
|
+
});
|
|
410
|
+
const end = () => {
|
|
411
|
+
this.ended = true;
|
|
412
|
+
while (this.waiters.length > 0)
|
|
413
|
+
this.waiters.shift()(undefined);
|
|
414
|
+
};
|
|
415
|
+
stream.on("end", end);
|
|
416
|
+
stream.on("close", end);
|
|
417
|
+
stream.on("error", end);
|
|
418
|
+
stream.resume();
|
|
419
|
+
}
|
|
420
|
+
push(line) {
|
|
421
|
+
const waiter = this.waiters.shift();
|
|
422
|
+
if (waiter)
|
|
423
|
+
waiter(line);
|
|
424
|
+
else
|
|
425
|
+
this.ready.push(line);
|
|
426
|
+
}
|
|
427
|
+
next() {
|
|
428
|
+
const queued = this.ready.shift();
|
|
429
|
+
if (queued !== undefined)
|
|
430
|
+
return Promise.resolve(queued);
|
|
431
|
+
if (this.ended)
|
|
432
|
+
return Promise.resolve(undefined);
|
|
433
|
+
return new Promise((resolve) => this.waiters.push(resolve));
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export { promptKey, RunJournal, resolveConcurrencyCap, makeSemaphore, splitNdjson, encodeNdjson, WORKFLOW_WORKER_ARGV_FLAG2, WORKFLOW_WORKER_BRIDGE_FLAG2, WORKFLOW_WORKER_NOT_IMPLEMENTED_EXIT_CODE2, WORKFLOW_WORKER_BROKEN_EXIT_CODE2, workflowWorkerMain2 };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import {
|
|
2
|
+
killAllTaskProcessGroups,
|
|
3
|
+
setHostWorkflowWorkerCommand,
|
|
4
|
+
runEngine2,
|
|
5
|
+
stubExecutor2,
|
|
6
|
+
isTestProviderName2,
|
|
7
|
+
testProviderForNamespace,
|
|
8
|
+
registerBgTaskTestTool2,
|
|
9
|
+
resolveEngineSession2,
|
|
10
|
+
resolveProductionWinterHome2,
|
|
11
|
+
resolveProductionStoreHome
|
|
12
|
+
} from "./index-9qgkpv56.js";
|
|
13
|
+
import {
|
|
14
|
+
registerDefaultChildEngineFactory,
|
|
15
|
+
loadResumedChain,
|
|
16
|
+
buildProductionWiring,
|
|
17
|
+
withAutoSkillPermissions,
|
|
18
|
+
restoreChildRoster
|
|
19
|
+
} from "./index-584yahed.js";
|
|
20
|
+
|
|
21
|
+
// src/embedded.ts
|
|
22
|
+
import { splitFrames, encodeFrame } from "@yanlinglabs/winter-agent-sdk";
|
|
23
|
+
import { WinterCompatibilitySessionStore, compatibilityKeys } from "@yanlinglabs/winter-agent-sdk";
|
|
24
|
+
|
|
25
|
+
// src/embedded-protocol.ts
|
|
26
|
+
var EMBEDDED_ABORT_END_INPUT_REQUEST_ID = "embedded-abort:end_input";
|
|
27
|
+
var EMBEDDED_ABORT_INTERRUPT_REQUEST_ID = "embedded-abort:interrupt";
|
|
28
|
+
|
|
29
|
+
// src/embedded.ts
|
|
30
|
+
function parseConfigFromArgv(argv) {
|
|
31
|
+
if (!argv.includes("--run")) {
|
|
32
|
+
throw new Error("winter: expected '--run --config-json <json>' (missing --run)");
|
|
33
|
+
}
|
|
34
|
+
const idx = argv.indexOf("--config-json");
|
|
35
|
+
const raw = idx === -1 ? undefined : argv[idx + 1];
|
|
36
|
+
if (raw === undefined) {
|
|
37
|
+
throw new Error("winter: expected '--run --config-json <json>' (missing --config-json <json>)");
|
|
38
|
+
}
|
|
39
|
+
return JSON.parse(raw);
|
|
40
|
+
}
|
|
41
|
+
function resolveNamespacedTestProvider(name) {
|
|
42
|
+
if (name === "bgtask")
|
|
43
|
+
registerBgTaskTestTool2();
|
|
44
|
+
return testProviderForNamespace(name);
|
|
45
|
+
}
|
|
46
|
+
function assertRecognizedTestProviderEnv(env) {
|
|
47
|
+
const raw = env["WINTER_TEST_PROVIDER"];
|
|
48
|
+
if (raw === undefined || raw === "")
|
|
49
|
+
return;
|
|
50
|
+
const name = raw.startsWith("winter-test/") ? raw.slice("winter-test/".length) : raw;
|
|
51
|
+
if (name !== "echo" && !isTestProviderName2(name)) {
|
|
52
|
+
throw new Error(`winter: unrecognized WINTER_TEST_PROVIDER '${raw}'`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
var ABORTED = Symbol("aborted");
|
|
56
|
+
function frameSource(input, aborted) {
|
|
57
|
+
return async function* () {
|
|
58
|
+
let carry = "";
|
|
59
|
+
const iterator = input[Symbol.asyncIterator]();
|
|
60
|
+
let sawAbort = false;
|
|
61
|
+
try {
|
|
62
|
+
while (true) {
|
|
63
|
+
const next = await Promise.race([iterator.next(), aborted]);
|
|
64
|
+
if (next === ABORTED) {
|
|
65
|
+
sawAbort = true;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
if (next.done)
|
|
69
|
+
return;
|
|
70
|
+
const split = splitFrames(next.value, carry);
|
|
71
|
+
carry = split.carry;
|
|
72
|
+
for (const frame of split.frames)
|
|
73
|
+
yield frame;
|
|
74
|
+
}
|
|
75
|
+
} catch {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (sawAbort) {
|
|
79
|
+
Promise.resolve(iterator.return?.()).catch(() => {});
|
|
80
|
+
yield { type: "control_request", requestId: EMBEDDED_ABORT_END_INPUT_REQUEST_ID, subtype: "end_input", payload: {} };
|
|
81
|
+
yield { type: "control_request", requestId: EMBEDDED_ABORT_INTERRUPT_REQUEST_ID, subtype: "interrupt", payload: {} };
|
|
82
|
+
}
|
|
83
|
+
}();
|
|
84
|
+
}
|
|
85
|
+
function isSyntheticAbortAck(frame) {
|
|
86
|
+
if (frame.type !== "control_response")
|
|
87
|
+
return false;
|
|
88
|
+
const id = frame.requestId;
|
|
89
|
+
return id === EMBEDDED_ABORT_END_INPUT_REQUEST_ID || id === EMBEDDED_ABORT_INTERRUPT_REQUEST_ID;
|
|
90
|
+
}
|
|
91
|
+
async function runEmbeddedSession2(opts) {
|
|
92
|
+
const { env, write, writeErr, signal } = opts;
|
|
93
|
+
let settleAborted;
|
|
94
|
+
const aborted = new Promise((resolve) => {
|
|
95
|
+
settleAborted = resolve;
|
|
96
|
+
});
|
|
97
|
+
const onAbort = () => {
|
|
98
|
+
try {
|
|
99
|
+
killAllTaskProcessGroups();
|
|
100
|
+
} catch {}
|
|
101
|
+
settleAborted(ABORTED);
|
|
102
|
+
};
|
|
103
|
+
if (signal?.aborted === true)
|
|
104
|
+
onAbort();
|
|
105
|
+
else
|
|
106
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
107
|
+
const restoreWorkflowCommand = opts.workflowWorkerCommand !== undefined ? setHostWorkflowWorkerCommand(opts.workflowWorkerCommand) : undefined;
|
|
108
|
+
const output = {
|
|
109
|
+
write(frame) {
|
|
110
|
+
if (isSyntheticAbortAck(frame))
|
|
111
|
+
return;
|
|
112
|
+
write(encodeFrame(frame));
|
|
113
|
+
},
|
|
114
|
+
end() {}
|
|
115
|
+
};
|
|
116
|
+
try {
|
|
117
|
+
const config = parseConfigFromArgv(opts.argv);
|
|
118
|
+
assertRecognizedTestProviderEnv(env);
|
|
119
|
+
const { config: effectiveConfig, store, initialMessages, approvalStore, autoStateStore } = await resolveEngineSession2({
|
|
120
|
+
config,
|
|
121
|
+
resolveWinterHome: () => resolveProductionWinterHome2(config, env),
|
|
122
|
+
resolveStoreHome: () => resolveProductionStoreHome(config, env),
|
|
123
|
+
env
|
|
124
|
+
});
|
|
125
|
+
const childWinterHome = resolveProductionWinterHome2(config, env);
|
|
126
|
+
const childDurableRoot = resolveProductionStoreHome(config, env) ?? childWinterHome;
|
|
127
|
+
const childStore = config.persistSession === false ? undefined : new WinterCompatibilitySessionStore({ winterHome: childDurableRoot });
|
|
128
|
+
const providerChain = await loadResumedChain(store, initialMessages);
|
|
129
|
+
const wiring = await buildProductionWiring({
|
|
130
|
+
config: effectiveConfig,
|
|
131
|
+
env,
|
|
132
|
+
winterHome: resolveProductionWinterHome2(config, env),
|
|
133
|
+
...store !== undefined ? { persistence: store } : {},
|
|
134
|
+
provider: {
|
|
135
|
+
testProviders: resolveNamespacedTestProvider,
|
|
136
|
+
...env["HOME"] !== undefined ? { home: env["HOME"] } : {},
|
|
137
|
+
chain: () => providerChain
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
const provider = wiring.providerWiring.provider;
|
|
141
|
+
for (const warning of wiring.warnings)
|
|
142
|
+
writeErr(`winter: ${warning}
|
|
143
|
+
`);
|
|
144
|
+
registerDefaultChildEngineFactory({
|
|
145
|
+
provider,
|
|
146
|
+
config: effectiveConfig,
|
|
147
|
+
env,
|
|
148
|
+
warn: (line) => writeErr(`${line}
|
|
149
|
+
`),
|
|
150
|
+
...childStore !== undefined ? { store: childStore } : {},
|
|
151
|
+
...childWinterHome !== undefined ? { winterHome: childWinterHome } : {},
|
|
152
|
+
...wiring.config.storeHome !== undefined ? { storeHome: wiring.config.storeHome } : {},
|
|
153
|
+
...wiring.childFactoryOptions
|
|
154
|
+
});
|
|
155
|
+
const restoredChildren = childStore !== undefined && config.forkSession !== true && (config.resume !== undefined || config.continue === true) ? await restoreChildRoster(childStore, { projectKey: compatibilityKeys(effectiveConfig.cwd).transcriptProjectKey, sessionId: effectiveConfig.sessionId }) : undefined;
|
|
156
|
+
try {
|
|
157
|
+
return await runEngine2({
|
|
158
|
+
config: withAutoSkillPermissions(wiring.config),
|
|
159
|
+
...wiring.engineOptions,
|
|
160
|
+
input: frameSource(opts.input, aborted),
|
|
161
|
+
output,
|
|
162
|
+
provider,
|
|
163
|
+
unregisteredToolExecutor: stubExecutor2,
|
|
164
|
+
...store !== undefined ? { store } : {},
|
|
165
|
+
...initialMessages.length > 0 ? { initialMessages } : {},
|
|
166
|
+
...approvalStore !== undefined ? { approvalStore } : {},
|
|
167
|
+
...autoStateStore !== undefined ? { autoStateStore } : {},
|
|
168
|
+
env
|
|
169
|
+
});
|
|
170
|
+
} finally {
|
|
171
|
+
restoredChildren?.remove();
|
|
172
|
+
wiring.dispose();
|
|
173
|
+
}
|
|
174
|
+
} catch (err) {
|
|
175
|
+
const text = err instanceof Error ? err.stack ?? err.message : String(err);
|
|
176
|
+
try {
|
|
177
|
+
writeErr(`winter: fatal: ${text}
|
|
178
|
+
`);
|
|
179
|
+
} catch {}
|
|
180
|
+
return 1;
|
|
181
|
+
} finally {
|
|
182
|
+
signal?.removeEventListener("abort", onAbort);
|
|
183
|
+
restoreWorkflowCommand?.();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export { runEmbeddedSession2 };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export { runWinterRuntime } from "./runtime.js";
|
|
2
|
+
export { runEngine } from "./engine.js";
|
|
3
|
+
export type { Provider, ProviderTurn, ProviderMessage, ContentBlock, ToolExecutor, SessionPersistence, EngineOptions, ProviderRequest, ProviderUsage, ContextAccountant, ContextAccountantOptions, } from "./engine.js";
|
|
4
|
+
export { createContextAccountant, DEFAULT_CONTEXT_WINDOW_TOKENS } from "./engine.js";
|
|
5
|
+
export { recordedProviderSystems, resetRecordedProviderSystems } from "./provider/mock.js";
|
|
6
|
+
export { SCENARIO_FINAL_TEXT, SCENARIO_FIRST_TEXT, SCENARIO_CHILD_AGENT, SCENARIO_CHILD_MODEL, SCENARIO_CHILD_WIRE_ID, SCENARIO_DELEGATE_MARKER, SCENARIO_MODELS, SCENARIO_TOOL_CALLING_NONE, SCENARIO_TOOL_INPUT, SCENARIO_TOOL_NAME, startScenarioFake, } from "./provider/scenario-fake.js";
|
|
7
|
+
export type { ScenarioFake, ScenarioFakeOptions, ScenarioRequest } from "./provider/scenario-fake.js";
|
|
8
|
+
export { onCompaction } from "./tools/registry.js";
|
|
9
|
+
export { createInMemoryChannel } from "./protocol/channel.js";
|
|
10
|
+
export type { Duplex, FrameSource, FrameSink } from "./protocol/channel.js";
|
|
11
|
+
export { createRpcBridge } from "./rpc/bridge.js";
|
|
12
|
+
export type { RpcBridge } from "./rpc/bridge.js";
|
|
13
|
+
export { echoProvider, scriptedProvider, stubExecutor, isTestProviderName, testProviderByName, registerBgTaskTestTool, BGTASK_TEST_TOOL_NAME, MCP_SDK_TEST_SERVER_NAME, SUBAGENT_CHILD_PROBE_TEXT, P5_FIXTURE_SKILL_NAME, P5_WORKFLOW_SCRIPT, MCP_SDK_TEST_TOOL_NAME, } from "./provider/mock.js";
|
|
14
|
+
export type { TestProviderName } from "./provider/mock.js";
|
|
15
|
+
export { registerTool } from "./tools/registry.js";
|
|
16
|
+
export { resolveWinterHome } from "@yanlinglabs/winter-agent-sdk";
|
|
17
|
+
export { transcriptProjectKey } from "@yanlinglabs/winter-agent-sdk";
|
|
18
|
+
export { compatibilityKeys } from "@yanlinglabs/winter-agent-sdk";
|
|
19
|
+
export type { CompatibilityKeys } from "@yanlinglabs/winter-agent-sdk";
|
|
20
|
+
export { sessionTempDir, ensureTasksDir, WinterPathsError } from "./paths/temp.js";
|
|
21
|
+
export type { SessionTempDirOptions, SessionTempDirPaths } from "./paths/temp.js";
|
|
22
|
+
export { resolveProjectDirName } from "./paths/project-dir-name.js";
|
|
23
|
+
export { WinterCompatibilitySessionStore, WinterStoreError, WinterStoreLeaseError, DIALECT_RECORD_ENTRY_TYPE, } from "@yanlinglabs/winter-agent-sdk";
|
|
24
|
+
export type { SessionKey, SessionStoreEntry, SessionSummaryEntry, SessionStore } from "@yanlinglabs/winter-agent-sdk";
|
|
25
|
+
export { userEntry, assistantEntry, winterMessageIdFor, claudeCompactBoundaryEntry, claudeCompactSummaryEntry, CLAUDE_COMPACT_SUMMARY_PREAMBLE, TranscriptWriter, TranscriptWriterError, RUNTIME_ENGINE_VERSION, resolveEngineSession, resolveProductionWinterHome, } from "./store/dialect.js";
|
|
26
|
+
export type { Block, Chain, SessionCtx, DialectEntryBase, UserEntryOpts, TranscriptWriterOptions, ResolvedEngineSession, ClaudeCompactMetadata } from "./store/dialect.js";
|
|
27
|
+
export { findContinueTarget, findResumeTarget, truncateAt, toDialectEntries, rebuildProviderMessages, ResumeTargetError, ResumeTruncationError } from "./store/resume.js";
|
|
28
|
+
export type { DialectEntry } from "./store/resume.js";
|
|
29
|
+
export { PROTOCOL_VERSION, encodeFrame, decodeFrame, splitFrames, ProtocolError, } from "@yanlinglabs/winter-agent-sdk";
|
|
30
|
+
export type { ProtocolVersion, WinterFrame, ProtocolSdkMessage as SdkMessage, InitFrame, UserFrame, DataFrame, ControlRequestFrame, ControlResponseFrame, UnknownFrame, RuntimeConfig, } from "@yanlinglabs/winter-agent-sdk";
|
|
31
|
+
export { deleteProviderCredential, providerCredentialRef, storeProviderCredential, validateProviderCredential } from "./provider/credential-api.js";
|
|
32
|
+
export type { ProviderCredentialLocator, ProviderCredentialRef, StoreProviderCredentialInput } from "./provider/credential-api.js";
|
|
33
|
+
export { createModelClassifier, selectClassifierRoute, DEFAULT_CLASSIFIER_TIMEOUT_MS } from "./provider/classifier/model-classifier.js";
|
|
34
|
+
export type { ClassifierRoute, ClassifierRouteConfig, ModelClassifierOptions } from "./provider/classifier/model-classifier.js";
|
|
35
|
+
export { CLASSIFIER_TOOL_NAME, CLASSIFIER_NO_VERDICT_REASONS, CLASSIFIER_VERDICT_SCHEMA } from "./provider/classifier/verdict-schema.js";
|
|
36
|
+
export type { ClassifierNoVerdictReason } from "./provider/classifier/verdict-schema.js";
|
|
37
|
+
export { CLASSIFIER_SYSTEM_PROMPT, DEFAULT_MAX_CONTEXT_CHARS } from "./provider/classifier/prompt.js";
|