@bastani/atomic 0.9.16-alpha.9 → 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 +120 -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 +490 -183
- 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 +202 -52
- 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 +422 -140
- package/dist/builtin/web-access/index.bundle.mjs +202 -52
- 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-h5e65g7g.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-qe6bfpbd.js → chunk-bz1c9732.js} +15 -3
- package/dist/builtin/workflows/builtin/{chunk-8v8wmb7z.js → chunk-dattsgxg.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-17zk6ffd.js → chunk-gdx0avpx.js} +355 -67
- package/dist/builtin/workflows/builtin/{chunk-rbnj9621.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 +531 -143
- package/dist/builtin/workflows/src/index.js +212 -72
- 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/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/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/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-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 +1 -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
|
@@ -9224,11 +9224,13 @@ function runSynchronousCallback(descriptor, callback) {
|
|
|
9224
9224
|
}
|
|
9225
9225
|
}
|
|
9226
9226
|
async function runCallback(descriptor, callback) {
|
|
9227
|
+
if (!reporter)
|
|
9228
|
+
return callback();
|
|
9229
|
+
await yieldToEventLoop();
|
|
9227
9230
|
const active = beginActivity(descriptor);
|
|
9228
9231
|
if (!active)
|
|
9229
9232
|
return callback();
|
|
9230
9233
|
try {
|
|
9231
|
-
await yieldToEventLoop();
|
|
9232
9234
|
return await callback();
|
|
9233
9235
|
} finally {
|
|
9234
9236
|
active.reporter.finished(active.activity.id);
|
|
@@ -11960,12 +11962,34 @@ var init_runner_events = __esm(() => {
|
|
|
11960
11962
|
init_callback_activity();
|
|
11961
11963
|
});
|
|
11962
11964
|
|
|
11965
|
+
// src/core/mandatory-runtime-tools.ts
|
|
11966
|
+
function isTrustedMandatoryRuntimeTool(registration) {
|
|
11967
|
+
return MANDATORY_TOOL_NAMES.has(registration.definition.name) && TRUSTED_MANDATORY_DEFINITIONS.has(registration.definition);
|
|
11968
|
+
}
|
|
11969
|
+
function isMandatoryRuntimeTool(name) {
|
|
11970
|
+
return MANDATORY_TOOL_NAMES.has(name);
|
|
11971
|
+
}
|
|
11972
|
+
function appendRegisteredMandatoryTools(tools, registry) {
|
|
11973
|
+
for (const name of MANDATORY_TOOL_NAMES) {
|
|
11974
|
+
const tool = registry.get(name);
|
|
11975
|
+
if (tool && !tools.some((candidate) => candidate.name === name))
|
|
11976
|
+
tools.push(tool);
|
|
11977
|
+
}
|
|
11978
|
+
return tools;
|
|
11979
|
+
}
|
|
11980
|
+
var MANDATORY_TOOL_NAMES, TRUSTED_MANDATORY_DEFINITIONS;
|
|
11981
|
+
var init_mandatory_runtime_tools = __esm(() => {
|
|
11982
|
+
MANDATORY_TOOL_NAMES = new Set(["intercom"]);
|
|
11983
|
+
TRUSTED_MANDATORY_DEFINITIONS = new WeakSet;
|
|
11984
|
+
});
|
|
11985
|
+
|
|
11963
11986
|
// src/core/extensions/runner-registries.ts
|
|
11964
11987
|
function collectRegisteredTools(extensions) {
|
|
11965
11988
|
const toolsByName = new Map;
|
|
11966
11989
|
for (const ext of extensions) {
|
|
11967
11990
|
for (const tool of ext.tools.values()) {
|
|
11968
|
-
|
|
11991
|
+
const existing = toolsByName.get(tool.definition.name);
|
|
11992
|
+
if (!existing || isMandatoryRuntimeTool(tool.definition.name) && isTrustedMandatoryRuntimeTool(tool)) {
|
|
11969
11993
|
toolsByName.set(tool.definition.name, tool);
|
|
11970
11994
|
}
|
|
11971
11995
|
}
|
|
@@ -11973,13 +11997,16 @@ function collectRegisteredTools(extensions) {
|
|
|
11973
11997
|
return Array.from(toolsByName.values());
|
|
11974
11998
|
}
|
|
11975
11999
|
function findToolDefinition(extensions, toolName) {
|
|
12000
|
+
let first;
|
|
11976
12001
|
for (const ext of extensions) {
|
|
11977
12002
|
const tool = ext.tools.get(toolName);
|
|
11978
|
-
if (tool)
|
|
12003
|
+
if (!tool)
|
|
12004
|
+
continue;
|
|
12005
|
+
first ??= tool;
|
|
12006
|
+
if (isMandatoryRuntimeTool(toolName) && isTrustedMandatoryRuntimeTool(tool))
|
|
11979
12007
|
return tool.definition;
|
|
11980
|
-
}
|
|
11981
12008
|
}
|
|
11982
|
-
return;
|
|
12009
|
+
return first?.definition;
|
|
11983
12010
|
}
|
|
11984
12011
|
function collectFlags(extensions) {
|
|
11985
12012
|
const allFlags = new Map;
|
|
@@ -12047,6 +12074,9 @@ function resolveRegisteredCommands(extensions) {
|
|
|
12047
12074
|
return { ...command, invocationName };
|
|
12048
12075
|
});
|
|
12049
12076
|
}
|
|
12077
|
+
var init_runner_registries = __esm(() => {
|
|
12078
|
+
init_mandatory_runtime_tools();
|
|
12079
|
+
});
|
|
12050
12080
|
|
|
12051
12081
|
// src/core/extensions/runner-shortcuts.ts
|
|
12052
12082
|
function resolveExtensionShortcuts(extensions, resolvedKeybindings, hasUI) {
|
|
@@ -12110,6 +12140,7 @@ var init_runner_shortcuts = __esm(() => {
|
|
|
12110
12140
|
"app.thinking.toggle",
|
|
12111
12141
|
"app.editor.external",
|
|
12112
12142
|
"app.message.followUp",
|
|
12143
|
+
"app.message.copy",
|
|
12113
12144
|
"tui.input.submit",
|
|
12114
12145
|
"tui.select.confirm",
|
|
12115
12146
|
"tui.select.cancel",
|
|
@@ -12573,6 +12604,7 @@ var init_runner = __esm(() => {
|
|
|
12573
12604
|
init_loader_runtime();
|
|
12574
12605
|
init_runner_context();
|
|
12575
12606
|
init_runner_events();
|
|
12607
|
+
init_runner_registries();
|
|
12576
12608
|
init_runner_shortcuts();
|
|
12577
12609
|
init_runner_ui();
|
|
12578
12610
|
init_stale_context();
|
|
@@ -14776,11 +14808,13 @@ async function _runAgentContinue() {
|
|
|
14776
14808
|
}
|
|
14777
14809
|
async function _continueQueuedAgentMessages() {
|
|
14778
14810
|
await this._agentEventQueue;
|
|
14779
|
-
while (!this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
|
|
14811
|
+
while (!this._stopAfterTurnBlockedContinuation && !this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
|
|
14780
14812
|
await this.agent.continue();
|
|
14781
14813
|
await this.waitForRetry();
|
|
14782
14814
|
await this._agentEventQueue;
|
|
14783
14815
|
}
|
|
14816
|
+
if (this._stopAfterTurnBlockedContinuation)
|
|
14817
|
+
return;
|
|
14784
14818
|
await answerAdmittedQueuedMessage(this);
|
|
14785
14819
|
}
|
|
14786
14820
|
async function answerAdmittedQueuedMessage(session) {
|
|
@@ -16171,14 +16205,13 @@ function getToolDefinition(name) {
|
|
|
16171
16205
|
}
|
|
16172
16206
|
function setActiveToolsByName(toolNames) {
|
|
16173
16207
|
const tools = [];
|
|
16174
|
-
const validToolNames = [];
|
|
16175
16208
|
for (const name of toolNames) {
|
|
16176
16209
|
const tool = this._toolRegistry.get(name);
|
|
16177
|
-
if (tool)
|
|
16210
|
+
if (tool)
|
|
16178
16211
|
tools.push(tool);
|
|
16179
|
-
validToolNames.push(name);
|
|
16180
|
-
}
|
|
16181
16212
|
}
|
|
16213
|
+
appendRegisteredMandatoryTools(tools, this._toolRegistry);
|
|
16214
|
+
const validToolNames = tools.map((tool) => tool.name);
|
|
16182
16215
|
this.agent.state.tools = tools;
|
|
16183
16216
|
this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
|
|
16184
16217
|
this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
|
|
@@ -16235,7 +16268,7 @@ function _rebuildSystemPrompt(toolNames) {
|
|
|
16235
16268
|
customPrompt: loaderSystemPrompt,
|
|
16236
16269
|
appendSystemPrompt,
|
|
16237
16270
|
selectedTools: validToolNames,
|
|
16238
|
-
excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames) : undefined,
|
|
16271
|
+
excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames).filter((name) => !isMandatoryRuntimeTool(name)) : undefined,
|
|
16239
16272
|
toolSnippets,
|
|
16240
16273
|
promptGuidelines
|
|
16241
16274
|
};
|
|
@@ -16248,6 +16281,7 @@ function _refreshBaseSystemPromptFromActiveTools() {
|
|
|
16248
16281
|
}
|
|
16249
16282
|
var agentSessionStateMethods;
|
|
16250
16283
|
var init_agent_session_state = __esm(() => {
|
|
16284
|
+
init_mandatory_runtime_tools();
|
|
16251
16285
|
init_skill_catalog();
|
|
16252
16286
|
init_system_prompt();
|
|
16253
16287
|
agentSessionStateMethods = {
|
|
@@ -17275,6 +17309,17 @@ function _installAgentToolHooks() {
|
|
|
17275
17309
|
}
|
|
17276
17310
|
function _installAgentNextTurnRefresh() {
|
|
17277
17311
|
const previousPrepareNextTurnWithContext = this.agent.prepareNextTurnWithContext ?? (this.agent.prepareNextTurn ? async (_turn, signal) => await this.agent.prepareNextTurn?.(signal) : undefined);
|
|
17312
|
+
const previousShouldStopAfterTurn = this.agent.shouldStopAfterTurn;
|
|
17313
|
+
this.agent.shouldStopAfterTurn = async (turn, signal) => {
|
|
17314
|
+
const toolCallIds = turn.message.content.filter((part) => part.type === "toolCall").map((part) => part.id);
|
|
17315
|
+
const terminatingBatch = toolCallIds.length > 0 && toolCallIds.every((id) => this._terminatingToolCallIds.has(id));
|
|
17316
|
+
for (const id of toolCallIds)
|
|
17317
|
+
this._terminatingToolCallIds.delete(id);
|
|
17318
|
+
const shouldStop = await previousShouldStopAfterTurn?.(turn, signal) ?? false;
|
|
17319
|
+
this._stopAfterTurnBlockedContinuation = shouldStop;
|
|
17320
|
+
await settleFallbackAfterTurn(this, turn, terminatingBatch);
|
|
17321
|
+
return shouldStop;
|
|
17322
|
+
};
|
|
17278
17323
|
const previousTransformContext = this.agent.transformContext;
|
|
17279
17324
|
this.agent.transformContext = async (messages, signal) => {
|
|
17280
17325
|
const transformed = previousTransformContext ? await previousTransformContext(messages, signal) : messages;
|
|
@@ -17282,24 +17327,17 @@ function _installAgentNextTurnRefresh() {
|
|
|
17282
17327
|
assertToolPairingInvariant(guarded);
|
|
17283
17328
|
return guarded;
|
|
17284
17329
|
};
|
|
17285
|
-
|
|
17286
|
-
const
|
|
17287
|
-
const
|
|
17288
|
-
const
|
|
17289
|
-
const
|
|
17290
|
-
|
|
17291
|
-
this._terminatingToolCallIds.delete(id);
|
|
17292
|
-
const messages = turn.toolResults.length > 0 && !terminatingBatch ? await this._preflightPostToolContext(previousContext.messages, signal) : previousContext.messages;
|
|
17293
|
-
const preserveFallbackForFailure = turn.message.role === "assistant" && !this.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || this._isEmptyCompletion?.(turn.message) === true || this._isSafetyRefusal?.(turn.message) === true);
|
|
17294
|
-
if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
|
|
17295
|
-
await this._agentEventQueue;
|
|
17296
|
-
await this._settleFallbackModelScope();
|
|
17297
|
-
}
|
|
17330
|
+
const prepareTurn = async (turn, signal) => {
|
|
17331
|
+
const compactedMessages = turn.toolResults.length > 0 ? await this._preflightPostToolContext(turn.context.messages, signal) : turn.context.messages;
|
|
17332
|
+
const compactedContext = compactedMessages === turn.context.messages ? turn.context : { ...turn.context, messages: compactedMessages };
|
|
17333
|
+
const preparedTurn = compactedContext === turn.context ? turn : { ...turn, context: compactedContext };
|
|
17334
|
+
const previousSnapshot = await previousPrepareNextTurnWithContext?.(preparedTurn, signal);
|
|
17335
|
+
const previousContext = previousSnapshot?.context ?? compactedContext;
|
|
17298
17336
|
return {
|
|
17299
17337
|
...previousSnapshot,
|
|
17300
17338
|
context: {
|
|
17301
17339
|
...previousContext,
|
|
17302
|
-
messages,
|
|
17340
|
+
messages: previousContext.messages,
|
|
17303
17341
|
systemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,
|
|
17304
17342
|
tools: this.agent.state.tools.slice()
|
|
17305
17343
|
},
|
|
@@ -17307,6 +17345,14 @@ function _installAgentNextTurnRefresh() {
|
|
|
17307
17345
|
thinkingLevel: this.agent.state.thinkingLevel
|
|
17308
17346
|
};
|
|
17309
17347
|
};
|
|
17348
|
+
this.agent.prepareNextTurnWithContext = prepareTurn;
|
|
17349
|
+
}
|
|
17350
|
+
async function settleFallbackAfterTurn(session, turn, terminatingBatch) {
|
|
17351
|
+
const preserveFallbackForFailure = turn.message.role === "assistant" && !session.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || session._isEmptyCompletion?.(turn.message) === true || session._isSafetyRefusal?.(turn.message) === true);
|
|
17352
|
+
if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
|
|
17353
|
+
await session._agentEventQueue;
|
|
17354
|
+
await session._settleFallbackModelScope();
|
|
17355
|
+
}
|
|
17310
17356
|
}
|
|
17311
17357
|
var agentSessionToolHooksMethods;
|
|
17312
17358
|
var init_agent_session_tool_hooks = __esm(() => {
|
|
@@ -17389,6 +17435,7 @@ var init_loader_virtual_modules = __esm(() => {
|
|
|
17389
17435
|
});
|
|
17390
17436
|
|
|
17391
17437
|
// src/core/extensions/loader-core.ts
|
|
17438
|
+
var runtimeEventBuses;
|
|
17392
17439
|
var init_loader_core = __esm(() => {
|
|
17393
17440
|
init_event_loop();
|
|
17394
17441
|
init_paths();
|
|
@@ -17398,6 +17445,7 @@ var init_loader_core = __esm(() => {
|
|
|
17398
17445
|
init_loader_resources();
|
|
17399
17446
|
init_loader_runtime();
|
|
17400
17447
|
init_loader_virtual_modules();
|
|
17448
|
+
runtimeEventBuses = new WeakMap;
|
|
17401
17449
|
});
|
|
17402
17450
|
|
|
17403
17451
|
// src/core/package-manager-manifest.ts
|
|
@@ -22491,7 +22539,7 @@ class FastModeSelectorComponent {
|
|
|
22491
22539
|
}
|
|
22492
22540
|
invalidate() {}
|
|
22493
22541
|
render(width) {
|
|
22494
|
-
const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "
|
|
22542
|
+
const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "Fast mode")), width)];
|
|
22495
22543
|
for (const line of wrapTextWithAnsi3(DESCRIPTION, Math.max(20, width))) {
|
|
22496
22544
|
lines.push(theme.fg("muted", line));
|
|
22497
22545
|
}
|
|
@@ -22574,7 +22622,7 @@ class FastModeSelectorComponent {
|
|
|
22574
22622
|
return this.getFocusedRow() === row ? theme.fg("muted", text) : theme.fg("dim", text);
|
|
22575
22623
|
}
|
|
22576
22624
|
}
|
|
22577
|
-
var ROWS, LABEL_WIDTH = 16, DESCRIPTION = "
|
|
22625
|
+
var ROWS, LABEL_WIDTH = 16, DESCRIPTION = "Use faster routing for the selected model when supported by its provider.", ROW_DETAILS;
|
|
22578
22626
|
var init_fast_mode_selector = __esm(() => {
|
|
22579
22627
|
init_theme();
|
|
22580
22628
|
ROWS = ["chat", "workflow"];
|
|
@@ -23801,6 +23849,10 @@ var init_keybindings = __esm(() => {
|
|
|
23801
23849
|
defaultKeys: windowsKeybindings ? "alt+q" : "alt+up",
|
|
23802
23850
|
description: "Restore queued messages"
|
|
23803
23851
|
},
|
|
23852
|
+
"app.message.copy": {
|
|
23853
|
+
defaultKeys: "ctrl+x",
|
|
23854
|
+
description: "Copy fullscreen selection or last agent message"
|
|
23855
|
+
},
|
|
23804
23856
|
"app.clipboard.pasteImage": {
|
|
23805
23857
|
defaultKeys: windowsKeybindings ? "alt+v" : "ctrl+v",
|
|
23806
23858
|
description: "Paste image from clipboard (text fallback)"
|
|
@@ -25186,6 +25238,9 @@ function createSettingsChangeHandler(callbacks) {
|
|
|
25186
25238
|
case "fullscreen-exit-output":
|
|
25187
25239
|
callbacks.onFullscreenExitOutputChange(newValue);
|
|
25188
25240
|
break;
|
|
25241
|
+
case "fullscreen-copy-on-select":
|
|
25242
|
+
callbacks.onFullscreenCopyOnSelectChange(newValue === "true");
|
|
25243
|
+
break;
|
|
25189
25244
|
case "editor-padding":
|
|
25190
25245
|
callbacks.onEditorPaddingXChange(parseInt(newValue, 10));
|
|
25191
25246
|
break;
|
|
@@ -25573,6 +25628,13 @@ function insertUiToggles(items, config) {
|
|
|
25573
25628
|
values: ["transcript", "resume-hint"]
|
|
25574
25629
|
});
|
|
25575
25630
|
insertAfter(items, "fullscreen-exit-output", {
|
|
25631
|
+
id: "fullscreen-copy-on-select",
|
|
25632
|
+
label: "Fullscreen copy on select",
|
|
25633
|
+
description: "Copy selected transcript text automatically on mouse release",
|
|
25634
|
+
currentValue: config.fullscreenCopyOnSelect ? "true" : "false",
|
|
25635
|
+
values: ["true", "false"]
|
|
25636
|
+
});
|
|
25637
|
+
insertAfter(items, "fullscreen-copy-on-select", {
|
|
25576
25638
|
id: "editor-padding",
|
|
25577
25639
|
label: "Editor padding",
|
|
25578
25640
|
description: "Horizontal padding for input editor (0-3)",
|
|
@@ -38647,6 +38709,8 @@ function _refreshToolRegistry(options) {
|
|
|
38647
38709
|
const allowedToolNames = this._allowedToolNames;
|
|
38648
38710
|
const excludedToolNames = this._excludedToolNames;
|
|
38649
38711
|
const isExposedTool = (name) => {
|
|
38712
|
+
if (isMandatoryRuntimeTool(name))
|
|
38713
|
+
return true;
|
|
38650
38714
|
if (allowedToolNames && !allowedToolNames.has(name)) {
|
|
38651
38715
|
return false;
|
|
38652
38716
|
}
|
|
@@ -38655,10 +38719,10 @@ function _refreshToolRegistry(options) {
|
|
|
38655
38719
|
}
|
|
38656
38720
|
return true;
|
|
38657
38721
|
};
|
|
38658
|
-
const registeredTools = this._extensionRunner.getAllRegisteredTools();
|
|
38722
|
+
const registeredTools = this._extensionRunner.getAllRegisteredTools().filter((tool) => !isMandatoryRuntimeTool(tool.definition.name) || isTrustedMandatoryRuntimeTool(tool));
|
|
38659
38723
|
const allCustomTools = [
|
|
38660
38724
|
...registeredTools,
|
|
38661
|
-
...this._customTools.map((definition) => ({
|
|
38725
|
+
...this._customTools.filter((definition) => !isMandatoryRuntimeTool(definition.name)).map((definition) => ({
|
|
38662
38726
|
definition,
|
|
38663
38727
|
sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" })
|
|
38664
38728
|
}))
|
|
@@ -38779,6 +38843,7 @@ function _buildRuntime(options) {
|
|
|
38779
38843
|
var agentSessionToolRegistryMethods;
|
|
38780
38844
|
var init_agent_session_tool_registry = __esm(() => {
|
|
38781
38845
|
init_extensions();
|
|
38846
|
+
init_mandatory_runtime_tools();
|
|
38782
38847
|
init_model_registry();
|
|
38783
38848
|
init_tools();
|
|
38784
38849
|
init_session_temp_dir();
|
|
@@ -39621,6 +39686,7 @@ class AgentSessionBase {
|
|
|
39621
39686
|
_postToolCompactionPreflightError = undefined;
|
|
39622
39687
|
_pendingPostToolCompactionGuard = undefined;
|
|
39623
39688
|
_terminatingToolCallIds = new Set;
|
|
39689
|
+
_stopAfterTurnBlockedContinuation = false;
|
|
39624
39690
|
_disposed = false;
|
|
39625
39691
|
_branchSummaryAbortController = undefined;
|
|
39626
39692
|
_sessionSummaryAbortController = undefined;
|
|
@@ -39769,11 +39835,12 @@ var init_builtin_packages = __esm(() => {
|
|
|
39769
39835
|
{ packageName: "@bastani/subagents", workspaceDirName: "subagents", distDirName: "subagents" },
|
|
39770
39836
|
{ packageName: "@bastani/mcp", workspaceDirName: "mcp", distDirName: "mcp" },
|
|
39771
39837
|
{ packageName: "@bastani/web-access", workspaceDirName: "web-access", distDirName: "web-access" },
|
|
39772
|
-
{ packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom" }
|
|
39838
|
+
{ packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom", mandatory: true }
|
|
39773
39839
|
];
|
|
39774
39840
|
BUILTIN_PACKAGES = WORKSPACE_BUILTINS.map((spec) => ({
|
|
39775
39841
|
packageName: spec.packageName,
|
|
39776
39842
|
distDirName: spec.distDirName,
|
|
39843
|
+
mandatory: spec.mandatory === true,
|
|
39777
39844
|
requiredEntries: requiredEntriesForBuiltin(spec.distDirName),
|
|
39778
39845
|
sourceCandidates: ({ here, packageDir, isSourceCheckout }) => isSourceCheckout ? [join37(packageDir, "..", spec.workspaceDirName), join37(here, "..", "..", "..", spec.workspaceDirName)] : []
|
|
39779
39846
|
}));
|
|
@@ -43099,7 +43166,9 @@ var init_resource_loader_extensions = __esm(() => {
|
|
|
43099
43166
|
var init_resource_loader_reload = __esm(() => {
|
|
43100
43167
|
init_event_loop();
|
|
43101
43168
|
init_paths();
|
|
43169
|
+
init_builtin_packages();
|
|
43102
43170
|
init_loader();
|
|
43171
|
+
init_mandatory_runtime_tools();
|
|
43103
43172
|
init_resource_loader_assets();
|
|
43104
43173
|
init_resource_loader_context_files();
|
|
43105
43174
|
init_resource_loader_discovery();
|
|
@@ -44256,6 +44325,28 @@ var init_settings_manager_ui_accessors = __esm(() => {
|
|
|
44256
44325
|
state.markModified("fullscreenExitOutput");
|
|
44257
44326
|
state.save();
|
|
44258
44327
|
},
|
|
44328
|
+
getFullscreenCopyOnSelect() {
|
|
44329
|
+
return settingsInternals(this).settings.fullscreenCopyOnSelect !== false;
|
|
44330
|
+
},
|
|
44331
|
+
setFullscreenCopyOnSelect(enabled) {
|
|
44332
|
+
const state = settingsInternals(this);
|
|
44333
|
+
state.globalSettings.fullscreenCopyOnSelect = enabled;
|
|
44334
|
+
state.markModified("fullscreenCopyOnSelect");
|
|
44335
|
+
state.save();
|
|
44336
|
+
},
|
|
44337
|
+
getTerminalCapabilityOverrides() {
|
|
44338
|
+
const terminal = settingsInternals(this).settings.terminal;
|
|
44339
|
+
const overrides = {};
|
|
44340
|
+
if (typeof terminal?.hyperlinks === "boolean")
|
|
44341
|
+
overrides.hyperlinks = terminal.hyperlinks;
|
|
44342
|
+
if (terminal?.images === "kitty" || terminal?.images === "iterm2")
|
|
44343
|
+
overrides.images = terminal.images;
|
|
44344
|
+
else if (terminal?.images === false)
|
|
44345
|
+
overrides.images = null;
|
|
44346
|
+
if (typeof terminal?.trueColor === "boolean")
|
|
44347
|
+
overrides.trueColor = terminal.trueColor;
|
|
44348
|
+
return overrides;
|
|
44349
|
+
},
|
|
44259
44350
|
getEditorPaddingX() {
|
|
44260
44351
|
return settingsInternals(this).settings.editorPaddingX ?? 0;
|
|
44261
44352
|
},
|
|
@@ -44401,6 +44492,14 @@ var init_resource_loader = __esm(() => {
|
|
|
44401
44492
|
init_resource_loader_core();
|
|
44402
44493
|
init_skill_catalog();
|
|
44403
44494
|
});
|
|
44495
|
+
// src/core/mandatory-resource-loader.ts
|
|
44496
|
+
var init_mandatory_resource_loader = __esm(() => {
|
|
44497
|
+
init_builtin_packages();
|
|
44498
|
+
init_loader();
|
|
44499
|
+
init_mandatory_runtime_tools();
|
|
44500
|
+
init_skill_catalog();
|
|
44501
|
+
});
|
|
44502
|
+
|
|
44404
44503
|
// src/core/model-resolver-defaults.ts
|
|
44405
44504
|
function findPreferredAvailableModel(availableModels) {
|
|
44406
44505
|
for (const [provider, defaultId] of Object.entries(defaultModelPerProvider)) {
|
|
@@ -44441,7 +44540,7 @@ var init_model_resolver_defaults = __esm(() => {
|
|
|
44441
44540
|
huggingface: "moonshotai/Kimi-K2.6",
|
|
44442
44541
|
fireworks: "accounts/fireworks/models/kimi-k2p6",
|
|
44443
44542
|
together: "moonshotai/Kimi-K2.6",
|
|
44444
|
-
baseten: "zai-org/GLM-5.
|
|
44543
|
+
baseten: "zai-org/GLM-5.3",
|
|
44445
44544
|
opencode: "kimi-k2.6",
|
|
44446
44545
|
"opencode-go": "kimi-k2.6",
|
|
44447
44546
|
"kimi-coding": "kimi-for-coding",
|
|
@@ -45099,6 +45198,7 @@ var init_session_cwd = __esm(() => {
|
|
|
45099
45198
|
var init_agent_session_services = __esm(() => {
|
|
45100
45199
|
init_config();
|
|
45101
45200
|
init_paths();
|
|
45201
|
+
init_mandatory_resource_loader();
|
|
45102
45202
|
init_model_runtime();
|
|
45103
45203
|
init_resource_loader();
|
|
45104
45204
|
init_sdk();
|
|
@@ -45435,6 +45535,7 @@ var init_sdk = __esm(() => {
|
|
|
45435
45535
|
init_agent_session();
|
|
45436
45536
|
init_auth_guidance();
|
|
45437
45537
|
init_codex_fast_mode();
|
|
45538
|
+
init_mandatory_resource_loader();
|
|
45438
45539
|
init_messages();
|
|
45439
45540
|
init_model_resolver();
|
|
45440
45541
|
init_model_runtime();
|
|
@@ -45538,7 +45639,12 @@ var init_list_models = __esm(() => {
|
|
|
45538
45639
|
});
|
|
45539
45640
|
|
|
45540
45641
|
// src/cli/startup-ui.ts
|
|
45541
|
-
import {
|
|
45642
|
+
import {
|
|
45643
|
+
ProcessTerminal,
|
|
45644
|
+
setCapabilityOverrides,
|
|
45645
|
+
setKeybindings,
|
|
45646
|
+
TuiMainScreen
|
|
45647
|
+
} from "@earendil-works/pi-tui";
|
|
45542
45648
|
var init_startup_ui = __esm(() => {
|
|
45543
45649
|
init_config();
|
|
45544
45650
|
init_keybindings();
|
|
@@ -45626,7 +45732,7 @@ var init_main_first_time_setup = __esm(() => {
|
|
|
45626
45732
|
init_startup_ui();
|
|
45627
45733
|
});
|
|
45628
45734
|
// src/cli/session-picker.ts
|
|
45629
|
-
import { ProcessTerminal as ProcessTerminal2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
|
|
45735
|
+
import { ProcessTerminal as ProcessTerminal2, setCapabilityOverrides as setCapabilityOverrides2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
|
|
45630
45736
|
var init_session_picker = __esm(() => {
|
|
45631
45737
|
init_config();
|
|
45632
45738
|
init_keybindings();
|
|
@@ -45634,7 +45740,7 @@ var init_session_picker = __esm(() => {
|
|
|
45634
45740
|
});
|
|
45635
45741
|
|
|
45636
45742
|
// src/main-session.ts
|
|
45637
|
-
import { ProcessTerminal as ProcessTerminal3, setKeybindings as setKeybindings3, TuiMainScreen as TuiMainScreen3 } from "@earendil-works/pi-tui";
|
|
45743
|
+
import { ProcessTerminal as ProcessTerminal3, setCapabilityOverrides as setCapabilityOverrides3, setKeybindings as setKeybindings3, TuiMainScreen as TuiMainScreen3 } from "@earendil-works/pi-tui";
|
|
45638
45744
|
import chalk10 from "chalk";
|
|
45639
45745
|
var init_main_session = __esm(() => {
|
|
45640
45746
|
init_session_picker();
|
|
@@ -48452,7 +48558,7 @@ var init_slash_commands = __esm(() => {
|
|
|
48452
48558
|
{ name: "tree", description: "Navigate session tree (switch branches)" },
|
|
48453
48559
|
{ name: "thinking", description: "Set thinking level", argumentHint: "<level>" },
|
|
48454
48560
|
{ name: "scoped-models", description: "Enable/disable models for ctrl+p cycling" },
|
|
48455
|
-
{ name: "fast", description: "Configure
|
|
48561
|
+
{ name: "fast", description: "Configure fast mode for chat and workflows on supported models" },
|
|
48456
48562
|
{ name: "export", description: "Export session (HTML default, or specify path: .html/.jsonl)" },
|
|
48457
48563
|
{ name: "import", description: "Import and resume a session from a JSONL file" },
|
|
48458
48564
|
{ name: "share", description: "Share session as a secret GitHub gist" },
|
|
@@ -49078,6 +49184,7 @@ function createFullscreenTui(options) {
|
|
|
49078
49184
|
openUrl: openBrowser
|
|
49079
49185
|
}),
|
|
49080
49186
|
onRightClickPaste: options.onRightClickPaste,
|
|
49187
|
+
copyOnSelect: options.copyOnSelect,
|
|
49081
49188
|
copySelection: options.copySelection ?? copySelectionToHostClipboard
|
|
49082
49189
|
}, options.shouldHandleViewportInput, options.onOverlayUnhandledInput);
|
|
49083
49190
|
}
|
|
@@ -49119,7 +49226,7 @@ function createInteractiveTuiReference(getTui) {
|
|
|
49119
49226
|
getPrototypeOf: () => Reflect.getPrototypeOf(getTui())
|
|
49120
49227
|
});
|
|
49121
49228
|
}
|
|
49122
|
-
var viewportInputListeners, viewportInputGates, overlayUnhandledInputHandlers, viewportInputReplays, viewportInputSubscriptions, SGR_MOUSE_SEQUENCE, LEFT_MOUSE_MODIFIER_MASK, AtomicTuiAltScreen, AtomicTuiMainScreen;
|
|
49229
|
+
var viewportInputListeners, viewportInputGates, overlayUnhandledInputHandlers, viewportInputReplays, overlayOwnedSelections, viewportInputSubscriptions, SGR_MOUSE_SEQUENCE, LEFT_MOUSE_MODIFIER_MASK, AtomicTuiAltScreen, AtomicTuiMainScreen;
|
|
49123
49230
|
var init_interactive_tui = __esm(() => {
|
|
49124
49231
|
init_clipboard();
|
|
49125
49232
|
init_open_browser();
|
|
@@ -49128,6 +49235,7 @@ var init_interactive_tui = __esm(() => {
|
|
|
49128
49235
|
viewportInputGates = new WeakMap;
|
|
49129
49236
|
overlayUnhandledInputHandlers = new WeakMap;
|
|
49130
49237
|
viewportInputReplays = new WeakSet;
|
|
49238
|
+
overlayOwnedSelections = new WeakSet;
|
|
49131
49239
|
viewportInputSubscriptions = new WeakMap;
|
|
49132
49240
|
SGR_MOUSE_SEQUENCE = /^\x1b\[<(\d+);\d+;\d+([Mm])/;
|
|
49133
49241
|
LEFT_MOUSE_MODIFIER_MASK = 4 | 8 | 16;
|
|
@@ -49143,8 +49251,20 @@ var init_interactive_tui = __esm(() => {
|
|
|
49143
49251
|
deferral.shouldDeferViewportInputToOverlay = () => !viewportInputReplays.has(this) && deferToOverlay?.() === true;
|
|
49144
49252
|
}
|
|
49145
49253
|
applyLineResets(lines) {
|
|
49254
|
+
if (overlayOwnedSelections.has(this) && !this.isFocusedOverlay())
|
|
49255
|
+
this.clearOverlayOwnedSelection();
|
|
49146
49256
|
return stripOverlayActiveRowMarker(super.applyLineResets(lines));
|
|
49147
49257
|
}
|
|
49258
|
+
clearOverlayOwnedSelection() {
|
|
49259
|
+
const selection = this;
|
|
49260
|
+
selection.selectionAnchor = undefined;
|
|
49261
|
+
selection.selectionFocus = undefined;
|
|
49262
|
+
selection.selectionInitialRange = undefined;
|
|
49263
|
+
selection.selectionPressActive = false;
|
|
49264
|
+
selection.selectionDragged = false;
|
|
49265
|
+
selection.lastClick = undefined;
|
|
49266
|
+
overlayOwnedSelections.delete(this);
|
|
49267
|
+
}
|
|
49148
49268
|
isPiTuiMouseSequence(data) {
|
|
49149
49269
|
if (parseMouseSequences(data))
|
|
49150
49270
|
return true;
|
|
@@ -49221,6 +49341,7 @@ var init_interactive_tui = __esm(() => {
|
|
|
49221
49341
|
if (isLeftMouseButton(sequence))
|
|
49222
49342
|
viewportListener(sequence.data);
|
|
49223
49343
|
}
|
|
49344
|
+
overlayOwnedSelections.add(this);
|
|
49224
49345
|
}
|
|
49225
49346
|
replayViewportInput(viewportListener, data) {
|
|
49226
49347
|
viewportInputReplays.add(this);
|
|
@@ -49288,7 +49409,11 @@ var init_interactive_tui = __esm(() => {
|
|
|
49288
49409
|
});
|
|
49289
49410
|
|
|
49290
49411
|
// src/modes/interactive/interactive-mode-base.ts
|
|
49291
|
-
import {
|
|
49412
|
+
import {
|
|
49413
|
+
isKeyRelease as isKeyRelease3,
|
|
49414
|
+
isViewportTUI,
|
|
49415
|
+
setCapabilityOverrides as setCapabilityOverrides4
|
|
49416
|
+
} from "@earendil-works/pi-tui";
|
|
49292
49417
|
function isFullscreenViewportAction(data, keybindings) {
|
|
49293
49418
|
return FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));
|
|
49294
49419
|
}
|
|
@@ -49349,6 +49474,18 @@ class InteractiveModeBase {
|
|
|
49349
49474
|
return false;
|
|
49350
49475
|
return this.defaultEditor.handleInput(data);
|
|
49351
49476
|
}
|
|
49477
|
+
setFullscreenCopyOnSelect(enabled) {
|
|
49478
|
+
if (this.renderer.mode === "fullscreen")
|
|
49479
|
+
this.renderer.setCopyOnSelect(enabled);
|
|
49480
|
+
}
|
|
49481
|
+
getFullscreenCopyOnSelect() {
|
|
49482
|
+
return this.renderer.mode === "fullscreen" ? this.renderer.getCopyOnSelect() : undefined;
|
|
49483
|
+
}
|
|
49484
|
+
async copyActiveFullscreenSelection() {
|
|
49485
|
+
if (this.renderer.mode !== "fullscreen" || !this.renderer.hasActiveSelection())
|
|
49486
|
+
return;
|
|
49487
|
+
return this.renderer.copyActiveSelectionToClipboard();
|
|
49488
|
+
}
|
|
49352
49489
|
onRightClickPaste = () => {
|
|
49353
49490
|
this.handleRightClickPaste();
|
|
49354
49491
|
};
|
|
@@ -49548,11 +49685,13 @@ class InteractiveModeBase {
|
|
|
49548
49685
|
await this.rebindCurrentSession();
|
|
49549
49686
|
await this.themeController.applyFromSettings();
|
|
49550
49687
|
});
|
|
49688
|
+
setCapabilityOverrides4(this.settingsManager.getTerminalCapabilityOverrides());
|
|
49551
49689
|
this.version = VERSION;
|
|
49552
49690
|
this.renderer = createInteractiveTui({
|
|
49553
49691
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
49554
49692
|
logDirectory: runtimeHost.services.agentDir,
|
|
49555
49693
|
terminal: options.terminal,
|
|
49694
|
+
copyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
|
|
49556
49695
|
onRightClickPaste: this.onRightClickPaste,
|
|
49557
49696
|
shouldHandleViewportInput: this.shouldHandleViewportInput,
|
|
49558
49697
|
onOverlayUnhandledInput: this.onOverlayUnhandledInput,
|
|
@@ -50675,6 +50814,7 @@ var init_interactive_deferred_startup = __esm(() => {
|
|
|
50675
50814
|
try {
|
|
50676
50815
|
await this.bindCurrentSessionExtensions();
|
|
50677
50816
|
await this.session.reload({ reason: "startup" });
|
|
50817
|
+
this.applyRuntimeSettings();
|
|
50678
50818
|
this.rebuildChatFromMessages();
|
|
50679
50819
|
if (!this.promptTurnWorkingLoaderActive) {
|
|
50680
50820
|
this.stopWorkingLoader();
|
|
@@ -51363,6 +51503,7 @@ ${warningLines}`, 0, 0));
|
|
|
51363
51503
|
});
|
|
51364
51504
|
|
|
51365
51505
|
// src/modes/interactive/interactive-session-runtime.ts
|
|
51506
|
+
import { setCapabilityOverrides as setCapabilityOverrides5 } from "@earendil-works/pi-tui";
|
|
51366
51507
|
var init_interactive_session_runtime = __esm(() => {
|
|
51367
51508
|
init_interactive_mode_base();
|
|
51368
51509
|
init_interactive_mode_deps();
|
|
@@ -51449,6 +51590,8 @@ var init_interactive_session_runtime = __esm(() => {
|
|
|
51449
51590
|
}
|
|
51450
51591
|
};
|
|
51451
51592
|
InteractiveModeBase.prototype.applyRuntimeSettings = function() {
|
|
51593
|
+
setCapabilityOverrides5(this.settingsManager.getTerminalCapabilityOverrides());
|
|
51594
|
+
this.setFullscreenCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect());
|
|
51452
51595
|
this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar());
|
|
51453
51596
|
this.footer.setSession(this.session);
|
|
51454
51597
|
this.usageMeter.setSession(this.session);
|
|
@@ -52965,6 +53108,9 @@ var init_interactive_input_handling = __esm(() => {
|
|
|
52965
53108
|
});
|
|
52966
53109
|
this.defaultEditor.onAction("app.message.followUp", () => this.handleFollowUp());
|
|
52967
53110
|
this.defaultEditor.onAction("app.message.dequeue", () => this.handleDequeue());
|
|
53111
|
+
this.defaultEditor.onAction("app.message.copy", () => {
|
|
53112
|
+
this.handleCopyCommand({ preferSelection: true });
|
|
53113
|
+
});
|
|
52968
53114
|
this.defaultEditor.onAction("app.session.new", () => this.handleClearCommand());
|
|
52969
53115
|
this.defaultEditor.onAction("app.session.tree", () => this.showTreeSelector());
|
|
52970
53116
|
this.defaultEditor.onAction("app.session.fork", () => this.showUserMessageSelector());
|
|
@@ -53872,7 +54018,8 @@ var init_interactive_agent_events = __esm(() => {
|
|
|
53872
54018
|
} else if (event.reason === "manual") {
|
|
53873
54019
|
this.manualCompactionTakeoverPending = false;
|
|
53874
54020
|
}
|
|
53875
|
-
|
|
54021
|
+
const resumesActiveRun = event.midTurn && !event.aborted && !event.errorMessage && !manualTakeoverPending;
|
|
54022
|
+
if (!manualTakeoverPending && !resumesActiveRun && this.settingsManager.getShowTerminalProgress()) {
|
|
53876
54023
|
this.ui.terminal.setProgress(false);
|
|
53877
54024
|
}
|
|
53878
54025
|
if (!manualTakeoverPending && this.autoCompactionEscapeHandlerSaved) {
|
|
@@ -54888,7 +55035,7 @@ var init_interactive_selectors = __esm(() => {
|
|
|
54888
55035
|
};
|
|
54889
55036
|
InteractiveModeBase.prototype.showFastModeSelector = function() {
|
|
54890
55037
|
if (!this.hasCodexFastModeSupportedModels()) {
|
|
54891
|
-
this.showWarning("
|
|
55038
|
+
this.showWarning("Fast mode isn't available for any configured model.");
|
|
54892
55039
|
return;
|
|
54893
55040
|
}
|
|
54894
55041
|
this.showSelector((done) => {
|
|
@@ -54947,6 +55094,7 @@ var init_interactive_selectors = __esm(() => {
|
|
|
54947
55094
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
54948
55095
|
fullscreenScrollbar: this.settingsManager.getFullscreenScrollbar(),
|
|
54949
55096
|
fullscreenExitOutput: this.settingsManager.getFullscreenExitOutput(),
|
|
55097
|
+
fullscreenCopyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
|
|
54950
55098
|
editorPaddingX: this.settingsManager.getEditorPaddingX(),
|
|
54951
55099
|
outputPad: this.settingsManager.getOutputPad(),
|
|
54952
55100
|
showCacheMissNotices: this.settingsManager.getShowCacheMissNotices(),
|
|
@@ -55064,6 +55212,10 @@ var init_interactive_selectors = __esm(() => {
|
|
|
55064
55212
|
onFullscreenExitOutputChange: (output) => {
|
|
55065
55213
|
this.settingsManager.setFullscreenExitOutput(output);
|
|
55066
55214
|
},
|
|
55215
|
+
onFullscreenCopyOnSelectChange: (enabled) => {
|
|
55216
|
+
this.settingsManager.setFullscreenCopyOnSelect(enabled);
|
|
55217
|
+
this.setFullscreenCopyOnSelect(enabled);
|
|
55218
|
+
},
|
|
55067
55219
|
onEditorPaddingXChange: (padding) => {
|
|
55068
55220
|
this.settingsManager.setEditorPaddingX(padding);
|
|
55069
55221
|
this.defaultEditor.setPaddingX(padding);
|
|
@@ -56050,18 +56202,8 @@ var init_interactive_slash_commands = __esm(() => {
|
|
|
56050
56202
|
activeHeader.setExpanded(this.toolOutputExpanded);
|
|
56051
56203
|
}
|
|
56052
56204
|
setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
|
|
56053
|
-
this.
|
|
56205
|
+
this.applyRuntimeSettings();
|
|
56054
56206
|
await this.themeController.applyFromSettings();
|
|
56055
|
-
const editorPaddingX = this.settingsManager.getEditorPaddingX();
|
|
56056
|
-
const autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();
|
|
56057
|
-
this.defaultEditor.setPaddingX(editorPaddingX);
|
|
56058
|
-
this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible);
|
|
56059
|
-
if (this.editor !== this.defaultEditor) {
|
|
56060
|
-
this.editor.setPaddingX?.(editorPaddingX);
|
|
56061
|
-
this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible);
|
|
56062
|
-
}
|
|
56063
|
-
this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());
|
|
56064
|
-
this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
|
|
56065
56207
|
this.setupAutocompleteProvider();
|
|
56066
56208
|
const runner = this.session.extensionRunner;
|
|
56067
56209
|
this.setupExtensionShortcuts(runner);
|
|
@@ -56254,7 +56396,12 @@ Gist: ${hyperlink3(gistUrl, gistUrl)}`);
|
|
|
56254
56396
|
}
|
|
56255
56397
|
}
|
|
56256
56398
|
};
|
|
56257
|
-
InteractiveModeBase.prototype.handleCopyCommand = async function() {
|
|
56399
|
+
InteractiveModeBase.prototype.handleCopyCommand = async function(options = {}) {
|
|
56400
|
+
if (options.preferSelection && this.getFullscreenCopyOnSelect() === false) {
|
|
56401
|
+
const selectionCopied = await this.copyActiveFullscreenSelection();
|
|
56402
|
+
if (selectionCopied !== undefined)
|
|
56403
|
+
return;
|
|
56404
|
+
}
|
|
56258
56405
|
const text = this.session.getLastAssistantText();
|
|
56259
56406
|
if (!text) {
|
|
56260
56407
|
this.showError("No agent messages to copy yet.");
|
|
@@ -56801,6 +56948,7 @@ var init_rpc_extension_ui = __esm(() => {
|
|
|
56801
56948
|
});
|
|
56802
56949
|
|
|
56803
56950
|
// src/modes/rpc/rpc-session-binding.ts
|
|
56951
|
+
import { setCapabilityOverrides as setCapabilityOverrides6 } from "@earendil-works/pi-tui";
|
|
56804
56952
|
var init_rpc_session_binding = __esm(() => {
|
|
56805
56953
|
init_footer_data_provider();
|
|
56806
56954
|
init_output_guard();
|
|
@@ -56877,7 +57025,7 @@ var init_config_selector = __esm(() => {
|
|
|
56877
57025
|
});
|
|
56878
57026
|
|
|
56879
57027
|
// src/cli/config-selector.ts
|
|
56880
|
-
import { ProcessTerminal as ProcessTerminal6, TuiMainScreen as TuiMainScreen8 } from "@earendil-works/pi-tui";
|
|
57028
|
+
import { ProcessTerminal as ProcessTerminal6, setCapabilityOverrides as setCapabilityOverrides7, TuiMainScreen as TuiMainScreen8 } from "@earendil-works/pi-tui";
|
|
56881
57029
|
var init_config_selector2 = __esm(() => {
|
|
56882
57030
|
init_config_selector();
|
|
56883
57031
|
init_theme();
|
|
@@ -56924,6 +57072,7 @@ var init_package_manager_cli = __esm(() => {
|
|
|
56924
57072
|
});
|
|
56925
57073
|
|
|
56926
57074
|
// src/main.ts
|
|
57075
|
+
import { setCapabilityOverrides as setCapabilityOverrides8 } from "@earendil-works/pi-tui";
|
|
56927
57076
|
import chalk15 from "chalk";
|
|
56928
57077
|
var init_main = __esm(() => {
|
|
56929
57078
|
init_args();
|
|
@@ -56938,6 +57087,7 @@ var init_main = __esm(() => {
|
|
|
56938
57087
|
init_auth_storage();
|
|
56939
57088
|
init_builtin_packages();
|
|
56940
57089
|
init_http_dispatcher();
|
|
57090
|
+
init_mandatory_resource_loader();
|
|
56941
57091
|
init_model_resolver();
|
|
56942
57092
|
init_model_runtime();
|
|
56943
57093
|
init_output_guard();
|
|
@@ -57373,6 +57523,59 @@ function isSessionInfo(value) {
|
|
|
57373
57523
|
return session.status === undefined || typeof session.status === "string";
|
|
57374
57524
|
}
|
|
57375
57525
|
|
|
57526
|
+
// dist/builtin/intercom/group.ts
|
|
57527
|
+
function intercomGroupFromEnv() {
|
|
57528
|
+
return process.env.ATOMIC_INTERCOM_GROUP ?? process.env.PI_INTERCOM_GROUP;
|
|
57529
|
+
}
|
|
57530
|
+
function normalizeGroup(value) {
|
|
57531
|
+
if (typeof value !== "string")
|
|
57532
|
+
return DEFAULT_GROUP;
|
|
57533
|
+
const trimmed = value.trim();
|
|
57534
|
+
return trimmed.length > 0 ? trimmed : DEFAULT_GROUP;
|
|
57535
|
+
}
|
|
57536
|
+
function normalizeGroups(values, legacyGroup) {
|
|
57537
|
+
const groups = new Set;
|
|
57538
|
+
for (const value of values ?? [])
|
|
57539
|
+
groups.add(normalizeGroup(value));
|
|
57540
|
+
if (legacyGroup !== undefined)
|
|
57541
|
+
groups.add(normalizeGroup(legacyGroup));
|
|
57542
|
+
if (groups.size === 0)
|
|
57543
|
+
groups.add(DEFAULT_GROUP);
|
|
57544
|
+
return groups;
|
|
57545
|
+
}
|
|
57546
|
+
function validateRuntimeGroup(value) {
|
|
57547
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
57548
|
+
throw new Error("A non-empty intercom group name is required");
|
|
57549
|
+
}
|
|
57550
|
+
const group = normalizeGroup(value);
|
|
57551
|
+
if (RESERVED_RUNTIME_GROUPS.has(group.toLowerCase())) {
|
|
57552
|
+
throw new Error(`Intercom group name "${group}" is reserved; choose another name`);
|
|
57553
|
+
}
|
|
57554
|
+
return group;
|
|
57555
|
+
}
|
|
57556
|
+
function resolveHomeGroup(config, ctx) {
|
|
57557
|
+
const fromPolicy = ctx?.subagentPolicy?.intercomGroup;
|
|
57558
|
+
if (typeof fromPolicy === "string" && fromPolicy.trim().length > 0) {
|
|
57559
|
+
return normalizeGroup(fromPolicy);
|
|
57560
|
+
}
|
|
57561
|
+
const fromContext = ctx?.orchestrationContext?.intercomGroup;
|
|
57562
|
+
if (typeof fromContext === "string" && fromContext.trim().length > 0) {
|
|
57563
|
+
return normalizeGroup(fromContext);
|
|
57564
|
+
}
|
|
57565
|
+
const fromEnv = intercomGroupFromEnv();
|
|
57566
|
+
if (typeof fromEnv === "string" && fromEnv.trim().length > 0) {
|
|
57567
|
+
return normalizeGroup(fromEnv);
|
|
57568
|
+
}
|
|
57569
|
+
if (config && typeof config.group === "string" && config.group.trim().length > 0) {
|
|
57570
|
+
return normalizeGroup(config.group);
|
|
57571
|
+
}
|
|
57572
|
+
return DEFAULT_GROUP;
|
|
57573
|
+
}
|
|
57574
|
+
var DEFAULT_GROUP = "default", RESERVED_RUNTIME_GROUPS;
|
|
57575
|
+
var init_group = __esm(() => {
|
|
57576
|
+
RESERVED_RUNTIME_GROUPS = new Set(["true", "auto"]);
|
|
57577
|
+
});
|
|
57578
|
+
|
|
57376
57579
|
// dist/builtin/intercom/broker/client.ts
|
|
57377
57580
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
57378
57581
|
import net from "net";
|
|
@@ -57380,10 +57583,11 @@ import { randomUUID as randomUUID8 } from "crypto";
|
|
|
57380
57583
|
function toError(error) {
|
|
57381
57584
|
return error instanceof Error ? error : new Error(String(error));
|
|
57382
57585
|
}
|
|
57383
|
-
var BROKER_SOCKET, PRESENCE_ACK_TIMEOUT_MS = 5000, IntercomClient;
|
|
57586
|
+
var BROKER_SOCKET, GROUP_REQUEST_TIMEOUT_MS = 5000, PRESENCE_ACK_TIMEOUT_MS = 5000, IntercomClient;
|
|
57384
57587
|
var init_client = __esm(() => {
|
|
57385
57588
|
init_paths2();
|
|
57386
57589
|
init_pending_send_registry();
|
|
57590
|
+
init_group();
|
|
57387
57591
|
BROKER_SOCKET = getBrokerSocketPath();
|
|
57388
57592
|
IntercomClient = class IntercomClient extends EventEmitter2 {
|
|
57389
57593
|
returnAddress;
|
|
@@ -57392,8 +57596,11 @@ var init_client = __esm(() => {
|
|
|
57392
57596
|
_supervisorSessionId = null;
|
|
57393
57597
|
_messageSource;
|
|
57394
57598
|
pendingSends = new PendingSendRegistry;
|
|
57599
|
+
pendingGroupLists = new Map;
|
|
57395
57600
|
pendingLists = new Map;
|
|
57396
57601
|
pendingPresence = new Map;
|
|
57602
|
+
pendingMemberships = new Map;
|
|
57603
|
+
_groups = normalizeGroups();
|
|
57397
57604
|
pendingLiveWorkflowStageRoutes = new Map;
|
|
57398
57605
|
pendingSupervisorAuthorizations = new Map;
|
|
57399
57606
|
disconnecting = false;
|
|
@@ -57406,17 +57613,23 @@ var init_client = __esm(() => {
|
|
|
57406
57613
|
}
|
|
57407
57614
|
failPending(error) {
|
|
57408
57615
|
this.pendingSends.rejectAll(error);
|
|
57616
|
+
for (const pending of this.pendingGroupLists.values())
|
|
57617
|
+
pending.reject(error);
|
|
57409
57618
|
for (const pending of this.pendingLists.values())
|
|
57410
57619
|
pending.reject(error);
|
|
57411
57620
|
for (const pending of this.pendingSupervisorAuthorizations.values())
|
|
57412
57621
|
pending.reject(error);
|
|
57413
57622
|
for (const pending of this.pendingPresence.values())
|
|
57414
57623
|
pending.reject(error);
|
|
57624
|
+
for (const pending of this.pendingMemberships.values())
|
|
57625
|
+
pending.reject(error);
|
|
57415
57626
|
for (const pending of this.pendingLiveWorkflowStageRoutes.values())
|
|
57416
57627
|
pending.reject(error);
|
|
57417
57628
|
this.pendingLists.clear();
|
|
57629
|
+
this.pendingGroupLists.clear();
|
|
57418
57630
|
this.pendingSupervisorAuthorizations.clear();
|
|
57419
57631
|
this.pendingPresence.clear();
|
|
57632
|
+
this.pendingMemberships.clear();
|
|
57420
57633
|
this.pendingLiveWorkflowStageRoutes.clear();
|
|
57421
57634
|
}
|
|
57422
57635
|
get sessionId() {
|
|
@@ -57425,6 +57638,9 @@ var init_client = __esm(() => {
|
|
|
57425
57638
|
get supervisorSessionId() {
|
|
57426
57639
|
return this._supervisorSessionId;
|
|
57427
57640
|
}
|
|
57641
|
+
get groups() {
|
|
57642
|
+
return [...this._groups];
|
|
57643
|
+
}
|
|
57428
57644
|
isConnected() {
|
|
57429
57645
|
const socket = this.socket;
|
|
57430
57646
|
return Boolean(socket && this._sessionId && !this.disconnecting && !socket.destroyed && !socket.writableEnded && socket.writable);
|
|
@@ -57447,6 +57663,7 @@ var init_client = __esm(() => {
|
|
|
57447
57663
|
return Promise.reject(new Error("Already connected"));
|
|
57448
57664
|
}
|
|
57449
57665
|
this._messageSource = messageSource ?? readSubagentMessageSource();
|
|
57666
|
+
this._groups = normalizeGroups(session.groups, session.group);
|
|
57450
57667
|
return new Promise((resolve15, reject) => {
|
|
57451
57668
|
const socket = net.connect(BROKER_SOCKET);
|
|
57452
57669
|
this.socket = socket;
|
|
@@ -57598,6 +57815,18 @@ var init_client = __esm(() => {
|
|
|
57598
57815
|
pending.resolve(sessions);
|
|
57599
57816
|
break;
|
|
57600
57817
|
}
|
|
57818
|
+
case "groups": {
|
|
57819
|
+
const { requestId, groups } = brokerMessage;
|
|
57820
|
+
if (typeof requestId !== "string" || !Array.isArray(groups) || !groups.every((summary) => typeof summary === "object" && summary !== null && typeof summary.group === "string" && typeof summary.sessionCount === "number" && typeof summary.member === "boolean")) {
|
|
57821
|
+
throw new Error("Invalid groups message");
|
|
57822
|
+
}
|
|
57823
|
+
const pending = this.pendingGroupLists.get(requestId);
|
|
57824
|
+
if (!pending)
|
|
57825
|
+
return;
|
|
57826
|
+
this.pendingGroupLists.delete(requestId);
|
|
57827
|
+
pending.resolve(groups);
|
|
57828
|
+
break;
|
|
57829
|
+
}
|
|
57601
57830
|
case "supervisor_authorized": {
|
|
57602
57831
|
const { requestId, capability, supervisorSessionId, childName } = brokerMessage;
|
|
57603
57832
|
if (typeof requestId !== "string" || typeof capability !== "string" || typeof supervisorSessionId !== "string" || typeof childName !== "string") {
|
|
@@ -57728,18 +57957,39 @@ var init_client = __esm(() => {
|
|
|
57728
57957
|
if (!pending)
|
|
57729
57958
|
return;
|
|
57730
57959
|
this.pendingPresence.delete(brokerMessage.requestId);
|
|
57960
|
+
this._groups = pending.groups === undefined ? normalizeGroups(undefined, brokerMessage.group) : normalizeGroups(pending.groups);
|
|
57731
57961
|
pending.resolve(brokerMessage.group);
|
|
57732
57962
|
break;
|
|
57733
57963
|
}
|
|
57964
|
+
case "membership_ack": {
|
|
57965
|
+
const { requestId, groups } = brokerMessage;
|
|
57966
|
+
if (typeof requestId !== "string" || !Array.isArray(groups) || !groups.every((group) => typeof group === "string")) {
|
|
57967
|
+
throw new Error("Invalid membership_ack message");
|
|
57968
|
+
}
|
|
57969
|
+
const pending = this.pendingMemberships.get(requestId);
|
|
57970
|
+
if (!pending)
|
|
57971
|
+
return;
|
|
57972
|
+
this.pendingMemberships.delete(requestId);
|
|
57973
|
+
const normalizedGroups = [...normalizeGroups(groups)];
|
|
57974
|
+
this._groups = new Set(normalizedGroups);
|
|
57975
|
+
pending.resolve(normalizedGroups);
|
|
57976
|
+
break;
|
|
57977
|
+
}
|
|
57734
57978
|
case "presence_failed": {
|
|
57735
57979
|
if (typeof brokerMessage.requestId !== "string" || typeof brokerMessage.reason !== "string") {
|
|
57736
57980
|
throw new Error("Invalid presence_failed message");
|
|
57737
57981
|
}
|
|
57738
|
-
const
|
|
57739
|
-
if (
|
|
57982
|
+
const presence = this.pendingPresence.get(brokerMessage.requestId);
|
|
57983
|
+
if (presence) {
|
|
57984
|
+
this.pendingPresence.delete(brokerMessage.requestId);
|
|
57985
|
+
presence.reject(new Error(brokerMessage.reason));
|
|
57986
|
+
break;
|
|
57987
|
+
}
|
|
57988
|
+
const membership = this.pendingMemberships.get(brokerMessage.requestId);
|
|
57989
|
+
if (!membership)
|
|
57740
57990
|
return;
|
|
57741
|
-
this.
|
|
57742
|
-
|
|
57991
|
+
this.pendingMemberships.delete(brokerMessage.requestId);
|
|
57992
|
+
membership.reject(new Error(brokerMessage.reason));
|
|
57743
57993
|
break;
|
|
57744
57994
|
}
|
|
57745
57995
|
case "peer_disconnected": {
|
|
@@ -57835,6 +58085,78 @@ var init_client = __esm(() => {
|
|
|
57835
58085
|
}
|
|
57836
58086
|
});
|
|
57837
58087
|
}
|
|
58088
|
+
listGroups() {
|
|
58089
|
+
let socket;
|
|
58090
|
+
try {
|
|
58091
|
+
socket = this.requireActiveSocket();
|
|
58092
|
+
} catch (error) {
|
|
58093
|
+
return Promise.reject(toError(error));
|
|
58094
|
+
}
|
|
58095
|
+
const requestId = randomUUID8();
|
|
58096
|
+
return new Promise((resolve15, reject) => {
|
|
58097
|
+
const timeout = setTimeout(() => {
|
|
58098
|
+
if (!this.pendingGroupLists.delete(requestId))
|
|
58099
|
+
return;
|
|
58100
|
+
reject(new Error("List groups timeout"));
|
|
58101
|
+
}, GROUP_REQUEST_TIMEOUT_MS);
|
|
58102
|
+
this.pendingGroupLists.set(requestId, {
|
|
58103
|
+
resolve: (groups) => {
|
|
58104
|
+
clearTimeout(timeout);
|
|
58105
|
+
resolve15(groups);
|
|
58106
|
+
},
|
|
58107
|
+
reject: (error) => {
|
|
58108
|
+
clearTimeout(timeout);
|
|
58109
|
+
reject(error);
|
|
58110
|
+
}
|
|
58111
|
+
});
|
|
58112
|
+
try {
|
|
58113
|
+
writeMessage(socket, { type: "list_groups", requestId });
|
|
58114
|
+
} catch (error) {
|
|
58115
|
+
clearTimeout(timeout);
|
|
58116
|
+
this.pendingGroupLists.delete(requestId);
|
|
58117
|
+
reject(toError(error));
|
|
58118
|
+
}
|
|
58119
|
+
});
|
|
58120
|
+
}
|
|
58121
|
+
joinGroup(group) {
|
|
58122
|
+
return this.updateMembership("join_group", group);
|
|
58123
|
+
}
|
|
58124
|
+
leaveGroup(group) {
|
|
58125
|
+
return this.updateMembership("leave_group", group);
|
|
58126
|
+
}
|
|
58127
|
+
updateMembership(type, group) {
|
|
58128
|
+
let socket;
|
|
58129
|
+
try {
|
|
58130
|
+
socket = this.requireActiveSocket();
|
|
58131
|
+
} catch (error) {
|
|
58132
|
+
return Promise.reject(toError(error));
|
|
58133
|
+
}
|
|
58134
|
+
const requestId = randomUUID8();
|
|
58135
|
+
return new Promise((resolve15, reject) => {
|
|
58136
|
+
const timeout = setTimeout(() => {
|
|
58137
|
+
if (!this.pendingMemberships.delete(requestId))
|
|
58138
|
+
return;
|
|
58139
|
+
reject(new Error("Membership update timeout"));
|
|
58140
|
+
}, GROUP_REQUEST_TIMEOUT_MS);
|
|
58141
|
+
this.pendingMemberships.set(requestId, {
|
|
58142
|
+
resolve: (groups) => {
|
|
58143
|
+
clearTimeout(timeout);
|
|
58144
|
+
resolve15(groups);
|
|
58145
|
+
},
|
|
58146
|
+
reject: (error) => {
|
|
58147
|
+
clearTimeout(timeout);
|
|
58148
|
+
reject(error);
|
|
58149
|
+
}
|
|
58150
|
+
});
|
|
58151
|
+
try {
|
|
58152
|
+
writeMessage(socket, group === undefined ? { type, requestId } : { type, requestId, group });
|
|
58153
|
+
} catch (error) {
|
|
58154
|
+
clearTimeout(timeout);
|
|
58155
|
+
this.pendingMemberships.delete(requestId);
|
|
58156
|
+
reject(toError(error));
|
|
58157
|
+
}
|
|
58158
|
+
});
|
|
58159
|
+
}
|
|
57838
58160
|
authorizeSupervisorChild(childName, capability) {
|
|
57839
58161
|
let socket;
|
|
57840
58162
|
try {
|
|
@@ -57966,6 +58288,10 @@ var init_client = __esm(() => {
|
|
|
57966
58288
|
return false;
|
|
57967
58289
|
}
|
|
57968
58290
|
writeMessage(socket, { type: "presence", ...updates });
|
|
58291
|
+
if (updates.groups !== undefined)
|
|
58292
|
+
this._groups = normalizeGroups(updates.groups, updates.group);
|
|
58293
|
+
else if (updates.group !== undefined)
|
|
58294
|
+
this._groups = normalizeGroups(undefined, updates.group);
|
|
57969
58295
|
return true;
|
|
57970
58296
|
}
|
|
57971
58297
|
updatePresenceAcked(updates) {
|
|
@@ -57990,7 +58316,11 @@ var init_client = __esm(() => {
|
|
|
57990
58316
|
return;
|
|
57991
58317
|
reject(new Error("Presence update timeout"));
|
|
57992
58318
|
}, PRESENCE_ACK_TIMEOUT_MS);
|
|
57993
|
-
this.pendingPresence.set(requestId, {
|
|
58319
|
+
this.pendingPresence.set(requestId, {
|
|
58320
|
+
resolve: wrappedResolve,
|
|
58321
|
+
reject: wrappedReject,
|
|
58322
|
+
...updates.groups === undefined ? {} : { groups: [...updates.groups] }
|
|
58323
|
+
});
|
|
57994
58324
|
try {
|
|
57995
58325
|
writeMessage(socket, { type: "presence", ...updates, requestId });
|
|
57996
58326
|
} catch (error) {
|
|
@@ -58541,12 +58871,6 @@ function loadConfig2() {
|
|
|
58541
58871
|
}
|
|
58542
58872
|
config.maxPendingAsks = Number(parsedConfig.maxPendingAsks);
|
|
58543
58873
|
}
|
|
58544
|
-
if (Object.hasOwn(parsedConfig, "enabled")) {
|
|
58545
|
-
if (typeof parsedConfig.enabled !== "boolean") {
|
|
58546
|
-
throw new Error(`"enabled" must be a boolean`);
|
|
58547
|
-
}
|
|
58548
|
-
config.enabled = parsedConfig.enabled;
|
|
58549
|
-
}
|
|
58550
58874
|
if (Object.hasOwn(parsedConfig, "replyHint")) {
|
|
58551
58875
|
if (typeof parsedConfig.replyHint !== "boolean") {
|
|
58552
58876
|
throw new Error(`"replyHint" must be a boolean`);
|
|
@@ -58583,7 +58907,6 @@ var init_config3 = __esm(() => {
|
|
|
58583
58907
|
brokerArgs: [...DEFAULT_BROKER_ARGS],
|
|
58584
58908
|
confirmSend: false,
|
|
58585
58909
|
maxPendingAsks: DEFAULT_MAX_PENDING_REPLY_WAITS,
|
|
58586
|
-
enabled: true,
|
|
58587
58910
|
replyHint: true
|
|
58588
58911
|
};
|
|
58589
58912
|
});
|
|
@@ -58769,49 +59092,6 @@ var init_parent_ask_handoff = __esm(() => {
|
|
|
58769
59092
|
PROCESS_PARENT_ASK_CLAIMS = Symbol.for("atomic/subagents/parent-ask-claims@1");
|
|
58770
59093
|
});
|
|
58771
59094
|
|
|
58772
|
-
// dist/builtin/intercom/group.ts
|
|
58773
|
-
function intercomGroupFromEnv() {
|
|
58774
|
-
return process.env.ATOMIC_INTERCOM_GROUP ?? process.env.PI_INTERCOM_GROUP;
|
|
58775
|
-
}
|
|
58776
|
-
function normalizeGroup(value) {
|
|
58777
|
-
if (typeof value !== "string")
|
|
58778
|
-
return DEFAULT_GROUP;
|
|
58779
|
-
const trimmed = value.trim();
|
|
58780
|
-
return trimmed.length > 0 ? trimmed : DEFAULT_GROUP;
|
|
58781
|
-
}
|
|
58782
|
-
function validateRuntimeGroup(value) {
|
|
58783
|
-
if (typeof value !== "string" || value.trim().length === 0) {
|
|
58784
|
-
throw new Error("A non-empty intercom group name is required");
|
|
58785
|
-
}
|
|
58786
|
-
const group = normalizeGroup(value);
|
|
58787
|
-
if (RESERVED_RUNTIME_GROUPS.has(group.toLowerCase())) {
|
|
58788
|
-
throw new Error(`Intercom group name "${group}" is reserved; choose another name`);
|
|
58789
|
-
}
|
|
58790
|
-
return group;
|
|
58791
|
-
}
|
|
58792
|
-
function resolveHomeGroup(config, ctx) {
|
|
58793
|
-
const fromPolicy = ctx?.subagentPolicy?.intercomGroup;
|
|
58794
|
-
if (typeof fromPolicy === "string" && fromPolicy.trim().length > 0) {
|
|
58795
|
-
return normalizeGroup(fromPolicy);
|
|
58796
|
-
}
|
|
58797
|
-
const fromContext = ctx?.orchestrationContext?.intercomGroup;
|
|
58798
|
-
if (typeof fromContext === "string" && fromContext.trim().length > 0) {
|
|
58799
|
-
return normalizeGroup(fromContext);
|
|
58800
|
-
}
|
|
58801
|
-
const fromEnv = intercomGroupFromEnv();
|
|
58802
|
-
if (typeof fromEnv === "string" && fromEnv.trim().length > 0) {
|
|
58803
|
-
return normalizeGroup(fromEnv);
|
|
58804
|
-
}
|
|
58805
|
-
if (config && typeof config.group === "string" && config.group.trim().length > 0) {
|
|
58806
|
-
return normalizeGroup(config.group);
|
|
58807
|
-
}
|
|
58808
|
-
return DEFAULT_GROUP;
|
|
58809
|
-
}
|
|
58810
|
-
var DEFAULT_GROUP = "default", RESERVED_RUNTIME_GROUPS;
|
|
58811
|
-
var init_group = __esm(() => {
|
|
58812
|
-
RESERVED_RUNTIME_GROUPS = new Set(["true", "auto"]);
|
|
58813
|
-
});
|
|
58814
|
-
|
|
58815
59095
|
// dist/builtin/intercom/intercom-utils.ts
|
|
58816
59096
|
function getErrorMessage(error) {
|
|
58817
59097
|
return error instanceof Error ? error.message : String(error);
|
|
@@ -59484,23 +59764,25 @@ workflow stage, use the exact \`<runId>:<stageKey>\` target; send messages to pe
|
|
|
59484
59764
|
queue automatically.
|
|
59485
59765
|
|
|
59486
59766
|
Usage:
|
|
59487
|
-
intercom({ action: "list" }) → List sessions
|
|
59488
|
-
intercom({ action: "list", group: "name" }) → Read-only peek at
|
|
59489
|
-
intercom({ action: "
|
|
59767
|
+
intercom({ action: "list" }) → List sessions visible through your groups
|
|
59768
|
+
intercom({ action: "list", group: "name" }) → Read-only peek at one group's sessions
|
|
59769
|
+
intercom({ action: "groups" }) → Discover every available group and your memberships
|
|
59770
|
+
intercom({ action: "join", group: "name" }) → Add a named group membership
|
|
59771
|
+
intercom({ action: "leave", group: "name" }) → Leave one named group
|
|
59490
59772
|
intercom({ action: "leave" }) → Return to your resolved home group
|
|
59491
|
-
intercom({ action: "send", to: "session-name", message: "..." }) → Send message (
|
|
59773
|
+
intercom({ action: "send", to: "session-name", message: "..." }) → Send message (shared group only)
|
|
59492
59774
|
intercom({ action: "ask", to: "session-name", message: "..." }) → Ask and wait for reply
|
|
59493
59775
|
intercom({ action: "reply", message: "..." }) → Reply to the active or exact pending ask
|
|
59494
59776
|
intercom({ action: "pending" }) → List unresolved inbound asks
|
|
59495
|
-
intercom({ action: "status" }) → Show connection status and your
|
|
59777
|
+
intercom({ action: "status" }) → Show connection status and all your groups
|
|
59496
59778
|
|
|
59497
|
-
The "join" action
|
|
59498
|
-
|
|
59499
|
-
|
|
59500
|
-
promptSnippet: "Use to coordinate with other local agent sessions
|
|
59779
|
+
The "join" action is additive. "default" is the shared default group; "true" and
|
|
59780
|
+
"auto" are reserved for subagent auto-groups. Ordinary delivery requires at least
|
|
59781
|
+
one shared membership; contact_supervisor remains the only cross-group path.`,
|
|
59782
|
+
promptSnippet: "Use to coordinate with other local agent sessions that share an intercom group: discover groups or peers, send updates, ask for help, or check connectivity. Ordinary messages require a shared membership.",
|
|
59501
59783
|
parameters: Type14.Object({
|
|
59502
59784
|
action: Type14.String({
|
|
59503
|
-
description: "Action: 'list', 'join', 'leave', 'send', 'ask', 'reply', 'pending', or 'status'"
|
|
59785
|
+
description: "Action: 'list', 'groups', 'join', 'leave', 'send', 'ask', 'reply', 'pending', or 'status'"
|
|
59504
59786
|
}),
|
|
59505
59787
|
to: Type14.Optional(Type14.String({
|
|
59506
59788
|
description: "Live session name, exact full session ID, or exact `<runId>:<stageKey>` for a known workflow stage; send messages to pending stages queue automatically (for 'send', 'ask', or targeted 'reply')"
|
|
@@ -59518,7 +59800,7 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
|
|
|
59518
59800
|
description: "Exact pending-ask message ID; disambiguates concurrent asks, including asks from one sender"
|
|
59519
59801
|
})),
|
|
59520
59802
|
group: Type14.Optional(Type14.String({
|
|
59521
|
-
description: "Group name for 'join'; read-only group filter for 'list'/'status'. 'send'/'ask'
|
|
59803
|
+
description: "Group name for 'join' or optional targeted 'leave'; read-only group filter for 'list'/'status'. 'send'/'ask' use shared memberships."
|
|
59522
59804
|
}))
|
|
59523
59805
|
}),
|
|
59524
59806
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
@@ -59534,17 +59816,20 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
|
|
|
59534
59816
|
}
|
|
59535
59817
|
syncPresenceIdentity(ctx.sessionManager.getSessionId());
|
|
59536
59818
|
const { action, to, message, attachments, replyTo, group } = params;
|
|
59537
|
-
const
|
|
59538
|
-
|
|
59539
|
-
|
|
59540
|
-
|
|
59541
|
-
|
|
59819
|
+
const resolveOwnGroups = (sessions) => {
|
|
59820
|
+
if (Array.isArray(connectedClient.groups)) {
|
|
59821
|
+
return connectedClient.groups.map((membership) => normalizeGroup(membership));
|
|
59822
|
+
}
|
|
59823
|
+
const self = sessions?.find((session) => session.id === connectedClient.sessionId);
|
|
59824
|
+
return [...normalizeGroups(self?.groups, self?.group)];
|
|
59542
59825
|
};
|
|
59826
|
+
const isOnlyOwnGroup = (candidate, ownGroups) => candidate !== undefined && ownGroups.length === 1 && ownGroups[0] === candidate;
|
|
59827
|
+
const requestedGroup = typeof group === "string" && group.trim() ? normalizeGroup(group) : undefined;
|
|
59543
59828
|
if ((action === "send" || action === "ask") && requestedGroup) {
|
|
59544
|
-
const
|
|
59545
|
-
if (requestedGroup
|
|
59829
|
+
const ownGroups = resolveOwnGroups();
|
|
59830
|
+
if (!ownGroups.includes(requestedGroup)) {
|
|
59546
59831
|
return {
|
|
59547
|
-
content: [{ type: "text", text: `The 'group' parameter is read-only for 'list'/'status'. '${action}' is always locked to your
|
|
59832
|
+
content: [{ type: "text", text: `The 'group' parameter is read-only for 'list'/'status'. '${action}' is always locked to your groups (${ownGroups.join(", ")}); it cannot target group "${requestedGroup}".` }],
|
|
59548
59833
|
isError: true,
|
|
59549
59834
|
details: { error: true }
|
|
59550
59835
|
};
|
|
@@ -59563,15 +59848,12 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
|
|
|
59563
59848
|
};
|
|
59564
59849
|
}
|
|
59565
59850
|
try {
|
|
59566
|
-
const
|
|
59567
|
-
|
|
59568
|
-
throw new Error(`Broker acknowledged group "${acknowledgedGroup}" instead of "${targetGroup}"`);
|
|
59569
|
-
}
|
|
59570
|
-
deps.setJoinedGroup(targetGroup);
|
|
59851
|
+
const groups = await connectedClient.joinGroup(targetGroup);
|
|
59852
|
+
deps.setJoinedGroups(groups);
|
|
59571
59853
|
return {
|
|
59572
|
-
content: [{ type: "text", text: `Joined intercom group "${targetGroup}".` }],
|
|
59854
|
+
content: [{ type: "text", text: `Joined intercom group "${targetGroup}". Memberships: ${groups.join(", ")}.` }],
|
|
59573
59855
|
isError: false,
|
|
59574
|
-
details: { group: targetGroup }
|
|
59856
|
+
details: { group: targetGroup, groups }
|
|
59575
59857
|
};
|
|
59576
59858
|
} catch (error) {
|
|
59577
59859
|
return {
|
|
@@ -59582,37 +59864,59 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
|
|
|
59582
59864
|
}
|
|
59583
59865
|
}
|
|
59584
59866
|
case "leave": {
|
|
59585
|
-
|
|
59867
|
+
let targetGroup;
|
|
59868
|
+
let homeGroup;
|
|
59869
|
+
try {
|
|
59870
|
+
targetGroup = typeof group === "string" && group.trim().length > 0 ? validateRuntimeGroup(group) : undefined;
|
|
59871
|
+
if (targetGroup === undefined)
|
|
59872
|
+
homeGroup = validateRuntimeGroup(deps.homeGroup());
|
|
59873
|
+
} catch (error) {
|
|
59586
59874
|
return {
|
|
59587
|
-
content: [{ type: "text", text:
|
|
59875
|
+
content: [{ type: "text", text: `Cannot leave intercom group: ${getErrorMessage(error)}` }],
|
|
59588
59876
|
isError: true,
|
|
59589
59877
|
details: { error: true }
|
|
59590
59878
|
};
|
|
59591
59879
|
}
|
|
59592
|
-
let targetGroup;
|
|
59593
59880
|
try {
|
|
59594
|
-
|
|
59881
|
+
let groups;
|
|
59882
|
+
if (targetGroup === undefined) {
|
|
59883
|
+
if (homeGroup === undefined)
|
|
59884
|
+
throw new Error("Intercom home group is unavailable");
|
|
59885
|
+
await connectedClient.updatePresenceAcked({ groups: [homeGroup] });
|
|
59886
|
+
groups = connectedClient.groups;
|
|
59887
|
+
deps.clearJoinedGroups();
|
|
59888
|
+
} else {
|
|
59889
|
+
groups = await connectedClient.leaveGroup(targetGroup);
|
|
59890
|
+
deps.setJoinedGroups(groups);
|
|
59891
|
+
}
|
|
59892
|
+
const text = targetGroup === undefined ? `Returned to home intercom membership. Memberships: ${groups.join(", ")}.` : `Left intercom group "${targetGroup}". Memberships: ${groups.join(", ")}.`;
|
|
59893
|
+
return {
|
|
59894
|
+
content: [{ type: "text", text }],
|
|
59895
|
+
isError: false,
|
|
59896
|
+
details: targetGroup === undefined ? { group: homeGroup, groups } : { groups }
|
|
59897
|
+
};
|
|
59595
59898
|
} catch (error) {
|
|
59596
59899
|
return {
|
|
59597
|
-
content: [{ type: "text", text: `
|
|
59900
|
+
content: [{ type: "text", text: `Failed to leave group: ${getErrorMessage(error)}` }],
|
|
59598
59901
|
isError: true,
|
|
59599
59902
|
details: { error: true }
|
|
59600
59903
|
};
|
|
59601
59904
|
}
|
|
59905
|
+
}
|
|
59906
|
+
case "groups": {
|
|
59602
59907
|
try {
|
|
59603
|
-
const
|
|
59604
|
-
|
|
59605
|
-
throw new Error(`Broker acknowledged group "${acknowledgedGroup}" instead of "${targetGroup}"`);
|
|
59606
|
-
}
|
|
59607
|
-
deps.clearJoinedGroup();
|
|
59908
|
+
const groups = await connectedClient.listGroups();
|
|
59909
|
+
const lines = groups.map(({ group: groupName, sessionCount, member }) => `- ${groupName} — ${sessionCount} session${sessionCount === 1 ? "" : "s"}${member ? " [member]" : ""}`);
|
|
59608
59910
|
return {
|
|
59609
|
-
content: [{ type: "text", text:
|
|
59911
|
+
content: [{ type: "text", text: `**Intercom groups:**
|
|
59912
|
+
${lines.join(`
|
|
59913
|
+
`)}` }],
|
|
59610
59914
|
isError: false,
|
|
59611
|
-
details: {
|
|
59915
|
+
details: { groups }
|
|
59612
59916
|
};
|
|
59613
59917
|
} catch (error) {
|
|
59614
59918
|
return {
|
|
59615
|
-
content: [{ type: "text", text: `Failed to
|
|
59919
|
+
content: [{ type: "text", text: `Failed to list groups: ${getErrorMessage(error)}` }],
|
|
59616
59920
|
isError: true,
|
|
59617
59921
|
details: { error: true }
|
|
59618
59922
|
};
|
|
@@ -59622,7 +59926,7 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
|
|
|
59622
59926
|
try {
|
|
59623
59927
|
const mySessionId = connectedClient.sessionId;
|
|
59624
59928
|
const ownSessions = await connectedClient.listSessions();
|
|
59625
|
-
const currentSession = ownSessions.find((
|
|
59929
|
+
const currentSession = ownSessions.find((session) => session.id === mySessionId);
|
|
59626
59930
|
if (!currentSession) {
|
|
59627
59931
|
return {
|
|
59628
59932
|
content: [{ type: "text", text: "Current session is missing from intercom session list." }],
|
|
@@ -59630,34 +59934,34 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
|
|
|
59630
59934
|
details: { error: true }
|
|
59631
59935
|
};
|
|
59632
59936
|
}
|
|
59633
|
-
const
|
|
59634
|
-
if (requestedGroup && requestedGroup
|
|
59937
|
+
const ownGroups = resolveOwnGroups(ownSessions);
|
|
59938
|
+
if (requestedGroup && !isOnlyOwnGroup(requestedGroup, ownGroups)) {
|
|
59635
59939
|
const peeked = await connectedClient.listSessions(requestedGroup);
|
|
59636
59940
|
const section = peeked.length === 0 ? `**Group [${requestedGroup}] (read-only peek):**
|
|
59637
59941
|
No sessions in this group.` : `**Group [${requestedGroup}] (read-only peek):**
|
|
59638
|
-
${peeked.map((
|
|
59942
|
+
${peeked.map((session) => formatSessionListRow(session, currentSession.cwd, session.id === mySessionId)).join(`
|
|
59639
59943
|
`)}`;
|
|
59640
59944
|
return {
|
|
59641
|
-
content: [{ type: "text", text: `Your
|
|
59945
|
+
content: [{ type: "text", text: `Your groups: ${ownGroups.join(", ")}
|
|
59642
59946
|
|
|
59643
59947
|
${section}` }],
|
|
59644
59948
|
isError: false,
|
|
59645
|
-
details: { group:
|
|
59949
|
+
details: { group: ownGroups.at(-1), groups: ownGroups, peekGroup: requestedGroup }
|
|
59646
59950
|
};
|
|
59647
59951
|
}
|
|
59648
|
-
const otherSessions = ownSessions.filter((
|
|
59649
|
-
const currentSection = `**Current session** (
|
|
59952
|
+
const otherSessions = ownSessions.filter((session) => session.id !== mySessionId);
|
|
59953
|
+
const currentSection = `**Current session** (groups: ${ownGroups.join(", ")}):
|
|
59650
59954
|
${formatSessionListRow(currentSession, currentSession.cwd, true)}`;
|
|
59651
59955
|
const otherSection = otherSessions.length === 0 ? `**Other sessions:**
|
|
59652
|
-
No other sessions
|
|
59653
|
-
${otherSessions.map((
|
|
59956
|
+
No other sessions share any of your groups.` : `**Other visible sessions:**
|
|
59957
|
+
${otherSessions.map((session) => formatSessionListRow(session, currentSession.cwd, false)).join(`
|
|
59654
59958
|
`)}`;
|
|
59655
59959
|
return {
|
|
59656
59960
|
content: [{ type: "text", text: `${currentSection}
|
|
59657
59961
|
|
|
59658
59962
|
${otherSection}` }],
|
|
59659
59963
|
isError: false,
|
|
59660
|
-
details: { group:
|
|
59964
|
+
details: { group: ownGroups.at(-1), groups: ownGroups }
|
|
59661
59965
|
};
|
|
59662
59966
|
} catch (error) {
|
|
59663
59967
|
return {
|
|
@@ -59965,21 +60269,26 @@ ${lines.join(`
|
|
|
59965
60269
|
try {
|
|
59966
60270
|
const mySessionId = connectedClient.sessionId;
|
|
59967
60271
|
const sessions = await connectedClient.listSessions();
|
|
59968
|
-
const
|
|
59969
|
-
const
|
|
59970
|
-
const
|
|
59971
|
-
|
|
60272
|
+
const ownGroups = resolveOwnGroups(sessions);
|
|
60273
|
+
const selectedGroup = isOnlyOwnGroup(requestedGroup, ownGroups) ? undefined : requestedGroup;
|
|
60274
|
+
const selectedGroupSessions = selectedGroup === undefined ? undefined : await connectedClient.listSessions(selectedGroup);
|
|
60275
|
+
const selectedSection = selectedGroupSessions === undefined ? "" : `
|
|
60276
|
+
Selected group [${selectedGroup}]: ${selectedGroupSessions.length} session(s)`;
|
|
59972
60277
|
return {
|
|
59973
60278
|
content: [{
|
|
59974
60279
|
type: "text",
|
|
59975
60280
|
text: `**Intercom Status:**
|
|
59976
60281
|
Connected: Yes
|
|
59977
60282
|
Session ID: ${mySessionId}
|
|
59978
|
-
|
|
59979
|
-
Active sessions
|
|
60283
|
+
Groups: ${ownGroups.join(", ")}
|
|
60284
|
+
Active visible sessions: ${sessions.length}${selectedSection}`
|
|
59980
60285
|
}],
|
|
59981
60286
|
isError: false,
|
|
59982
|
-
details: {
|
|
60287
|
+
details: {
|
|
60288
|
+
group: ownGroups.at(-1),
|
|
60289
|
+
groups: ownGroups,
|
|
60290
|
+
...selectedGroup === undefined ? {} : { selectedGroup, selectedGroupSessionCount: selectedGroupSessions?.length ?? 0 }
|
|
60291
|
+
}
|
|
59983
60292
|
};
|
|
59984
60293
|
} catch (error) {
|
|
59985
60294
|
return {
|
|
@@ -60433,8 +60742,6 @@ function registerIntercomLifecycle(pi, deps) {
|
|
|
60433
60742
|
deps.setSessionStartedAt(null);
|
|
60434
60743
|
}
|
|
60435
60744
|
pi.on("session_start", async (_event, ctx) => {
|
|
60436
|
-
if (!deps.config.enabled)
|
|
60437
|
-
return;
|
|
60438
60745
|
if (hasActiveSession)
|
|
60439
60746
|
await cleanupRuntime("Session replaced");
|
|
60440
60747
|
hasActiveSession = true;
|
|
@@ -61769,7 +62076,7 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
61769
62076
|
let runtimeGeneration = 0;
|
|
61770
62077
|
let agentRunning = false;
|
|
61771
62078
|
let sessionHomeGroup = null;
|
|
61772
|
-
let
|
|
62079
|
+
let joinedGroups = null;
|
|
61773
62080
|
const activeTools = new Map;
|
|
61774
62081
|
let replyTracker = new ReplyTracker;
|
|
61775
62082
|
const replyWaiters = new ReplyWaiterRegistry(DEFAULT_REPLY_TIMEOUT_MS, config.maxPendingAsks);
|
|
@@ -61824,19 +62131,21 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
61824
62131
|
function resolveSessionHomeGroup() {
|
|
61825
62132
|
return sessionHomeGroup ?? resolveHomeGroup(config, getLiveContext());
|
|
61826
62133
|
}
|
|
62134
|
+
function currentIntercomGroups() {
|
|
62135
|
+
return joinedGroups === null ? normalizeGroups(undefined, resolveSessionHomeGroup()) : new Set(joinedGroups);
|
|
62136
|
+
}
|
|
61827
62137
|
function currentIntercomGroup() {
|
|
61828
|
-
return
|
|
62138
|
+
return [...currentIntercomGroups()].at(-1) ?? resolveSessionHomeGroup();
|
|
61829
62139
|
}
|
|
61830
|
-
function
|
|
62140
|
+
function setJoinedGroups(groups) {
|
|
62141
|
+
joinedGroups = normalizeGroups(groups);
|
|
61831
62142
|
const sessionId = currentSessionId;
|
|
61832
|
-
if (
|
|
61833
|
-
|
|
61834
|
-
setRuntimeIntercomGroup(sessionId, group);
|
|
61835
|
-
joinedGroup = group;
|
|
62143
|
+
if (sessionId)
|
|
62144
|
+
setRuntimeIntercomGroup(sessionId, currentIntercomGroup());
|
|
61836
62145
|
}
|
|
61837
|
-
function
|
|
62146
|
+
function clearJoinedGroups() {
|
|
62147
|
+
joinedGroups = null;
|
|
61838
62148
|
const sessionId = currentSessionId;
|
|
61839
|
-
joinedGroup = null;
|
|
61840
62149
|
if (sessionId)
|
|
61841
62150
|
clearRuntimeIntercomGroup(sessionId);
|
|
61842
62151
|
}
|
|
@@ -61854,6 +62163,7 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
61854
62163
|
startedAt: sessionStartedAt,
|
|
61855
62164
|
lastActivity: Date.now(),
|
|
61856
62165
|
status: currentStatus(),
|
|
62166
|
+
groups: [...currentIntercomGroups()],
|
|
61857
62167
|
group: currentIntercomGroup()
|
|
61858
62168
|
};
|
|
61859
62169
|
}
|
|
@@ -62273,7 +62583,7 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
62273
62583
|
const nextClient = new IntercomClient(`${currentSessionId}:pending-stage-route:${runId}`);
|
|
62274
62584
|
state.client = nextClient;
|
|
62275
62585
|
attachPendingStageRouteClientHandlers(runId, state, nextClient);
|
|
62276
|
-
await nextClient.connect({ ...buildRegistration(), name: undefined, group: normalizeGroup(route.group) }, undefined, undefined, readSubagentMessageSource(runtimeContext?.subagentPolicy));
|
|
62586
|
+
await nextClient.connect({ ...buildRegistration(), name: undefined, groups: [normalizeGroup(route.group)], group: normalizeGroup(route.group) }, undefined, undefined, readSubagentMessageSource(runtimeContext?.subagentPolicy));
|
|
62277
62587
|
if (!pendingStageRouteClientIsCurrent(runId, state, contextAtStart, generationAtStart)) {
|
|
62278
62588
|
await nextClient.disconnect();
|
|
62279
62589
|
throw new Error("Intercom runtime no longer active");
|
|
@@ -62332,9 +62642,6 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
62332
62642
|
await ensurePendingStageRouteClient(runId, { ...route, group: routeGroup });
|
|
62333
62643
|
}
|
|
62334
62644
|
async function ensureConnected(reason) {
|
|
62335
|
-
if (!config.enabled) {
|
|
62336
|
-
throw new Error("Intercom disabled");
|
|
62337
|
-
}
|
|
62338
62645
|
if (disposed || shuttingDown) {
|
|
62339
62646
|
throw new Error("Intercom shutting down");
|
|
62340
62647
|
}
|
|
@@ -62476,7 +62783,7 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
62476
62783
|
clearReconnectTimer,
|
|
62477
62784
|
setRuntimeContext: (value) => {
|
|
62478
62785
|
if (value === null) {
|
|
62479
|
-
|
|
62786
|
+
clearJoinedGroups();
|
|
62480
62787
|
sessionHomeGroup = null;
|
|
62481
62788
|
} else {
|
|
62482
62789
|
sessionHomeGroup = resolveHomeGroup(config, value);
|
|
@@ -62539,8 +62846,8 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
62539
62846
|
beginReplyWait: (from, replyTo, signal) => replyWaiters.begin(from, replyTo, signal),
|
|
62540
62847
|
confirmSend: config.confirmSend,
|
|
62541
62848
|
homeGroup: resolveSessionHomeGroup,
|
|
62542
|
-
|
|
62543
|
-
|
|
62849
|
+
setJoinedGroups,
|
|
62850
|
+
clearJoinedGroups,
|
|
62544
62851
|
replyTracker: () => replyTracker
|
|
62545
62852
|
});
|
|
62546
62853
|
registerIntercomOverlay(pi, {
|