@bastani/atomic 0.9.16-alpha.8 → 0.9.16
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 +126 -0
- package/README.md +4 -4
- package/dist/builtin/intercom/CHANGELOG.md +42 -0
- package/dist/builtin/intercom/README.md +18 -17
- package/dist/builtin/intercom/broker/broker.ts +43 -18
- package/dist/builtin/intercom/broker/client.ts +138 -7
- package/dist/builtin/intercom/broker/group-isolation.ts +3 -3
- package/dist/builtin/intercom/broker/group-membership.ts +55 -0
- package/dist/builtin/intercom/broker/presence-handler.ts +62 -50
- package/dist/builtin/intercom/broker/send-handler.ts +2 -3
- package/dist/builtin/intercom/group.ts +40 -0
- package/dist/builtin/intercom/index.bundle.mjs +556 -185
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/intercom/skills/intercom/SKILL.md +16 -10
- package/dist/builtin/intercom/types.ts +24 -2
- package/dist/builtin/mcp/index.bundle.mjs +268 -54
- package/dist/builtin/mcp/package.json +2 -2
- package/dist/builtin/subagents/CHANGELOG.md +51 -0
- package/dist/builtin/subagents/README.md +3 -3
- package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
- package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
- package/dist/builtin/subagents/agents/debugger.md +1 -1
- package/dist/builtin/subagents/agents/worker.md +1 -1
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +488 -142
- package/dist/builtin/web-access/index.bundle.mjs +268 -54
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +70 -0
- package/dist/builtin/workflows/README.md +2 -2
- package/dist/builtin/workflows/builtin/{chunk-zf28603f.js → chunk-3y1hmzw6.js} +36 -6
- package/dist/builtin/workflows/builtin/{chunk-nqr34qp3.js → chunk-6rbajjf5.js} +7 -1
- package/dist/builtin/workflows/builtin/{chunk-v04c5qmd.js → chunk-bz1c9732.js} +15 -3
- package/dist/builtin/workflows/builtin/{chunk-cdtd3m3w.js → chunk-dattsgxg.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-5n10x7j2.js → chunk-gdx0avpx.js} +421 -69
- package/dist/builtin/workflows/builtin/{chunk-hdpj1dkw.js → chunk-w9c7rkrk.js} +1 -1
- package/dist/builtin/workflows/builtin/goal.js +3 -3
- package/dist/builtin/workflows/builtin/index.js +5 -5
- package/dist/builtin/workflows/builtin/open-claude-design.js +2 -2
- package/dist/builtin/workflows/builtin/ralph.js +3 -3
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +597 -145
- package/dist/builtin/workflows/src/index.js +278 -74
- package/dist/cli/args.js +6 -6
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/session-picker.d.ts +2 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +3 -2
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +1 -0
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.js +3 -6
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +3 -1
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +6 -3
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +7 -5
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
- package/dist/core/agent-session-tool-hooks.js +37 -23
- package/dist/core/agent-session-tool-hooks.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +9 -2
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +2 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/builtin-packages.d.ts +4 -0
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/builtin-packages.js +22 -1
- package/dist/core/builtin-packages.js.map +1 -1
- package/dist/core/callback-activity.d.ts.map +1 -1
- package/dist/core/callback-activity.js +6 -3
- package/dist/core/callback-activity.js.map +1 -1
- package/dist/core/extensions/agent-events.d.ts +15 -0
- package/dist/core/extensions/agent-events.d.ts.map +1 -1
- package/dist/core/extensions/agent-events.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +3 -1
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/event-types.d.ts +2 -2
- package/dist/core/extensions/event-types.d.ts.map +1 -1
- package/dist/core/extensions/event-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-core.d.ts +1 -0
- package/dist/core/extensions/loader-core.d.ts.map +1 -1
- package/dist/core/extensions/loader-core.js +11 -1
- package/dist/core/extensions/loader-core.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner-registries.d.ts.map +1 -1
- package/dist/core/extensions/runner-registries.js +9 -4
- package/dist/core/extensions/runner-registries.js.map +1 -1
- package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
- package/dist/core/extensions/runner-shortcuts.js +1 -0
- package/dist/core/extensions/runner-shortcuts.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +6 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +65 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +4 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/mandatory-resource-loader.d.ts +6 -0
- package/dist/core/mandatory-resource-loader.d.ts.map +1 -0
- package/dist/core/mandatory-resource-loader.js +94 -0
- package/dist/core/mandatory-resource-loader.js.map +1 -0
- package/dist/core/mandatory-runtime-tools.d.ts +10 -0
- package/dist/core/mandatory-runtime-tools.d.ts.map +1 -0
- package/dist/core/mandatory-runtime-tools.js +31 -0
- package/dist/core/mandatory-runtime-tools.js.map +1 -0
- package/dist/core/model-resolver-defaults.js +1 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +24 -13
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager-ui-accessors.d.ts +4 -1
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-ui-accessors.js +22 -0
- package/dist/core/settings-manager-ui-accessors.js.map +1 -1
- package/dist/core/settings-types.d.ts +4 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/slash-commands.js +1 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/main-session.d.ts.map +1 -1
- package/dist/main-session.js +3 -2
- package/dist/main-session.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.js +2 -2
- package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +7 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +2 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +1 -0
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +3 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +15 -1
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +6 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +6 -1
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +3 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +7 -12
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-tui.d.ts +1 -0
- package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-tui.js +16 -0
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.js +2 -0
- package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
- package/docs/compaction.md +1 -1
- package/docs/environment-variables.md +2 -0
- package/docs/extensions.md +20 -1
- package/docs/intercom.md +29 -24
- package/docs/keybindings.md +5 -2
- package/docs/packages.md +1 -1
- package/docs/providers.md +2 -2
- package/docs/sdk.md +9 -7
- package/docs/settings.md +9 -3
- package/docs/subagents.md +2 -2
- package/docs/usage.md +7 -6
- package/docs/workflows.md +11 -7
- package/npm-shrinkwrap.json +59 -77
- package/package.json +7 -7
|
@@ -1126,15 +1126,15 @@ ${chalk.bold("Options:")}
|
|
|
1126
1126
|
--name, -n <name> Set session display name
|
|
1127
1127
|
--models <patterns> Comma-separated model patterns for ctrl+p cycling
|
|
1128
1128
|
Supports globs (anthropic/*, *sonnet*) and fuzzy matching
|
|
1129
|
-
--no-tools, -nt Disable
|
|
1129
|
+
--no-tools, -nt Disable every tool except mandatory ordinary intercom
|
|
1130
1130
|
--no-builtin-tools, -nbt Disable built-in tools by default but keep extension/custom tools enabled
|
|
1131
|
-
--tools, -t <tools> Comma-separated allowlist of tool names
|
|
1132
|
-
|
|
1133
|
-
--exclude-tools, -xt <tools> Comma-separated denylist of tool names
|
|
1134
|
-
|
|
1131
|
+
--tools, -t <tools> Comma-separated allowlist of non-mandatory tool names
|
|
1132
|
+
Mandatory ordinary intercom remains available
|
|
1133
|
+
--exclude-tools, -xt <tools> Comma-separated denylist of non-mandatory tool names
|
|
1134
|
+
Mandatory ordinary intercom cannot be excluded
|
|
1135
1135
|
--thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh, max
|
|
1136
1136
|
--extension, -e <path> Load an extension file (can be used multiple times)
|
|
1137
|
-
--no-extensions, -ne Disable extension discovery
|
|
1137
|
+
--no-extensions, -ne Disable optional extension discovery; mandatory bundled Intercom remains loaded
|
|
1138
1138
|
--skill <path> Load a skill file or directory (can be used multiple times)
|
|
1139
1139
|
--no-skills, -ns Disable skills discovery and loading
|
|
1140
1140
|
--prompt-template <path> Load a prompt template file or directory (can be used multiple times)
|
|
@@ -10019,11 +10019,13 @@ function runSynchronousCallback(descriptor, callback) {
|
|
|
10019
10019
|
}
|
|
10020
10020
|
}
|
|
10021
10021
|
async function runCallback(descriptor, callback) {
|
|
10022
|
+
if (!reporter)
|
|
10023
|
+
return callback();
|
|
10024
|
+
await yieldToEventLoop();
|
|
10022
10025
|
const active = beginActivity(descriptor);
|
|
10023
10026
|
if (!active)
|
|
10024
10027
|
return callback();
|
|
10025
10028
|
try {
|
|
10026
|
-
await yieldToEventLoop();
|
|
10027
10029
|
return await callback();
|
|
10028
10030
|
} finally {
|
|
10029
10031
|
active.reporter.finished(active.activity.id);
|
|
@@ -13013,12 +13015,45 @@ var init_runner_events = __esm(() => {
|
|
|
13013
13015
|
init_callback_activity();
|
|
13014
13016
|
});
|
|
13015
13017
|
|
|
13018
|
+
// src/core/mandatory-runtime-tools.ts
|
|
13019
|
+
function markTrustedMandatoryRuntimeExtension(extension) {
|
|
13020
|
+
extension.sourceInfo = { ...extension.sourceInfo, configurationOrigin: "bundled" };
|
|
13021
|
+
for (const registration of extension.tools.values()) {
|
|
13022
|
+
registration.sourceInfo = extension.sourceInfo;
|
|
13023
|
+
if (MANDATORY_TOOL_NAMES.has(registration.definition.name)) {
|
|
13024
|
+
TRUSTED_MANDATORY_DEFINITIONS.add(registration.definition);
|
|
13025
|
+
}
|
|
13026
|
+
}
|
|
13027
|
+
for (const command of extension.commands.values())
|
|
13028
|
+
command.sourceInfo = extension.sourceInfo;
|
|
13029
|
+
}
|
|
13030
|
+
function isTrustedMandatoryRuntimeTool(registration) {
|
|
13031
|
+
return MANDATORY_TOOL_NAMES.has(registration.definition.name) && TRUSTED_MANDATORY_DEFINITIONS.has(registration.definition);
|
|
13032
|
+
}
|
|
13033
|
+
function isMandatoryRuntimeTool(name) {
|
|
13034
|
+
return MANDATORY_TOOL_NAMES.has(name);
|
|
13035
|
+
}
|
|
13036
|
+
function appendRegisteredMandatoryTools(tools, registry) {
|
|
13037
|
+
for (const name of MANDATORY_TOOL_NAMES) {
|
|
13038
|
+
const tool = registry.get(name);
|
|
13039
|
+
if (tool && !tools.some((candidate) => candidate.name === name))
|
|
13040
|
+
tools.push(tool);
|
|
13041
|
+
}
|
|
13042
|
+
return tools;
|
|
13043
|
+
}
|
|
13044
|
+
var MANDATORY_TOOL_NAMES, TRUSTED_MANDATORY_DEFINITIONS;
|
|
13045
|
+
var init_mandatory_runtime_tools = __esm(() => {
|
|
13046
|
+
MANDATORY_TOOL_NAMES = new Set(["intercom"]);
|
|
13047
|
+
TRUSTED_MANDATORY_DEFINITIONS = new WeakSet;
|
|
13048
|
+
});
|
|
13049
|
+
|
|
13016
13050
|
// src/core/extensions/runner-registries.ts
|
|
13017
13051
|
function collectRegisteredTools(extensions) {
|
|
13018
13052
|
const toolsByName = new Map;
|
|
13019
13053
|
for (const ext of extensions) {
|
|
13020
13054
|
for (const tool of ext.tools.values()) {
|
|
13021
|
-
|
|
13055
|
+
const existing = toolsByName.get(tool.definition.name);
|
|
13056
|
+
if (!existing || isMandatoryRuntimeTool(tool.definition.name) && isTrustedMandatoryRuntimeTool(tool)) {
|
|
13022
13057
|
toolsByName.set(tool.definition.name, tool);
|
|
13023
13058
|
}
|
|
13024
13059
|
}
|
|
@@ -13026,13 +13061,16 @@ function collectRegisteredTools(extensions) {
|
|
|
13026
13061
|
return Array.from(toolsByName.values());
|
|
13027
13062
|
}
|
|
13028
13063
|
function findToolDefinition(extensions, toolName) {
|
|
13064
|
+
let first;
|
|
13029
13065
|
for (const ext of extensions) {
|
|
13030
13066
|
const tool = ext.tools.get(toolName);
|
|
13031
|
-
if (tool)
|
|
13067
|
+
if (!tool)
|
|
13068
|
+
continue;
|
|
13069
|
+
first ??= tool;
|
|
13070
|
+
if (isMandatoryRuntimeTool(toolName) && isTrustedMandatoryRuntimeTool(tool))
|
|
13032
13071
|
return tool.definition;
|
|
13033
|
-
}
|
|
13034
13072
|
}
|
|
13035
|
-
return;
|
|
13073
|
+
return first?.definition;
|
|
13036
13074
|
}
|
|
13037
13075
|
function collectFlags(extensions) {
|
|
13038
13076
|
const allFlags = new Map;
|
|
@@ -13100,6 +13138,9 @@ function resolveRegisteredCommands(extensions) {
|
|
|
13100
13138
|
return { ...command, invocationName };
|
|
13101
13139
|
});
|
|
13102
13140
|
}
|
|
13141
|
+
var init_runner_registries = __esm(() => {
|
|
13142
|
+
init_mandatory_runtime_tools();
|
|
13143
|
+
});
|
|
13103
13144
|
|
|
13104
13145
|
// src/core/extensions/runner-shortcuts.ts
|
|
13105
13146
|
function resolveExtensionShortcuts(extensions, resolvedKeybindings, hasUI) {
|
|
@@ -13163,6 +13204,7 @@ var init_runner_shortcuts = __esm(() => {
|
|
|
13163
13204
|
"app.thinking.toggle",
|
|
13164
13205
|
"app.editor.external",
|
|
13165
13206
|
"app.message.followUp",
|
|
13207
|
+
"app.message.copy",
|
|
13166
13208
|
"tui.input.submit",
|
|
13167
13209
|
"tui.select.confirm",
|
|
13168
13210
|
"tui.select.cancel",
|
|
@@ -13317,6 +13359,8 @@ class ExtensionRunner {
|
|
|
13317
13359
|
shortcutDiagnostics = [];
|
|
13318
13360
|
commandDiagnostics = [];
|
|
13319
13361
|
staleMessage;
|
|
13362
|
+
uiPromptBinding = 0;
|
|
13363
|
+
activeUIPrompt;
|
|
13320
13364
|
constructor(extensions, runtime, cwd, sessionManager, modelRegistry, orchestrationContext, subagentPolicy) {
|
|
13321
13365
|
this.extensions = extensions;
|
|
13322
13366
|
this.runtime = runtime;
|
|
@@ -13411,9 +13455,71 @@ class ExtensionRunner {
|
|
|
13411
13455
|
this.reloadHandler = async () => {};
|
|
13412
13456
|
}
|
|
13413
13457
|
setUIContext(uiContext, mode = "print") {
|
|
13414
|
-
this.
|
|
13458
|
+
this.endActiveUIPrompt();
|
|
13459
|
+
const binding = ++this.uiPromptBinding;
|
|
13460
|
+
this.uiContext = uiContext ? this.wrapUIPromptContext(uiContext, binding) : noOpUIContext;
|
|
13415
13461
|
this.mode = mode;
|
|
13416
13462
|
}
|
|
13463
|
+
wrapUIPromptContext(ui, binding) {
|
|
13464
|
+
return {
|
|
13465
|
+
...ui,
|
|
13466
|
+
select: (title, options, opts) => this.withUIPrompt(binding, "select", title, () => ui.select(title, options, opts)),
|
|
13467
|
+
confirm: (title, message, opts) => this.withUIPrompt(binding, "confirm", title, () => ui.confirm(title, message, opts)),
|
|
13468
|
+
input: (title, placeholder, opts) => this.withUIPrompt(binding, "input", title, () => ui.input(title, placeholder, opts)),
|
|
13469
|
+
editor: (title, prefill, opts) => this.withUIPrompt(binding, "editor", title, () => ui.editor(title, prefill, opts)),
|
|
13470
|
+
custom: (factory, options) => this.withUIPrompt(binding, "custom", undefined, () => ui.custom(factory, options))
|
|
13471
|
+
};
|
|
13472
|
+
}
|
|
13473
|
+
withUIPrompt(binding, kind, title, run) {
|
|
13474
|
+
if (binding !== this.uiPromptBinding)
|
|
13475
|
+
return run();
|
|
13476
|
+
let prompt = this.activeUIPrompt;
|
|
13477
|
+
if (!prompt) {
|
|
13478
|
+
prompt = { depth: 0, kind, title };
|
|
13479
|
+
this.activeUIPrompt = prompt;
|
|
13480
|
+
this.emitUIPromptEvent({
|
|
13481
|
+
type: "ui_prompt_start",
|
|
13482
|
+
reason: "ui_prompt",
|
|
13483
|
+
kind,
|
|
13484
|
+
...title === undefined ? {} : { title }
|
|
13485
|
+
});
|
|
13486
|
+
}
|
|
13487
|
+
prompt.depth += 1;
|
|
13488
|
+
let finished = false;
|
|
13489
|
+
const finish = () => {
|
|
13490
|
+
if (finished)
|
|
13491
|
+
return;
|
|
13492
|
+
finished = true;
|
|
13493
|
+
if (this.activeUIPrompt !== prompt)
|
|
13494
|
+
return;
|
|
13495
|
+
prompt.depth -= 1;
|
|
13496
|
+
if (prompt.depth === 0)
|
|
13497
|
+
this.endActiveUIPrompt(prompt);
|
|
13498
|
+
};
|
|
13499
|
+
try {
|
|
13500
|
+
return run().finally(finish);
|
|
13501
|
+
} catch (error) {
|
|
13502
|
+
finish();
|
|
13503
|
+
throw error;
|
|
13504
|
+
}
|
|
13505
|
+
}
|
|
13506
|
+
endActiveUIPrompt(prompt = this.activeUIPrompt) {
|
|
13507
|
+
if (!prompt || this.activeUIPrompt !== prompt)
|
|
13508
|
+
return;
|
|
13509
|
+
this.activeUIPrompt = undefined;
|
|
13510
|
+
prompt.depth = 0;
|
|
13511
|
+
this.emitUIPromptEvent({
|
|
13512
|
+
type: "ui_prompt_end",
|
|
13513
|
+
reason: "ui_prompt",
|
|
13514
|
+
kind: prompt.kind,
|
|
13515
|
+
...prompt.title === undefined ? {} : { title: prompt.title }
|
|
13516
|
+
});
|
|
13517
|
+
}
|
|
13518
|
+
emitUIPromptEvent(event) {
|
|
13519
|
+
queueMicrotask(() => {
|
|
13520
|
+
this.emit(event);
|
|
13521
|
+
});
|
|
13522
|
+
}
|
|
13417
13523
|
getUIContext() {
|
|
13418
13524
|
return this.uiContext;
|
|
13419
13525
|
}
|
|
@@ -13590,6 +13696,7 @@ var init_runner = __esm(() => {
|
|
|
13590
13696
|
init_loader_runtime();
|
|
13591
13697
|
init_runner_context();
|
|
13592
13698
|
init_runner_events();
|
|
13699
|
+
init_runner_registries();
|
|
13593
13700
|
init_runner_shortcuts();
|
|
13594
13701
|
init_runner_ui();
|
|
13595
13702
|
init_stale_context();
|
|
@@ -15822,11 +15929,13 @@ async function _runAgentContinue() {
|
|
|
15822
15929
|
}
|
|
15823
15930
|
async function _continueQueuedAgentMessages() {
|
|
15824
15931
|
await this._agentEventQueue;
|
|
15825
|
-
while (!this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
|
|
15932
|
+
while (!this._stopAfterTurnBlockedContinuation && !this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
|
|
15826
15933
|
await this.agent.continue();
|
|
15827
15934
|
await this.waitForRetry();
|
|
15828
15935
|
await this._agentEventQueue;
|
|
15829
15936
|
}
|
|
15937
|
+
if (this._stopAfterTurnBlockedContinuation)
|
|
15938
|
+
return;
|
|
15830
15939
|
await answerAdmittedQueuedMessage(this);
|
|
15831
15940
|
}
|
|
15832
15941
|
async function answerAdmittedQueuedMessage(session) {
|
|
@@ -17534,14 +17643,13 @@ function getToolDefinition(name) {
|
|
|
17534
17643
|
}
|
|
17535
17644
|
function setActiveToolsByName(toolNames) {
|
|
17536
17645
|
const tools = [];
|
|
17537
|
-
const validToolNames = [];
|
|
17538
17646
|
for (const name of toolNames) {
|
|
17539
17647
|
const tool = this._toolRegistry.get(name);
|
|
17540
|
-
if (tool)
|
|
17648
|
+
if (tool)
|
|
17541
17649
|
tools.push(tool);
|
|
17542
|
-
validToolNames.push(name);
|
|
17543
|
-
}
|
|
17544
17650
|
}
|
|
17651
|
+
appendRegisteredMandatoryTools(tools, this._toolRegistry);
|
|
17652
|
+
const validToolNames = tools.map((tool) => tool.name);
|
|
17545
17653
|
this.agent.state.tools = tools;
|
|
17546
17654
|
this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
|
|
17547
17655
|
this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
|
|
@@ -17598,7 +17706,7 @@ function _rebuildSystemPrompt(toolNames) {
|
|
|
17598
17706
|
customPrompt: loaderSystemPrompt,
|
|
17599
17707
|
appendSystemPrompt,
|
|
17600
17708
|
selectedTools: validToolNames,
|
|
17601
|
-
excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames) : undefined,
|
|
17709
|
+
excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames).filter((name) => !isMandatoryRuntimeTool(name)) : undefined,
|
|
17602
17710
|
toolSnippets,
|
|
17603
17711
|
promptGuidelines
|
|
17604
17712
|
};
|
|
@@ -17611,6 +17719,7 @@ function _refreshBaseSystemPromptFromActiveTools() {
|
|
|
17611
17719
|
}
|
|
17612
17720
|
var agentSessionStateMethods;
|
|
17613
17721
|
var init_agent_session_state = __esm(() => {
|
|
17722
|
+
init_mandatory_runtime_tools();
|
|
17614
17723
|
init_skill_catalog();
|
|
17615
17724
|
init_system_prompt();
|
|
17616
17725
|
agentSessionStateMethods = {
|
|
@@ -18638,6 +18747,17 @@ function _installAgentToolHooks() {
|
|
|
18638
18747
|
}
|
|
18639
18748
|
function _installAgentNextTurnRefresh() {
|
|
18640
18749
|
const previousPrepareNextTurnWithContext = this.agent.prepareNextTurnWithContext ?? (this.agent.prepareNextTurn ? async (_turn, signal) => await this.agent.prepareNextTurn?.(signal) : undefined);
|
|
18750
|
+
const previousShouldStopAfterTurn = this.agent.shouldStopAfterTurn;
|
|
18751
|
+
this.agent.shouldStopAfterTurn = async (turn, signal) => {
|
|
18752
|
+
const toolCallIds = turn.message.content.filter((part) => part.type === "toolCall").map((part) => part.id);
|
|
18753
|
+
const terminatingBatch = toolCallIds.length > 0 && toolCallIds.every((id) => this._terminatingToolCallIds.has(id));
|
|
18754
|
+
for (const id of toolCallIds)
|
|
18755
|
+
this._terminatingToolCallIds.delete(id);
|
|
18756
|
+
const shouldStop = await previousShouldStopAfterTurn?.(turn, signal) ?? false;
|
|
18757
|
+
this._stopAfterTurnBlockedContinuation = shouldStop;
|
|
18758
|
+
await settleFallbackAfterTurn(this, turn, terminatingBatch);
|
|
18759
|
+
return shouldStop;
|
|
18760
|
+
};
|
|
18641
18761
|
const previousTransformContext = this.agent.transformContext;
|
|
18642
18762
|
this.agent.transformContext = async (messages, signal) => {
|
|
18643
18763
|
const transformed = previousTransformContext ? await previousTransformContext(messages, signal) : messages;
|
|
@@ -18645,24 +18765,17 @@ function _installAgentNextTurnRefresh() {
|
|
|
18645
18765
|
assertToolPairingInvariant(guarded);
|
|
18646
18766
|
return guarded;
|
|
18647
18767
|
};
|
|
18648
|
-
|
|
18649
|
-
const
|
|
18650
|
-
const
|
|
18651
|
-
const
|
|
18652
|
-
const
|
|
18653
|
-
|
|
18654
|
-
this._terminatingToolCallIds.delete(id);
|
|
18655
|
-
const messages = turn.toolResults.length > 0 && !terminatingBatch ? await this._preflightPostToolContext(previousContext.messages, signal) : previousContext.messages;
|
|
18656
|
-
const preserveFallbackForFailure = turn.message.role === "assistant" && !this.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || this._isEmptyCompletion?.(turn.message) === true || this._isSafetyRefusal?.(turn.message) === true);
|
|
18657
|
-
if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
|
|
18658
|
-
await this._agentEventQueue;
|
|
18659
|
-
await this._settleFallbackModelScope();
|
|
18660
|
-
}
|
|
18768
|
+
const prepareTurn = async (turn, signal) => {
|
|
18769
|
+
const compactedMessages = turn.toolResults.length > 0 ? await this._preflightPostToolContext(turn.context.messages, signal) : turn.context.messages;
|
|
18770
|
+
const compactedContext = compactedMessages === turn.context.messages ? turn.context : { ...turn.context, messages: compactedMessages };
|
|
18771
|
+
const preparedTurn = compactedContext === turn.context ? turn : { ...turn, context: compactedContext };
|
|
18772
|
+
const previousSnapshot = await previousPrepareNextTurnWithContext?.(preparedTurn, signal);
|
|
18773
|
+
const previousContext = previousSnapshot?.context ?? compactedContext;
|
|
18661
18774
|
return {
|
|
18662
18775
|
...previousSnapshot,
|
|
18663
18776
|
context: {
|
|
18664
18777
|
...previousContext,
|
|
18665
|
-
messages,
|
|
18778
|
+
messages: previousContext.messages,
|
|
18666
18779
|
systemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,
|
|
18667
18780
|
tools: this.agent.state.tools.slice()
|
|
18668
18781
|
},
|
|
@@ -18670,6 +18783,14 @@ function _installAgentNextTurnRefresh() {
|
|
|
18670
18783
|
thinkingLevel: this.agent.state.thinkingLevel
|
|
18671
18784
|
};
|
|
18672
18785
|
};
|
|
18786
|
+
this.agent.prepareNextTurnWithContext = prepareTurn;
|
|
18787
|
+
}
|
|
18788
|
+
async function settleFallbackAfterTurn(session, turn, terminatingBatch) {
|
|
18789
|
+
const preserveFallbackForFailure = turn.message.role === "assistant" && !session.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || session._isEmptyCompletion?.(turn.message) === true || session._isSafetyRefusal?.(turn.message) === true);
|
|
18790
|
+
if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
|
|
18791
|
+
await session._agentEventQueue;
|
|
18792
|
+
await session._settleFallbackModelScope();
|
|
18793
|
+
}
|
|
18673
18794
|
}
|
|
18674
18795
|
var agentSessionToolHooksMethods;
|
|
18675
18796
|
var init_agent_session_tool_hooks = __esm(() => {
|
|
@@ -19567,6 +19688,14 @@ var init_loader_virtual_modules = __esm(() => {
|
|
|
19567
19688
|
|
|
19568
19689
|
// src/core/extensions/loader-core.ts
|
|
19569
19690
|
import * as path7 from "node:path";
|
|
19691
|
+
function getExtensionRuntimeEventBus(runtime) {
|
|
19692
|
+
let eventBus = runtimeEventBuses.get(runtime);
|
|
19693
|
+
if (!eventBus) {
|
|
19694
|
+
eventBus = createEventBus();
|
|
19695
|
+
runtimeEventBuses.set(runtime, eventBus);
|
|
19696
|
+
}
|
|
19697
|
+
return eventBus;
|
|
19698
|
+
}
|
|
19570
19699
|
function createExtension(extensionPath, resolvedPath) {
|
|
19571
19700
|
const source = extensionPath.startsWith("<") && extensionPath.endsWith(">") ? extensionPath.slice(1, -1).split(":")[0] || "temporary" : "local";
|
|
19572
19701
|
const baseDir = extensionPath.startsWith("<") ? undefined : path7.dirname(resolvedPath);
|
|
@@ -19632,6 +19761,7 @@ async function loadExtensionsInternal(paths, cwd, eventBus, workflowResourceProv
|
|
|
19632
19761
|
const resolvedCwd = cacheToken?.cwd ?? resolvePath(cwd);
|
|
19633
19762
|
const resolvedEventBus = eventBus ?? createEventBus();
|
|
19634
19763
|
const resolvedRuntime = runtime ?? createExtensionRuntime();
|
|
19764
|
+
runtimeEventBuses.set(resolvedRuntime, resolvedEventBus);
|
|
19635
19765
|
let processedExtensionCount = 0;
|
|
19636
19766
|
let lastYieldAt = Date.now();
|
|
19637
19767
|
for (const extPath of paths) {
|
|
@@ -19663,7 +19793,7 @@ async function loadExtensions(paths, cwd, eventBus, workflowResourceProvider = e
|
|
|
19663
19793
|
async function loadExtensionsCached(paths, cwd, eventBus, workflowResourceProvider = emptyWorkflowResourceProvider, runtime, resourceLoaderInheritanceSnapshotProvider) {
|
|
19664
19794
|
return loadExtensionsInternal(paths, cwd, eventBus, workflowResourceProvider, runtime, resourceLoaderInheritanceSnapshotProvider, true);
|
|
19665
19795
|
}
|
|
19666
|
-
var INTER_EXTENSION_YIELD_THRESHOLD_MS = 16;
|
|
19796
|
+
var runtimeEventBuses, INTER_EXTENSION_YIELD_THRESHOLD_MS = 16;
|
|
19667
19797
|
var init_loader_core = __esm(() => {
|
|
19668
19798
|
init_event_loop();
|
|
19669
19799
|
init_paths();
|
|
@@ -19673,6 +19803,7 @@ var init_loader_core = __esm(() => {
|
|
|
19673
19803
|
init_loader_resources();
|
|
19674
19804
|
init_loader_runtime();
|
|
19675
19805
|
init_loader_virtual_modules();
|
|
19806
|
+
runtimeEventBuses = new WeakMap;
|
|
19676
19807
|
});
|
|
19677
19808
|
|
|
19678
19809
|
// src/core/package-manager-manifest.ts
|
|
@@ -28211,7 +28342,7 @@ class FastModeSelectorComponent {
|
|
|
28211
28342
|
}
|
|
28212
28343
|
invalidate() {}
|
|
28213
28344
|
render(width) {
|
|
28214
|
-
const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "
|
|
28345
|
+
const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "Fast mode")), width)];
|
|
28215
28346
|
for (const line of wrapTextWithAnsi3(DESCRIPTION, Math.max(20, width))) {
|
|
28216
28347
|
lines.push(theme.fg("muted", line));
|
|
28217
28348
|
}
|
|
@@ -28294,7 +28425,7 @@ class FastModeSelectorComponent {
|
|
|
28294
28425
|
return this.getFocusedRow() === row ? theme.fg("muted", text) : theme.fg("dim", text);
|
|
28295
28426
|
}
|
|
28296
28427
|
}
|
|
28297
|
-
var ROWS, LABEL_WIDTH = 16, DESCRIPTION = "
|
|
28428
|
+
var ROWS, LABEL_WIDTH = 16, DESCRIPTION = "Use faster routing for the selected model when supported by its provider.", ROW_DETAILS;
|
|
28298
28429
|
var init_fast_mode_selector = __esm(() => {
|
|
28299
28430
|
init_theme();
|
|
28300
28431
|
ROWS = ["chat", "workflow"];
|
|
@@ -29600,6 +29731,10 @@ var init_keybindings = __esm(() => {
|
|
|
29600
29731
|
defaultKeys: windowsKeybindings ? "alt+q" : "alt+up",
|
|
29601
29732
|
description: "Restore queued messages"
|
|
29602
29733
|
},
|
|
29734
|
+
"app.message.copy": {
|
|
29735
|
+
defaultKeys: "ctrl+x",
|
|
29736
|
+
description: "Copy fullscreen selection or last agent message"
|
|
29737
|
+
},
|
|
29603
29738
|
"app.clipboard.pasteImage": {
|
|
29604
29739
|
defaultKeys: windowsKeybindings ? "alt+v" : "ctrl+v",
|
|
29605
29740
|
description: "Paste image from clipboard (text fallback)"
|
|
@@ -30992,6 +31127,9 @@ function createSettingsChangeHandler(callbacks) {
|
|
|
30992
31127
|
case "fullscreen-exit-output":
|
|
30993
31128
|
callbacks.onFullscreenExitOutputChange(newValue);
|
|
30994
31129
|
break;
|
|
31130
|
+
case "fullscreen-copy-on-select":
|
|
31131
|
+
callbacks.onFullscreenCopyOnSelectChange(newValue === "true");
|
|
31132
|
+
break;
|
|
30995
31133
|
case "editor-padding":
|
|
30996
31134
|
callbacks.onEditorPaddingXChange(parseInt(newValue, 10));
|
|
30997
31135
|
break;
|
|
@@ -31379,6 +31517,13 @@ function insertUiToggles(items, config) {
|
|
|
31379
31517
|
values: ["transcript", "resume-hint"]
|
|
31380
31518
|
});
|
|
31381
31519
|
insertAfter(items, "fullscreen-exit-output", {
|
|
31520
|
+
id: "fullscreen-copy-on-select",
|
|
31521
|
+
label: "Fullscreen copy on select",
|
|
31522
|
+
description: "Copy selected transcript text automatically on mouse release",
|
|
31523
|
+
currentValue: config.fullscreenCopyOnSelect ? "true" : "false",
|
|
31524
|
+
values: ["true", "false"]
|
|
31525
|
+
});
|
|
31526
|
+
insertAfter(items, "fullscreen-copy-on-select", {
|
|
31382
31527
|
id: "editor-padding",
|
|
31383
31528
|
label: "Editor padding",
|
|
31384
31529
|
description: "Horizontal padding for input editor (0-3)",
|
|
@@ -44656,6 +44801,8 @@ function _refreshToolRegistry(options) {
|
|
|
44656
44801
|
const allowedToolNames = this._allowedToolNames;
|
|
44657
44802
|
const excludedToolNames = this._excludedToolNames;
|
|
44658
44803
|
const isExposedTool = (name) => {
|
|
44804
|
+
if (isMandatoryRuntimeTool(name))
|
|
44805
|
+
return true;
|
|
44659
44806
|
if (allowedToolNames && !allowedToolNames.has(name)) {
|
|
44660
44807
|
return false;
|
|
44661
44808
|
}
|
|
@@ -44664,10 +44811,10 @@ function _refreshToolRegistry(options) {
|
|
|
44664
44811
|
}
|
|
44665
44812
|
return true;
|
|
44666
44813
|
};
|
|
44667
|
-
const registeredTools = this._extensionRunner.getAllRegisteredTools();
|
|
44814
|
+
const registeredTools = this._extensionRunner.getAllRegisteredTools().filter((tool) => !isMandatoryRuntimeTool(tool.definition.name) || isTrustedMandatoryRuntimeTool(tool));
|
|
44668
44815
|
const allCustomTools = [
|
|
44669
44816
|
...registeredTools,
|
|
44670
|
-
...this._customTools.map((definition) => ({
|
|
44817
|
+
...this._customTools.filter((definition) => !isMandatoryRuntimeTool(definition.name)).map((definition) => ({
|
|
44671
44818
|
definition,
|
|
44672
44819
|
sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" })
|
|
44673
44820
|
}))
|
|
@@ -44788,6 +44935,7 @@ function _buildRuntime(options) {
|
|
|
44788
44935
|
var agentSessionToolRegistryMethods;
|
|
44789
44936
|
var init_agent_session_tool_registry = __esm(() => {
|
|
44790
44937
|
init_extensions();
|
|
44938
|
+
init_mandatory_runtime_tools();
|
|
44791
44939
|
init_model_registry();
|
|
44792
44940
|
init_tools();
|
|
44793
44941
|
init_session_temp_dir();
|
|
@@ -45630,6 +45778,7 @@ class AgentSessionBase {
|
|
|
45630
45778
|
_postToolCompactionPreflightError = undefined;
|
|
45631
45779
|
_pendingPostToolCompactionGuard = undefined;
|
|
45632
45780
|
_terminatingToolCallIds = new Set;
|
|
45781
|
+
_stopAfterTurnBlockedContinuation = false;
|
|
45633
45782
|
_disposed = false;
|
|
45634
45783
|
_branchSummaryAbortController = undefined;
|
|
45635
45784
|
_sessionSummaryAbortController = undefined;
|
|
@@ -46217,6 +46366,23 @@ function getBuiltinPackagePaths() {
|
|
|
46217
46366
|
return packageDir ? [packageDir] : [];
|
|
46218
46367
|
});
|
|
46219
46368
|
}
|
|
46369
|
+
function getMandatoryBuiltinPackagePaths() {
|
|
46370
|
+
const context = getBuiltinPackageCandidateContext();
|
|
46371
|
+
return BUILTIN_PACKAGES.filter((descriptor) => descriptor.mandatory).flatMap((descriptor) => {
|
|
46372
|
+
const packageDir = firstExistingPackageDir([...descriptor.sourceCandidates(context), ...distCandidates(context, descriptor)], descriptor);
|
|
46373
|
+
return packageDir ? [packageDir] : [];
|
|
46374
|
+
});
|
|
46375
|
+
}
|
|
46376
|
+
function getMandatoryBuiltinExtensionPaths() {
|
|
46377
|
+
return getMandatoryBuiltinPackagePaths().flatMap((packageDir) => {
|
|
46378
|
+
try {
|
|
46379
|
+
const manifest = JSON.parse(stripBom(readFileSync21(join43(packageDir, "package.json"), "utf-8")));
|
|
46380
|
+
return (manifest.atomic?.extensions ?? manifest.pi?.extensions ?? []).map((entry) => resolve12(packageDir, entry));
|
|
46381
|
+
} catch {
|
|
46382
|
+
return [];
|
|
46383
|
+
}
|
|
46384
|
+
});
|
|
46385
|
+
}
|
|
46220
46386
|
var WORKSPACE_BUILTINS, BUILTIN_PACKAGES;
|
|
46221
46387
|
var init_builtin_packages = __esm(() => {
|
|
46222
46388
|
init_config();
|
|
@@ -46227,11 +46393,12 @@ var init_builtin_packages = __esm(() => {
|
|
|
46227
46393
|
{ packageName: "@bastani/subagents", workspaceDirName: "subagents", distDirName: "subagents" },
|
|
46228
46394
|
{ packageName: "@bastani/mcp", workspaceDirName: "mcp", distDirName: "mcp" },
|
|
46229
46395
|
{ packageName: "@bastani/web-access", workspaceDirName: "web-access", distDirName: "web-access" },
|
|
46230
|
-
{ packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom" }
|
|
46396
|
+
{ packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom", mandatory: true }
|
|
46231
46397
|
];
|
|
46232
46398
|
BUILTIN_PACKAGES = WORKSPACE_BUILTINS.map((spec) => ({
|
|
46233
46399
|
packageName: spec.packageName,
|
|
46234
46400
|
distDirName: spec.distDirName,
|
|
46401
|
+
mandatory: spec.mandatory === true,
|
|
46235
46402
|
requiredEntries: requiredEntriesForBuiltin(spec.distDirName),
|
|
46236
46403
|
sourceCandidates: ({ here, packageDir, isSourceCheckout }) => isSourceCheckout ? [join43(packageDir, "..", spec.workspaceDirName), join43(here, "..", "..", "..", spec.workspaceDirName)] : []
|
|
46237
46404
|
}));
|
|
@@ -52206,6 +52373,13 @@ function getEnabledResources(resources, metadataByPath) {
|
|
|
52206
52373
|
function getEnabledPaths(resources, metadataByPath) {
|
|
52207
52374
|
return getEnabledResources(resources, metadataByPath).map((r) => r.path);
|
|
52208
52375
|
}
|
|
52376
|
+
function getBuiltinExtensionPaths(resources, metadataByPath, noExtensions) {
|
|
52377
|
+
for (const resource of resources) {
|
|
52378
|
+
if (!metadataByPath.has(resource.path))
|
|
52379
|
+
metadataByPath.set(resource.path, resource.metadata);
|
|
52380
|
+
}
|
|
52381
|
+
return noExtensions ? [] : resources.filter((resource) => resource.enabled).map((resource) => resource.path);
|
|
52382
|
+
}
|
|
52209
52383
|
function mapSkillPath(resource, metadataByPath) {
|
|
52210
52384
|
if (resource.metadata.source !== "auto" && resource.metadata.origin !== "package") {
|
|
52211
52385
|
return resource.path;
|
|
@@ -52249,12 +52423,12 @@ async function loadProjectTrustExtensions(loader) {
|
|
|
52249
52423
|
const metadataByPath = new Map;
|
|
52250
52424
|
const cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);
|
|
52251
52425
|
const enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);
|
|
52252
|
-
const builtinEnabledExtensions =
|
|
52426
|
+
const builtinEnabledExtensions = getBuiltinExtensionPaths(builtinPackagePaths.extensions, metadataByPath, state.noExtensions);
|
|
52253
52427
|
const workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);
|
|
52254
52428
|
state.workflowResources = workflowResources;
|
|
52255
52429
|
const workflowResourceProvider = createWorkflowResourceProvider(loader);
|
|
52256
52430
|
const inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);
|
|
52257
|
-
const extensionPaths =
|
|
52431
|
+
const extensionPaths = mergeResourcePaths(state.cwd, cliEnabledExtensions, state.noExtensions ? builtinEnabledExtensions : [...enabledExtensions, ...builtinEnabledExtensions]);
|
|
52258
52432
|
const extensionsResult = await loadExtensionsCached(extensionPaths, state.cwd, state.eventBus, workflowResourceProvider, undefined, inheritanceSnapshotProvider);
|
|
52259
52433
|
const inlineExtensions = await loadExtensionFactories(loader, extensionsResult.runtime, workflowResourceProvider, inheritanceSnapshotProvider);
|
|
52260
52434
|
extensionsResult.extensions.push(...inlineExtensions.extensions);
|
|
@@ -52334,7 +52508,7 @@ async function reloadDefaultResourceLoader(loader, options) {
|
|
|
52334
52508
|
const enabledSkillResources = getEnabledResources(resolvedPaths.skills, metadataByPath);
|
|
52335
52509
|
const enabledPrompts = getEnabledPaths(resolvedPaths.prompts, metadataByPath);
|
|
52336
52510
|
const enabledThemes = getEnabledPaths(resolvedPaths.themes, metadataByPath);
|
|
52337
|
-
const builtinEnabledExtensions =
|
|
52511
|
+
const builtinEnabledExtensions = getBuiltinExtensionPaths(builtinPackagePaths.extensions, metadataByPath, state.noExtensions);
|
|
52338
52512
|
const builtinEnabledSkillResources = state.noSkills ? [] : getEnabledResources(builtinPackagePaths.skills, metadataByPath);
|
|
52339
52513
|
const builtinEnabledPrompts = state.noPromptTemplates ? [] : getEnabledPaths(builtinPackagePaths.prompts, metadataByPath);
|
|
52340
52514
|
const builtinEnabledThemes = state.noThemes ? [] : getEnabledPaths(builtinPackagePaths.themes, metadataByPath);
|
|
@@ -52348,9 +52522,13 @@ async function reloadDefaultResourceLoader(loader, options) {
|
|
|
52348
52522
|
const workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);
|
|
52349
52523
|
state.workflowResources = workflowResources;
|
|
52350
52524
|
const workflowResourceProvider = createWorkflowResourceProvider(loader);
|
|
52351
|
-
const extensionPaths =
|
|
52525
|
+
const extensionPaths = mergeResourcePaths(state.cwd, cliEnabledExtensions, state.noExtensions ? builtinEnabledExtensions : [...enabledExtensions, ...builtinEnabledExtensions]);
|
|
52352
52526
|
const inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);
|
|
52353
52527
|
const extensionsResult = options?.deferExtensions ? { extensions: [], errors: [], runtime: createExtensionRuntime() } : await loadFinalExtensionSet(loader, extensionPaths, preTrustExtensions, workflowResourceProvider, inheritanceSnapshotProvider);
|
|
52528
|
+
const mandatoryExtensionPaths = new Set(getMandatoryBuiltinExtensionPaths().map((path16) => resolvePath(path16, state.cwd, { normalizeUnicodeSpaces: true })));
|
|
52529
|
+
const loadedMandatoryExtensions = new Set(extensionsResult.extensions.filter((extension) => mandatoryExtensionPaths.has(resolvePath(extension.resolvedPath, state.cwd, { normalizeUnicodeSpaces: true }))));
|
|
52530
|
+
for (const extension of loadedMandatoryExtensions)
|
|
52531
|
+
markTrustedMandatoryRuntimeExtension(extension);
|
|
52354
52532
|
for (const p of state.additionalExtensionPaths) {
|
|
52355
52533
|
if (isLocalPath(p)) {
|
|
52356
52534
|
const resolved = resolveResourcePath(state.cwd, p);
|
|
@@ -52361,6 +52539,12 @@ async function reloadDefaultResourceLoader(loader, options) {
|
|
|
52361
52539
|
}
|
|
52362
52540
|
state.extensionsResult = state.extensionsOverride ? state.extensionsOverride(extensionsResult) : extensionsResult;
|
|
52363
52541
|
applyExtensionSourceInfo(loader, state.extensionsResult.extensions, metadataByPath);
|
|
52542
|
+
for (const extension of state.extensionsResult.extensions) {
|
|
52543
|
+
const registration = extension.tools.get("intercom");
|
|
52544
|
+
if (loadedMandatoryExtensions.has(extension) && registration && isTrustedMandatoryRuntimeTool(registration)) {
|
|
52545
|
+
markTrustedMandatoryRuntimeExtension(extension);
|
|
52546
|
+
}
|
|
52547
|
+
}
|
|
52364
52548
|
resolveInheritedExtensionOverlaps(state.extensionsResult);
|
|
52365
52549
|
const skillPaths = state.noSkills ? mergeResourcePaths(state.cwd, cliEnabledSkills, state.additionalSkillPaths) : mergeResourcePaths(state.cwd, [...cliEnabledSkills, ...enabledSkills, ...builtinEnabledSkills], state.additionalSkillPaths);
|
|
52366
52550
|
state.lastSkillPaths = skillPaths;
|
|
@@ -52440,7 +52624,9 @@ async function reloadDefaultResourceLoader(loader, options) {
|
|
|
52440
52624
|
var init_resource_loader_reload = __esm(() => {
|
|
52441
52625
|
init_event_loop();
|
|
52442
52626
|
init_paths();
|
|
52627
|
+
init_builtin_packages();
|
|
52443
52628
|
init_loader();
|
|
52629
|
+
init_mandatory_runtime_tools();
|
|
52444
52630
|
init_resource_loader_assets();
|
|
52445
52631
|
init_resource_loader_context_files();
|
|
52446
52632
|
init_resource_loader_discovery();
|
|
@@ -53597,6 +53783,28 @@ var init_settings_manager_ui_accessors = __esm(() => {
|
|
|
53597
53783
|
state.markModified("fullscreenExitOutput");
|
|
53598
53784
|
state.save();
|
|
53599
53785
|
},
|
|
53786
|
+
getFullscreenCopyOnSelect() {
|
|
53787
|
+
return settingsInternals(this).settings.fullscreenCopyOnSelect !== false;
|
|
53788
|
+
},
|
|
53789
|
+
setFullscreenCopyOnSelect(enabled) {
|
|
53790
|
+
const state = settingsInternals(this);
|
|
53791
|
+
state.globalSettings.fullscreenCopyOnSelect = enabled;
|
|
53792
|
+
state.markModified("fullscreenCopyOnSelect");
|
|
53793
|
+
state.save();
|
|
53794
|
+
},
|
|
53795
|
+
getTerminalCapabilityOverrides() {
|
|
53796
|
+
const terminal = settingsInternals(this).settings.terminal;
|
|
53797
|
+
const overrides = {};
|
|
53798
|
+
if (typeof terminal?.hyperlinks === "boolean")
|
|
53799
|
+
overrides.hyperlinks = terminal.hyperlinks;
|
|
53800
|
+
if (terminal?.images === "kitty" || terminal?.images === "iterm2")
|
|
53801
|
+
overrides.images = terminal.images;
|
|
53802
|
+
else if (terminal?.images === false)
|
|
53803
|
+
overrides.images = null;
|
|
53804
|
+
if (typeof terminal?.trueColor === "boolean")
|
|
53805
|
+
overrides.trueColor = terminal.trueColor;
|
|
53806
|
+
return overrides;
|
|
53807
|
+
},
|
|
53600
53808
|
getEditorPaddingX() {
|
|
53601
53809
|
return settingsInternals(this).settings.editorPaddingX ?? 0;
|
|
53602
53810
|
},
|
|
@@ -54147,6 +54355,105 @@ function restoreAnthropicReplayThinkingBlocks(payload, sourceMessages, model) {
|
|
|
54147
54355
|
return { ...payload, messages: nextPayloadMessages };
|
|
54148
54356
|
}
|
|
54149
54357
|
|
|
54358
|
+
// src/core/mandatory-resource-loader.ts
|
|
54359
|
+
function hasTrustedIntercom(extension) {
|
|
54360
|
+
const registration = extension.tools.get("intercom");
|
|
54361
|
+
return registration !== undefined && isTrustedMandatoryRuntimeTool(registration);
|
|
54362
|
+
}
|
|
54363
|
+
async function restoreMandatoryExtensions(target, cwd) {
|
|
54364
|
+
if (target.extensions.some(hasTrustedIntercom))
|
|
54365
|
+
return target;
|
|
54366
|
+
const loaded = await loadExtensions(getMandatoryBuiltinExtensionPaths(), cwd, getExtensionRuntimeEventBus(target.runtime), undefined, target.runtime);
|
|
54367
|
+
for (const extension of loaded.extensions)
|
|
54368
|
+
markTrustedMandatoryRuntimeExtension(extension);
|
|
54369
|
+
const restored = {
|
|
54370
|
+
...target,
|
|
54371
|
+
extensions: [...target.extensions, ...loaded.extensions],
|
|
54372
|
+
errors: [...target.errors, ...loaded.errors]
|
|
54373
|
+
};
|
|
54374
|
+
if (!restored.extensions.some(hasTrustedIntercom)) {
|
|
54375
|
+
const detail = loaded.errors.map(({ error }) => error).join("; ") || "extension did not register intercom";
|
|
54376
|
+
throw new Error(`Mandatory bundled Intercom is unavailable: ${detail}`);
|
|
54377
|
+
}
|
|
54378
|
+
return restored;
|
|
54379
|
+
}
|
|
54380
|
+
|
|
54381
|
+
class MandatoryResourceLoader {
|
|
54382
|
+
delegate;
|
|
54383
|
+
cwd;
|
|
54384
|
+
extensionsResult;
|
|
54385
|
+
toolOnly = false;
|
|
54386
|
+
constructor(delegate, cwd, extensionsResult) {
|
|
54387
|
+
this.delegate = delegate;
|
|
54388
|
+
this.cwd = cwd;
|
|
54389
|
+
this.extensionsResult = extensionsResult;
|
|
54390
|
+
}
|
|
54391
|
+
limitToTool() {
|
|
54392
|
+
this.toolOnly = true;
|
|
54393
|
+
this.removeLocalInteractionSurfaces();
|
|
54394
|
+
}
|
|
54395
|
+
removeLocalInteractionSurfaces() {
|
|
54396
|
+
const extension = this.extensionsResult.extensions.find(hasTrustedIntercom);
|
|
54397
|
+
extension?.commands.delete("intercom");
|
|
54398
|
+
extension?.shortcuts.delete("alt+m");
|
|
54399
|
+
}
|
|
54400
|
+
getExtensions() {
|
|
54401
|
+
return this.extensionsResult;
|
|
54402
|
+
}
|
|
54403
|
+
getSkills() {
|
|
54404
|
+
return this.delegate.getSkills();
|
|
54405
|
+
}
|
|
54406
|
+
getSkillCatalog() {
|
|
54407
|
+
return this.delegate.getSkillCatalog?.() ?? buildSkillCatalog(this.delegate.getSkills().skills);
|
|
54408
|
+
}
|
|
54409
|
+
getPrompts() {
|
|
54410
|
+
return this.delegate.getPrompts();
|
|
54411
|
+
}
|
|
54412
|
+
getThemes() {
|
|
54413
|
+
return this.delegate.getThemes();
|
|
54414
|
+
}
|
|
54415
|
+
getAgentsFiles() {
|
|
54416
|
+
return this.delegate.getAgentsFiles();
|
|
54417
|
+
}
|
|
54418
|
+
getSystemPrompt() {
|
|
54419
|
+
return this.delegate.getSystemPrompt();
|
|
54420
|
+
}
|
|
54421
|
+
getSystemPromptSource() {
|
|
54422
|
+
return this.delegate.getSystemPromptSource();
|
|
54423
|
+
}
|
|
54424
|
+
getAppendSystemPrompt() {
|
|
54425
|
+
return this.delegate.getAppendSystemPrompt();
|
|
54426
|
+
}
|
|
54427
|
+
getAppendSystemPromptSources() {
|
|
54428
|
+
return this.delegate.getAppendSystemPromptSources();
|
|
54429
|
+
}
|
|
54430
|
+
extendResources(paths) {
|
|
54431
|
+
return this.delegate.extendResources(paths);
|
|
54432
|
+
}
|
|
54433
|
+
async reload(options) {
|
|
54434
|
+
await this.delegate.reload(options);
|
|
54435
|
+
this.extensionsResult = await restoreMandatoryExtensions(this.delegate.getExtensions(), this.cwd);
|
|
54436
|
+
if (this.toolOnly)
|
|
54437
|
+
this.removeLocalInteractionSurfaces();
|
|
54438
|
+
}
|
|
54439
|
+
}
|
|
54440
|
+
async function withMandatoryResourceLoader(loader, cwd) {
|
|
54441
|
+
if (loader instanceof MandatoryResourceLoader)
|
|
54442
|
+
return loader;
|
|
54443
|
+
const extensionsResult = await restoreMandatoryExtensions(loader.getExtensions(), cwd);
|
|
54444
|
+
return new MandatoryResourceLoader(loader, cwd, extensionsResult);
|
|
54445
|
+
}
|
|
54446
|
+
function limitMandatoryIntercomToTool(loader) {
|
|
54447
|
+
if (loader instanceof MandatoryResourceLoader)
|
|
54448
|
+
loader.limitToTool();
|
|
54449
|
+
}
|
|
54450
|
+
var init_mandatory_resource_loader = __esm(() => {
|
|
54451
|
+
init_builtin_packages();
|
|
54452
|
+
init_loader();
|
|
54453
|
+
init_mandatory_runtime_tools();
|
|
54454
|
+
init_skill_catalog();
|
|
54455
|
+
});
|
|
54456
|
+
|
|
54150
54457
|
// src/core/model-resolver-defaults.ts
|
|
54151
54458
|
function findPreferredAvailableModel(availableModels) {
|
|
54152
54459
|
for (const [provider, defaultId] of Object.entries(defaultModelPerProvider)) {
|
|
@@ -54187,7 +54494,7 @@ var init_model_resolver_defaults = __esm(() => {
|
|
|
54187
54494
|
huggingface: "moonshotai/Kimi-K2.6",
|
|
54188
54495
|
fireworks: "accounts/fireworks/models/kimi-k2p6",
|
|
54189
54496
|
together: "moonshotai/Kimi-K2.6",
|
|
54190
|
-
baseten: "zai-org/GLM-5.
|
|
54497
|
+
baseten: "zai-org/GLM-5.3",
|
|
54191
54498
|
opencode: "kimi-k2.6",
|
|
54192
54499
|
"opencode-go": "kimi-k2.6",
|
|
54193
54500
|
"kimi-coding": "kimi-for-coding",
|
|
@@ -54976,14 +55283,16 @@ async function createAgentSessionServices(options) {
|
|
|
54976
55283
|
const settingsSpan = startTimingSpan("createAgentSessionServices.settingsManager");
|
|
54977
55284
|
const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
|
|
54978
55285
|
endTimingSpan(settingsSpan);
|
|
54979
|
-
const
|
|
54980
|
-
|
|
55286
|
+
const resourceLoaderOptions = options.resourceLoaderOptions ?? {};
|
|
55287
|
+
const defaultResourceLoader = new DefaultResourceLoader({
|
|
55288
|
+
...resourceLoaderOptions,
|
|
54981
55289
|
cwd,
|
|
54982
55290
|
agentDir,
|
|
54983
55291
|
settingsManager
|
|
54984
55292
|
});
|
|
54985
55293
|
const reloadSpan = startTimingSpan("createAgentSessionServices.resourceLoader.reload");
|
|
54986
|
-
await
|
|
55294
|
+
await defaultResourceLoader.reload(options.resourceLoaderReloadOptions);
|
|
55295
|
+
const resourceLoader = await withMandatoryResourceLoader(defaultResourceLoader, cwd);
|
|
54987
55296
|
endTimingSpan(reloadSpan);
|
|
54988
55297
|
const diagnostics = [];
|
|
54989
55298
|
const providerSpan = startTimingSpan("createAgentSessionServices.providerRegistrations");
|
|
@@ -55036,6 +55345,7 @@ async function createAgentSessionFromServices(options) {
|
|
|
55036
55345
|
var init_agent_session_services = __esm(() => {
|
|
55037
55346
|
init_config();
|
|
55038
55347
|
init_paths();
|
|
55348
|
+
init_mandatory_resource_loader();
|
|
55039
55349
|
init_model_runtime();
|
|
55040
55350
|
init_resource_loader();
|
|
55041
55351
|
init_sdk();
|
|
@@ -55418,6 +55728,7 @@ async function createAgentSession(options = {}) {
|
|
|
55418
55728
|
await resourceLoader.reload();
|
|
55419
55729
|
time("resourceLoader.reload");
|
|
55420
55730
|
}
|
|
55731
|
+
resourceLoader = await withMandatoryResourceLoader(resourceLoader, cwd);
|
|
55421
55732
|
const existingSession = sessionManager.buildSessionContext();
|
|
55422
55733
|
const repairedMessages = repairOrphanToolResults(existingSession.messages, { repairTrailing: true });
|
|
55423
55734
|
const existingMessages = options.initialContextTransform ? options.initialContextTransform(repairedMessages) : repairedMessages;
|
|
@@ -55643,6 +55954,7 @@ var init_sdk = __esm(() => {
|
|
|
55643
55954
|
init_agent_session();
|
|
55644
55955
|
init_auth_guidance();
|
|
55645
55956
|
init_codex_fast_mode();
|
|
55957
|
+
init_mandatory_resource_loader();
|
|
55646
55958
|
init_messages();
|
|
55647
55959
|
init_model_resolver();
|
|
55648
55960
|
init_model_runtime();
|
|
@@ -56219,8 +56531,14 @@ var init_list_models = __esm(() => {
|
|
|
56219
56531
|
|
|
56220
56532
|
// src/cli/startup-ui.ts
|
|
56221
56533
|
import { existsSync as existsSync45 } from "node:fs";
|
|
56222
|
-
import {
|
|
56534
|
+
import {
|
|
56535
|
+
ProcessTerminal,
|
|
56536
|
+
setCapabilityOverrides,
|
|
56537
|
+
setKeybindings,
|
|
56538
|
+
TuiMainScreen
|
|
56539
|
+
} from "@earendil-works/pi-tui";
|
|
56223
56540
|
function createStartupTui(settingsManager) {
|
|
56541
|
+
setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides());
|
|
56224
56542
|
initTheme(settingsManager.getTheme());
|
|
56225
56543
|
setKeybindings(KeybindingsManager.create());
|
|
56226
56544
|
const ui = new TuiMainScreen(new ProcessTerminal, settingsManager.getShowHardwareCursor(), getAgentDir());
|
|
@@ -58050,8 +58368,9 @@ async function applyCliRuntimeApiKey(modelRuntime, providerId, apiKey, signal) {
|
|
|
58050
58368
|
}
|
|
58051
58369
|
|
|
58052
58370
|
// src/cli/session-picker.ts
|
|
58053
|
-
import { ProcessTerminal as ProcessTerminal2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
|
|
58054
|
-
async function selectSession(currentSessionsLoader, allSessionsLoader) {
|
|
58371
|
+
import { ProcessTerminal as ProcessTerminal2, setCapabilityOverrides as setCapabilityOverrides2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
|
|
58372
|
+
async function selectSession(currentSessionsLoader, allSessionsLoader, settingsManager) {
|
|
58373
|
+
setCapabilityOverrides2(settingsManager.getTerminalCapabilityOverrides());
|
|
58055
58374
|
return new Promise((resolve23) => {
|
|
58056
58375
|
const ui = new TuiMainScreen2(new ProcessTerminal2, undefined, getAgentDir());
|
|
58057
58376
|
const keybindings = KeybindingsManager.create();
|
|
@@ -58089,7 +58408,7 @@ var init_session_picker = __esm(() => {
|
|
|
58089
58408
|
|
|
58090
58409
|
// src/main-session.ts
|
|
58091
58410
|
import { createInterface as createInterface3 } from "node:readline";
|
|
58092
|
-
import { ProcessTerminal as ProcessTerminal3, setKeybindings as setKeybindings3, TuiMainScreen as TuiMainScreen3 } from "@earendil-works/pi-tui";
|
|
58411
|
+
import { ProcessTerminal as ProcessTerminal3, setCapabilityOverrides as setCapabilityOverrides3, setKeybindings as setKeybindings3, TuiMainScreen as TuiMainScreen3 } from "@earendil-works/pi-tui";
|
|
58093
58412
|
import chalk10 from "chalk";
|
|
58094
58413
|
async function findLocalSessionByExactId(sessionId, cwd, sessionDir) {
|
|
58095
58414
|
const localSessions = await SessionManager.list(cwd, sessionDir);
|
|
@@ -58228,7 +58547,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
|
|
|
58228
58547
|
if (parsed.resume) {
|
|
58229
58548
|
initTheme(settingsManager.getTheme(), true);
|
|
58230
58549
|
try {
|
|
58231
|
-
const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), (onProgress) => SessionManager.listAll(sessionDir, onProgress));
|
|
58550
|
+
const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), (onProgress) => SessionManager.listAll(sessionDir, onProgress), settingsManager);
|
|
58232
58551
|
if (!selectedPath) {
|
|
58233
58552
|
console.log(chalk10.dim("No session selected"));
|
|
58234
58553
|
process.exit(0);
|
|
@@ -58251,6 +58570,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
|
|
|
58251
58570
|
return SessionManager.create(cwd, sessionDir, { id: parsed.sessionId });
|
|
58252
58571
|
}
|
|
58253
58572
|
async function promptForMissingSessionCwd(issue, settingsManager) {
|
|
58573
|
+
setCapabilityOverrides3(settingsManager.getTerminalCapabilityOverrides());
|
|
58254
58574
|
initTheme(settingsManager.getTheme());
|
|
58255
58575
|
setKeybindings3(KeybindingsManager.create());
|
|
58256
58576
|
return new Promise((resolve23) => {
|
|
@@ -61836,7 +62156,7 @@ var init_slash_commands = __esm(() => {
|
|
|
61836
62156
|
{ name: "tree", description: "Navigate session tree (switch branches)" },
|
|
61837
62157
|
{ name: "thinking", description: "Set thinking level", argumentHint: "<level>" },
|
|
61838
62158
|
{ name: "scoped-models", description: "Enable/disable models for ctrl+p cycling" },
|
|
61839
|
-
{ name: "fast", description: "Configure
|
|
62159
|
+
{ name: "fast", description: "Configure fast mode for chat and workflows on supported models" },
|
|
61840
62160
|
{ name: "export", description: "Export session (HTML default, or specify path: .html/.jsonl)" },
|
|
61841
62161
|
{ name: "import", description: "Import and resume a session from a JSONL file" },
|
|
61842
62162
|
{ name: "share", description: "Share session as a secret GitHub gist" },
|
|
@@ -62472,6 +62792,7 @@ function createFullscreenTui(options) {
|
|
|
62472
62792
|
openUrl: openBrowser
|
|
62473
62793
|
}),
|
|
62474
62794
|
onRightClickPaste: options.onRightClickPaste,
|
|
62795
|
+
copyOnSelect: options.copyOnSelect,
|
|
62475
62796
|
copySelection: options.copySelection ?? copySelectionToHostClipboard
|
|
62476
62797
|
}, options.shouldHandleViewportInput, options.onOverlayUnhandledInput);
|
|
62477
62798
|
}
|
|
@@ -62513,7 +62834,7 @@ function createInteractiveTuiReference(getTui) {
|
|
|
62513
62834
|
getPrototypeOf: () => Reflect.getPrototypeOf(getTui())
|
|
62514
62835
|
});
|
|
62515
62836
|
}
|
|
62516
|
-
var viewportInputListeners, viewportInputGates, overlayUnhandledInputHandlers, viewportInputReplays, viewportInputSubscriptions, SGR_MOUSE_SEQUENCE, LEFT_MOUSE_MODIFIER_MASK, AtomicTuiAltScreen, AtomicTuiMainScreen;
|
|
62837
|
+
var viewportInputListeners, viewportInputGates, overlayUnhandledInputHandlers, viewportInputReplays, overlayOwnedSelections, viewportInputSubscriptions, SGR_MOUSE_SEQUENCE, LEFT_MOUSE_MODIFIER_MASK, AtomicTuiAltScreen, AtomicTuiMainScreen;
|
|
62517
62838
|
var init_interactive_tui = __esm(() => {
|
|
62518
62839
|
init_clipboard();
|
|
62519
62840
|
init_open_browser();
|
|
@@ -62522,6 +62843,7 @@ var init_interactive_tui = __esm(() => {
|
|
|
62522
62843
|
viewportInputGates = new WeakMap;
|
|
62523
62844
|
overlayUnhandledInputHandlers = new WeakMap;
|
|
62524
62845
|
viewportInputReplays = new WeakSet;
|
|
62846
|
+
overlayOwnedSelections = new WeakSet;
|
|
62525
62847
|
viewportInputSubscriptions = new WeakMap;
|
|
62526
62848
|
SGR_MOUSE_SEQUENCE = /^\x1b\[<(\d+);\d+;\d+([Mm])/;
|
|
62527
62849
|
LEFT_MOUSE_MODIFIER_MASK = 4 | 8 | 16;
|
|
@@ -62537,8 +62859,20 @@ var init_interactive_tui = __esm(() => {
|
|
|
62537
62859
|
deferral.shouldDeferViewportInputToOverlay = () => !viewportInputReplays.has(this) && deferToOverlay?.() === true;
|
|
62538
62860
|
}
|
|
62539
62861
|
applyLineResets(lines) {
|
|
62862
|
+
if (overlayOwnedSelections.has(this) && !this.isFocusedOverlay())
|
|
62863
|
+
this.clearOverlayOwnedSelection();
|
|
62540
62864
|
return stripOverlayActiveRowMarker(super.applyLineResets(lines));
|
|
62541
62865
|
}
|
|
62866
|
+
clearOverlayOwnedSelection() {
|
|
62867
|
+
const selection = this;
|
|
62868
|
+
selection.selectionAnchor = undefined;
|
|
62869
|
+
selection.selectionFocus = undefined;
|
|
62870
|
+
selection.selectionInitialRange = undefined;
|
|
62871
|
+
selection.selectionPressActive = false;
|
|
62872
|
+
selection.selectionDragged = false;
|
|
62873
|
+
selection.lastClick = undefined;
|
|
62874
|
+
overlayOwnedSelections.delete(this);
|
|
62875
|
+
}
|
|
62542
62876
|
isPiTuiMouseSequence(data) {
|
|
62543
62877
|
if (parseMouseSequences(data))
|
|
62544
62878
|
return true;
|
|
@@ -62615,6 +62949,7 @@ var init_interactive_tui = __esm(() => {
|
|
|
62615
62949
|
if (isLeftMouseButton(sequence))
|
|
62616
62950
|
viewportListener(sequence.data);
|
|
62617
62951
|
}
|
|
62952
|
+
overlayOwnedSelections.add(this);
|
|
62618
62953
|
}
|
|
62619
62954
|
replayViewportInput(viewportListener, data) {
|
|
62620
62955
|
viewportInputReplays.add(this);
|
|
@@ -62682,7 +63017,11 @@ var init_interactive_tui = __esm(() => {
|
|
|
62682
63017
|
});
|
|
62683
63018
|
|
|
62684
63019
|
// src/modes/interactive/interactive-mode-base.ts
|
|
62685
|
-
import {
|
|
63020
|
+
import {
|
|
63021
|
+
isKeyRelease as isKeyRelease3,
|
|
63022
|
+
isViewportTUI,
|
|
63023
|
+
setCapabilityOverrides as setCapabilityOverrides4
|
|
63024
|
+
} from "@earendil-works/pi-tui";
|
|
62686
63025
|
function isFullscreenViewportAction(data, keybindings) {
|
|
62687
63026
|
return FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));
|
|
62688
63027
|
}
|
|
@@ -62743,6 +63082,18 @@ class InteractiveModeBase {
|
|
|
62743
63082
|
return false;
|
|
62744
63083
|
return this.defaultEditor.handleInput(data);
|
|
62745
63084
|
}
|
|
63085
|
+
setFullscreenCopyOnSelect(enabled) {
|
|
63086
|
+
if (this.renderer.mode === "fullscreen")
|
|
63087
|
+
this.renderer.setCopyOnSelect(enabled);
|
|
63088
|
+
}
|
|
63089
|
+
getFullscreenCopyOnSelect() {
|
|
63090
|
+
return this.renderer.mode === "fullscreen" ? this.renderer.getCopyOnSelect() : undefined;
|
|
63091
|
+
}
|
|
63092
|
+
async copyActiveFullscreenSelection() {
|
|
63093
|
+
if (this.renderer.mode !== "fullscreen" || !this.renderer.hasActiveSelection())
|
|
63094
|
+
return;
|
|
63095
|
+
return this.renderer.copyActiveSelectionToClipboard();
|
|
63096
|
+
}
|
|
62746
63097
|
onRightClickPaste = () => {
|
|
62747
63098
|
this.handleRightClickPaste();
|
|
62748
63099
|
};
|
|
@@ -62942,11 +63293,13 @@ class InteractiveModeBase {
|
|
|
62942
63293
|
await this.rebindCurrentSession();
|
|
62943
63294
|
await this.themeController.applyFromSettings();
|
|
62944
63295
|
});
|
|
63296
|
+
setCapabilityOverrides4(this.settingsManager.getTerminalCapabilityOverrides());
|
|
62945
63297
|
this.version = VERSION;
|
|
62946
63298
|
this.renderer = createInteractiveTui({
|
|
62947
63299
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
62948
63300
|
logDirectory: runtimeHost.services.agentDir,
|
|
62949
63301
|
terminal: options.terminal,
|
|
63302
|
+
copyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
|
|
62950
63303
|
onRightClickPaste: this.onRightClickPaste,
|
|
62951
63304
|
shouldHandleViewportInput: this.shouldHandleViewportInput,
|
|
62952
63305
|
onOverlayUnhandledInput: this.onOverlayUnhandledInput,
|
|
@@ -64069,6 +64422,7 @@ var init_interactive_deferred_startup = __esm(() => {
|
|
|
64069
64422
|
try {
|
|
64070
64423
|
await this.bindCurrentSessionExtensions();
|
|
64071
64424
|
await this.session.reload({ reason: "startup" });
|
|
64425
|
+
this.applyRuntimeSettings();
|
|
64072
64426
|
this.rebuildChatFromMessages();
|
|
64073
64427
|
if (!this.promptTurnWorkingLoaderActive) {
|
|
64074
64428
|
this.stopWorkingLoader();
|
|
@@ -64757,6 +65111,7 @@ ${warningLines}`, 0, 0));
|
|
|
64757
65111
|
});
|
|
64758
65112
|
|
|
64759
65113
|
// src/modes/interactive/interactive-session-runtime.ts
|
|
65114
|
+
import { setCapabilityOverrides as setCapabilityOverrides5 } from "@earendil-works/pi-tui";
|
|
64760
65115
|
var init_interactive_session_runtime = __esm(() => {
|
|
64761
65116
|
init_interactive_mode_base();
|
|
64762
65117
|
init_interactive_mode_deps();
|
|
@@ -64843,6 +65198,8 @@ var init_interactive_session_runtime = __esm(() => {
|
|
|
64843
65198
|
}
|
|
64844
65199
|
};
|
|
64845
65200
|
InteractiveModeBase.prototype.applyRuntimeSettings = function() {
|
|
65201
|
+
setCapabilityOverrides5(this.settingsManager.getTerminalCapabilityOverrides());
|
|
65202
|
+
this.setFullscreenCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect());
|
|
64846
65203
|
this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar());
|
|
64847
65204
|
this.footer.setSession(this.session);
|
|
64848
65205
|
this.usageMeter.setSession(this.session);
|
|
@@ -64912,7 +65269,7 @@ var init_interactive_extension_runtime = __esm(() => {
|
|
|
64912
65269
|
if (shortcuts.size === 0)
|
|
64913
65270
|
return;
|
|
64914
65271
|
const createContext = () => ({
|
|
64915
|
-
ui:
|
|
65272
|
+
ui: extensionRunner.getUIContext(),
|
|
64916
65273
|
mode: "tui",
|
|
64917
65274
|
hasUI: true,
|
|
64918
65275
|
cwd: this.sessionManager.getCwd(),
|
|
@@ -66359,6 +66716,9 @@ var init_interactive_input_handling = __esm(() => {
|
|
|
66359
66716
|
});
|
|
66360
66717
|
this.defaultEditor.onAction("app.message.followUp", () => this.handleFollowUp());
|
|
66361
66718
|
this.defaultEditor.onAction("app.message.dequeue", () => this.handleDequeue());
|
|
66719
|
+
this.defaultEditor.onAction("app.message.copy", () => {
|
|
66720
|
+
this.handleCopyCommand({ preferSelection: true });
|
|
66721
|
+
});
|
|
66362
66722
|
this.defaultEditor.onAction("app.session.new", () => this.handleClearCommand());
|
|
66363
66723
|
this.defaultEditor.onAction("app.session.tree", () => this.showTreeSelector());
|
|
66364
66724
|
this.defaultEditor.onAction("app.session.fork", () => this.showUserMessageSelector());
|
|
@@ -67266,7 +67626,8 @@ var init_interactive_agent_events = __esm(() => {
|
|
|
67266
67626
|
} else if (event.reason === "manual") {
|
|
67267
67627
|
this.manualCompactionTakeoverPending = false;
|
|
67268
67628
|
}
|
|
67269
|
-
|
|
67629
|
+
const resumesActiveRun = event.midTurn && !event.aborted && !event.errorMessage && !manualTakeoverPending;
|
|
67630
|
+
if (!manualTakeoverPending && !resumesActiveRun && this.settingsManager.getShowTerminalProgress()) {
|
|
67270
67631
|
this.ui.terminal.setProgress(false);
|
|
67271
67632
|
}
|
|
67272
67633
|
if (!manualTakeoverPending && this.autoCompactionEscapeHandlerSaved) {
|
|
@@ -68282,7 +68643,7 @@ var init_interactive_selectors = __esm(() => {
|
|
|
68282
68643
|
};
|
|
68283
68644
|
InteractiveModeBase.prototype.showFastModeSelector = function() {
|
|
68284
68645
|
if (!this.hasCodexFastModeSupportedModels()) {
|
|
68285
|
-
this.showWarning("
|
|
68646
|
+
this.showWarning("Fast mode isn't available for any configured model.");
|
|
68286
68647
|
return;
|
|
68287
68648
|
}
|
|
68288
68649
|
this.showSelector((done) => {
|
|
@@ -68341,6 +68702,7 @@ var init_interactive_selectors = __esm(() => {
|
|
|
68341
68702
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
68342
68703
|
fullscreenScrollbar: this.settingsManager.getFullscreenScrollbar(),
|
|
68343
68704
|
fullscreenExitOutput: this.settingsManager.getFullscreenExitOutput(),
|
|
68705
|
+
fullscreenCopyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
|
|
68344
68706
|
editorPaddingX: this.settingsManager.getEditorPaddingX(),
|
|
68345
68707
|
outputPad: this.settingsManager.getOutputPad(),
|
|
68346
68708
|
showCacheMissNotices: this.settingsManager.getShowCacheMissNotices(),
|
|
@@ -68458,6 +68820,10 @@ var init_interactive_selectors = __esm(() => {
|
|
|
68458
68820
|
onFullscreenExitOutputChange: (output) => {
|
|
68459
68821
|
this.settingsManager.setFullscreenExitOutput(output);
|
|
68460
68822
|
},
|
|
68823
|
+
onFullscreenCopyOnSelectChange: (enabled) => {
|
|
68824
|
+
this.settingsManager.setFullscreenCopyOnSelect(enabled);
|
|
68825
|
+
this.setFullscreenCopyOnSelect(enabled);
|
|
68826
|
+
},
|
|
68461
68827
|
onEditorPaddingXChange: (padding) => {
|
|
68462
68828
|
this.settingsManager.setEditorPaddingX(padding);
|
|
68463
68829
|
this.defaultEditor.setPaddingX(padding);
|
|
@@ -69444,18 +69810,8 @@ var init_interactive_slash_commands = __esm(() => {
|
|
|
69444
69810
|
activeHeader.setExpanded(this.toolOutputExpanded);
|
|
69445
69811
|
}
|
|
69446
69812
|
setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
|
|
69447
|
-
this.
|
|
69813
|
+
this.applyRuntimeSettings();
|
|
69448
69814
|
await this.themeController.applyFromSettings();
|
|
69449
|
-
const editorPaddingX = this.settingsManager.getEditorPaddingX();
|
|
69450
|
-
const autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();
|
|
69451
|
-
this.defaultEditor.setPaddingX(editorPaddingX);
|
|
69452
|
-
this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible);
|
|
69453
|
-
if (this.editor !== this.defaultEditor) {
|
|
69454
|
-
this.editor.setPaddingX?.(editorPaddingX);
|
|
69455
|
-
this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible);
|
|
69456
|
-
}
|
|
69457
|
-
this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());
|
|
69458
|
-
this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
|
|
69459
69815
|
this.setupAutocompleteProvider();
|
|
69460
69816
|
const runner = this.session.extensionRunner;
|
|
69461
69817
|
this.setupExtensionShortcuts(runner);
|
|
@@ -69648,7 +70004,12 @@ Gist: ${hyperlink3(gistUrl, gistUrl)}`);
|
|
|
69648
70004
|
}
|
|
69649
70005
|
}
|
|
69650
70006
|
};
|
|
69651
|
-
InteractiveModeBase.prototype.handleCopyCommand = async function() {
|
|
70007
|
+
InteractiveModeBase.prototype.handleCopyCommand = async function(options = {}) {
|
|
70008
|
+
if (options.preferSelection && this.getFullscreenCopyOnSelect() === false) {
|
|
70009
|
+
const selectionCopied = await this.copyActiveFullscreenSelection();
|
|
70010
|
+
if (selectionCopied !== undefined)
|
|
70011
|
+
return;
|
|
70012
|
+
}
|
|
69652
70013
|
const text = this.session.getLastAssistantText();
|
|
69653
70014
|
if (!text) {
|
|
69654
70015
|
this.showError("No agent messages to copy yet.");
|
|
@@ -73702,6 +74063,8 @@ var init_rpc_extension_ui = __esm(() => {
|
|
|
73702
74063
|
});
|
|
73703
74064
|
|
|
73704
74065
|
// src/modes/rpc/rpc-session-binding.ts
|
|
74066
|
+
import { setCapabilityOverrides as setCapabilityOverrides6 } from "@earendil-works/pi-tui";
|
|
74067
|
+
|
|
73705
74068
|
class RpcSessionBinding {
|
|
73706
74069
|
session;
|
|
73707
74070
|
unsubscribe;
|
|
@@ -73745,6 +74108,7 @@ class RpcSessionBinding {
|
|
|
73745
74108
|
this.session = this.runtimeHost.session;
|
|
73746
74109
|
this.disposeSubscriptions();
|
|
73747
74110
|
const session = this.session;
|
|
74111
|
+
setCapabilityOverrides6(session.settingsManager.getTerminalCapabilityOverrides());
|
|
73748
74112
|
this.renderService?.bindSession(session);
|
|
73749
74113
|
this.footerDataProvider = new FooterDataProvider(session.sessionManager.getCwd());
|
|
73750
74114
|
const models = session.scopedModels.length > 0 ? session.scopedModels.map((scoped) => scoped.model) : session.modelRuntime.getAvailableSnapshot();
|
|
@@ -74640,8 +75004,9 @@ var init_config_selector = __esm(() => {
|
|
|
74640
75004
|
});
|
|
74641
75005
|
|
|
74642
75006
|
// src/cli/config-selector.ts
|
|
74643
|
-
import { ProcessTerminal as ProcessTerminal6, TuiMainScreen as TuiMainScreen8 } from "@earendil-works/pi-tui";
|
|
75007
|
+
import { ProcessTerminal as ProcessTerminal6, setCapabilityOverrides as setCapabilityOverrides7, TuiMainScreen as TuiMainScreen8 } from "@earendil-works/pi-tui";
|
|
74644
75008
|
async function selectConfig(options) {
|
|
75009
|
+
setCapabilityOverrides7(options.settingsManager.getTerminalCapabilityOverrides());
|
|
74645
75010
|
initTheme(options.settingsManager.getTheme(), true);
|
|
74646
75011
|
return new Promise((resolve23) => {
|
|
74647
75012
|
const ui = new TuiMainScreen8(new ProcessTerminal6, undefined, options.agentDir);
|
|
@@ -75494,6 +75859,7 @@ var init_package_manager_cli = __esm(() => {
|
|
|
75494
75859
|
});
|
|
75495
75860
|
|
|
75496
75861
|
// src/main.ts
|
|
75862
|
+
import { setCapabilityOverrides as setCapabilityOverrides8 } from "@earendil-works/pi-tui";
|
|
75497
75863
|
import chalk15 from "chalk";
|
|
75498
75864
|
function authCheckErrorMessage(error) {
|
|
75499
75865
|
return error instanceof AuthCommandError ? error.message : "Failed to check provider readiness";
|
|
@@ -75728,6 +76094,7 @@ async function main(argv, options) {
|
|
|
75728
76094
|
startupEarlyInputCapture = undefined;
|
|
75729
76095
|
}
|
|
75730
76096
|
const startupSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: startupProjectTrusted });
|
|
76097
|
+
setCapabilityOverrides8(startupSettingsManager.getTerminalCapabilityOverrides());
|
|
75731
76098
|
const startupSettingsDiagnostics = collectSettingsDiagnostics(startupSettingsManager, "startup session lookup");
|
|
75732
76099
|
if (appMode === "interactive" && parsed.useTheme !== undefined) {
|
|
75733
76100
|
startupSettingsManager.applyOverrides({ theme: parsed.useTheme });
|
|
@@ -75862,6 +76229,8 @@ async function main(argv, options) {
|
|
|
75862
76229
|
extensionFactories: isolateInteractiveHost ? undefined : extensionFactories
|
|
75863
76230
|
}
|
|
75864
76231
|
});
|
|
76232
|
+
if (isolateInteractiveHost)
|
|
76233
|
+
limitMandatoryIntercomToTool(services2.resourceLoader);
|
|
75865
76234
|
const { settingsManager: settingsManager2, modelRuntime: modelRuntime2, resourceLoader: resourceLoader2 } = services2;
|
|
75866
76235
|
const diagnostics = [
|
|
75867
76236
|
...services2.diagnostics,
|
|
@@ -75924,6 +76293,7 @@ async function main(argv, options) {
|
|
|
75924
76293
|
endTimingSpan(runtimeCreationSpan);
|
|
75925
76294
|
const { services, session, modelFallbackMessage } = runtime;
|
|
75926
76295
|
const { settingsManager, modelRuntime, resourceLoader } = services;
|
|
76296
|
+
setCapabilityOverrides8(settingsManager.getTerminalCapabilityOverrides());
|
|
75927
76297
|
applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);
|
|
75928
76298
|
configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());
|
|
75929
76299
|
if (parsed.help) {
|
|
@@ -76055,6 +76425,7 @@ var init_main = __esm(() => {
|
|
|
76055
76425
|
init_auth_storage();
|
|
76056
76426
|
init_builtin_packages();
|
|
76057
76427
|
init_http_dispatcher();
|
|
76428
|
+
init_mandatory_resource_loader();
|
|
76058
76429
|
init_model_resolver();
|
|
76059
76430
|
init_model_runtime();
|
|
76060
76431
|
init_output_guard();
|
|
@@ -92594,6 +92965,7 @@ function serializePendingStageMessages(messages2) {
|
|
|
92594
92965
|
id: entry.from.id,
|
|
92595
92966
|
...entry.from.name !== undefined ? { name: entry.from.name } : {},
|
|
92596
92967
|
...entry.from.group !== undefined ? { group: entry.from.group } : {},
|
|
92968
|
+
...entry.from.groups !== undefined ? { groups: [...entry.from.groups] } : {},
|
|
92597
92969
|
...entry.from.cwd !== undefined ? { cwd: entry.from.cwd } : {},
|
|
92598
92970
|
...entry.from.model !== undefined ? { model: entry.from.model } : {},
|
|
92599
92971
|
...entry.from.pid !== undefined ? { pid: entry.from.pid } : {},
|
|
@@ -92635,7 +93007,7 @@ function isPendingStageMessage(value) {
|
|
|
92635
93007
|
return typeof value.id === "string" && typeof value.runId === "string" && typeof value.stageKey === "string" && (value.stageId === undefined || typeof value.stageId === "string") && (value.stageReplayKey === undefined || typeof value.stageReplayKey === "string") && (value.senderRegistrationName === undefined || typeof value.senderRegistrationName === "string") && (value.senderReturnAddress === undefined || typeof value.senderReturnAddress === "string") && typeof value.queuedAt === "string" && (value.admissionOrder === undefined || typeof value.admissionOrder === "number" && Number.isSafeInteger(value.admissionOrder) && value.admissionOrder > 0) && (value.status === "queued" || value.status === "delivered" || value.status === "undeliverable") && (value.deliveredAt === undefined || typeof value.deliveredAt === "string") && (value.undeliverableReason === undefined || typeof value.undeliverableReason === "string") && (value.undeliverableNotificationId === undefined || typeof value.undeliverableNotificationId === "string") && (value.undeliverableNotifiedAt === undefined || typeof value.undeliverableNotifiedAt === "string") && isPendingStageSender(value.from) && isPendingStageIntercomMessage(value.message);
|
|
92636
93008
|
}
|
|
92637
93009
|
function isPendingStageSender(value) {
|
|
92638
|
-
return isSerializableObject(value) && typeof value.id === "string" && (value.name === undefined || typeof value.name === "string") && (value.group === undefined || typeof value.group === "string") && (value.cwd === undefined || typeof value.cwd === "string") && (value.model === undefined || typeof value.model === "string") && (value.pid === undefined || typeof value.pid === "number") && (value.startedAt === undefined || typeof value.startedAt === "number") && (value.lastActivity === undefined || typeof value.lastActivity === "number") && (value.status === undefined || typeof value.status === "string");
|
|
93010
|
+
return isSerializableObject(value) && typeof value.id === "string" && (value.name === undefined || typeof value.name === "string") && (value.group === undefined || typeof value.group === "string") && (value.groups === undefined || Array.isArray(value.groups) && value.groups.every((group) => typeof group === "string")) && (value.cwd === undefined || typeof value.cwd === "string") && (value.model === undefined || typeof value.model === "string") && (value.pid === undefined || typeof value.pid === "number") && (value.startedAt === undefined || typeof value.startedAt === "number") && (value.lastActivity === undefined || typeof value.lastActivity === "number") && (value.status === undefined || typeof value.status === "string");
|
|
92639
93011
|
}
|
|
92640
93012
|
function isPendingStageIntercomMessage(value) {
|
|
92641
93013
|
if (!isSerializableObject(value) || typeof value.id !== "string" || typeof value.timestamp !== "number")
|
|
@@ -93169,8 +93541,8 @@ class DbosDurableBackend {
|
|
|
93169
93541
|
locallyRegistered = new Set;
|
|
93170
93542
|
promptReservations;
|
|
93171
93543
|
executorId;
|
|
93172
|
-
|
|
93173
|
-
writeErrors =
|
|
93544
|
+
writeQueues = new Map;
|
|
93545
|
+
writeErrors = new Map;
|
|
93174
93546
|
constructor(sdk, options) {
|
|
93175
93547
|
this.sdk = sdk;
|
|
93176
93548
|
this.executorId = options?.executorId ?? getAtomicExecutorId();
|
|
@@ -93178,7 +93550,7 @@ class DbosDurableBackend {
|
|
|
93178
93550
|
pendingPrompts: (workflowId) => this.mem.getWorkflow(workflowId)?.pendingPrompts ?? 0,
|
|
93179
93551
|
adjustPendingPrompts: (workflowId, delta) => this.mem.adjustPendingPrompts(workflowId, delta),
|
|
93180
93552
|
persist: (workflowId, stepName, output) => {
|
|
93181
|
-
this.enqueueWrite(() => this.sdk.recordStepOutput(workflowId, stepName, output));
|
|
93553
|
+
this.enqueueWrite(workflowId, () => this.sdk.recordStepOutput(workflowId, stepName, output));
|
|
93182
93554
|
}
|
|
93183
93555
|
});
|
|
93184
93556
|
}
|
|
@@ -93191,14 +93563,14 @@ class DbosDurableBackend {
|
|
|
93191
93563
|
this.locallyRegistered.add(handle.workflowId);
|
|
93192
93564
|
const pendingPrompts2 = this.promptReservations.registerWorkflow(handle.workflowId, handle.pendingPrompts, this.mem.getWorkflow(handle.workflowId)?.pendingPrompts ?? 0);
|
|
93193
93565
|
this.mem.registerWorkflow({ ...handle, pendingPrompts: pendingPrompts2 });
|
|
93194
|
-
this.enqueueWrite(async () => {
|
|
93566
|
+
this.enqueueWrite(handle.workflowId, async () => {
|
|
93195
93567
|
await this.sdk.startWorkflow(handle.workflowId, handle.name, handle.inputs);
|
|
93196
93568
|
await this.writeMetadata(handle.workflowId);
|
|
93197
93569
|
});
|
|
93198
93570
|
}
|
|
93199
93571
|
async persistPendingStageMessages(workflowId, messages2, logicalRunId = workflowId) {
|
|
93200
93572
|
let persisted = false;
|
|
93201
|
-
await this.enqueueWrite(async () => {
|
|
93573
|
+
await this.enqueueWrite(workflowId, async () => {
|
|
93202
93574
|
if (!this.isWorkflowLoadable(workflowId))
|
|
93203
93575
|
return;
|
|
93204
93576
|
const handle = this.mem.getWorkflow(workflowId);
|
|
@@ -93223,7 +93595,7 @@ class DbosDurableBackend {
|
|
|
93223
93595
|
if (!this.isWorkflowLoadable(checkpoint.workflowId))
|
|
93224
93596
|
return;
|
|
93225
93597
|
this.mem.recordCheckpoint(checkpoint);
|
|
93226
|
-
this.enqueueWrite(() => this.persistCheckpoint(checkpoint));
|
|
93598
|
+
this.enqueueWrite(checkpoint.workflowId, () => this.persistCheckpoint(checkpoint));
|
|
93227
93599
|
}
|
|
93228
93600
|
async recordCheckpointAsync(checkpoint, options) {
|
|
93229
93601
|
if (!this.isWorkflowLoadable(checkpoint.workflowId))
|
|
@@ -93231,7 +93603,7 @@ class DbosDurableBackend {
|
|
|
93231
93603
|
const signal = options?.signal;
|
|
93232
93604
|
if (signal?.aborted)
|
|
93233
93605
|
throw abortSignalReason(signal);
|
|
93234
|
-
await this.enqueueWrite(async () => {
|
|
93606
|
+
await this.enqueueWrite(checkpoint.workflowId, async () => {
|
|
93235
93607
|
if (signal?.aborted || !this.isWorkflowLoadable(checkpoint.workflowId))
|
|
93236
93608
|
return;
|
|
93237
93609
|
const persist = (async () => {
|
|
@@ -93268,7 +93640,7 @@ class DbosDurableBackend {
|
|
|
93268
93640
|
if (!this.isWorkflowLoadable(checkpoint.workflowId))
|
|
93269
93641
|
return true;
|
|
93270
93642
|
const encoded = encodeCheckpoint(checkpoint);
|
|
93271
|
-
return await this.enqueueBestEffortWrite(async () => {
|
|
93643
|
+
return await this.enqueueBestEffortWrite(checkpoint.workflowId, async () => {
|
|
93272
93644
|
if (!this.isWorkflowLoadable(checkpoint.workflowId))
|
|
93273
93645
|
return;
|
|
93274
93646
|
await this.sdk.recordStepOutput(checkpoint.workflowId, checkpoint.checkpointId, encoded);
|
|
@@ -93313,7 +93685,7 @@ class DbosDurableBackend {
|
|
|
93313
93685
|
this.promptReservations.setBaseline(workflowId, pendingPrompts2);
|
|
93314
93686
|
}
|
|
93315
93687
|
this.mem.setWorkflowStatus(workflowId, status, pendingPrompts2, resumable, failure2);
|
|
93316
|
-
this.enqueueWrite(async () => {
|
|
93688
|
+
this.enqueueWrite(workflowId, async () => {
|
|
93317
93689
|
if (!this.isWorkflowLoadable(workflowId))
|
|
93318
93690
|
return;
|
|
93319
93691
|
if (status === "cancelled")
|
|
@@ -93327,14 +93699,14 @@ class DbosDurableBackend {
|
|
|
93327
93699
|
return await transitionDbosWorkflowStatus({
|
|
93328
93700
|
expectedStatuses: expected,
|
|
93329
93701
|
status,
|
|
93330
|
-
flush: () => this.flush(),
|
|
93702
|
+
flush: () => this.flush(workflowId),
|
|
93331
93703
|
local: () => this.getLoadableWorkflow(workflowId),
|
|
93332
93704
|
read: async () => classifyLatestMetadata(await this.sdk.listStepRecords(workflowId), workflowId),
|
|
93333
93705
|
reconcile: (entry) => this.mem.setWorkflowStatus(workflowId, entry.status, undefined, entry.resumable),
|
|
93334
93706
|
claim: (authoritative, generation) => this.claimStatusTransition(workflowId, authoritative, generation, status, pendingPrompts2, resumable),
|
|
93335
93707
|
write: async () => {
|
|
93336
93708
|
this.setWorkflowStatus(workflowId, status, pendingPrompts2, resumable);
|
|
93337
|
-
await this.flush();
|
|
93709
|
+
await this.flush(workflowId);
|
|
93338
93710
|
}
|
|
93339
93711
|
});
|
|
93340
93712
|
}
|
|
@@ -93396,13 +93768,13 @@ class DbosDurableBackend {
|
|
|
93396
93768
|
this.locallyRegistered.delete(workflowId);
|
|
93397
93769
|
this.promptReservations.delete(workflowId);
|
|
93398
93770
|
await this.mem.deleteWorkflow(workflowId);
|
|
93399
|
-
await this.enqueueWrite(async () => {
|
|
93771
|
+
await this.enqueueWrite(workflowId, async () => {
|
|
93400
93772
|
await this.sdk.deleteWorkflowData(workflowId);
|
|
93401
93773
|
await this.sdk.recordStepOutput(workflowId, DBOS_DELETION_STEP, encodeDbosDeletionTombstone(workflowId));
|
|
93402
93774
|
});
|
|
93403
93775
|
}
|
|
93404
93776
|
async deleteWorkflowIfInactive(workflowId) {
|
|
93405
|
-
await this.flush();
|
|
93777
|
+
await this.flush(workflowId);
|
|
93406
93778
|
await this.hydrateWorkflow(workflowId);
|
|
93407
93779
|
const handle = this.getLoadableWorkflow(workflowId);
|
|
93408
93780
|
if (handle === undefined)
|
|
@@ -93413,7 +93785,7 @@ class DbosDurableBackend {
|
|
|
93413
93785
|
if (!guarded)
|
|
93414
93786
|
return { ok: false, reason: "running" };
|
|
93415
93787
|
await this.deleteWorkflow(workflowId);
|
|
93416
|
-
await this.flush();
|
|
93788
|
+
await this.flush(workflowId);
|
|
93417
93789
|
return { ok: true };
|
|
93418
93790
|
}
|
|
93419
93791
|
isWorkflowLoadable(workflowId) {
|
|
@@ -93425,16 +93797,19 @@ class DbosDurableBackend {
|
|
|
93425
93797
|
this.current.clear();
|
|
93426
93798
|
this.locallyRegistered.clear();
|
|
93427
93799
|
this.promptReservations.clear();
|
|
93428
|
-
this.
|
|
93429
|
-
this.writeErrors
|
|
93430
|
-
}
|
|
93431
|
-
async flush() {
|
|
93432
|
-
|
|
93433
|
-
|
|
93434
|
-
|
|
93435
|
-
|
|
93436
|
-
|
|
93437
|
-
|
|
93800
|
+
this.writeQueues.clear();
|
|
93801
|
+
this.writeErrors.clear();
|
|
93802
|
+
}
|
|
93803
|
+
async flush(workflowId) {
|
|
93804
|
+
const workflowIds = workflowId === undefined ? [...new Set([...this.writeQueues.keys(), ...this.writeErrors.keys()])] : [workflowId];
|
|
93805
|
+
await Promise.all(workflowIds.map(async (id) => await this.writeQueues.get(id)));
|
|
93806
|
+
for (const id of workflowIds) {
|
|
93807
|
+
const errors = this.writeErrors.get(id);
|
|
93808
|
+
if (errors === undefined || errors.length === 0)
|
|
93809
|
+
continue;
|
|
93810
|
+
this.writeErrors.delete(id);
|
|
93811
|
+
throw errors[0];
|
|
93812
|
+
}
|
|
93438
93813
|
}
|
|
93439
93814
|
async hydrateWorkflow(workflowId) {
|
|
93440
93815
|
await this.hydrateWorkflowForInspection(workflowId);
|
|
@@ -93528,21 +93903,33 @@ class DbosDurableBackend {
|
|
|
93528
93903
|
this.promptReservations.delete(workflowId);
|
|
93529
93904
|
await this.mem.deleteWorkflow(workflowId);
|
|
93530
93905
|
}
|
|
93531
|
-
enqueueWrite(fn) {
|
|
93532
|
-
const
|
|
93533
|
-
|
|
93906
|
+
enqueueWrite(workflowId, fn) {
|
|
93907
|
+
const previous2 = this.writeQueues.get(workflowId) ?? Promise.resolve();
|
|
93908
|
+
const next = previous2.then(fn, fn);
|
|
93909
|
+
const tracked = next.catch((err) => {
|
|
93534
93910
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
93535
|
-
this.writeErrors.
|
|
93911
|
+
const errors = this.writeErrors.get(workflowId) ?? [];
|
|
93912
|
+
errors.push(error);
|
|
93913
|
+
this.writeErrors.set(workflowId, errors);
|
|
93536
93914
|
});
|
|
93915
|
+
this.trackWriteQueue(workflowId, tracked);
|
|
93537
93916
|
return next;
|
|
93538
93917
|
}
|
|
93539
|
-
async enqueueBestEffortWrite(fn) {
|
|
93540
|
-
const
|
|
93541
|
-
|
|
93918
|
+
async enqueueBestEffortWrite(workflowId, fn) {
|
|
93919
|
+
const previous2 = this.writeQueues.get(workflowId) ?? Promise.resolve();
|
|
93920
|
+
const next = previous2.then(fn, fn);
|
|
93921
|
+
this.trackWriteQueue(workflowId, next.catch(() => {
|
|
93542
93922
|
return;
|
|
93543
|
-
});
|
|
93923
|
+
}));
|
|
93544
93924
|
return await next.then(() => true, () => false);
|
|
93545
93925
|
}
|
|
93926
|
+
trackWriteQueue(workflowId, queue) {
|
|
93927
|
+
this.writeQueues.set(workflowId, queue);
|
|
93928
|
+
queue.finally(() => {
|
|
93929
|
+
if (this.writeQueues.get(workflowId) === queue)
|
|
93930
|
+
this.writeQueues.delete(workflowId);
|
|
93931
|
+
});
|
|
93932
|
+
}
|
|
93546
93933
|
async writeMetadata(workflowId) {
|
|
93547
93934
|
const value = this.mem.toMetadata(workflowId);
|
|
93548
93935
|
if (value === undefined)
|
|
@@ -96546,7 +96933,7 @@ async function markDurableQuit(runId, run) {
|
|
|
96546
96933
|
if (!transitioned)
|
|
96547
96934
|
return "refused";
|
|
96548
96935
|
recordRunTimingCheckpoint(backend, run);
|
|
96549
|
-
await backend.flush();
|
|
96936
|
+
await backend.flush(runId);
|
|
96550
96937
|
return "transitioned";
|
|
96551
96938
|
}
|
|
96552
96939
|
function discoverDurableQuitBackend(runId) {
|
|
@@ -96774,7 +97161,7 @@ async function markDurableResumed(runId) {
|
|
|
96774
97161
|
const authoritative = getLoadableDurableWorkflow(backend, runId);
|
|
96775
97162
|
return authoritative?.status === "running" ? "not_needed" : "refused";
|
|
96776
97163
|
}
|
|
96777
|
-
await backend.flush();
|
|
97164
|
+
await backend.flush(runId);
|
|
96778
97165
|
pending.delete(runId);
|
|
96779
97166
|
return "transitioned";
|
|
96780
97167
|
} catch (error) {
|
|
@@ -101072,6 +101459,10 @@ var orchestratorModelConfig = {
|
|
|
101072
101459
|
"github-copilot/grok-4.6:xhigh",
|
|
101073
101460
|
"zai/glm-5.3:high",
|
|
101074
101461
|
"zai-coding-cn/glm-5.3:high",
|
|
101462
|
+
"zai/glm-5.3-flash:high",
|
|
101463
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
101464
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
101465
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
101075
101466
|
"openrouter/anthropic/claude-opus-5:high",
|
|
101076
101467
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
101077
101468
|
"openrouter/anthropic/claude-fable-5:high",
|
|
@@ -101079,7 +101470,9 @@ var orchestratorModelConfig = {
|
|
|
101079
101470
|
"openrouter/sakana/fugu-ultra:high",
|
|
101080
101471
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
101081
101472
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
101082
|
-
"openrouter/x-ai/grok-4.6"
|
|
101473
|
+
"openrouter/x-ai/grok-4.6",
|
|
101474
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
101475
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
101083
101476
|
],
|
|
101084
101477
|
excludedTools: ["ask_user_question"]
|
|
101085
101478
|
};
|
|
@@ -101104,6 +101497,10 @@ var reviewerModelConfig = {
|
|
|
101104
101497
|
"github-copilot/grok-4.6:xhigh",
|
|
101105
101498
|
"zai/glm-5.3:high",
|
|
101106
101499
|
"zai-coding-cn/glm-5.3:high",
|
|
101500
|
+
"zai/glm-5.3-flash:high",
|
|
101501
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
101502
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
101503
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
101107
101504
|
"openrouter/anthropic/claude-opus-5:high",
|
|
101108
101505
|
"openrouter/anthropic/claude-fable-5:high",
|
|
101109
101506
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
@@ -101111,7 +101508,9 @@ var reviewerModelConfig = {
|
|
|
101111
101508
|
"openrouter/sakana/fugu-ultra:high",
|
|
101112
101509
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
101113
101510
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
101114
|
-
"openrouter/x-ai/grok-4.6"
|
|
101511
|
+
"openrouter/x-ai/grok-4.6",
|
|
101512
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
101513
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
101115
101514
|
],
|
|
101116
101515
|
excludedTools: ["ask_user_question"],
|
|
101117
101516
|
schema: reviewDecisionSchema
|
|
@@ -103207,13 +103606,19 @@ async function runOpenClaudeDesignWorkflow(ctx) {
|
|
|
103207
103606
|
"github-copilot/grok-4.6:xhigh",
|
|
103208
103607
|
"zai/glm-5.3:high",
|
|
103209
103608
|
"zai-coding-cn/glm-5.3:high",
|
|
103609
|
+
"zai/glm-5.3-flash:high",
|
|
103610
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
103611
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
103612
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
103210
103613
|
"openrouter/anthropic/claude-opus-5:high",
|
|
103211
103614
|
"openrouter/anthropic/claude-fable-5:high",
|
|
103212
103615
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
103213
103616
|
"openrouter/moonshotai/kimi-k3:max",
|
|
103214
103617
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
103215
103618
|
"openrouter/sakana/fugu-ultra:high",
|
|
103216
|
-
"openrouter/x-ai/grok-4.6"
|
|
103619
|
+
"openrouter/x-ai/grok-4.6",
|
|
103620
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
103621
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
103217
103622
|
]
|
|
103218
103623
|
};
|
|
103219
103624
|
const frontDoor = await runDiscoveryAndInit({
|
|
@@ -104234,6 +104639,10 @@ var promptEngineerModelConfig = {
|
|
|
104234
104639
|
"github-copilot/grok-4.6:xhigh",
|
|
104235
104640
|
"zai/glm-5.3:high",
|
|
104236
104641
|
"zai-coding-cn/glm-5.3:high",
|
|
104642
|
+
"zai/glm-5.3-flash:high",
|
|
104643
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
104644
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
104645
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
104237
104646
|
"openrouter/anthropic/claude-opus-5:high",
|
|
104238
104647
|
"openrouter/anthropic/claude-fable-5:high",
|
|
104239
104648
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
@@ -104241,7 +104650,9 @@ var promptEngineerModelConfig = {
|
|
|
104241
104650
|
"openrouter/sakana/fugu-ultra:high",
|
|
104242
104651
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
104243
104652
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
104244
|
-
"openrouter/x-ai/grok-4.6"
|
|
104653
|
+
"openrouter/x-ai/grok-4.6",
|
|
104654
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
104655
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
104245
104656
|
],
|
|
104246
104657
|
excludedTools: ["ask_user_question"]
|
|
104247
104658
|
};
|
|
@@ -104266,6 +104677,10 @@ var researchModelConfig = {
|
|
|
104266
104677
|
"github-copilot/grok-4.6:xhigh",
|
|
104267
104678
|
"zai/glm-5.3:high",
|
|
104268
104679
|
"zai-coding-cn/glm-5.3:high",
|
|
104680
|
+
"zai/glm-5.3-flash:high",
|
|
104681
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
104682
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
104683
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
104269
104684
|
"openrouter/anthropic/claude-opus-5:high",
|
|
104270
104685
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
104271
104686
|
"openrouter/anthropic/claude-fable-5:high",
|
|
@@ -104273,7 +104688,9 @@ var researchModelConfig = {
|
|
|
104273
104688
|
"openrouter/sakana/fugu-ultra:high",
|
|
104274
104689
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
104275
104690
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
104276
|
-
"openrouter/x-ai/grok-4.6"
|
|
104691
|
+
"openrouter/x-ai/grok-4.6",
|
|
104692
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
104693
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
104277
104694
|
],
|
|
104278
104695
|
excludedTools: ["ask_user_question"]
|
|
104279
104696
|
};
|
|
@@ -104298,6 +104715,10 @@ var orchestratorModelConfig2 = {
|
|
|
104298
104715
|
"github-copilot/grok-4.6:xhigh",
|
|
104299
104716
|
"zai/glm-5.3:high",
|
|
104300
104717
|
"zai-coding-cn/glm-5.3:high",
|
|
104718
|
+
"zai/glm-5.3-flash:high",
|
|
104719
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
104720
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
104721
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
104301
104722
|
"openrouter/anthropic/claude-opus-5:high",
|
|
104302
104723
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
104303
104724
|
"openrouter/anthropic/claude-fable-5:high",
|
|
@@ -104305,7 +104726,9 @@ var orchestratorModelConfig2 = {
|
|
|
104305
104726
|
"openrouter/sakana/fugu-ultra:high",
|
|
104306
104727
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
104307
104728
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
104308
|
-
"openrouter/x-ai/grok-4.6"
|
|
104729
|
+
"openrouter/x-ai/grok-4.6",
|
|
104730
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
104731
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
104309
104732
|
],
|
|
104310
104733
|
excludedTools: ["ask_user_question"]
|
|
104311
104734
|
};
|
|
@@ -104330,6 +104753,10 @@ var reviewerAModelConfig = {
|
|
|
104330
104753
|
"github-copilot/grok-4.6:xhigh",
|
|
104331
104754
|
"zai/glm-5.3:high",
|
|
104332
104755
|
"zai-coding-cn/glm-5.3:high",
|
|
104756
|
+
"zai/glm-5.3-flash:high",
|
|
104757
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
104758
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
104759
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
104333
104760
|
"openrouter/anthropic/claude-opus-5:high",
|
|
104334
104761
|
"openrouter/anthropic/claude-fable-5:high",
|
|
104335
104762
|
"openrouter/moonshotai/kimi-k3:max",
|
|
@@ -104337,7 +104764,9 @@ var reviewerAModelConfig = {
|
|
|
104337
104764
|
"openrouter/sakana/fugu-ultra:high",
|
|
104338
104765
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
104339
104766
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
104340
|
-
"openrouter/x-ai/grok-4.6"
|
|
104767
|
+
"openrouter/x-ai/grok-4.6",
|
|
104768
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
104769
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
104341
104770
|
],
|
|
104342
104771
|
excludedTools: ["ask_user_question"],
|
|
104343
104772
|
schema: reviewDecisionSchema2
|
|
@@ -104363,6 +104792,10 @@ var reviewerBModelConfig = {
|
|
|
104363
104792
|
"github-copilot/grok-4.6:xhigh",
|
|
104364
104793
|
"zai/glm-5.3:high",
|
|
104365
104794
|
"zai-coding-cn/glm-5.3:high",
|
|
104795
|
+
"zai/glm-5.3-flash:high",
|
|
104796
|
+
"zai-coding-cn/glm-5.3-flash:high",
|
|
104797
|
+
"baseten/zai-org/GLM-5.3:high",
|
|
104798
|
+
"baseten/zai-org/GLM-5.3-Flash:high",
|
|
104366
104799
|
"openrouter/openai/gpt-5.6-sol:xhigh",
|
|
104367
104800
|
"openrouter/anthropic/claude-opus-5:high",
|
|
104368
104801
|
"openrouter/anthropic/claude-fable-5:high",
|
|
@@ -104370,7 +104803,9 @@ var reviewerBModelConfig = {
|
|
|
104370
104803
|
"openrouter/openai/gpt-5.5:xhigh",
|
|
104371
104804
|
"openrouter/sakana/fugu-ultra:high",
|
|
104372
104805
|
"openrouter/anthropic/claude-opus-4-8:high",
|
|
104373
|
-
"openrouter/x-ai/grok-4.6"
|
|
104806
|
+
"openrouter/x-ai/grok-4.6",
|
|
104807
|
+
"openrouter/z-ai/glm-5.3:high",
|
|
104808
|
+
"openrouter/z-ai/glm-5.3-flash:high"
|
|
104374
104809
|
],
|
|
104375
104810
|
excludedTools: ["ask_user_question"],
|
|
104376
104811
|
schema: reviewDecisionSchema2
|
|
@@ -105428,6 +105863,8 @@ import { extname as extname2, isAbsolute as isAbsolute20, join as join100, resol
|
|
|
105428
105863
|
// dist/builtin/workflows/src/extension/workflow-module-loader.ts
|
|
105429
105864
|
import { createJiti as createJiti2 } from "jiti/static";
|
|
105430
105865
|
import * as typeboxModule from "typebox";
|
|
105866
|
+
import * as typeboxCompileModule from "typebox/compile";
|
|
105867
|
+
import * as typeboxValueModule from "typebox/value";
|
|
105431
105868
|
|
|
105432
105869
|
// dist/builtin/workflows/src/sdk-surface.ts
|
|
105433
105870
|
var exports_sdk_surface = {};
|
|
@@ -106766,8 +107203,8 @@ class ScopedDurableBackend {
|
|
|
106766
107203
|
async recordAdditiveCheckpointBestEffort(checkpoint) {
|
|
106767
107204
|
return await this.inner.recordAdditiveCheckpointBestEffort(this.remap(checkpoint));
|
|
106768
107205
|
}
|
|
106769
|
-
flush() {
|
|
106770
|
-
return this.inner.flush();
|
|
107206
|
+
flush(workflowId) {
|
|
107207
|
+
return workflowId === undefined ? this.inner.flush() : this.inner.flush(this.scope.rootWorkflowId);
|
|
106771
107208
|
}
|
|
106772
107209
|
getToolOutput(_workflowId, argsHash) {
|
|
106773
107210
|
return this.inner.getToolOutput(this.scope.rootWorkflowId, this.scopeKey(argsHash));
|
|
@@ -110121,17 +110558,7 @@ function resolveStageGroup(stageOptions, workflowGroup) {
|
|
|
110121
110558
|
const trimmed = group.trim();
|
|
110122
110559
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
110123
110560
|
}
|
|
110124
|
-
function stageHasIntercomAccess(
|
|
110125
|
-
if (!stageOptions)
|
|
110126
|
-
return true;
|
|
110127
|
-
if (stageOptions.noTools === "all")
|
|
110128
|
-
return false;
|
|
110129
|
-
const tools = stageOptions.tools;
|
|
110130
|
-
if (Array.isArray(tools) && !tools.includes("intercom"))
|
|
110131
|
-
return false;
|
|
110132
|
-
const excluded = stageOptions.excludedTools;
|
|
110133
|
-
if (Array.isArray(excluded) && excluded.includes("intercom"))
|
|
110134
|
-
return false;
|
|
110561
|
+
function stageHasIntercomAccess(_stageOptions) {
|
|
110135
110562
|
return true;
|
|
110136
110563
|
}
|
|
110137
110564
|
function stageCanUseWorkflowPendingStageRoute(stageOptions, workflowGroup) {
|
|
@@ -110555,11 +110982,11 @@ function wrapUiWithDurable(base, deps) {
|
|
|
110555
110982
|
};
|
|
110556
110983
|
const releasePending = async (identity, token) => {
|
|
110557
110984
|
releaseDurablePrompt(deps.backend, deps.workflowId, identity.hash, token);
|
|
110558
|
-
await deps.backend.flush();
|
|
110985
|
+
await deps.backend.flush(deps.workflowId);
|
|
110559
110986
|
};
|
|
110560
110987
|
const beginPending = (identity) => {
|
|
110561
110988
|
const token = reserveDurablePrompt(deps.backend, deps.workflowId, identity.hash);
|
|
110562
|
-
const write = deps.backend.flush();
|
|
110989
|
+
const write = deps.backend.flush(deps.workflowId);
|
|
110563
110990
|
return { token, write };
|
|
110564
110991
|
};
|
|
110565
110992
|
const waitForPendingWrite = async (identity, pending) => {
|
|
@@ -110570,7 +110997,7 @@ function wrapUiWithDurable(base, deps) {
|
|
|
110570
110997
|
} catch (error) {
|
|
110571
110998
|
releaseDurablePrompt(deps.backend, deps.workflowId, identity.hash, pending.token);
|
|
110572
110999
|
try {
|
|
110573
|
-
await deps.backend.flush();
|
|
111000
|
+
await deps.backend.flush(deps.workflowId);
|
|
110574
111001
|
} catch {}
|
|
110575
111002
|
throw error;
|
|
110576
111003
|
}
|
|
@@ -110867,7 +111294,7 @@ async function admitDurableRootRun(args) {
|
|
|
110867
111294
|
args.backend.setWorkflowStatus(args.runId, "running");
|
|
110868
111295
|
}
|
|
110869
111296
|
if (!args.isChildRun)
|
|
110870
|
-
await args.backend.flush();
|
|
111297
|
+
await args.backend.flush(args.runId);
|
|
110871
111298
|
}
|
|
110872
111299
|
|
|
110873
111300
|
// dist/builtin/workflows/src/engine/run-durable-finalize.ts
|
|
@@ -110898,7 +111325,7 @@ async function finalizeDurableTerminalStatus(input2) {
|
|
|
110898
111325
|
} : undefined;
|
|
110899
111326
|
input2.durableBackend.setWorkflowStatus(input2.runId, durableStatus, undefined, input2.runSnapshot.resumable, failure2);
|
|
110900
111327
|
}
|
|
110901
|
-
await input2.durableBackend.flush();
|
|
111328
|
+
await input2.durableBackend.flush(input2.runId);
|
|
110902
111329
|
}
|
|
110903
111330
|
function toDurableStatus(status) {
|
|
110904
111331
|
switch (status) {
|
|
@@ -111453,7 +111880,7 @@ async function resumeDurableWorkflow(workflowId, deps, catalog) {
|
|
|
111453
111880
|
});
|
|
111454
111881
|
} catch (error) {
|
|
111455
111882
|
backend.setWorkflowStatus(resolved.workflowId, handle.status, handle.pendingPrompts, handle.resumable);
|
|
111456
|
-
await backend.flush();
|
|
111883
|
+
await backend.flush(resolved.workflowId);
|
|
111457
111884
|
return {
|
|
111458
111885
|
ok: false,
|
|
111459
111886
|
reason: "startup_failed",
|
|
@@ -111467,7 +111894,7 @@ async function resumeDurableWorkflow(workflowId, deps, catalog) {
|
|
|
111467
111894
|
const error = workflowStartupFailureMessage(admission, snapshot2?.error, `Workflow ${resolved.workflowId} ended before startup admission`);
|
|
111468
111895
|
deps.baseRunOpts.store?.removeRun(accepted2.runId);
|
|
111469
111896
|
backend.setWorkflowStatus(resolved.workflowId, handle.status, handle.pendingPrompts, handle.resumable);
|
|
111470
|
-
await backend.flush();
|
|
111897
|
+
await backend.flush(resolved.workflowId);
|
|
111471
111898
|
return {
|
|
111472
111899
|
ok: false,
|
|
111473
111900
|
reason: "startup_failed",
|
|
@@ -117418,7 +117845,7 @@ async function run(def, inputs, opts = {}) {
|
|
|
117418
117845
|
const result = normalizeWorkflowRunOutput(def.name, rawResult);
|
|
117419
117846
|
assertWorkflowRunOutputs(def.name, result, def.outputs);
|
|
117420
117847
|
assertWorkflowCreatedExecution(runSnapshot);
|
|
117421
|
-
await durableBackend.flush();
|
|
117848
|
+
await durableBackend.flush(runId);
|
|
117422
117849
|
const returned = classifyReturnedRunStatus(result, runSnapshot);
|
|
117423
117850
|
const recorded = activeStore.recordRunEnd(runId, returned.status, result, returned.error, returned.metadata);
|
|
117424
117851
|
appendRunEndWhenRecorded(opts.persistence, recorded, {
|
|
@@ -117434,7 +117861,7 @@ async function run(def, inputs, opts = {}) {
|
|
|
117434
117861
|
if (opts.parentRun === undefined)
|
|
117435
117862
|
recordRunTimingCheckpoint(durableBackend, runSnapshot);
|
|
117436
117863
|
durableBackend.setWorkflowStatus(runId, returned.status, undefined, returned.metadata?.resumable);
|
|
117437
|
-
await durableBackend.flush();
|
|
117864
|
+
await durableBackend.flush(runId);
|
|
117438
117865
|
return reconcileTerminalRunResult(runId, runSnapshot, activeStore, { status: returned.status, result, error: returned.error }, opts.onRunEnd);
|
|
117439
117866
|
} catch (err) {
|
|
117440
117867
|
terminalEvents.selectFailure(err);
|
|
@@ -117591,10 +118018,21 @@ function createWorkflowVirtualModules(moduleSpecifier) {
|
|
|
117591
118018
|
[`${builtinModuleSpecifier}/steering-context`]: exports_steering_context
|
|
117592
118019
|
};
|
|
117593
118020
|
}
|
|
118021
|
+
var TYPEBOX_COMPILE_MODULE = {
|
|
118022
|
+
...typeboxCompileModule
|
|
118023
|
+
};
|
|
118024
|
+
var TYPEBOX_VALUE_MODULE = {
|
|
118025
|
+
...typeboxValueModule
|
|
118026
|
+
};
|
|
117594
118027
|
var WORKFLOWS_VIRTUAL_MODULES = {
|
|
117595
118028
|
...createWorkflowVirtualModules(WORKFLOWS_MODULE_SPECIFIER),
|
|
117596
118029
|
...createWorkflowVirtualModules(LEGACY_WORKFLOWS_MODULE_SPECIFIER),
|
|
117597
|
-
[TYPEBOX_MODULE_SPECIFIER]: TYPEBOX_MODULE
|
|
118030
|
+
[TYPEBOX_MODULE_SPECIFIER]: TYPEBOX_MODULE,
|
|
118031
|
+
"typebox/compile": TYPEBOX_COMPILE_MODULE,
|
|
118032
|
+
"typebox/value": TYPEBOX_VALUE_MODULE,
|
|
118033
|
+
"@sinclair/typebox": TYPEBOX_MODULE,
|
|
118034
|
+
"@sinclair/typebox/compile": TYPEBOX_COMPILE_MODULE,
|
|
118035
|
+
"@sinclair/typebox/value": TYPEBOX_VALUE_MODULE
|
|
117598
118036
|
};
|
|
117599
118037
|
var workflowModuleLoader = createJiti2(import.meta.url, {
|
|
117600
118038
|
moduleCache: false,
|
|
@@ -117971,7 +118409,7 @@ async function discardUnadmittedRun(runId, activeStore) {
|
|
|
117971
118409
|
const handle = backend.getWorkflow(runId);
|
|
117972
118410
|
if (handle?.status === "running") {
|
|
117973
118411
|
backend.setWorkflowStatus(runId, "failed", handle.pendingPrompts, false);
|
|
117974
|
-
await backend.flush();
|
|
118412
|
+
await backend.flush(runId);
|
|
117975
118413
|
}
|
|
117976
118414
|
const deleted = await backend.deleteWorkflowIfInactive(runId);
|
|
117977
118415
|
if (!deleted.ok && deleted.reason !== "not_found") {
|
|
@@ -118134,7 +118572,7 @@ async function discardFailedActiveBlockedContinuation(backend, runId, store2) {
|
|
|
118134
118572
|
const handle = backend.getWorkflow(runId);
|
|
118135
118573
|
if (handle?.status === "running") {
|
|
118136
118574
|
backend.setWorkflowStatus(runId, "failed", handle.pendingPrompts, false);
|
|
118137
|
-
await backend.flush();
|
|
118575
|
+
await backend.flush(runId);
|
|
118138
118576
|
}
|
|
118139
118577
|
const deleted = await backend.deleteWorkflowIfInactive(runId);
|
|
118140
118578
|
if (!deleted.ok && deleted.reason !== "not_found") {
|
|
@@ -118968,7 +119406,7 @@ function formatWorkflowHeartbeatNoticeText(details) {
|
|
|
118968
119406
|
const workflowName = escapeQuotedText3(details.workflowName);
|
|
118969
119407
|
const elapsed = formatWorkflowHeartbeatElapsed(details);
|
|
118970
119408
|
const cadence = formatWorkflowHeartbeatCadence(details.intervalMinutes);
|
|
118971
|
-
return `${WORKFLOW_HEARTBEAT_GLYPH} Workflow "${workflowName}" heartbeat (run ${details.runId}) — still running` + `${elapsed === undefined ? "" : ` after ${elapsed}`}, on a ${cadence} cadence. ` + "This is a periodic alignment check. Review whether the run is still on goal. " + "When steering or communication is useful, use Intercom. Consider the expanded workflow topology and match
|
|
119409
|
+
return `${WORKFLOW_HEARTBEAT_GLYPH} Workflow "${workflowName}" heartbeat (run ${details.runId}) — still running` + `${elapsed === undefined ? "" : ` after ${elapsed}`}, on a ${cadence} cadence. ` + "This is a periodic alignment check. Review whether the run is still on goal. " + "When steering or communication is useful, use Intercom. Before steering a stage, join its invocation group. " + "Use the Intercom `groups` action to discover it. Workflow invocation groups are named `workflow:<rootRunId>`. " + "Consider the expanded workflow topology and match each update's reach to its impact: send a local update to " + "its affected stage; when shared scope or acceptance " + "criteria change, send the same authoritative Intercom update to every relevant live and known unstarted " + "`<runId>:<stageKey>`, including each worker-to-reviewer loop. Intercom delivers immediately to live stages and " + "queues updates for known stages that have not started, delivering them before their first model turn, so workers " + "and reviewers begin with one consistent contract. " + "Use `ask` once the target has a live session that can reply. " + "Use workflow pause, resume, interrupt, or quit for run control. " + "Continue the progressing run when no intervention is needed, or ask the user when a decision is needed. " + `Inspect: /workflow status ${details.runId}`;
|
|
118972
119410
|
}
|
|
118973
119411
|
function registerWorkflowHeartbeatRenderer(options) {
|
|
118974
119412
|
const register = options.registerMessageRenderer;
|
|
@@ -119638,6 +120076,9 @@ function workflowModelCatalogFromContext(ctx) {
|
|
|
119638
120076
|
};
|
|
119639
120077
|
}
|
|
119640
120078
|
|
|
120079
|
+
// dist/builtin/workflows/src/extension/workflow-ports.ts
|
|
120080
|
+
init_src();
|
|
120081
|
+
|
|
119641
120082
|
// dist/builtin/workflows/src/extension/mcp.ts
|
|
119642
120083
|
init_src();
|
|
119643
120084
|
function setMcpScope(pi, opts) {
|
|
@@ -119672,19 +120113,30 @@ function clearMcpScope(pi, stageId) {
|
|
|
119672
120113
|
}
|
|
119673
120114
|
|
|
119674
120115
|
// dist/builtin/workflows/src/extension/workflow-ports.ts
|
|
120116
|
+
function unlessStale(append) {
|
|
120117
|
+
try {
|
|
120118
|
+
return append();
|
|
120119
|
+
} catch (error) {
|
|
120120
|
+
if (isStaleExtensionContextError(error))
|
|
120121
|
+
return;
|
|
120122
|
+
throw error;
|
|
120123
|
+
}
|
|
120124
|
+
}
|
|
119675
120125
|
function makePersistencePort(pi, persistRuns) {
|
|
119676
120126
|
if (!persistRuns)
|
|
119677
120127
|
return;
|
|
119678
120128
|
if (typeof pi.appendEntry !== "function")
|
|
119679
120129
|
return;
|
|
119680
120130
|
const port = {
|
|
119681
|
-
appendEntry: (type, payload) => pi.appendEntry(type, payload)
|
|
120131
|
+
appendEntry: (type, payload) => unlessStale(() => pi.appendEntry(type, payload))
|
|
119682
120132
|
};
|
|
119683
120133
|
if (typeof pi.setLabel === "function") {
|
|
119684
|
-
port.setLabel = (entryId, label) =>
|
|
120134
|
+
port.setLabel = (entryId, label) => {
|
|
120135
|
+
unlessStale(() => pi.setLabel(entryId, label));
|
|
120136
|
+
};
|
|
119685
120137
|
}
|
|
119686
120138
|
if (typeof pi.appendCustomMessageEntry === "function") {
|
|
119687
|
-
port.appendCustomMessageEntry = (content, meta2) => pi.appendCustomMessageEntry(content, meta2);
|
|
120139
|
+
port.appendCustomMessageEntry = (content, meta2) => unlessStale(() => pi.appendCustomMessageEntry(content, meta2));
|
|
119688
120140
|
}
|
|
119689
120141
|
return port;
|
|
119690
120142
|
}
|
|
@@ -124506,7 +124958,7 @@ function renderResult(result, opts) {
|
|
|
124506
124958
|
}
|
|
124507
124959
|
|
|
124508
124960
|
// dist/builtin/workflows/src/extension/workflow-prompts.ts
|
|
124509
|
-
var WORKFLOW_TOOL_DESCRIPTION = "Run named builtin, project, user, or package workflows; custom definitions may import reusable project/package workflows or builtin definitions from @bastani/atomic/workflows/builtin and nest them with ctx.workflow(...), including deeper composition within the configured maxDepth; " + "when workflow execution fits but another shape would better achieve the task, author a custom TypeScript workflow({...}) inline with normal coding tools, reload it, and run it; after successfully creating and reloading a newly authored custom workflow, report the folder containing its generated code as 'Custom workflow created. You can inspect its code at: <workflow-folder-path>'; do this only for newly created custom workflows, never builtin or pre-existing workflows; " + "discover with list/get/inputs/models, list session runs with status (no runId; statusFilter narrows the list), inspect status/stages/stage details, " + "answer pending prompts only while the root workflow is nonterminal, pause/resume/interrupt/quit runs, and reload workflow resources. " + "When steering or communication is useful, use Intercom
|
|
124961
|
+
var WORKFLOW_TOOL_DESCRIPTION = "Run named builtin, project, user, or package workflows; custom definitions may import reusable project/package workflows or builtin definitions from @bastani/atomic/workflows/builtin and nest them with ctx.workflow(...), including deeper composition within the configured maxDepth; " + "when workflow execution fits but another shape would better achieve the task, author a custom TypeScript workflow({...}) inline with normal coding tools, reload it, and run it; after successfully creating and reloading a newly authored custom workflow, report the folder containing its generated code as 'Custom workflow created. You can inspect its code at: <workflow-folder-path>'; do this only for newly created custom workflows, never builtin or pre-existing workflows; " + "discover with list/get/inputs/models, list session runs with status (no runId; statusFilter narrows the list), inspect status/stages/stage details, " + "answer pending prompts only while the root workflow is nonterminal, pause/resume/interrupt/quit runs, and reload workflow resources. " + "When steering or communication is useful, use Intercom. Before steering a stage, join its invocation group. Use the Intercom `groups` action to discover it. Workflow invocation groups are named `workflow:<rootRunId>`. Then address the stage as `<runId>:<stageKey>`. Live delivery is immediate; a known stage that has not started is queued and receives the message before its first model turn. Use `ask` only for a reply-capable live session. " + "Treat a blocked run as continuable by default: resume resumable blocks, answer pending prompts, steer past the obstacle, or start a follow-up workflow past a terminal block, and escalate to the user only when the blocked result is so ambiguous that human input or steering must settle it; when ask_user_question or human input is unavailable, continue fully autonomously on the interpretation best supported by the objective and repository evidence, and record the assumption. " + "For action 'run' and 'resume', budget accepts per-field duration, token, cost, and warning overrides; fields resolve over the workflow declaration and config, and 0 disables a field. " + "Pass budget only when the user asked for a limit; otherwise omit it entirely and inherit the declaration and config rather than inventing a cap. " + "For primitive prompt answers, use booleans or the documented confirm labels, exact case-insensitive select labels or 1-based indexes, and text strings for input/editor; an invalid answer remains pending and returns guidance instead of choosing a default. " + "For large stage handoffs, write context to files/artifacts, pass paths via reads, and prompt downstream agents to 'Read the file at <path>...' instead of injecting large previous text. " + "Wrap critical parts of run inputs and steering messages in <keepContext>...</keepContext> so compaction preserves them verbatim in the stages that inherit them; tag role constraints, prohibitions, must-hold criteria, and identifiers, not background or bulk reference material. " + "For transcripts, prefer status/stages/stage to get sessionFile/transcriptPath, " + "quote the exact path without rewriting separators (Windows backslashes are valid), " + "then search it with rg/grep and read small ranges; transcript is path-only by default when sessionFile/transcriptPath exists, explicit tail/limit returns bounded previews, and missing transcript paths fall back to a small preview. " + "Use action 'models' to inspect models in the configured catalog; the result is a configured-auth snapshot showing what's present in the registry with configured authentication, not proof of credentials, entitlements, OAuth freshness, or live provider access. " + "When authoring a workflow that should dynamically select a model, first call workflow({ action: 'models' }) to inspect the configured catalog, then select from the returned provider/id entries considering the isCurrent marker and available thinking levels.";
|
|
124510
124962
|
var DEFAULT_PROMPT_GUIDANCE = [
|
|
124511
124963
|
`**Workflows**: Treat workflows as the default execution path for any non-trivial task and for any request that has inherent structure plus an objective you can make verifiable. Use the \`workflow\` tool for existing named workflows; when the task needs a graph that is not installed, author a custom TypeScript \`workflow({...})\` inline with normal coding tools, reload workflow resources, and run it.
|
|
124512
124964
|
- Workflow fit check: prefer a workflow for implementation, build, debug/diagnosis, bug-fix, migration, new-feature, scoped multi-file, or docs/code changes with validation; and whenever there are multiple steps, dependencies, handoffs, uncertainty, review/validation needs, long-running work, measurable done criteria, or an outcome that needs evidence.
|
|
@@ -124542,7 +124994,7 @@ var DEFAULT_PROMPT_GUIDANCE = [
|
|
|
124542
124994
|
- Wrap critical parts of the \`inputs\` you pass — objective, prompt, acceptance criteria — in \`<keepContext>\` / \`</keepContext>\`. Tagged text survives compaction verbatim regardless of the compression ratio, and stages inherit it because workflows inject your inputs into their prompts. A long stage is compacted repeatedly, and compaction ranks lines individually: a verbose restated objective outlives the one line that bounds it, so a stage can end up executing a coherent but unbounded version of what you asked for. Decide this per launch rather than tagging everything — tag role constraints, prohibitions, must-hold criteria, and identifiers such as a target branch, worktree path, or issue number; leave background, quoted issue text, and reference material untagged and pass bulk through files and \`reads\`. Protected lines count against the keep target rather than raising it, so an over-tagged input makes the evidence stages need compress harder.
|
|
124543
124995
|
- Tag steering the same way. An Intercom \`send\` amendment is authoritative and stages must carry it forward, but it arrives late in an already-long session and is exactly one short message competing with the whole transcript; \`<keepContext>\` around the requirement keeps it from being compacted away before the stage acts on it.
|
|
124544
124996
|
- In interactive chat, named workflow launches run in the background. Run \`/workflow connect <run>\` to see agents working and chat with and steer each stage. Inspection and control calls (\`status\`, \`stages\`, \`stage\`, \`transcript\`, \`answer\`, \`pause\`, \`resume\`, \`interrupt\`, \`quit\`) remain available while work runs.
|
|
124545
|
-
- \`workflow answer\` handles a pending human-input prompt. Send free-form updates through Intercom to \`<runId>:<stageKey>\`; Atomic delivers immediately to live stages and queues messages for known stages that have not started, delivering them before their first model turn. Use \`ask\` once the target has a live session that can reply. Use explicit \`/workflow attach <run> <stage>\` for user-driven post-mortem chat.
|
|
124997
|
+
- \`workflow answer\` handles a pending human-input prompt. Before steering a stage, join its invocation group. Use the Intercom \`groups\` action to discover it. Workflow invocation groups are named \`workflow:<rootRunId>\`. Send free-form updates through Intercom to \`<runId>:<stageKey>\`; Atomic delivers immediately to live stages and queues messages for known stages that have not started, delivering them before their first model turn. Use \`ask\` once the target has a live session that can reply. Use explicit \`/workflow attach <run> <stage>\` for user-driven post-mortem chat.
|
|
124546
124998
|
- A blocked run is a changed condition, not a stop order. On a blocked status or a WORKFLOW BLOCKED lifecycle notice, keep the work moving by default: resume a resumable block, answer the pending prompt, steer the stage past the obstacle, or start a follow-up workflow that carries the remaining tracked work past a terminal block — continue inline only if the remaining work is minimal. Stop for user input only when the task is so ambiguous that competing interpretations lead to materially different outcomes and judgment cannot infer intent from the stated objective and repository evidence; then ask one grouped question or wait for steering.
|
|
124547
124999
|
- A budget-exceeded stop (the resumable \`budget_exceeded\` blocked rail) is the exception: the exhausted budget is a boundary someone chose, so do not raise it silently. Summarize progress and the estimated next steps, ask the user whether to proceed — prefer the \`ask_user_question\` tool when it is available — and resume with a raised \`budget\` only after approval.
|
|
124548
125000
|
- When human input is unavailable — \`ask_user_question\` is not among your tools, the session is headless, or nobody answers — do not stall on a question. Choose the interpretation best supported by the stated objective and repository evidence — mine git history, commits, PRs, issues, and the user's own comments to infer how they would decide — record the assumption and rationale in the result or an artifact, and continue fully autonomously on best judgment.
|
|
@@ -124564,7 +125016,7 @@ var DEFAULT_PROMPT_GUIDANCE = [
|
|
|
124564
125016
|
- Cyclic workflow graphs are unsupported. Workflow authors and coding agents MUST NOT create self-edges or dependency edges from the current frontier to an existing ancestor. Every materialized execution topology must remain a DAG. Redesign or stop before launch if a cycle cannot be removed.
|
|
124565
125017
|
- Bounded loops must create distinct tracked work for every iteration; never reopen an ancestor below its downstream work. Stacked implementation slices are unrolled, not looped: each slice gets a fresh child boundary and distinct tracked nodes, and no slice may add an edge back to the current frontier, itself, or an ancestor. If a retained session receives follow-up without new dependency work, keep it as non-topological activity metadata rather than adding a back-edge. Before launch, sketch nodes and dependencies for every branch and loop and reject any proposed parent edge to the node itself or an ancestor.
|
|
124566
125018
|
- Treat dynamic graph validation during execution, replay, and DBOS hydration as the authoritative cycle boundary. If runtime topology code changes, require incremental edge checks and DBOS hydration validation; prompt guidance and TypeScript types cannot replace those runtime checks.
|
|
124567
|
-
- Every workflow invocation automatically receives one stable, non-default Intercom group
|
|
125019
|
+
- Every workflow invocation automatically receives one stable, non-default Intercom group named \`workflow:<rootRunId>\`. Every model stage inherits it because ordinary \`intercom\` is mandatory even under tool and extension restrictions; nested workflows keep the top-level invocation group, and subagents inherit their launching stage's group. Do not mint or thread group names through ordinary workflow definitions. Use an explicit \`group\` only for an intentional override: a named group or \`group: true\` creates a subgroup, while \`group: "default"\` opts into the shared default group. \`contact_supervisor\` still crosses group boundaries only for authorized subagent escalation.
|
|
124568
125020
|
- Prefer \`ctx.tool(name, args, fn)\` for workflow-owned TypeScript operations with side effects, such as filesystem writes, network mutations, and external API actions. It creates a tracked, non-attachable durable graph node before invoking \`fn\`; it may be used before, between, after, or without model stages. A completed \`ctx.tool\` call is durably checkpointed with its serializable result, so resume replays that result without rerunning \`fn\`. For checks that may fail during a bounded repair loop, opt into \`failureMode: "return"\`, branch on the typed outcome, and pass only the needed error fields to the repair stage or artifact yourself; Atomic does not inject failure evidence into later prompts. Retries do not bound a hung callback, so every \`ctx.tool\` callback that starts a child process or performs network I/O MUST set an explicit positive finite \`timeoutMs\` and forward the supplied \`signal\` to cancellable work. A timeout applies per attempt, aborts that attempt's signal, and gives retries a fresh deadline and signal. Cancellation and storage faults still throw. Keep pure computation and side-effect-free transformations as ordinary TypeScript. Do not wrap agent-stage internals or every function call indiscriminately; this rule applies to side effects orchestrated directly by the workflow definition.
|
|
124569
125021
|
- Pass large stage context through files/artifacts and \`reads\` with an explicit \`Read the file at <path>...\` prompt rather than large \`previous\` payloads or injected session history.
|
|
124570
125022
|
- Wrap critical stage-prompt content in \`<keepContext>\` / \`</keepContext>\`. Tagged content survives compression verbatim regardless of the compression ratio, and every line of the span including the tag lines is protected. A long-running stage will be compacted, and compaction ranks lines individually: an objective is verbose and restated while the constraint that narrows it is usually one line, so the constraint is the cheaper deletion and what survives reads as broader permission than intended. Tag role constraints that bound a stage to part of the work, acceptance criteria and immutable contracts, explicit prohibitions, and identifiers a stage must not lose such as a target branch, worktree path, or run ID. Do not tag bulk context: protected lines count against the keep target rather than raising it, so a large protected span makes the surrounding transcript compress harder — tag the constraint, not the material it applies to.
|