@caupulican/pi-adaptative 0.90.7 → 0.90.12
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 +56 -0
- package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +5 -4
- package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +6 -3
- package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +1 -0
- package/dist/core/agent-session-contracts.d.ts +2 -0
- package/dist/core/agent-session-contracts.d.ts.map +1 -1
- package/dist/core/agent-session-contracts.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -197
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts +7 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +8 -2
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/contracts.d.ts +1 -1
- package/dist/core/autonomy/contracts.d.ts.map +1 -1
- package/dist/core/autonomy/contracts.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +14 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +32 -0
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/billing-failover-controller.js +1 -1
- package/dist/core/billing-failover-controller.js.map +1 -1
- package/dist/core/context/current-work-memory.d.ts +1 -1
- package/dist/core/context/current-work-memory.d.ts.map +1 -1
- package/dist/core/context/current-work-memory.js +2 -1
- package/dist/core/context/current-work-memory.js.map +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
- package/dist/core/context/long-term-memory-trigger.js +2 -1
- package/dist/core/context/long-term-memory-trigger.js.map +1 -1
- package/dist/core/delegation/managed-lane-controller.js +2 -2
- package/dist/core/delegation/managed-lane-controller.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +13 -0
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +71 -8
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +13 -8
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/worker-claim.js +14 -1
- package/dist/core/delegation/worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +3 -2
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +95 -42
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.js +5 -1
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
- package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
- package/dist/core/delegation/worker-lane-projection.js +7 -4
- package/dist/core/delegation/worker-lane-projection.js.map +1 -1
- package/dist/core/delegation/worker-lifecycle.d.ts +8 -0
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts +21 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +65 -2
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +7 -0
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +24 -7
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-system-prompt.d.ts +54 -0
- package/dist/core/delegation/worker-system-prompt.d.ts.map +1 -0
- package/dist/core/delegation/worker-system-prompt.js +85 -0
- package/dist/core/delegation/worker-system-prompt.js.map +1 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.js +4 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +4 -0
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +28 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.js +14 -3
- package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
- package/dist/core/extension-binding-controller.d.ts +107 -0
- package/dist/core/extension-binding-controller.d.ts.map +1 -0
- package/dist/core/extension-binding-controller.js +224 -0
- package/dist/core/extension-binding-controller.js.map +1 -0
- package/dist/core/extensions/extension-session-scope.d.ts +17 -0
- package/dist/core/extensions/extension-session-scope.d.ts.map +1 -0
- package/dist/core/extensions/extension-session-scope.js +135 -0
- package/dist/core/extensions/extension-session-scope.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -0
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +2 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +10 -4
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +9 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +35 -9
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +10 -1
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts +1 -1
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
- package/dist/core/goals/compact-goal-context.js +2 -1
- package/dist/core/goals/compact-goal-context.js.map +1 -1
- package/dist/core/goals/goal-execution-errors.d.ts +18 -0
- package/dist/core/goals/goal-execution-errors.d.ts.map +1 -0
- package/dist/core/goals/goal-execution-errors.js +21 -0
- package/dist/core/goals/goal-execution-errors.js.map +1 -0
- package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
- package/dist/core/goals/goal-lifecycle.js +3 -3
- package/dist/core/goals/goal-lifecycle.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +11 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +74 -14
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-state.js +1 -1
- package/dist/core/goals/goal-state.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +2 -2
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/goals/natural-language-goal.d.ts +18 -0
- package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
- package/dist/core/goals/natural-language-goal.js +99 -16
- package/dist/core/goals/natural-language-goal.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +10 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +3 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/orchestration/capability-gateway.d.ts +1 -1
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +4 -4
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/event-store.d.ts +8 -0
- package/dist/core/orchestration/event-store.d.ts.map +1 -1
- package/dist/core/orchestration/event-store.js +9 -7
- package/dist/core/orchestration/event-store.js.map +1 -1
- package/dist/core/orchestration/task-runtime-reducer.js +1 -1
- package/dist/core/orchestration/task-runtime-reducer.js.map +1 -1
- package/dist/core/orchestration/worker-model-pins.d.ts +7 -0
- package/dist/core/orchestration/worker-model-pins.d.ts.map +1 -1
- package/dist/core/orchestration/worker-model-pins.js +17 -1
- package/dist/core/orchestration/worker-model-pins.js.map +1 -1
- package/dist/core/provider-request-runtime-controller.d.ts +9 -0
- package/dist/core/provider-request-runtime-controller.d.ts.map +1 -1
- package/dist/core/provider-request-runtime-controller.js +17 -3
- package/dist/core/provider-request-runtime-controller.js.map +1 -1
- package/dist/core/provider-tool-text.d.ts +15 -1
- package/dist/core/provider-tool-text.d.ts.map +1 -1
- package/dist/core/provider-tool-text.js +42 -10
- package/dist/core/provider-tool-text.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts +1 -1
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +2 -1
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +3 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +8 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +8 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +6 -0
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/session-supervision-runtime.d.ts.map +1 -1
- package/dist/core/session-supervision-runtime.js +2 -1
- package/dist/core/session-supervision-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +7 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tasks/task-state.d.ts +1 -1
- package/dist/core/tasks/task-state.d.ts.map +1 -1
- package/dist/core/tasks/task-state.js +4 -2
- package/dist/core/tasks/task-state.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +13 -0
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +20 -18
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +7 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +8 -6
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/core/util/faultable-fs.d.ts +30 -0
- package/dist/core/util/faultable-fs.d.ts.map +1 -0
- package/dist/core/util/faultable-fs.js +30 -0
- package/dist/core/util/faultable-fs.js.map +1 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +1 -0
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +4 -3
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +2 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -2
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/report-commands.js +1 -1
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/session-flow-commands.d.ts +1 -1
- package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
- package/dist/modes/interactive/session-flow-commands.js +3 -2
- package/dist/modes/interactive/session-flow-commands.js.map +1 -1
- package/docs/extensions.md +1 -0
- package/docs/providers.md +3 -0
- package/docs/settings.md +4 -2
- package/docs/tool-repair.md +1 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +9 -4
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension runtime binding: the boundary between {@link AgentSession} and the {@link
|
|
3
|
+
* ExtensionRunner} it hosts. Owns the public `bindExtensions()` entry point (stores the
|
|
4
|
+
* host-supplied UI/mode/callback bindings, applies them to the runner, fires the session-start
|
|
5
|
+
* event, discovers extension-contributed resources, and initializes memory), the resource
|
|
6
|
+
* discovery pass that turns extension-reported skill/prompt/theme paths into labeled {@link
|
|
7
|
+
* ResourceExtensionPaths}, and `bindExtensionCore` — the ~30-method translation of the session's
|
|
8
|
+
* own public surface (send message, set model, compact, abort, reload, …) into the `ExtensionActions`
|
|
9
|
+
* / `ExtensionContextActions` shape `ExtensionRunner.bindCore` expects.
|
|
10
|
+
*
|
|
11
|
+
* Extracted verbatim from agent-session.ts (god-file decomposition). All logic here is pure code
|
|
12
|
+
* motion — no behavior changes. State that other collaborators (RuntimeBuilder, LocalRuntimeController,
|
|
13
|
+
* HumanInputController) also read (`_extensionUIContext`, `_extensionMode`, `_extensionCommandContextActions`,
|
|
14
|
+
* `_extensionShutdownHandler`, `_extensionErrorListener`) stays host-owned and is reached through the
|
|
15
|
+
* same get/set deps accessors those collaborators already use; `_extensionAbortHandler` and the
|
|
16
|
+
* error-unsubscribe callback are touched only within this binding boundary, so they are owned here.
|
|
17
|
+
*
|
|
18
|
+
* Host-binding boundary note (see runtime-builder.ts): `bindExtensionCore` exposes session identity
|
|
19
|
+
* to the extension runner, not tool-registry build logic, which is why it lives in its own dedicated
|
|
20
|
+
* module rather than inside RuntimeBuilder; RuntimeBuilder still invokes it (and `applyExtensionBindings`
|
|
21
|
+
* / `extendResourcesFromExtensions`) through {@link RuntimeBuilderDeps}, one level further delegated.
|
|
22
|
+
*/
|
|
23
|
+
import { basename, dirname } from "node:path";
|
|
24
|
+
export class ExtensionBindingController {
|
|
25
|
+
constructor(deps) {
|
|
26
|
+
this.deps = deps;
|
|
27
|
+
}
|
|
28
|
+
async bindExtensions(bindings) {
|
|
29
|
+
if (bindings.uiContext !== undefined) {
|
|
30
|
+
this.deps.setExtensionUIContext(bindings.uiContext);
|
|
31
|
+
}
|
|
32
|
+
if (bindings.mode !== undefined) {
|
|
33
|
+
this.deps.setExtensionMode(bindings.mode);
|
|
34
|
+
}
|
|
35
|
+
if (bindings.commandContextActions !== undefined) {
|
|
36
|
+
this.deps.setExtensionCommandContextActions(bindings.commandContextActions);
|
|
37
|
+
}
|
|
38
|
+
if (bindings.abortHandler !== undefined) {
|
|
39
|
+
this.extensionAbortHandler = bindings.abortHandler;
|
|
40
|
+
}
|
|
41
|
+
if (bindings.shutdownHandler !== undefined) {
|
|
42
|
+
this.deps.setExtensionShutdownHandler(bindings.shutdownHandler);
|
|
43
|
+
}
|
|
44
|
+
if (bindings.onError !== undefined) {
|
|
45
|
+
this.deps.setExtensionErrorListener(bindings.onError);
|
|
46
|
+
}
|
|
47
|
+
this.applyExtensionBindings(this.deps.getExtensionRunner());
|
|
48
|
+
await this.deps.getExtensionRunner().emit(this.deps.getSessionStartEvent());
|
|
49
|
+
await this.extendResourcesFromExtensions(this.deps.getSessionStartEvent().reason === "reload" ? "reload" : "startup");
|
|
50
|
+
// Initialize the memory subsystem after extensions have had a chance to register providers.
|
|
51
|
+
await this.deps.initializeMemory();
|
|
52
|
+
}
|
|
53
|
+
async extendResourcesFromExtensions(reason) {
|
|
54
|
+
const runner = this.deps.getExtensionRunner();
|
|
55
|
+
if (!runner.hasHandlers("resources_discover")) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const { skillPaths, promptPaths, themePaths } = await runner.emitResourcesDiscover(this.deps.getCwd(), reason);
|
|
59
|
+
if (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const extensionPaths = {
|
|
63
|
+
skillPaths: this.buildExtensionResourcePaths(skillPaths),
|
|
64
|
+
promptPaths: this.buildExtensionResourcePaths(promptPaths),
|
|
65
|
+
themePaths: this.buildExtensionResourcePaths(themePaths),
|
|
66
|
+
};
|
|
67
|
+
this.deps.getResourceLoader().extendResources(extensionPaths);
|
|
68
|
+
const rebuiltSystemPrompt = this.deps.rebuildSystemPrompt(this.deps.getActiveToolNames());
|
|
69
|
+
this.deps.setBaseSystemPrompt(rebuiltSystemPrompt);
|
|
70
|
+
this.deps.getAgent().state.systemPrompt = rebuiltSystemPrompt;
|
|
71
|
+
}
|
|
72
|
+
buildExtensionResourcePaths(entries) {
|
|
73
|
+
return entries.map((entry) => {
|
|
74
|
+
const source = this.getExtensionSourceLabel(entry.extensionPath);
|
|
75
|
+
const baseDir = entry.extensionPath.startsWith("<") ? undefined : dirname(entry.extensionPath);
|
|
76
|
+
return {
|
|
77
|
+
path: entry.path,
|
|
78
|
+
metadata: {
|
|
79
|
+
source,
|
|
80
|
+
scope: "temporary",
|
|
81
|
+
origin: "top-level",
|
|
82
|
+
baseDir,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
getExtensionSourceLabel(extensionPath) {
|
|
88
|
+
if (extensionPath.startsWith("<")) {
|
|
89
|
+
return `extension:${extensionPath.replace(/[<>]/g, "")}`;
|
|
90
|
+
}
|
|
91
|
+
const base = basename(extensionPath);
|
|
92
|
+
const name = base.replace(/\.(ts|js)$/, "");
|
|
93
|
+
return `extension:${name}`;
|
|
94
|
+
}
|
|
95
|
+
applyExtensionBindings(runner) {
|
|
96
|
+
runner.setUIContext(this.deps.getExtensionUIContext());
|
|
97
|
+
runner.setMode(this.deps.getExtensionMode());
|
|
98
|
+
runner.bindCommandContext(this.deps.getExtensionCommandContextActions());
|
|
99
|
+
this.extensionErrorUnsubscriber?.();
|
|
100
|
+
const errorListener = this.deps.getExtensionErrorListener();
|
|
101
|
+
this.extensionErrorUnsubscriber = errorListener ? runner.onError(errorListener) : undefined;
|
|
102
|
+
}
|
|
103
|
+
bindExtensionCore(runner) {
|
|
104
|
+
const getCommands = () => {
|
|
105
|
+
const extensionCommands = runner.getRegisteredCommands().map((command) => ({
|
|
106
|
+
name: command.invocationName,
|
|
107
|
+
description: command.description,
|
|
108
|
+
source: "extension",
|
|
109
|
+
sourceInfo: command.sourceInfo,
|
|
110
|
+
}));
|
|
111
|
+
const templates = this.deps.getPromptTemplates().map((template) => ({
|
|
112
|
+
name: template.name,
|
|
113
|
+
description: template.description,
|
|
114
|
+
source: "prompt",
|
|
115
|
+
sourceInfo: template.sourceInfo,
|
|
116
|
+
}));
|
|
117
|
+
const skills = this.deps
|
|
118
|
+
.getResourceLoader()
|
|
119
|
+
.getActiveSkills()
|
|
120
|
+
.map((skill) => ({
|
|
121
|
+
name: `skill:${skill.name}`,
|
|
122
|
+
description: skill.description,
|
|
123
|
+
source: "skill",
|
|
124
|
+
sourceInfo: skill.sourceInfo,
|
|
125
|
+
}));
|
|
126
|
+
return [...extensionCommands, ...templates, ...skills];
|
|
127
|
+
};
|
|
128
|
+
runner.bindCore({
|
|
129
|
+
sendMessage: (message, options) => {
|
|
130
|
+
this.deps.sendCustomMessage(message, options).catch((err) => {
|
|
131
|
+
runner.emitError({
|
|
132
|
+
extensionPath: "<runtime>",
|
|
133
|
+
event: "send_message",
|
|
134
|
+
error: err instanceof Error ? err.message : String(err),
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
sendUserMessage: (content, options) => {
|
|
139
|
+
this.deps.sendUserMessage(content, options).catch((err) => {
|
|
140
|
+
runner.emitError({
|
|
141
|
+
extensionPath: "<runtime>",
|
|
142
|
+
event: "send_user_message",
|
|
143
|
+
error: err instanceof Error ? err.message : String(err),
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
appendEntry: (customType, data) => {
|
|
148
|
+
this.deps.getSessionManager().appendCustomEntry(customType, data);
|
|
149
|
+
},
|
|
150
|
+
setSessionName: (name) => {
|
|
151
|
+
this.deps.setSessionName(name);
|
|
152
|
+
},
|
|
153
|
+
getSessionName: () => {
|
|
154
|
+
return this.deps.getSessionManager().getSessionName();
|
|
155
|
+
},
|
|
156
|
+
setLabel: (entryId, label) => {
|
|
157
|
+
this.deps.getSessionManager().appendLabelChange(entryId, label);
|
|
158
|
+
},
|
|
159
|
+
getActiveTools: () => this.deps.getActiveToolNames(),
|
|
160
|
+
getAllTools: () => this.deps.getAllTools(),
|
|
161
|
+
setActiveTools: (toolNames) => this.deps.setActiveToolsByName(toolNames),
|
|
162
|
+
refreshTools: () => this.deps.refreshToolRegistry(),
|
|
163
|
+
getCommands,
|
|
164
|
+
setModel: async (model) => {
|
|
165
|
+
if (!this.deps.getModelRegistry().hasConfiguredAuth(model))
|
|
166
|
+
return false;
|
|
167
|
+
await this.deps.setModel(model);
|
|
168
|
+
return true;
|
|
169
|
+
},
|
|
170
|
+
getThinkingLevel: () => this.deps.getThinkingLevel(),
|
|
171
|
+
setThinkingLevel: (level) => this.deps.setThinkingLevel(level),
|
|
172
|
+
getExternalResourceRoots: () => this.deps.getSettingsManager().getEffectiveExternalResourceRoots(),
|
|
173
|
+
registerMemoryProvider: (provider) => this.deps.registerMemoryProvider(provider),
|
|
174
|
+
registerContextMemoryProvider: (provider) => this.deps.registerContextMemoryProvider(provider),
|
|
175
|
+
reportSpawnedUsage: (usage, opts) => {
|
|
176
|
+
this.deps.addSpawnedUsage(usage, opts);
|
|
177
|
+
},
|
|
178
|
+
reportManagedLane: (event) => {
|
|
179
|
+
this.deps.recordManagedLane(event);
|
|
180
|
+
},
|
|
181
|
+
}, {
|
|
182
|
+
getModel: () => this.deps.getModel(),
|
|
183
|
+
isIdle: () => !this.deps.isForegroundBusy(),
|
|
184
|
+
getSignal: () => this.deps.getAgent().signal,
|
|
185
|
+
abort: () => {
|
|
186
|
+
if (this.extensionAbortHandler) {
|
|
187
|
+
this.extensionAbortHandler();
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
void this.deps.abort();
|
|
191
|
+
},
|
|
192
|
+
hasPendingMessages: () => this.deps.getPendingMessageCount() > 0,
|
|
193
|
+
shutdown: () => {
|
|
194
|
+
this.deps.getExtensionShutdownHandler()?.();
|
|
195
|
+
},
|
|
196
|
+
getContextUsage: () => this.deps.getContextUsage(),
|
|
197
|
+
compact: (options) => this.deps.compactForExtension(options),
|
|
198
|
+
reload: () => {
|
|
199
|
+
if (this.deps.isStreaming()) {
|
|
200
|
+
return Promise.reject(new Error("ctx.reload() cannot run while the agent is streaming or a tool call is active. Wait for ctx.isIdle(), queue a follow-up /reload, or use an idle command/event handler so hot reload cannot destabilize the UI."));
|
|
201
|
+
}
|
|
202
|
+
if (this.deps.isCompacting()) {
|
|
203
|
+
return Promise.reject(new Error("ctx.reload() cannot run during context compaction or branch summarization. Let compaction finish before reloading so the session tree and UI remain stable."));
|
|
204
|
+
}
|
|
205
|
+
const actions = this.deps.getExtensionCommandContextActions();
|
|
206
|
+
if (!actions) {
|
|
207
|
+
return this.deps.reload();
|
|
208
|
+
}
|
|
209
|
+
return actions.reload();
|
|
210
|
+
},
|
|
211
|
+
getSystemPrompt: () => this.deps.getSystemPrompt(),
|
|
212
|
+
}, {
|
|
213
|
+
registerProvider: (name, config) => {
|
|
214
|
+
this.deps.getModelRegistry().registerProvider(name, config);
|
|
215
|
+
this.deps.refreshCurrentModelFromRegistry();
|
|
216
|
+
},
|
|
217
|
+
unregisterProvider: (name) => {
|
|
218
|
+
this.deps.getModelRegistry().unregisterProvider(name);
|
|
219
|
+
this.deps.refreshCurrentModelFromRegistry();
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=extension-binding-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-binding-controller.js","sourceRoot":"","sources":["../../src/core/extension-binding-controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension runtime binding: the boundary between {@link AgentSession} and the {@link\n * ExtensionRunner} it hosts. Owns the public `bindExtensions()` entry point (stores the\n * host-supplied UI/mode/callback bindings, applies them to the runner, fires the session-start\n * event, discovers extension-contributed resources, and initializes memory), the resource\n * discovery pass that turns extension-reported skill/prompt/theme paths into labeled {@link\n * ResourceExtensionPaths}, and `bindExtensionCore` — the ~30-method translation of the session's\n * own public surface (send message, set model, compact, abort, reload, …) into the `ExtensionActions`\n * / `ExtensionContextActions` shape `ExtensionRunner.bindCore` expects.\n *\n * Extracted verbatim from agent-session.ts (god-file decomposition). All logic here is pure code\n * motion — no behavior changes. State that other collaborators (RuntimeBuilder, LocalRuntimeController,\n * HumanInputController) also read (`_extensionUIContext`, `_extensionMode`, `_extensionCommandContextActions`,\n * `_extensionShutdownHandler`, `_extensionErrorListener`) stays host-owned and is reached through the\n * same get/set deps accessors those collaborators already use; `_extensionAbortHandler` and the\n * error-unsubscribe callback are touched only within this binding boundary, so they are owned here.\n *\n * Host-binding boundary note (see runtime-builder.ts): `bindExtensionCore` exposes session identity\n * to the extension runner, not tool-registry build logic, which is why it lives in its own dedicated\n * module rather than inside RuntimeBuilder; RuntimeBuilder still invokes it (and `applyExtensionBindings`\n * / `extendResourcesFromExtensions`) through {@link RuntimeBuilderDeps}, one level further delegated.\n */\n\nimport { basename, dirname } from \"node:path\";\nimport type { Agent, ThinkingLevel } from \"@caupulican/pi-agent-core\";\nimport type { CustomMessage } from \"@caupulican/pi-agent-core/messages\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Api, ImageContent, Model, TextContent, Usage } from \"@caupulican/pi-ai\";\nimport type { ExtensionBindings } from \"./agent-session-contracts.ts\";\nimport type { MemoryProvider as ContextMemoryProvider } from \"./context/memory-provider-contract.ts\";\nimport type {\n\tCompactOptions,\n\tContextUsage,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionErrorListener,\n\tExtensionRunner,\n\tExtensionUIContext,\n\tSessionStartEvent,\n\tShutdownHandler,\n\tToolInfo,\n} from \"./extensions/index.ts\";\nimport type { ManagedLaneEvent } from \"./extensions/types.ts\";\nimport type { MemoryProvider } from \"./memory/memory-provider.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { ResourceExtensionPaths, ResourceLoader } from \"./resource-loader.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport type { SlashCommandInfo } from \"./slash-commands.ts\";\n\nexport interface ExtensionBindingControllerDeps {\n\tgetAgent(): Agent;\n\tgetExtensionRunner(): ExtensionRunner;\n\tgetSessionStartEvent(): SessionStartEvent;\n\tgetCwd(): string;\n\tgetResourceLoader(): ResourceLoader;\n\tgetSessionManager(): SessionManager;\n\tgetSettingsManager(): SettingsManager;\n\tgetModelRegistry(): ModelRegistry;\n\tgetModel(): Model<Api> | undefined;\n\tgetActiveToolNames(): string[];\n\tgetAllTools(): ToolInfo[];\n\tsetActiveToolsByName(toolNames: string[]): void;\n\trefreshToolRegistry(): void;\n\trebuildSystemPrompt(toolNames: string[]): string;\n\tsetBaseSystemPrompt(prompt: string): void;\n\tgetPromptTemplates(): ReadonlyArray<PromptTemplate>;\n\tgetThinkingLevel(): ThinkingLevel;\n\tsetThinkingLevel(level: ThinkingLevel): void;\n\tsetModel(model: Model<Api>): Promise<void>;\n\tsendCustomMessage(\n\t\tmessage: Pick<CustomMessage, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; processSlashCommands?: boolean },\n\t): Promise<void>;\n\tsetSessionName(name: string): void;\n\tregisterMemoryProvider(provider: MemoryProvider): void;\n\tregisterContextMemoryProvider(provider: ContextMemoryProvider): void;\n\taddSpawnedUsage(\n\t\tusage: Usage,\n\t\topts?: { label?: string; sourceSessionId?: string; reportId?: string },\n\t): string | undefined;\n\trecordManagedLane(event: ManagedLaneEvent): void;\n\tisForegroundBusy(): boolean;\n\tgetPendingMessageCount(): number;\n\tisStreaming(): boolean;\n\tisCompacting(): boolean;\n\tgetContextUsage(): ContextUsage | undefined;\n\tcompactForExtension(options?: CompactOptions): void;\n\treload(): Promise<void>;\n\tabort(): Promise<void>;\n\tgetSystemPrompt(): string;\n\tgetExtensionCommandContextActions(): ExtensionCommandContextActions | undefined;\n\trefreshCurrentModelFromRegistry(): void;\n\tinitializeMemory(): Promise<void>;\n\tgetExtensionUIContext(): ExtensionUIContext | undefined;\n\tsetExtensionUIContext(uiContext: ExtensionUIContext | undefined): void;\n\tgetExtensionMode(): ExtensionContext[\"mode\"];\n\tsetExtensionMode(mode: ExtensionContext[\"mode\"]): void;\n\tsetExtensionCommandContextActions(actions: ExtensionCommandContextActions | undefined): void;\n\tgetExtensionShutdownHandler(): ShutdownHandler | undefined;\n\tsetExtensionShutdownHandler(handler: ShutdownHandler | undefined): void;\n\tgetExtensionErrorListener(): ExtensionErrorListener | undefined;\n\tsetExtensionErrorListener(listener: ExtensionErrorListener | undefined): void;\n}\n\nexport class ExtensionBindingController {\n\tprivate readonly deps: ExtensionBindingControllerDeps;\n\tprivate extensionAbortHandler?: () => void;\n\tprivate extensionErrorUnsubscriber?: () => void;\n\n\tconstructor(deps: ExtensionBindingControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tasync bindExtensions(bindings: ExtensionBindings): Promise<void> {\n\t\tif (bindings.uiContext !== undefined) {\n\t\t\tthis.deps.setExtensionUIContext(bindings.uiContext);\n\t\t}\n\t\tif (bindings.mode !== undefined) {\n\t\t\tthis.deps.setExtensionMode(bindings.mode);\n\t\t}\n\t\tif (bindings.commandContextActions !== undefined) {\n\t\t\tthis.deps.setExtensionCommandContextActions(bindings.commandContextActions);\n\t\t}\n\t\tif (bindings.abortHandler !== undefined) {\n\t\t\tthis.extensionAbortHandler = bindings.abortHandler;\n\t\t}\n\t\tif (bindings.shutdownHandler !== undefined) {\n\t\t\tthis.deps.setExtensionShutdownHandler(bindings.shutdownHandler);\n\t\t}\n\t\tif (bindings.onError !== undefined) {\n\t\t\tthis.deps.setExtensionErrorListener(bindings.onError);\n\t\t}\n\n\t\tthis.applyExtensionBindings(this.deps.getExtensionRunner());\n\t\tawait this.deps.getExtensionRunner().emit(this.deps.getSessionStartEvent());\n\t\tawait this.extendResourcesFromExtensions(\n\t\t\tthis.deps.getSessionStartEvent().reason === \"reload\" ? \"reload\" : \"startup\",\n\t\t);\n\t\t// Initialize the memory subsystem after extensions have had a chance to register providers.\n\t\tawait this.deps.initializeMemory();\n\t}\n\n\tasync extendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void> {\n\t\tconst runner = this.deps.getExtensionRunner();\n\t\tif (!runner.hasHandlers(\"resources_discover\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { skillPaths, promptPaths, themePaths } = await runner.emitResourcesDiscover(this.deps.getCwd(), reason);\n\n\t\tif (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst extensionPaths: ResourceExtensionPaths = {\n\t\t\tskillPaths: this.buildExtensionResourcePaths(skillPaths),\n\t\t\tpromptPaths: this.buildExtensionResourcePaths(promptPaths),\n\t\t\tthemePaths: this.buildExtensionResourcePaths(themePaths),\n\t\t};\n\n\t\tthis.deps.getResourceLoader().extendResources(extensionPaths);\n\t\tconst rebuiltSystemPrompt = this.deps.rebuildSystemPrompt(this.deps.getActiveToolNames());\n\t\tthis.deps.setBaseSystemPrompt(rebuiltSystemPrompt);\n\t\tthis.deps.getAgent().state.systemPrompt = rebuiltSystemPrompt;\n\t}\n\n\tprivate buildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}> {\n\t\treturn entries.map((entry) => {\n\t\t\tconst source = this.getExtensionSourceLabel(entry.extensionPath);\n\t\t\tconst baseDir = entry.extensionPath.startsWith(\"<\") ? undefined : dirname(entry.extensionPath);\n\t\t\treturn {\n\t\t\t\tpath: entry.path,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tscope: \"temporary\",\n\t\t\t\t\torigin: \"top-level\",\n\t\t\t\t\tbaseDir,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate getExtensionSourceLabel(extensionPath: string): string {\n\t\tif (extensionPath.startsWith(\"<\")) {\n\t\t\treturn `extension:${extensionPath.replace(/[<>]/g, \"\")}`;\n\t\t}\n\t\tconst base = basename(extensionPath);\n\t\tconst name = base.replace(/\\.(ts|js)$/, \"\");\n\t\treturn `extension:${name}`;\n\t}\n\n\tapplyExtensionBindings(runner: ExtensionRunner): void {\n\t\trunner.setUIContext(this.deps.getExtensionUIContext());\n\t\trunner.setMode(this.deps.getExtensionMode());\n\t\trunner.bindCommandContext(this.deps.getExtensionCommandContextActions());\n\n\t\tthis.extensionErrorUnsubscriber?.();\n\t\tconst errorListener = this.deps.getExtensionErrorListener();\n\t\tthis.extensionErrorUnsubscriber = errorListener ? runner.onError(errorListener) : undefined;\n\t}\n\n\tbindExtensionCore(runner: ExtensionRunner): void {\n\t\tconst getCommands = (): SlashCommandInfo[] => {\n\t\t\tconst extensionCommands: SlashCommandInfo[] = runner.getRegisteredCommands().map((command) => ({\n\t\t\t\tname: command.invocationName,\n\t\t\t\tdescription: command.description,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t}));\n\n\t\t\tconst templates: SlashCommandInfo[] = this.deps.getPromptTemplates().map((template) => ({\n\t\t\t\tname: template.name,\n\t\t\t\tdescription: template.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t}));\n\n\t\t\tconst skills: SlashCommandInfo[] = this.deps\n\t\t\t\t.getResourceLoader()\n\t\t\t\t.getActiveSkills()\n\t\t\t\t.map((skill) => ({\n\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t}));\n\n\t\t\treturn [...extensionCommands, ...templates, ...skills];\n\t\t};\n\n\t\trunner.bindCore(\n\t\t\t{\n\t\t\t\tsendMessage: (message, options) => {\n\t\t\t\t\tthis.deps.sendCustomMessage(message, options).catch((err) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: \"<runtime>\",\n\t\t\t\t\t\t\tevent: \"send_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tsendUserMessage: (content, options) => {\n\t\t\t\t\tthis.deps.sendUserMessage(content, options).catch((err) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: \"<runtime>\",\n\t\t\t\t\t\t\tevent: \"send_user_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType, data) => {\n\t\t\t\t\tthis.deps.getSessionManager().appendCustomEntry(customType, data);\n\t\t\t\t},\n\t\t\t\tsetSessionName: (name) => {\n\t\t\t\t\tthis.deps.setSessionName(name);\n\t\t\t\t},\n\t\t\t\tgetSessionName: () => {\n\t\t\t\t\treturn this.deps.getSessionManager().getSessionName();\n\t\t\t\t},\n\t\t\t\tsetLabel: (entryId, label) => {\n\t\t\t\t\tthis.deps.getSessionManager().appendLabelChange(entryId, label);\n\t\t\t\t},\n\t\t\t\tgetActiveTools: () => this.deps.getActiveToolNames(),\n\t\t\t\tgetAllTools: () => this.deps.getAllTools(),\n\t\t\t\tsetActiveTools: (toolNames) => this.deps.setActiveToolsByName(toolNames),\n\t\t\t\trefreshTools: () => this.deps.refreshToolRegistry(),\n\t\t\t\tgetCommands,\n\t\t\t\tsetModel: async (model) => {\n\t\t\t\t\tif (!this.deps.getModelRegistry().hasConfiguredAuth(model)) return false;\n\t\t\t\t\tawait this.deps.setModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgetThinkingLevel: () => this.deps.getThinkingLevel(),\n\t\t\t\tsetThinkingLevel: (level) => this.deps.setThinkingLevel(level),\n\t\t\t\tgetExternalResourceRoots: () => this.deps.getSettingsManager().getEffectiveExternalResourceRoots(),\n\t\t\t\tregisterMemoryProvider: (provider) => this.deps.registerMemoryProvider(provider),\n\t\t\t\tregisterContextMemoryProvider: (provider) => this.deps.registerContextMemoryProvider(provider),\n\t\t\t\treportSpawnedUsage: (usage, opts) => {\n\t\t\t\t\tthis.deps.addSpawnedUsage(usage, opts);\n\t\t\t\t},\n\t\t\t\treportManagedLane: (event) => {\n\t\t\t\t\tthis.deps.recordManagedLane(event);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tgetModel: () => this.deps.getModel(),\n\t\t\t\tisIdle: () => !this.deps.isForegroundBusy(),\n\t\t\t\tgetSignal: () => this.deps.getAgent().signal,\n\t\t\t\tabort: () => {\n\t\t\t\t\tif (this.extensionAbortHandler) {\n\t\t\t\t\t\tthis.extensionAbortHandler();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvoid this.deps.abort();\n\t\t\t\t},\n\t\t\t\thasPendingMessages: () => this.deps.getPendingMessageCount() > 0,\n\t\t\t\tshutdown: () => {\n\t\t\t\t\tthis.deps.getExtensionShutdownHandler()?.();\n\t\t\t\t},\n\t\t\t\tgetContextUsage: () => this.deps.getContextUsage(),\n\t\t\t\tcompact: (options) => this.deps.compactForExtension(options),\n\t\t\t\treload: () => {\n\t\t\t\t\tif (this.deps.isStreaming()) {\n\t\t\t\t\t\treturn Promise.reject(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\"ctx.reload() cannot run while the agent is streaming or a tool call is active. Wait for ctx.isIdle(), queue a follow-up /reload, or use an idle command/event handler so hot reload cannot destabilize the UI.\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.deps.isCompacting()) {\n\t\t\t\t\t\treturn Promise.reject(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\"ctx.reload() cannot run during context compaction or branch summarization. Let compaction finish before reloading so the session tree and UI remain stable.\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst actions = this.deps.getExtensionCommandContextActions();\n\t\t\t\t\tif (!actions) {\n\t\t\t\t\t\treturn this.deps.reload();\n\t\t\t\t\t}\n\t\t\t\t\treturn actions.reload();\n\t\t\t\t},\n\t\t\t\tgetSystemPrompt: () => this.deps.getSystemPrompt(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tregisterProvider: (name, config) => {\n\t\t\t\t\tthis.deps.getModelRegistry().registerProvider(name, config);\n\t\t\t\t\tthis.deps.refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t\tunregisterProvider: (name) => {\n\t\t\t\t\tthis.deps.getModelRegistry().unregisterProvider(name);\n\t\t\t\t\tthis.deps.refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TSchema } from "typebox";
|
|
2
|
+
import type { ToolDefinition } from "./types.ts";
|
|
3
|
+
export declare class ExtensionSessionScope {
|
|
4
|
+
private readonly valuesByOwner;
|
|
5
|
+
prepare(ownerKey: string, schema: TSchema, args: unknown): unknown;
|
|
6
|
+
observeSuccess(ownerKey: string, schema: TSchema, params: unknown, details: unknown): void;
|
|
7
|
+
get(ownerKey: string, key: string): string | undefined;
|
|
8
|
+
clear(ownerKey?: string): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function extensionSessionScopeFor(owner: object): ExtensionSessionScope;
|
|
11
|
+
export declare function applyExtensionSessionHeal<TParams extends TSchema, TDetails>(definition: ToolDefinition<TParams, TDetails>, ownerKey: string, scope: ExtensionSessionScope): ToolDefinition<TParams, TDetails>;
|
|
12
|
+
export declare function extensionScopeOwnerKey(source: {
|
|
13
|
+
path: string;
|
|
14
|
+
source: string;
|
|
15
|
+
baseDir?: string;
|
|
16
|
+
}): string | undefined;
|
|
17
|
+
//# sourceMappingURL=extension-session-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-session-scope.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/extension-session-scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;IAExE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAejE;IAED,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOzF;IAED,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErD;IAED,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAG7B;CACD;AAID,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAM7E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,EAC1E,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC7C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,qBAAqB,GAC1B,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAiBnC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAGrH"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
const MAX_IDENTITY_CHARS = 256;
|
|
2
|
+
const IDENTITY_KEY = /^(?:card|project|board|.+Id)$/;
|
|
3
|
+
export class ExtensionSessionScope {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.valuesByOwner = new Map();
|
|
6
|
+
}
|
|
7
|
+
prepare(ownerKey, schema, args) {
|
|
8
|
+
if (!isRecord(args))
|
|
9
|
+
return args;
|
|
10
|
+
const stored = this.valuesByOwner.get(ownerKey);
|
|
11
|
+
if (!stored || stored.size === 0)
|
|
12
|
+
return args;
|
|
13
|
+
const schemaKeys = schemaPropertyNames(schema);
|
|
14
|
+
if (schemaKeys.length === 0)
|
|
15
|
+
return args;
|
|
16
|
+
let next;
|
|
17
|
+
for (const key of schemaKeys) {
|
|
18
|
+
if (!stored.has(key) || !isVacantIdentity(args[key]))
|
|
19
|
+
continue;
|
|
20
|
+
const value = stored.get(key);
|
|
21
|
+
if (!value)
|
|
22
|
+
continue;
|
|
23
|
+
next ??= { ...args };
|
|
24
|
+
next[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return next ?? args;
|
|
27
|
+
}
|
|
28
|
+
observeSuccess(ownerKey, schema, params, details) {
|
|
29
|
+
if (!shouldRetainIdentity(details))
|
|
30
|
+
return;
|
|
31
|
+
const extracted = extractIdentity(schemaPropertyNames(schema), isRecord(params) ? params : {}, details);
|
|
32
|
+
if (extracted.size === 0)
|
|
33
|
+
return;
|
|
34
|
+
const stored = this.valuesByOwner.get(ownerKey) ?? new Map();
|
|
35
|
+
for (const [key, value] of extracted)
|
|
36
|
+
stored.set(key, value);
|
|
37
|
+
this.valuesByOwner.set(ownerKey, stored);
|
|
38
|
+
}
|
|
39
|
+
get(ownerKey, key) {
|
|
40
|
+
return this.valuesByOwner.get(ownerKey)?.get(key);
|
|
41
|
+
}
|
|
42
|
+
clear(ownerKey) {
|
|
43
|
+
if (ownerKey)
|
|
44
|
+
this.valuesByOwner.delete(ownerKey);
|
|
45
|
+
else
|
|
46
|
+
this.valuesByOwner.clear();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const scopes = new WeakMap();
|
|
50
|
+
export function extensionSessionScopeFor(owner) {
|
|
51
|
+
const existing = scopes.get(owner);
|
|
52
|
+
if (existing)
|
|
53
|
+
return existing;
|
|
54
|
+
const created = new ExtensionSessionScope();
|
|
55
|
+
scopes.set(owner, created);
|
|
56
|
+
return created;
|
|
57
|
+
}
|
|
58
|
+
export function applyExtensionSessionHeal(definition, ownerKey, scope) {
|
|
59
|
+
const originalPrepare = definition.prepareArguments;
|
|
60
|
+
const originalExecute = definition.execute;
|
|
61
|
+
return {
|
|
62
|
+
...definition,
|
|
63
|
+
prepareArguments: (args) => {
|
|
64
|
+
const prepared = originalPrepare ? originalPrepare(args) : args;
|
|
65
|
+
return scope.prepare(ownerKey, definition.parameters, prepared);
|
|
66
|
+
},
|
|
67
|
+
execute: async (toolCallId, params, signal, onUpdate, ctx) => {
|
|
68
|
+
const result = await originalExecute(toolCallId, params, signal, onUpdate, ctx);
|
|
69
|
+
scope.observeSuccess(ownerKey, definition.parameters, params, result.details);
|
|
70
|
+
return result;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function extensionScopeOwnerKey(source) {
|
|
75
|
+
if (source.source === "builtin")
|
|
76
|
+
return undefined;
|
|
77
|
+
return source.baseDir ?? source.path;
|
|
78
|
+
}
|
|
79
|
+
function schemaPropertyNames(schema) {
|
|
80
|
+
const properties = schema.properties;
|
|
81
|
+
if (!isRecord(properties))
|
|
82
|
+
return [];
|
|
83
|
+
return Object.keys(properties);
|
|
84
|
+
}
|
|
85
|
+
function extractIdentity(schemaKeys, params, details) {
|
|
86
|
+
const extracted = new Map();
|
|
87
|
+
for (const key of schemaKeys) {
|
|
88
|
+
if (!IDENTITY_KEY.test(key))
|
|
89
|
+
continue;
|
|
90
|
+
const fromParams = params[key];
|
|
91
|
+
if (isIdentityValue(fromParams))
|
|
92
|
+
extracted.set(key, fromParams);
|
|
93
|
+
}
|
|
94
|
+
if (!isRecord(details))
|
|
95
|
+
return extracted;
|
|
96
|
+
for (const key of schemaKeys) {
|
|
97
|
+
if (!IDENTITY_KEY.test(key) || extracted.has(key))
|
|
98
|
+
continue;
|
|
99
|
+
const fromDetails = details[key];
|
|
100
|
+
if (isIdentityValue(fromDetails)) {
|
|
101
|
+
extracted.set(key, fromDetails);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (!key.endsWith("Id"))
|
|
105
|
+
continue;
|
|
106
|
+
const nested = details[key.slice(0, -2)];
|
|
107
|
+
if (isRecord(nested) && isIdentityValue(nested.id))
|
|
108
|
+
extracted.set(key, nested.id);
|
|
109
|
+
}
|
|
110
|
+
return extracted;
|
|
111
|
+
}
|
|
112
|
+
function shouldRetainIdentity(details) {
|
|
113
|
+
if (!isRecord(details))
|
|
114
|
+
return true;
|
|
115
|
+
if (details.error || details.ok === false)
|
|
116
|
+
return false;
|
|
117
|
+
const status = details.status;
|
|
118
|
+
if (typeof status !== "string")
|
|
119
|
+
return true;
|
|
120
|
+
return status === "resolved" || status === "ok" || status === "success";
|
|
121
|
+
}
|
|
122
|
+
function isVacantIdentity(value) {
|
|
123
|
+
return value === undefined || value === null || value === "";
|
|
124
|
+
}
|
|
125
|
+
function isIdentityValue(value) {
|
|
126
|
+
return (typeof value === "string" &&
|
|
127
|
+
value.length > 0 &&
|
|
128
|
+
value.length <= MAX_IDENTITY_CHARS &&
|
|
129
|
+
!value.includes("\0") &&
|
|
130
|
+
!value.includes("\n"));
|
|
131
|
+
}
|
|
132
|
+
function isRecord(value) {
|
|
133
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=extension-session-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-session-scope.js","sourceRoot":"","sources":["../../../src/core/extensions/extension-session-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TSchema } from \"typebox\";\nimport type { ToolDefinition } from \"./types.ts\";\n\nconst MAX_IDENTITY_CHARS = 256;\nconst IDENTITY_KEY = /^(?:card|project|board|.+Id)$/;\n\nexport class ExtensionSessionScope {\n\tprivate readonly valuesByOwner = new Map<string, Map<string, string>>();\n\n\tprepare(ownerKey: string, schema: TSchema, args: unknown): unknown {\n\t\tif (!isRecord(args)) return args;\n\t\tconst stored = this.valuesByOwner.get(ownerKey);\n\t\tif (!stored || stored.size === 0) return args;\n\t\tconst schemaKeys = schemaPropertyNames(schema);\n\t\tif (schemaKeys.length === 0) return args;\n\t\tlet next: Record<string, unknown> | undefined;\n\t\tfor (const key of schemaKeys) {\n\t\t\tif (!stored.has(key) || !isVacantIdentity(args[key])) continue;\n\t\t\tconst value = stored.get(key);\n\t\t\tif (!value) continue;\n\t\t\tnext ??= { ...args };\n\t\t\tnext[key] = value;\n\t\t}\n\t\treturn next ?? args;\n\t}\n\n\tobserveSuccess(ownerKey: string, schema: TSchema, params: unknown, details: unknown): void {\n\t\tif (!shouldRetainIdentity(details)) return;\n\t\tconst extracted = extractIdentity(schemaPropertyNames(schema), isRecord(params) ? params : {}, details);\n\t\tif (extracted.size === 0) return;\n\t\tconst stored = this.valuesByOwner.get(ownerKey) ?? new Map<string, string>();\n\t\tfor (const [key, value] of extracted) stored.set(key, value);\n\t\tthis.valuesByOwner.set(ownerKey, stored);\n\t}\n\n\tget(ownerKey: string, key: string): string | undefined {\n\t\treturn this.valuesByOwner.get(ownerKey)?.get(key);\n\t}\n\n\tclear(ownerKey?: string): void {\n\t\tif (ownerKey) this.valuesByOwner.delete(ownerKey);\n\t\telse this.valuesByOwner.clear();\n\t}\n}\n\nconst scopes = new WeakMap<object, ExtensionSessionScope>();\n\nexport function extensionSessionScopeFor(owner: object): ExtensionSessionScope {\n\tconst existing = scopes.get(owner);\n\tif (existing) return existing;\n\tconst created = new ExtensionSessionScope();\n\tscopes.set(owner, created);\n\treturn created;\n}\n\nexport function applyExtensionSessionHeal<TParams extends TSchema, TDetails>(\n\tdefinition: ToolDefinition<TParams, TDetails>,\n\townerKey: string,\n\tscope: ExtensionSessionScope,\n): ToolDefinition<TParams, TDetails> {\n\tconst originalPrepare = definition.prepareArguments;\n\tconst originalExecute = definition.execute;\n\treturn {\n\t\t...definition,\n\t\tprepareArguments: (args) => {\n\t\t\tconst prepared = originalPrepare ? originalPrepare(args) : args;\n\t\t\treturn scope.prepare(ownerKey, definition.parameters, prepared) as ReturnType<\n\t\t\t\tNonNullable<ToolDefinition<TParams, TDetails>[\"prepareArguments\"]>\n\t\t\t>;\n\t\t},\n\t\texecute: async (toolCallId, params, signal, onUpdate, ctx) => {\n\t\t\tconst result = await originalExecute(toolCallId, params, signal, onUpdate, ctx);\n\t\t\tscope.observeSuccess(ownerKey, definition.parameters, params, result.details);\n\t\t\treturn result;\n\t\t},\n\t};\n}\n\nexport function extensionScopeOwnerKey(source: { path: string; source: string; baseDir?: string }): string | undefined {\n\tif (source.source === \"builtin\") return undefined;\n\treturn source.baseDir ?? source.path;\n}\n\nfunction schemaPropertyNames(schema: TSchema): string[] {\n\tconst properties = (schema as { properties?: unknown }).properties;\n\tif (!isRecord(properties)) return [];\n\treturn Object.keys(properties);\n}\n\nfunction extractIdentity(\n\tschemaKeys: readonly string[],\n\tparams: Record<string, unknown>,\n\tdetails: unknown,\n): Map<string, string> {\n\tconst extracted = new Map<string, string>();\n\tfor (const key of schemaKeys) {\n\t\tif (!IDENTITY_KEY.test(key)) continue;\n\t\tconst fromParams = params[key];\n\t\tif (isIdentityValue(fromParams)) extracted.set(key, fromParams);\n\t}\n\tif (!isRecord(details)) return extracted;\n\tfor (const key of schemaKeys) {\n\t\tif (!IDENTITY_KEY.test(key) || extracted.has(key)) continue;\n\t\tconst fromDetails = details[key];\n\t\tif (isIdentityValue(fromDetails)) {\n\t\t\textracted.set(key, fromDetails);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!key.endsWith(\"Id\")) continue;\n\t\tconst nested = details[key.slice(0, -2)];\n\t\tif (isRecord(nested) && isIdentityValue(nested.id)) extracted.set(key, nested.id);\n\t}\n\treturn extracted;\n}\n\nfunction shouldRetainIdentity(details: unknown): boolean {\n\tif (!isRecord(details)) return true;\n\tif (details.error || details.ok === false) return false;\n\tconst status = details.status;\n\tif (typeof status !== \"string\") return true;\n\treturn status === \"resolved\" || status === \"ok\" || status === \"success\";\n}\n\nfunction isVacantIdentity(value: unknown): boolean {\n\treturn value === undefined || value === null || value === \"\";\n}\n\nfunction isIdentityValue(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= MAX_IDENTITY_CHARS &&\n\t\t!value.includes(\"\\0\") &&\n\t\t!value.includes(\"\\n\")\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export type { SlashCommandInfo, SlashCommandSource } from "../slash-commands.ts";
|
|
5
5
|
export type { SourceInfo } from "../source-info.ts";
|
|
6
|
+
export { applyExtensionSessionHeal, ExtensionSessionScope, extensionScopeOwnerKey, extensionSessionScopeFor, } from "./extension-session-scope.ts";
|
|
6
7
|
export { createExtensionRuntime } from "./factory-runtime.ts";
|
|
7
8
|
export type { ExtensionErrorListener, ForkHandler, NavigateTreeHandler, NewSessionHandler, ShutdownHandler, SwitchSessionHandler, } from "./runner.ts";
|
|
8
9
|
export { ExtensionRunner } from "./runner.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EACX,sBAAsB,EACtB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACX,0BAA0B,EAC1B,aAAa,EACb,eAAe,EAEf,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAElB,aAAa,EACb,2BAA2B,EAE3B,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,wBAAwB,EAExB,cAAc,EAEd,YAAY,EAEZ,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAEhB,YAAY,EACZ,uBAAuB,EACvB,8BAA8B,EAC9B,gBAAgB,EAChB,uBAAuB,EAEvB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAEhB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EAEnB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EAEjB,eAAe,EAEf,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAEjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EAEnB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,eAAe,EAEf,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EAEpB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EAEpB,aAAa,EACb,mBAAmB,EAEnB,cAAc,EAEd,qBAAqB,EAErB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,QAAQ,EACR,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,cAAc,EAEd,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extension system for lifecycle events and custom tools.
|
|
3
3
|
*/
|
|
4
|
+
export { applyExtensionSessionHeal, ExtensionSessionScope, extensionScopeOwnerKey, extensionSessionScopeFor, } from "./extension-session-scope.js";
|
|
4
5
|
export { createExtensionRuntime } from "./factory-runtime.js";
|
|
5
6
|
export { ExtensionRunner } from "./runner.js";
|
|
6
7
|
// Type guards
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAS9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6I9C,cAAc;AACd,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.ts\";\nexport type { SourceInfo } from \"../source-info.ts\";\nexport { createExtensionRuntime } from \"./factory-runtime.ts\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.ts\";\nexport { ExtensionRunner } from \"./runner.ts\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditorFactory,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionStorage,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tExtensionWorkRunOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - User Bash\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.ts\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisToolCallEventType,\n\tisWriteToolResult,\n} from \"./types.ts\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACN,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAS9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6I9C,cAAc;AACd,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.ts\";\nexport type { SourceInfo } from \"../source-info.ts\";\nexport {\n\tapplyExtensionSessionHeal,\n\tExtensionSessionScope,\n\textensionScopeOwnerKey,\n\textensionSessionScopeFor,\n} from \"./extension-session-scope.ts\";\nexport { createExtensionRuntime } from \"./factory-runtime.ts\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.ts\";\nexport { ExtensionRunner } from \"./runner.ts\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditorFactory,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionStorage,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tExtensionWorkRunOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - User Bash\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.ts\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisToolCallEventType,\n\tisWriteToolResult,\n} from \"./types.ts\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.ts\";\n"]}
|
|
@@ -1131,6 +1131,8 @@ export interface ProviderConfig {
|
|
|
1131
1131
|
oauth?: {
|
|
1132
1132
|
/** Display name for the provider in login UI. */
|
|
1133
1133
|
name: string;
|
|
1134
|
+
/** Whether access through this auth method is backed by a provider subscription. */
|
|
1135
|
+
isSubscription?: boolean;
|
|
1134
1136
|
/** Run the login flow, return credentials to persist. */
|
|
1135
1137
|
login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
|
|
1136
1138
|
/** Refresh expired credentials, return updated credentials to persist. */
|