@jmfederico/pi-web 1.202607.2 → 1.202608.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/client/assets/{CodeViewer-B4M13447.js → CodeViewer-D91Sp61M.js} +1 -1
- package/dist/client/assets/{TerminalPanel-Bmvj-Ecn.js → TerminalPanel-fYrKc3jh.js} +2 -2
- package/dist/client/assets/{UnifiedDiffViewer-C0hygwRo.js → UnifiedDiffViewer-BafLWGtF.js} +1 -1
- package/dist/client/assets/index-CA8q9_o7.js +4025 -0
- package/dist/client/index.html +1 -1
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -1
- package/dist/pi-web-plugins/info/infoInternals.js +208 -0
- package/dist/pi-web-plugins/info/pi-web-plugin.js +12 -15
- package/dist/pi-web-plugins/relays/markdownDocument.js +81 -0
- package/dist/pi-web-plugins/relays/package.json +9 -0
- package/dist/pi-web-plugins/relays/pi-web-plugin.js +44 -0
- package/dist/pi-web-plugins/relays/relayDiscovery.js +228 -0
- package/dist/pi-web-plugins/relays/relaysPanelElement.js +550 -0
- package/dist/pi-web-plugins/relays/vendor/README.md +24 -0
- package/dist/pi-web-plugins/relays/vendor/marked.esm.js +76 -0
- package/dist/plugin-api.d.ts +7 -1
- package/dist/server/app.js +0 -22
- package/dist/server/app.js.map +1 -1
- package/dist/server/browserMessageProjection.js +0 -2
- package/dist/server/browserMessageProjection.js.map +1 -1
- package/dist/server/configRoutes.js +13 -11
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +2 -13
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/piWebStatus.js +12 -38
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
- package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
- package/dist/server/sessiond/agentProcessEnvironment.js +62 -0
- package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js +33 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -0
- package/dist/server/sessiond.js +145 -116
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/askUserTool.js +102 -0
- package/dist/server/sessions/askUserTool.js.map +1 -0
- package/dist/server/sessions/authRoutes.js +0 -10
- package/dist/server/sessions/authRoutes.js.map +1 -1
- package/dist/server/sessions/authService.js +0 -24
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/extensionDialogWaiters.js +76 -0
- package/dist/server/sessions/extensionDialogWaiters.js.map +1 -0
- package/dist/server/sessions/globalProviderPolicy.js +79 -10
- package/dist/server/sessions/globalProviderPolicy.js.map +1 -1
- package/dist/server/sessions/messagePaging.js +2 -2
- package/dist/server/sessions/messagePaging.js.map +1 -1
- package/dist/server/sessions/modelCatalogRefresher.js +8 -0
- package/dist/server/sessions/modelCatalogRefresher.js.map +1 -1
- package/dist/server/sessions/oauthLoginFlowService.js +2 -5
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
- package/dist/server/sessions/parentSessionLocator.js +75 -0
- package/dist/server/sessions/parentSessionLocator.js.map +1 -0
- package/dist/server/sessions/pendingAskStore.js +275 -0
- package/dist/server/sessions/pendingAskStore.js.map +1 -0
- package/dist/server/sessions/pendingExtensionDialogStore.js +196 -0
- package/dist/server/sessions/pendingExtensionDialogStore.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +182 -2
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +721 -203
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionFileHeader.js +117 -0
- package/dist/server/sessions/sessionFileHeader.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +169 -54
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionSummaryScanner.js +619 -0
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +8 -1
- package/dist/server/sessions/spawnSessionTool.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +7 -1
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/sessions/spawnTargetResolver.js +3 -16
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -1
- package/dist/server/workspaces/effectivePathAccess.js +0 -19
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -1
- package/dist/server/workspaces/gitWorktreeDiscovery.js +9 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -1
- package/dist/server/workspaces/projectWorkspaceCwds.js +22 -0
- package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +30 -4
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
- package/dist/server/workspaces/workspaceService.js +15 -2
- package/dist/server/workspaces/workspaceService.js.map +1 -1
- package/dist/sessiond/config.js +2 -2
- package/dist/sessiond/config.js.map +1 -1
- package/dist/shared/activity.js +9 -1
- package/dist/shared/activity.js.map +1 -1
- package/dist/shared/apiTypes.d.ts +300 -24
- package/dist/shared/apiTypes.js +30 -15
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +10 -41
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +4 -3
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/docs/config.md +115 -11
- package/docs/plugins.md +82 -14
- package/package.json +11 -9
- package/dist/client/assets/index-TvPsRyS1.js +0 -3545
- package/dist/server/sessiond/sessionDaemonStartup.js +0 -49
- package/dist/server/sessiond/sessionDaemonStartup.js.map +0 -1
- package/dist/server/sessions/sessionArchiveMigration.js +0 -590
- package/dist/server/sessions/sessionArchiveMigration.js.map +0 -1
package/dist/server/sessiond.js
CHANGED
|
@@ -14,10 +14,12 @@ import { PiSessionService } from "./sessions/piSessionService.js";
|
|
|
14
14
|
import { createPiSessionManagerGateway } from "./sessions/piSessionManagerGateway.js";
|
|
15
15
|
import { registerSessionRoutes } from "./sessions/sessionRoutes.js";
|
|
16
16
|
import { SessionNotificationStore } from "./sessions/sessionNotificationStore.js";
|
|
17
|
-
import {
|
|
17
|
+
import { SessionArchiveStore, defaultSessionArchiveFilePath } from "./sessions/sessionArchiveStore.js";
|
|
18
|
+
import { FileSessionUnreadPersistence, SessionUnreadStore, defaultSessionUnreadFilePath } from "./sessions/sessionUnreadStore.js";
|
|
18
19
|
import { ProjectScopedSpawnTargetResolver } from "./sessions/spawnTargetResolver.js";
|
|
20
|
+
import { RegisteredProjectWorkspaceCwds } from "./workspaces/projectWorkspaceCwds.js";
|
|
19
21
|
import { ProjectService } from "./projects/projectService.js";
|
|
20
|
-
import { ProjectStore } from "./storage/projectStore.js";
|
|
22
|
+
import { ProjectStore, projectStorePath } from "./storage/projectStore.js";
|
|
21
23
|
import { WorkspaceService } from "./workspaces/workspaceService.js";
|
|
22
24
|
import { sessiondSocketPath } from "../sessiond/config.js";
|
|
23
25
|
import { TerminalService } from "./terminals/terminalService.js";
|
|
@@ -26,7 +28,9 @@ import { getPiWebRuntimeComponent } from "./piWebStatus.js";
|
|
|
26
28
|
import { SESSIOND_RUNTIME_CAPABILITIES } from "../shared/capabilities.js";
|
|
27
29
|
import { agentSessionDirEnvKeys, effectivePiWebConfig, maxUploadBytes, offlineModeEnabled } from "../config.js";
|
|
28
30
|
import { createActiveAgentProfileDescriptor } from "../sessiond/activeAgentProfile.js";
|
|
29
|
-
import {
|
|
31
|
+
import { applyAgentHttpIdleTimeout } from "./sessiond/agentHttpDispatcher.js";
|
|
32
|
+
import { sessionServiceDependencies } from "./sessiond/sessionServiceDependencies.js";
|
|
33
|
+
import { scrubNonAgentVisibleEnvKeys } from "./sessiond/agentProcessEnvironment.js";
|
|
30
34
|
const daemonEnvironment = Object.freeze({ ...process.env });
|
|
31
35
|
const { config } = effectivePiWebConfig({ env: daemonEnvironment });
|
|
32
36
|
const activeAgentProfile = createActiveAgentProfileDescriptor({
|
|
@@ -36,118 +40,143 @@ const activeAgentProfile = createActiveAgentProfileDescriptor({
|
|
|
36
40
|
});
|
|
37
41
|
const app = Fastify({ logger: true, bodyLimit: maxUploadBytes(daemonEnvironment, config) });
|
|
38
42
|
await app.register(fastifyWebsocket);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
43
|
+
// Agent-executed processes (bash tool, terminals, subsessions) are spawned from
|
|
44
|
+
// this process and inherit its environment, so hide the daemon's own
|
|
45
|
+
// configuration keys before any of them can start. The daemon keeps using the
|
|
46
|
+
// captured daemonEnvironment above; its runtime stores resolve their paths from
|
|
47
|
+
// it explicitly below.
|
|
48
|
+
const scrubbedEnvKeys = scrubNonAgentVisibleEnvKeys(process.env);
|
|
49
|
+
app.log.info({ scrubbedEnvKeys }, "daemon-only environment keys hidden from agent processes");
|
|
50
|
+
const runtime = await createSessionDaemonRuntime();
|
|
51
|
+
registerSessionDaemonRoutes(runtime);
|
|
52
|
+
await listenSessionDaemon(runtime);
|
|
53
|
+
async function createSessionDaemonRuntime() {
|
|
54
|
+
// Apply the active agent profile's httpIdleTimeoutMs before any other
|
|
55
|
+
// startup work so even catalog-refresh fetches run under the configured
|
|
56
|
+
// HTTP idle timeouts (issue #113).
|
|
57
|
+
const appliedHttpIdleTimeout = applyAgentHttpIdleTimeout({ agentDir: activeAgentProfile.dir, cwd: process.cwd() });
|
|
58
|
+
if (appliedHttpIdleTimeout.warning !== undefined) {
|
|
59
|
+
app.log.warn({ httpIdleTimeoutMs: appliedHttpIdleTimeout.timeoutMs }, appliedHttpIdleTimeout.warning);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
app.log.info({ httpIdleTimeoutMs: appliedHttpIdleTimeout.timeoutMs }, "applied agent profile HTTP idle timeout to the session daemon HTTP stack");
|
|
63
|
+
}
|
|
64
|
+
const eventHub = new SessionEventHub();
|
|
65
|
+
const notificationStore = new SessionNotificationStore();
|
|
66
|
+
const unreadStore = new SessionUnreadStore({
|
|
67
|
+
persistence: new FileSessionUnreadPersistence(defaultSessionUnreadFilePath(daemonEnvironment)),
|
|
68
|
+
onPersistenceError(operation, error) {
|
|
69
|
+
app.log.error({ err: error, operation }, "session unread persistence failed");
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
await unreadStore.load();
|
|
73
|
+
const workspaceActivity = new WorkspaceActivityService(eventHub);
|
|
74
|
+
const auth = await AuthService.create({ agentDir: activeAgentProfile.dir, logger: app.log });
|
|
75
|
+
// Capture providers registered by global extensions while the runtime is
|
|
76
|
+
// still mutable, then freeze every later extension-provider mutation before
|
|
77
|
+
// any real session can load project resources.
|
|
78
|
+
await bootstrapAndFreezeGlobalExtensionProviders(auth.runtime, activeAgentProfile.dir, app.log);
|
|
79
|
+
// The shared model runtime is constructed offline so request paths never
|
|
80
|
+
// wait on provider-catalog fetches; this is the single bounded network
|
|
81
|
+
// refresher, and auth changes (login/logout) ask it for a prompt run. It
|
|
82
|
+
// stays fully inert when the operator asked for offline behavior.
|
|
83
|
+
const catalogRefresher = new ModelCatalogRefresher({
|
|
84
|
+
runtime: auth.runtime,
|
|
85
|
+
logger: app.log,
|
|
86
|
+
offline: offlineModeEnabled(daemonEnvironment),
|
|
87
|
+
});
|
|
88
|
+
catalogRefresher.start();
|
|
89
|
+
auth.subscribe(() => { catalogRefresher.requestRefresh(); });
|
|
90
|
+
// Cross-workspace session relationships are reported regardless of whether
|
|
91
|
+
// agents may spawn sessions: children can predate a config change, and the
|
|
92
|
+
// session tree should stay honest about them either way.
|
|
93
|
+
const projectWorkspaceDeps = { projects: new ProjectService(new ProjectStore(projectStorePath(daemonEnvironment))), workspaces: new WorkspaceService() };
|
|
94
|
+
const projectWorkspaces = new RegisteredProjectWorkspaceCwds(projectWorkspaceDeps);
|
|
95
|
+
const spawnTargets = config.spawnSessions ? new ProjectScopedSpawnTargetResolver(projectWorkspaceDeps) : undefined;
|
|
96
|
+
const sessions = new PiSessionService(eventHub, sessionServiceDependencies({
|
|
97
|
+
modelRuntime: auth.runtime,
|
|
98
|
+
agentDir: activeAgentProfile.dir,
|
|
99
|
+
archiveStore: new SessionArchiveStore(defaultSessionArchiveFilePath(daemonEnvironment)),
|
|
100
|
+
workspaceActivity,
|
|
101
|
+
logger: app.log,
|
|
102
|
+
...(spawnTargets === undefined ? {} : { spawnTargets }),
|
|
103
|
+
projectWorkspaces,
|
|
104
|
+
subsessionsEnabled: config.subsessions,
|
|
105
|
+
askUserEnabled: config.askUser,
|
|
106
|
+
extensionDialogsTimeoutMs: config.extensionDialogsTimeoutMs,
|
|
107
|
+
notificationStore,
|
|
108
|
+
unreadStore,
|
|
109
|
+
catalogRefreshStatus: catalogRefresher,
|
|
110
|
+
sessionManager: createPiSessionManagerGateway({
|
|
73
111
|
agentDir: activeAgentProfile.dir,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
app.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
else {
|
|
145
|
-
const path = sessiondSocketPath();
|
|
146
|
-
await mkdir(dirname(path), { recursive: true });
|
|
147
|
-
await rm(path, { force: true });
|
|
148
|
-
await app.listen({ path });
|
|
149
|
-
process.on("exit", () => void rm(path, { force: true }));
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
});
|
|
112
|
+
env: daemonEnvironment,
|
|
113
|
+
sessionDirEnvKeys: activeAgentProfile.sessionDirEnvKeys,
|
|
114
|
+
}),
|
|
115
|
+
}));
|
|
116
|
+
auth.subscribe((change) => { sessions.applyAuthChange(change); });
|
|
117
|
+
const terminals = new TerminalService(eventHub, workspaceActivity);
|
|
118
|
+
const runtimeComponent = Object.freeze({
|
|
119
|
+
...getPiWebRuntimeComponent("sessiond", SESSIOND_RUNTIME_CAPABILITIES),
|
|
120
|
+
activeAgentProfile,
|
|
121
|
+
});
|
|
122
|
+
return { eventHub, workspaceActivity, auth, sessions, terminals, unreadStore, activeAgentProfile, runtimeComponent, catalogRefresher };
|
|
123
|
+
}
|
|
124
|
+
function registerSessionDaemonRoutes({ eventHub, workspaceActivity, auth, sessions, terminals, runtimeComponent }) {
|
|
125
|
+
registerWorkspaceActivityRoutes(app, workspaceActivity);
|
|
126
|
+
registerAuthRoutes(app, auth);
|
|
127
|
+
registerSessionRoutes(app, sessions, eventHub);
|
|
128
|
+
registerTerminalRoutes(app, terminals);
|
|
129
|
+
app.get("/health", () => ({
|
|
130
|
+
ok: true,
|
|
131
|
+
activeSessions: sessions.activeCount(),
|
|
132
|
+
checkedAt: new Date().toISOString(),
|
|
133
|
+
version: {
|
|
134
|
+
component: runtimeComponent.component,
|
|
135
|
+
label: runtimeComponent.label,
|
|
136
|
+
...(runtimeComponent.runtimeVersion === undefined ? {} : { runtimeVersion: runtimeComponent.runtimeVersion }),
|
|
137
|
+
stale: false,
|
|
138
|
+
available: runtimeComponent.available,
|
|
139
|
+
},
|
|
140
|
+
}));
|
|
141
|
+
app.get("/runtime", () => runtimeComponent);
|
|
142
|
+
}
|
|
143
|
+
async function listenSessionDaemon({ auth, sessions, terminals, unreadStore, catalogRefresher }) {
|
|
144
|
+
let shuttingDown = false;
|
|
145
|
+
async function shutdown(signal) {
|
|
146
|
+
if (shuttingDown)
|
|
147
|
+
return;
|
|
148
|
+
shuttingDown = true;
|
|
149
|
+
app.log.info({ signal }, "shutting down session daemon");
|
|
150
|
+
const attempt = async (operation, run) => {
|
|
151
|
+
try {
|
|
152
|
+
await run();
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
process.exitCode = 1;
|
|
156
|
+
app.log.error({ err: error, operation }, "session daemon shutdown operation failed");
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
await attempt("dispose terminals", () => { terminals.dispose(); });
|
|
160
|
+
await attempt("dispose catalog refresher", () => { catalogRefresher.dispose(); });
|
|
161
|
+
await attempt("dispose auth", () => { auth.dispose(); });
|
|
162
|
+
await attempt("dispose sessions", () => sessions.dispose());
|
|
163
|
+
await attempt("flush session unread state", () => unreadStore.flush());
|
|
164
|
+
await attempt("close server", () => app.close());
|
|
165
|
+
}
|
|
166
|
+
process.once("SIGINT", (signal) => { void shutdown(signal); });
|
|
167
|
+
process.once("SIGTERM", (signal) => { void shutdown(signal); });
|
|
168
|
+
const portValue = daemonEnvironment["PI_WEB_SESSIOND_PORT"];
|
|
169
|
+
const port = portValue !== undefined && portValue !== "" ? Number(portValue) : undefined;
|
|
170
|
+
const host = daemonEnvironment["PI_WEB_SESSIOND_HOST"] ?? "127.0.0.1";
|
|
171
|
+
if (port !== undefined) {
|
|
172
|
+
await app.listen({ port, host });
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
const path = sessiondSocketPath(daemonEnvironment);
|
|
176
|
+
await mkdir(dirname(path), { recursive: true });
|
|
177
|
+
await rm(path, { force: true });
|
|
178
|
+
await app.listen({ path });
|
|
179
|
+
process.on("exit", () => void rm(path, { force: true }));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
153
182
|
//# sourceMappingURL=sessiond.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessiond.js","sourceRoot":"","sources":["../../src/server/sessiond.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,0CAA0C,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"sessiond.js","sourceRoot":"","sources":["../../src/server/sessiond.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { defineTool } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { ASK_USER_ID_MAX_LENGTH, ASK_USER_OPTION_LIMIT, ASK_USER_QUESTION_LIMIT, ASK_USER_TEXT_MAX_LENGTH, } from "../../shared/apiTypes.js";
|
|
4
|
+
import { renderSupersededAskText } from "./pendingAskStore.js";
|
|
5
|
+
const AskUserOptionParams = Type.Object({
|
|
6
|
+
value: Type.String({
|
|
7
|
+
maxLength: ASK_USER_ID_MAX_LENGTH,
|
|
8
|
+
description: "Stable machine value reported back to you when the user picks this option.",
|
|
9
|
+
}),
|
|
10
|
+
label: Type.String({
|
|
11
|
+
maxLength: ASK_USER_TEXT_MAX_LENGTH,
|
|
12
|
+
description: "Short label the user reads, ideally a few words.",
|
|
13
|
+
}),
|
|
14
|
+
detail: Type.Optional(Type.String({
|
|
15
|
+
maxLength: ASK_USER_TEXT_MAX_LENGTH,
|
|
16
|
+
description: "Optional clarification shown under the label.",
|
|
17
|
+
})),
|
|
18
|
+
});
|
|
19
|
+
const AskUserQuestionParams = Type.Object({
|
|
20
|
+
id: Type.String({
|
|
21
|
+
maxLength: ASK_USER_ID_MAX_LENGTH,
|
|
22
|
+
description: "Unique within this call; used as the answer key reported back to you.",
|
|
23
|
+
}),
|
|
24
|
+
question: Type.String({
|
|
25
|
+
maxLength: ASK_USER_TEXT_MAX_LENGTH,
|
|
26
|
+
description: "The question itself, as one plain-text line.",
|
|
27
|
+
}),
|
|
28
|
+
detail: Type.Optional(Type.String({
|
|
29
|
+
maxLength: ASK_USER_TEXT_MAX_LENGTH,
|
|
30
|
+
description: "Optional supporting context shown under the question.",
|
|
31
|
+
})),
|
|
32
|
+
options: Type.Optional(Type.Array(AskUserOptionParams, {
|
|
33
|
+
maxItems: ASK_USER_OPTION_LIMIT,
|
|
34
|
+
description: "Options to choose from. Omit when free text is the whole answer; the browser always adds a Custom choice.",
|
|
35
|
+
})),
|
|
36
|
+
multiple: Type.Optional(Type.Boolean({
|
|
37
|
+
description: "Allow several options at once. Default: one answer per question.",
|
|
38
|
+
})),
|
|
39
|
+
});
|
|
40
|
+
const AskUserParams = Type.Object({
|
|
41
|
+
questions: Type.Array(AskUserQuestionParams, {
|
|
42
|
+
minItems: 1,
|
|
43
|
+
maxItems: ASK_USER_QUESTION_LIMIT,
|
|
44
|
+
description: "The questions to post, in the order the user should read them. Every question may be left unanswered.",
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
/** Shapes one schema question into the domain question; the store owns validation. */
|
|
48
|
+
function toQuestion(param) {
|
|
49
|
+
const { detail, options, multiple } = param;
|
|
50
|
+
return {
|
|
51
|
+
id: param.id,
|
|
52
|
+
question: param.question,
|
|
53
|
+
...(detail === undefined ? {} : { detail }),
|
|
54
|
+
options: (options ?? []).map(toOption),
|
|
55
|
+
...(multiple === undefined ? {} : { multiple }),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function toOption(param) {
|
|
59
|
+
const { detail } = param;
|
|
60
|
+
return { value: param.value, label: param.label, ...(detail === undefined ? {} : { detail }) };
|
|
61
|
+
}
|
|
62
|
+
function postedText(result) {
|
|
63
|
+
const count = result.ask.questions.length;
|
|
64
|
+
const posted = `Posted ${count.toString()} question${count === 1 ? "" : "s"} to the user as ask ${result.ask.askId}. Ending this run; the answers arrive as a follow-up message that wakes you, naming every question the user left unanswered. Do not repost these questions.`;
|
|
65
|
+
return result.superseded === undefined ? posted : `${posted}\n\n${renderSupersededAskText(result.superseded)}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Custom tool that posts a question set to the user's browser as interactive UI.
|
|
69
|
+
*
|
|
70
|
+
* It deliberately does **not** await the user. Awaiting would pin the agent run
|
|
71
|
+
* for an unbounded human-scale wait, keep the session streaming, and leave a
|
|
72
|
+
* dangling tool call if the runtime were replaced meanwhile. Instead the ask
|
|
73
|
+
* becomes daemon-owned state, the tool terminates the run, and the submitted
|
|
74
|
+
* answers return later as a follow-up message that wakes the session.
|
|
75
|
+
*
|
|
76
|
+
* Rejected question sets throw: the agent loop turns the thrown message into an
|
|
77
|
+
* error tool result, so the model can fix the ask and post it again.
|
|
78
|
+
*/
|
|
79
|
+
export function createAskUserToolDefinition(deps) {
|
|
80
|
+
return defineTool({
|
|
81
|
+
name: "ask_user",
|
|
82
|
+
label: "Ask user",
|
|
83
|
+
description: "Post a set of questions to the user as a browser form and end this run. Answers arrive later as a follow-up message; the user may leave any question unanswered.",
|
|
84
|
+
promptSnippet: "ask_user: post a question set to the user; ends the run, answers return as a follow-up",
|
|
85
|
+
promptGuidelines: [
|
|
86
|
+
"When you need decisions from the user, post them together with ask_user instead of asking in prose one at a time. It ends the run and the answers, including the questions the user left unanswered, come back as a follow-up message that wakes you. Call it alone and last, and do not repost the same questions or poll for answers.",
|
|
87
|
+
],
|
|
88
|
+
parameters: AskUserParams,
|
|
89
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
90
|
+
const result = await deps.open({
|
|
91
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
92
|
+
questions: params.questions.map(toQuestion),
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: "text", text: postedText(result) }],
|
|
96
|
+
details: result,
|
|
97
|
+
terminate: true,
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=askUserTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askUserTool.js","sourceRoot":"","sources":["../../../src/server/sessions/askUserTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,16 +7,6 @@ export function registerAuthRoutes(app, auth, prefix = "") {
|
|
|
7
7
|
return reply.code(404).send({ error: error instanceof Error ? error.message : String(error) });
|
|
8
8
|
}
|
|
9
9
|
});
|
|
10
|
-
app.post(`${prefix}/auth/api-key`, async (request, reply) => {
|
|
11
|
-
try {
|
|
12
|
-
return await auth.saveApiKey(request.body.providerId, request.body.key);
|
|
13
|
-
}
|
|
14
|
-
catch (error) {
|
|
15
|
-
return reply.code(400).send({ error: error instanceof Error ? error.message : String(error) });
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
// Additive endpoint for newer browsers; the one-secret route remains for
|
|
19
|
-
// rolling compatibility with older browser bundles.
|
|
20
10
|
app.post(`${prefix}/auth/api-key/interactive`, async (request, reply) => {
|
|
21
11
|
try {
|
|
22
12
|
return await auth.startApiKeyLogin(request.body.providerId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authRoutes.js","sourceRoot":"","sources":["../../../src/server/sessions/authRoutes.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,GAAoB,EAAE,IAAiB,EAAE,MAAM,GAAG,EAAE;IACrF,GAAG,CAAC,GAAG,CAAiF,GAAG,MAAM,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC3I,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"authRoutes.js","sourceRoot":"","sources":["../../../src/server/sessions/authRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,30 +89,6 @@ export class AuthService {
|
|
|
89
89
|
const providers = mode === "logout" ? await getLogoutProviderOptions(this.runtime) : getLoginProviderOptions(this.runtime, authType);
|
|
90
90
|
return { providers };
|
|
91
91
|
}
|
|
92
|
-
async saveApiKey(providerId, key) {
|
|
93
|
-
if (key.trim() === "")
|
|
94
|
-
throw new Error("API key is required");
|
|
95
|
-
const provider = await this.requireApiKeyLoginProvider(providerId);
|
|
96
|
-
let promptAttempted = false;
|
|
97
|
-
const interaction = {
|
|
98
|
-
prompt: (prompt) => {
|
|
99
|
-
if (promptAttempted) {
|
|
100
|
-
throw new Error(`${provider.name} requires interactive setup; use Pi's generic /login flow`);
|
|
101
|
-
}
|
|
102
|
-
promptAttempted = true;
|
|
103
|
-
if (prompt.signal?.aborted === true)
|
|
104
|
-
throw new Error("Login cancelled");
|
|
105
|
-
if (prompt.type !== "secret") {
|
|
106
|
-
throw new Error(`${provider.name} requires interactive setup; use Pi's generic /login flow`);
|
|
107
|
-
}
|
|
108
|
-
return Promise.resolve(key);
|
|
109
|
-
},
|
|
110
|
-
notify: () => undefined,
|
|
111
|
-
};
|
|
112
|
-
await this.runtime.login(providerId, "api_key", interaction);
|
|
113
|
-
await this.emit({}, { operation: "login", providerId, authType: "api_key" });
|
|
114
|
-
return { accepted: true };
|
|
115
|
-
}
|
|
116
92
|
async logoutProvider(providerId) {
|
|
117
93
|
await this.runtime.logout(providerId);
|
|
118
94
|
await this.emit({ removedProviderId: providerId }, { operation: "logout", providerId });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authService.js","sourceRoot":"","sources":["../../../src/server/sessions/authService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAkC,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"authService.js","sourceRoot":"","sources":["../../../src/server/sessions/authService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** The value an extension's dialog Promise settles with on any close without an answer. */
|
|
2
|
+
export function extensionDialogCancelValue(kind) {
|
|
3
|
+
return kind === "confirm" ? false : undefined;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* The auto-cancel delay of one dialog: the sooner of the extension's own
|
|
7
|
+
* `timeout` and the daemon's `extensionDialogsTimeoutMs` default, where `0`
|
|
8
|
+
* (or an invalid extension value, defensively ignored) means "waits forever".
|
|
9
|
+
*/
|
|
10
|
+
export function effectiveExtensionDialogTimeoutMs(extensionTimeoutMs, daemonDefaultMs) {
|
|
11
|
+
const fromExtension = typeof extensionTimeoutMs === "number" && Number.isFinite(extensionTimeoutMs) && extensionTimeoutMs > 0 ? extensionTimeoutMs : undefined;
|
|
12
|
+
const fromDaemon = daemonDefaultMs > 0 ? daemonDefaultMs : undefined;
|
|
13
|
+
if (fromExtension === undefined)
|
|
14
|
+
return fromDaemon;
|
|
15
|
+
if (fromDaemon === undefined)
|
|
16
|
+
return fromExtension;
|
|
17
|
+
return Math.min(fromExtension, fromDaemon);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The parked Promise resolvers behind open extension dialogs, plus the timers
|
|
21
|
+
* and signal subscriptions that can end a wait without the browser. Timers use
|
|
22
|
+
* the global `setTimeout`/`clearTimeout` looked up per call, the same seam the
|
|
23
|
+
* rest of the service's timer tests fake.
|
|
24
|
+
*
|
|
25
|
+
* Kept deliberately separate from {@link PendingExtensionDialogStore}: the
|
|
26
|
+
* store owns the domain state every browser sees, the waiters own the one
|
|
27
|
+
* in-memory resolver each open dialog parks inside extension code — state no
|
|
28
|
+
* browser ever observes and that must not survive the runtime. The pairing is
|
|
29
|
+
* the wiring's invariant: every open store record has exactly one parked
|
|
30
|
+
* waiter, and whoever closes the record settles the waiter exactly once.
|
|
31
|
+
*/
|
|
32
|
+
export class ExtensionDialogWaiters {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.parked = new Map();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Park the extension-facing Promise for a dialog the store just opened. Arms
|
|
38
|
+
* the timeout and signal triggers; both are disarmed when the wait settles,
|
|
39
|
+
* so a settled wait can never be triggered (nor trigger twice).
|
|
40
|
+
*/
|
|
41
|
+
park(dialog, triggers = {}) {
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
const parked = { cancelValue: extensionDialogCancelValue(dialog.kind), resolve };
|
|
44
|
+
if (triggers.timeoutMs !== undefined) {
|
|
45
|
+
const handle = setTimeout(() => { triggers.onTrigger?.("timeout"); }, triggers.timeoutMs);
|
|
46
|
+
parked.cancelArmedTimeout = () => { clearTimeout(handle); };
|
|
47
|
+
}
|
|
48
|
+
if (triggers.signal !== undefined) {
|
|
49
|
+
const signal = triggers.signal;
|
|
50
|
+
const onAbort = () => { triggers.onTrigger?.("cancelled"); };
|
|
51
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
52
|
+
parked.removeSignalListener = () => { signal.removeEventListener("abort", onAbort); };
|
|
53
|
+
}
|
|
54
|
+
this.parked.set(dialog.dialogId, parked);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Resolve the parked wait with the user's answer, which the store has already validated and recorded. */
|
|
58
|
+
settleWithAnswer(dialogId, answer) {
|
|
59
|
+
return this.settle(dialogId, (parked) => { parked.resolve(answer); });
|
|
60
|
+
}
|
|
61
|
+
/** Resolve the parked wait with the dialog kind's cancel value after a close without an answer. */
|
|
62
|
+
settleWithCancelValue(dialogId) {
|
|
63
|
+
return this.settle(dialogId, (parked) => { parked.resolve(parked.cancelValue); });
|
|
64
|
+
}
|
|
65
|
+
settle(dialogId, resolveParked) {
|
|
66
|
+
const parked = this.parked.get(dialogId);
|
|
67
|
+
if (parked === undefined)
|
|
68
|
+
return false;
|
|
69
|
+
this.parked.delete(dialogId);
|
|
70
|
+
parked.cancelArmedTimeout?.();
|
|
71
|
+
parked.removeSignalListener?.();
|
|
72
|
+
resolveParked(parked);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=extensionDialogWaiters.js.map
|