@agents-ensemble/core 0.20.0 → 0.22.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/assets/pi/pi-cli-env-wrapper.cmd +28 -0
- package/assets/pi/pi-cli-env-wrapper.sh +19 -0
- package/assets/pi/settings.json +4 -0
- package/dist/acp/acp-preset-bins.d.ts +3 -3
- package/dist/acp/acp-preset-bins.d.ts.map +1 -1
- package/dist/acp/acp-preset-bins.js +3 -3
- package/dist/acp/acp-preset-bins.js.map +1 -1
- package/dist/acp/index.d.ts +3 -1
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js +2 -1
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/pi-acp-wrapper.d.ts +3 -0
- package/dist/acp/pi-acp-wrapper.d.ts.map +1 -0
- package/dist/acp/pi-acp-wrapper.js +41 -0
- package/dist/acp/pi-acp-wrapper.js.map +1 -0
- package/dist/acp/pi-builtin-config.d.ts +10 -0
- package/dist/acp/pi-builtin-config.d.ts.map +1 -0
- package/dist/acp/pi-builtin-config.js +36 -0
- package/dist/acp/pi-builtin-config.js.map +1 -0
- package/dist/acp/pi-runtime.d.ts +23 -0
- package/dist/acp/pi-runtime.d.ts.map +1 -0
- package/dist/acp/pi-runtime.js +160 -0
- package/dist/acp/pi-runtime.js.map +1 -0
- package/dist/acp/pi-session-map.d.ts +36 -0
- package/dist/acp/pi-session-map.d.ts.map +1 -0
- package/dist/acp/pi-session-map.js +266 -0
- package/dist/acp/pi-session-map.js.map +1 -0
- package/dist/acp/resolve-acp-spawn.d.ts +9 -3
- package/dist/acp/resolve-acp-spawn.d.ts.map +1 -1
- package/dist/acp/resolve-acp-spawn.js +41 -9
- package/dist/acp/resolve-acp-spawn.js.map +1 -1
- package/dist/acp/resolve-bundled-acp-bin.d.ts +2 -2
- package/dist/acp/resolve-bundled-acp-bin.d.ts.map +1 -1
- package/dist/acp/resolve-bundled-acp-bin.js +4 -4
- package/dist/acp/resolve-bundled-acp-bin.js.map +1 -1
- package/dist/acp/validate-acp-preset-prerequisites.d.ts +1 -1
- package/dist/acp/validate-acp-preset-prerequisites.d.ts.map +1 -1
- package/dist/acp/validate-acp-preset-prerequisites.js +30 -10
- package/dist/acp/validate-acp-preset-prerequisites.js.map +1 -1
- package/dist/conductor/conductor-agent.d.ts +15 -3
- package/dist/conductor/conductor-agent.d.ts.map +1 -1
- package/dist/conductor/conductor-auth.d.ts +4 -3
- package/dist/conductor/conductor-auth.d.ts.map +1 -1
- package/dist/conductor/conductor-auth.js +20 -4
- package/dist/conductor/conductor-auth.js.map +1 -1
- package/dist/conductor/conductor-dispatch-lifecycle.d.ts +85 -0
- package/dist/conductor/conductor-dispatch-lifecycle.d.ts.map +1 -0
- package/dist/conductor/conductor-dispatch-lifecycle.js +190 -0
- package/dist/conductor/conductor-dispatch-lifecycle.js.map +1 -0
- package/dist/conductor/conductor-history.d.ts +15 -0
- package/dist/conductor/conductor-history.d.ts.map +1 -1
- package/dist/conductor/conductor-history.js +38 -7
- package/dist/conductor/conductor-history.js.map +1 -1
- package/dist/conductor/conductor-path-safety.d.ts +23 -0
- package/dist/conductor/conductor-path-safety.d.ts.map +1 -0
- package/dist/conductor/conductor-path-safety.js +319 -0
- package/dist/conductor/conductor-path-safety.js.map +1 -0
- package/dist/conductor/conductor-pi-auth.d.ts +57 -2
- package/dist/conductor/conductor-pi-auth.d.ts.map +1 -1
- package/dist/conductor/conductor-pi-auth.js +718 -40
- package/dist/conductor/conductor-pi-auth.js.map +1 -1
- package/dist/conductor/conductor-recovery-inbox.d.ts +73 -0
- package/dist/conductor/conductor-recovery-inbox.d.ts.map +1 -0
- package/dist/conductor/conductor-recovery-inbox.js +181 -0
- package/dist/conductor/conductor-recovery-inbox.js.map +1 -0
- package/dist/conductor/conductor-send-reconnect.d.ts +33 -4
- package/dist/conductor/conductor-send-reconnect.d.ts.map +1 -1
- package/dist/conductor/conductor-send-reconnect.js +89 -24
- package/dist/conductor/conductor-send-reconnect.js.map +1 -1
- package/dist/conductor/conductor-session-driver.d.ts +34 -1
- package/dist/conductor/conductor-session-driver.d.ts.map +1 -1
- package/dist/conductor/conductor-session-driver.js +529 -75
- package/dist/conductor/conductor-session-driver.js.map +1 -1
- package/dist/conductor/conductor-session.d.ts +4 -0
- package/dist/conductor/conductor-session.d.ts.map +1 -1
- package/dist/conductor/conductor-session.js +416 -145
- package/dist/conductor/conductor-session.js.map +1 -1
- package/dist/conductor/conductor-setup.d.ts +30 -0
- package/dist/conductor/conductor-setup.d.ts.map +1 -0
- package/dist/conductor/conductor-setup.js +243 -0
- package/dist/conductor/conductor-setup.js.map +1 -0
- package/dist/conductor/cursor-bootstrap-state.d.ts +9 -0
- package/dist/conductor/cursor-bootstrap-state.d.ts.map +1 -0
- package/dist/conductor/cursor-bootstrap-state.js +11 -0
- package/dist/conductor/cursor-bootstrap-state.js.map +1 -0
- package/dist/conductor/cursor-run-snapshots.d.ts +30 -0
- package/dist/conductor/cursor-run-snapshots.d.ts.map +1 -0
- package/dist/conductor/cursor-run-snapshots.js +120 -0
- package/dist/conductor/cursor-run-snapshots.js.map +1 -0
- package/dist/conductor/index.d.ts +18 -7
- package/dist/conductor/index.d.ts.map +1 -1
- package/dist/conductor/index.js +9 -4
- package/dist/conductor/index.js.map +1 -1
- package/dist/conductor/operator-command.d.ts +5 -0
- package/dist/conductor/operator-command.d.ts.map +1 -1
- package/dist/conductor/operator-command.js +6 -0
- package/dist/conductor/operator-command.js.map +1 -1
- package/dist/conductor/operator-input-binding.d.ts +17 -0
- package/dist/conductor/operator-input-binding.d.ts.map +1 -1
- package/dist/conductor/pi-auth-recovery-snapshot-store.d.ts +45 -0
- package/dist/conductor/pi-auth-recovery-snapshot-store.d.ts.map +1 -0
- package/dist/conductor/pi-auth-recovery-snapshot-store.js +116 -0
- package/dist/conductor/pi-auth-recovery-snapshot-store.js.map +1 -0
- package/dist/conductor/pi-conductor-agent.d.ts +6 -3
- package/dist/conductor/pi-conductor-agent.d.ts.map +1 -1
- package/dist/conductor/pi-conductor-agent.js +276 -53
- package/dist/conductor/pi-conductor-agent.js.map +1 -1
- package/dist/conductor/pi-conductor-session-file.d.ts +13 -0
- package/dist/conductor/pi-conductor-session-file.d.ts.map +1 -0
- package/dist/conductor/pi-conductor-session-file.js +21 -0
- package/dist/conductor/pi-conductor-session-file.js.map +1 -0
- package/dist/conductor/pi-resource-loader.d.ts +6 -0
- package/dist/conductor/pi-resource-loader.d.ts.map +1 -1
- package/dist/conductor/pi-resource-loader.js +26 -12
- package/dist/conductor/pi-resource-loader.js.map +1 -1
- package/dist/conductor/pi-user-root-lock.d.ts +8 -0
- package/dist/conductor/pi-user-root-lock.d.ts.map +1 -0
- package/dist/conductor/pi-user-root-lock.js +53 -0
- package/dist/conductor/pi-user-root-lock.js.map +1 -0
- package/dist/conductor/recovery-inbox-command.d.ts +29 -0
- package/dist/conductor/recovery-inbox-command.d.ts.map +1 -0
- package/dist/conductor/recovery-inbox-command.js +248 -0
- package/dist/conductor/recovery-inbox-command.js.map +1 -0
- package/dist/conductor/session/events/index.d.ts +1 -1
- package/dist/conductor/session/events/index.d.ts.map +1 -1
- package/dist/conductor/session/events/index.js.map +1 -1
- package/dist/conductor/session/events/session-event.d.ts +43 -1
- package/dist/conductor/session/events/session-event.d.ts.map +1 -1
- package/dist/conductor/session/events/session-log-event-groups.d.ts +1 -1
- package/dist/conductor/session/events/session-log-event-groups.d.ts.map +1 -1
- package/dist/conductor/session/events/session-log-event-groups.js +2 -0
- package/dist/conductor/session/events/session-log-event-groups.js.map +1 -1
- package/dist/conductor/session/events/session-log-event.d.ts +4 -0
- package/dist/conductor/session/events/session-log-event.d.ts.map +1 -1
- package/dist/conductor/session/format-session-event.js +57 -5
- package/dist/conductor/session/format-session-event.js.map +1 -1
- package/dist/conductor/session/select-dispatch-batch.d.ts +2 -0
- package/dist/conductor/session/select-dispatch-batch.d.ts.map +1 -1
- package/dist/conductor/session/select-dispatch-batch.js +36 -2
- package/dist/conductor/session/select-dispatch-batch.js.map +1 -1
- package/dist/conductor/session/session-event-queue.d.ts +14 -0
- package/dist/conductor/session/session-event-queue.d.ts.map +1 -1
- package/dist/conductor/session/session-event-queue.js +82 -10
- package/dist/conductor/session/session-event-queue.js.map +1 -1
- package/dist/conductor/session/session-event.d.ts +1 -1
- package/dist/conductor/session/session-event.d.ts.map +1 -1
- package/dist/conductor/session-policy.d.ts.map +1 -1
- package/dist/conductor/session-policy.js +8 -4
- package/dist/conductor/session-policy.js.map +1 -1
- package/dist/conductor/submit-operator-input.d.ts +3 -0
- package/dist/conductor/submit-operator-input.d.ts.map +1 -1
- package/dist/conductor/submit-operator-input.js +21 -0
- package/dist/conductor/submit-operator-input.js.map +1 -1
- package/dist/config/deep-merge.d.ts.map +1 -1
- package/dist/config/deep-merge.js +13 -3
- package/dist/config/deep-merge.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/doctor-settings.d.ts +59 -0
- package/dist/config/doctor-settings.d.ts.map +1 -0
- package/dist/config/doctor-settings.js +343 -0
- package/dist/config/doctor-settings.js.map +1 -0
- package/dist/config/ensemble-config-digest.d.ts +2 -4
- package/dist/config/ensemble-config-digest.d.ts.map +1 -1
- package/dist/config/ensemble-config-digest.js +2 -4
- package/dist/config/ensemble-config-digest.js.map +1 -1
- package/dist/config/index.d.ts +3 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/load-ensemble-config.d.ts.map +1 -1
- package/dist/config/load-ensemble-config.js +8 -1
- package/dist/config/load-ensemble-config.js.map +1 -1
- package/dist/config/parse-config.d.ts.map +1 -1
- package/dist/config/parse-config.js +34 -14
- package/dist/config/parse-config.js.map +1 -1
- package/dist/config/resolve-settings.d.ts +3 -1
- package/dist/config/resolve-settings.d.ts.map +1 -1
- package/dist/config/resolve-settings.js +7 -4
- package/dist/config/resolve-settings.js.map +1 -1
- package/dist/config/types.d.ts +14 -5
- package/dist/config/types.d.ts.map +1 -1
- package/dist/dispatch/attach-worker.js +1 -1
- package/dist/dispatch/attach-worker.js.map +1 -1
- package/dist/dispatch/worker-acp-session.d.ts +21 -3
- package/dist/dispatch/worker-acp-session.d.ts.map +1 -1
- package/dist/dispatch/worker-acp-session.js +50 -13
- package/dist/dispatch/worker-acp-session.js.map +1 -1
- package/dist/ensemble-paths.d.ts +19 -19
- package/dist/ensemble-paths.d.ts.map +1 -1
- package/dist/ensemble-paths.js +40 -22
- package/dist/ensemble-paths.js.map +1 -1
- package/dist/issue/resolve-issue-url.d.ts +4 -0
- package/dist/issue/resolve-issue-url.d.ts.map +1 -1
- package/dist/issue/resolve-issue-url.js +2 -2
- package/dist/issue/resolve-issue-url.js.map +1 -1
- package/dist/operator-runtime.d.ts +19 -4
- package/dist/operator-runtime.d.ts.map +1 -1
- package/dist/operator-runtime.js +13 -2
- package/dist/operator-runtime.js.map +1 -1
- package/dist/profile/types.d.ts +4 -0
- package/dist/profile/types.d.ts.map +1 -1
- package/dist/profile/types.js +29 -12
- package/dist/profile/types.js.map +1 -1
- package/dist/representation/escape-terminal-control-characters.d.ts +9 -0
- package/dist/representation/escape-terminal-control-characters.d.ts.map +1 -0
- package/dist/representation/escape-terminal-control-characters.js +34 -0
- package/dist/representation/escape-terminal-control-characters.js.map +1 -0
- package/dist/representation/index.d.ts +1 -0
- package/dist/representation/index.d.ts.map +1 -1
- package/dist/representation/index.js +1 -0
- package/dist/representation/index.js.map +1 -1
- package/dist/runtime/types.d.ts +9 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/worker-runtime.d.ts +14 -1
- package/dist/runtime/worker-runtime.d.ts.map +1 -1
- package/dist/runtime/worker-runtime.js +197 -50
- package/dist/runtime/worker-runtime.js.map +1 -1
- package/dist/runtime/worker-session.d.ts +2 -1
- package/dist/runtime/worker-session.d.ts.map +1 -1
- package/dist/runtime/worker-session.js +1 -0
- package/dist/runtime/worker-session.js.map +1 -1
- package/dist/session/export-session-bundle.d.ts +77 -0
- package/dist/session/export-session-bundle.d.ts.map +1 -0
- package/dist/session/export-session-bundle.js +640 -0
- package/dist/session/export-session-bundle.js.map +1 -0
- package/dist/session/index.d.ts +6 -3
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +4 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/open-question-control.d.ts +9 -0
- package/dist/session/open-question-control.d.ts.map +1 -1
- package/dist/session/open-question-control.js +26 -1
- package/dist/session/open-question-control.js.map +1 -1
- package/dist/session/open-questions-store.d.ts +1 -1
- package/dist/session/open-questions-store.d.ts.map +1 -1
- package/dist/session/open-questions-store.js +3 -6
- package/dist/session/open-questions-store.js.map +1 -1
- package/dist/session/persisted-file.d.ts +5 -0
- package/dist/session/persisted-file.d.ts.map +1 -0
- package/dist/session/persisted-file.js +56 -0
- package/dist/session/persisted-file.js.map +1 -0
- package/dist/session/session-resume-store.d.ts +79 -10
- package/dist/session/session-resume-store.d.ts.map +1 -1
- package/dist/session/session-resume-store.js +353 -83
- package/dist/session/session-resume-store.js.map +1 -1
- package/dist/session/session-snapshot-paths.d.ts +11 -0
- package/dist/session/session-snapshot-paths.d.ts.map +1 -0
- package/dist/session/session-snapshot-paths.js +41 -0
- package/dist/session/session-snapshot-paths.js.map +1 -0
- package/dist/session/session-state-store.d.ts +2 -2
- package/dist/session/session-state-store.d.ts.map +1 -1
- package/dist/session/session-state-store.js +5 -16
- package/dist/session/session-state-store.js.map +1 -1
- package/dist/session/tool-call-snapshot-history.d.ts +12 -1
- package/dist/session/tool-call-snapshot-history.d.ts.map +1 -1
- package/dist/session/tool-call-snapshot-history.js +75 -70
- package/dist/session/tool-call-snapshot-history.js.map +1 -1
- package/dist/session/worker-session-history.d.ts +51 -0
- package/dist/session/worker-session-history.d.ts.map +1 -0
- package/dist/session/worker-session-history.js +654 -0
- package/dist/session/worker-session-history.js.map +1 -0
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/worktree/worktree.d.ts +6 -1
- package/dist/worktree/worktree.d.ts.map +1 -1
- package/dist/worktree/worktree.js +123 -2
- package/dist/worktree/worktree.js.map +1 -1
- package/package.json +9 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
1
|
import { Agent } from '@cursor/sdk';
|
|
3
2
|
import { SessionManager, } from '@earendil-works/pi-coding-agent';
|
|
4
|
-
import { PI_CONDUCTOR_MESSAGE_HISTORY_ENTRY_TYPE
|
|
3
|
+
import { PI_CONDUCTOR_MESSAGE_HISTORY_ENTRY_TYPE } from './pi-conductor-agent.js';
|
|
4
|
+
import { findPiConductorSessionFile } from './pi-conductor-session-file.js';
|
|
5
5
|
export const CONDUCTOR_PROVIDER_HISTORY_LIMIT = 100;
|
|
6
6
|
/** Read the latest eligible user/final-response pairs from a provider session. */
|
|
7
7
|
export async function listConductorProviderHistory(input) {
|
|
@@ -24,21 +24,52 @@ export async function listConductorProviderHistory(input) {
|
|
|
24
24
|
}
|
|
25
25
|
matching = ordered.slice(cursorIndex + 1);
|
|
26
26
|
}
|
|
27
|
+
const messages = matching.slice(0, input.query.limit);
|
|
27
28
|
return {
|
|
28
|
-
messages:
|
|
29
|
+
messages: input.sanitizer === undefined
|
|
30
|
+
? messages
|
|
31
|
+
: await sanitizeProviderHistoryMessages(messages, input.sanitizer, input.conductorAgentId, input.backend),
|
|
29
32
|
hasMore: matching.length > input.query.limit,
|
|
30
33
|
};
|
|
31
34
|
}
|
|
35
|
+
async function sanitizeProviderHistoryMessages(messages, sanitizer, conductorAgentId, backend) {
|
|
36
|
+
const sanitized = [];
|
|
37
|
+
try {
|
|
38
|
+
if (typeof sanitizer !== 'function') {
|
|
39
|
+
throw new Error('The provider history sanitizer is not a function.');
|
|
40
|
+
}
|
|
41
|
+
for (const message of messages) {
|
|
42
|
+
const inbound = await sanitizer(message.inbound, 'inbound');
|
|
43
|
+
if (typeof inbound !== 'string') {
|
|
44
|
+
throw new Error('The provider history sanitizer returned a non-string value.');
|
|
45
|
+
}
|
|
46
|
+
const text = await sanitizer(message.text, 'text');
|
|
47
|
+
if (typeof text !== 'string') {
|
|
48
|
+
throw new Error('The provider history sanitizer returned a non-string value.');
|
|
49
|
+
}
|
|
50
|
+
sanitized.push({ ...message, inbound, text });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new Error(`Provider history sanitizer failed for conductor session ${conductorAgentId} (${backend}).`);
|
|
55
|
+
}
|
|
56
|
+
return sanitized;
|
|
57
|
+
}
|
|
32
58
|
function readPiConductorHistory(input) {
|
|
33
59
|
const cwd = input.cwd;
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
60
|
+
const location = findPiConductorSessionFile({
|
|
61
|
+
conductorAgentId: input.conductorAgentId,
|
|
62
|
+
cwd,
|
|
63
|
+
repoRoot: input.repoRoot,
|
|
64
|
+
issueUrl: input.issueUrl,
|
|
65
|
+
resumeCwds: input.resumeCwds,
|
|
66
|
+
});
|
|
67
|
+
if (!location) {
|
|
37
68
|
throw new Error('The Pi provider session is missing or unreadable.');
|
|
38
69
|
}
|
|
39
70
|
let session;
|
|
40
71
|
try {
|
|
41
|
-
session = SessionManager.open(sessionFile, sessionDir, cwd);
|
|
72
|
+
session = SessionManager.open(location.sessionFile, location.sessionDir, cwd);
|
|
42
73
|
}
|
|
43
74
|
catch {
|
|
44
75
|
throw new Error('The Pi provider session could not be read.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conductor-history.js","sourceRoot":"","sources":["../../src/conductor/conductor-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"conductor-history.js","sourceRoot":"","sources":["../../src/conductor/conductor-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve existing path components, including symlinks, while preserving any
|
|
3
|
+
* missing suffix. A dangling symlink is resolved to its intended target too.
|
|
4
|
+
*/
|
|
5
|
+
export declare function canonicalPath(path: string): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* Check path containment using the comparison rules of the containing volume.
|
|
8
|
+
* This matters for missing suffixes: realpath cannot normalize their casing.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isPathWithin(parent: string, target: string): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Check whether the spelling, canonical target, or any symlink-resolution hop
|
|
13
|
+
* lies within a protected root. This catches a user-layer symlink to a project
|
|
14
|
+
* file even when that project file is itself a symlink elsewhere.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isPathWithinAnyRoot(targetPath: string, roots: readonly string[]): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Project-owned paths that setup and Pi auth may encounter as write targets.
|
|
19
|
+
* Include links anywhere under the project roots so external symlink targets
|
|
20
|
+
* are protected while unrelated user links remain compatible.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getProjectWriteBoundaryPaths(cwd: string, projectPiDirs: readonly string[]): Promise<string[]>;
|
|
23
|
+
//# sourceMappingURL=conductor-path-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conductor-path-safety.d.ts","sourceRoot":"","sources":["../../src/conductor/conductor-path-safety.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBjE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBnF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { lstat, readdir, readlink, realpath, stat, } from 'node:fs/promises';
|
|
2
|
+
import { basename, dirname, isAbsolute, join, parse, relative, resolve, sep, } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve existing path components, including symlinks, while preserving any
|
|
5
|
+
* missing suffix. A dangling symlink is resolved to its intended target too.
|
|
6
|
+
*/
|
|
7
|
+
export async function canonicalPath(path) {
|
|
8
|
+
const absolute = resolve(path);
|
|
9
|
+
try {
|
|
10
|
+
return await realpath(absolute);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (!isMissingFile(error))
|
|
14
|
+
throw error;
|
|
15
|
+
try {
|
|
16
|
+
const details = await lstat(absolute);
|
|
17
|
+
if (details.isSymbolicLink()) {
|
|
18
|
+
const linkTarget = await readlink(absolute);
|
|
19
|
+
return canonicalPath(resolve(dirname(absolute), linkTarget));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (linkError) {
|
|
23
|
+
if (!isMissingFile(linkError))
|
|
24
|
+
throw linkError;
|
|
25
|
+
}
|
|
26
|
+
const parent = dirname(absolute);
|
|
27
|
+
if (parent === absolute)
|
|
28
|
+
return absolute;
|
|
29
|
+
return join(await canonicalPath(parent), basename(absolute));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check path containment using the comparison rules of the containing volume.
|
|
34
|
+
* This matters for missing suffixes: realpath cannot normalize their casing.
|
|
35
|
+
*/
|
|
36
|
+
export async function isPathWithin(parent, target) {
|
|
37
|
+
const absoluteParent = resolve(parent);
|
|
38
|
+
const absoluteTarget = resolve(target);
|
|
39
|
+
if (isPathWithinCaseSensitive(absoluteParent, absoluteTarget))
|
|
40
|
+
return true;
|
|
41
|
+
if (!isPathWithinCaseInsensitive(absoluteParent, absoluteTarget))
|
|
42
|
+
return false;
|
|
43
|
+
const commonAncestor = await deepestExistingDirectory(commonPathPrefix(absoluteParent, absoluteTarget));
|
|
44
|
+
const isCaseInsensitive = await detectCaseInsensitiveLookup(commonAncestor);
|
|
45
|
+
if (isCaseInsensitive === undefined) {
|
|
46
|
+
throw new Error('Could not determine whether the resource paths alias each other; refusing the write.');
|
|
47
|
+
}
|
|
48
|
+
return isCaseInsensitive;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check whether the spelling, canonical target, or any symlink-resolution hop
|
|
52
|
+
* lies within a protected root. This catches a user-layer symlink to a project
|
|
53
|
+
* file even when that project file is itself a symlink elsewhere.
|
|
54
|
+
*/
|
|
55
|
+
export async function isPathWithinAnyRoot(targetPath, roots) {
|
|
56
|
+
const targetAliases = await pathAliases(targetPath);
|
|
57
|
+
for (const root of roots) {
|
|
58
|
+
const rootAliases = await pathAliases(root);
|
|
59
|
+
for (const parent of rootAliases) {
|
|
60
|
+
for (const target of targetAliases) {
|
|
61
|
+
if (await isPathWithin(parent, target))
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Project-owned paths that setup and Pi auth may encounter as write targets.
|
|
70
|
+
* Include links anywhere under the project roots so external symlink targets
|
|
71
|
+
* are protected while unrelated user links remain compatible.
|
|
72
|
+
*/
|
|
73
|
+
export async function getProjectWriteBoundaryPaths(cwd, projectPiDirs) {
|
|
74
|
+
const projectEnsembleDir = join(resolve(cwd), '.ensemble');
|
|
75
|
+
const projectPiRoots = [...new Set(projectPiDirs.map((path) => resolve(path)))];
|
|
76
|
+
const projectRoots = [...new Set([projectEnsembleDir, ...projectPiRoots])];
|
|
77
|
+
const symlinkPaths = new Set();
|
|
78
|
+
const visitedDirectories = new Set();
|
|
79
|
+
for (const root of projectRoots) {
|
|
80
|
+
await collectProjectSymlinkPaths(root, symlinkPaths, visitedDirectories);
|
|
81
|
+
}
|
|
82
|
+
return [
|
|
83
|
+
...projectRoots,
|
|
84
|
+
join(projectEnsembleDir, 'config.yaml'),
|
|
85
|
+
...projectPiRoots.flatMap((root) => [
|
|
86
|
+
join(root, 'settings.json'),
|
|
87
|
+
join(root, 'auth.json'),
|
|
88
|
+
]),
|
|
89
|
+
...symlinkPaths,
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Find links inside a project resource tree without following them. Each link
|
|
94
|
+
* becomes a protected root, so a user path that points at the same external
|
|
95
|
+
* file or directory is rejected while unrelated external user links remain
|
|
96
|
+
* usable. An unreadable tree cannot be checked safely, so fail closed.
|
|
97
|
+
*/
|
|
98
|
+
async function collectProjectSymlinkPaths(root, symlinkPaths, visitedDirectories) {
|
|
99
|
+
const pendingDirectories = [root];
|
|
100
|
+
while (pendingDirectories.length > 0) {
|
|
101
|
+
const directory = pendingDirectories.pop();
|
|
102
|
+
let directoryDetails;
|
|
103
|
+
try {
|
|
104
|
+
directoryDetails = await lstat(directory);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (isMissingFile(error))
|
|
108
|
+
continue;
|
|
109
|
+
throw new Error(`Could not inspect project write boundary at ${directory}; refusing the write.`, { cause: error });
|
|
110
|
+
}
|
|
111
|
+
if (directoryDetails.isSymbolicLink()) {
|
|
112
|
+
symlinkPaths.add(directory);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!directoryDetails.isDirectory())
|
|
116
|
+
continue;
|
|
117
|
+
const identity = directoryDetails.ino !== 0
|
|
118
|
+
? `${directoryDetails.dev}:${directoryDetails.ino}`
|
|
119
|
+
: await realpath(directory);
|
|
120
|
+
if (visitedDirectories.has(identity))
|
|
121
|
+
continue;
|
|
122
|
+
visitedDirectories.add(identity);
|
|
123
|
+
let entries;
|
|
124
|
+
try {
|
|
125
|
+
entries = await readdir(directory, { withFileTypes: true });
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw new Error(`Could not inspect project write boundary at ${directory}; refusing the write.`, { cause: error });
|
|
129
|
+
}
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const entryPath = join(directory, entry.name);
|
|
132
|
+
if (entry.isSymbolicLink()) {
|
|
133
|
+
symlinkPaths.add(entryPath);
|
|
134
|
+
}
|
|
135
|
+
else if (entry.isDirectory()) {
|
|
136
|
+
pendingDirectories.push(entryPath);
|
|
137
|
+
}
|
|
138
|
+
else if (!entry.isFile()) {
|
|
139
|
+
// Some filesystems do not report directory entry types. Inspect only
|
|
140
|
+
// those ambiguous entries so symlinks are not silently missed.
|
|
141
|
+
let details;
|
|
142
|
+
try {
|
|
143
|
+
details = await lstat(entryPath);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new Error(`Could not inspect project write boundary at ${entryPath}; refusing the write.`, { cause: error });
|
|
147
|
+
}
|
|
148
|
+
if (details.isSymbolicLink())
|
|
149
|
+
symlinkPaths.add(entryPath);
|
|
150
|
+
else if (details.isDirectory())
|
|
151
|
+
pendingDirectories.push(entryPath);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function pathAliases(path) {
|
|
157
|
+
const aliases = new Set();
|
|
158
|
+
const absolutePath = resolve(path);
|
|
159
|
+
await traceSymlinkPaths(absolutePath, aliases, 0);
|
|
160
|
+
aliases.add(await canonicalPath(absolutePath));
|
|
161
|
+
return [...aliases];
|
|
162
|
+
}
|
|
163
|
+
async function traceSymlinkPaths(path, aliases, depth) {
|
|
164
|
+
const absolutePath = resolve(path);
|
|
165
|
+
aliases.add(absolutePath);
|
|
166
|
+
if (depth > 40) {
|
|
167
|
+
throw new Error(`Too many symlinks while checking path ${absolutePath}.`);
|
|
168
|
+
}
|
|
169
|
+
const root = parse(absolutePath).root;
|
|
170
|
+
const segments = absolutePath.slice(root.length).split(sep).filter(Boolean);
|
|
171
|
+
let current = root;
|
|
172
|
+
for (let index = 0; index < segments.length; index += 1) {
|
|
173
|
+
const entryPath = join(current, segments[index]);
|
|
174
|
+
let details;
|
|
175
|
+
try {
|
|
176
|
+
details = await lstat(entryPath);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (!isMissingFile(error))
|
|
180
|
+
throw error;
|
|
181
|
+
const missingPath = join(current, ...segments.slice(index));
|
|
182
|
+
aliases.add(missingPath);
|
|
183
|
+
aliases.add(await canonicalPath(missingPath));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (!details.isSymbolicLink()) {
|
|
187
|
+
current = entryPath;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const targetPath = resolve(dirname(entryPath), await readlink(entryPath));
|
|
191
|
+
const replacementPath = join(targetPath, ...segments.slice(index + 1));
|
|
192
|
+
await traceSymlinkPaths(replacementPath, aliases, depth + 1);
|
|
193
|
+
aliases.add(replacementPath);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
aliases.add(current);
|
|
197
|
+
}
|
|
198
|
+
function isPathWithinCaseSensitive(parent, target) {
|
|
199
|
+
const pathFromParent = relative(parent, target);
|
|
200
|
+
return (pathFromParent === '' ||
|
|
201
|
+
(pathFromParent !== '..' &&
|
|
202
|
+
!pathFromParent.startsWith(`..${sep}`) &&
|
|
203
|
+
!isAbsolute(pathFromParent)));
|
|
204
|
+
}
|
|
205
|
+
function isPathWithinCaseInsensitive(parent, target) {
|
|
206
|
+
const parentParts = splitPath(parent);
|
|
207
|
+
const targetParts = splitPath(target);
|
|
208
|
+
if (normalizeCaseInsensitive(parentParts.root) !== normalizeCaseInsensitive(targetParts.root)) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (parentParts.segments.length > targetParts.segments.length)
|
|
212
|
+
return false;
|
|
213
|
+
return parentParts.segments.every((part, index) => normalizeCaseInsensitive(part) === normalizeCaseInsensitive(targetParts.segments[index]));
|
|
214
|
+
}
|
|
215
|
+
function splitPath(path) {
|
|
216
|
+
const absolute = resolve(path);
|
|
217
|
+
const root = parse(absolute).root;
|
|
218
|
+
return {
|
|
219
|
+
root,
|
|
220
|
+
segments: absolute.slice(root.length).split(sep).filter(Boolean),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function normalizeCaseInsensitive(value) {
|
|
224
|
+
return value.normalize('NFD').toLowerCase();
|
|
225
|
+
}
|
|
226
|
+
function commonPathPrefix(left, right) {
|
|
227
|
+
const leftParts = splitPath(left);
|
|
228
|
+
const rightParts = splitPath(right);
|
|
229
|
+
if (normalizeCaseInsensitive(leftParts.root) !== normalizeCaseInsensitive(rightParts.root)) {
|
|
230
|
+
return leftParts.root;
|
|
231
|
+
}
|
|
232
|
+
let common = leftParts.root;
|
|
233
|
+
const segmentCount = Math.min(leftParts.segments.length, rightParts.segments.length);
|
|
234
|
+
for (let index = 0; index < segmentCount; index += 1) {
|
|
235
|
+
const leftSegment = leftParts.segments[index];
|
|
236
|
+
if (leftSegment !== rightParts.segments[index])
|
|
237
|
+
break;
|
|
238
|
+
common = join(common, leftSegment);
|
|
239
|
+
}
|
|
240
|
+
return common;
|
|
241
|
+
}
|
|
242
|
+
async function deepestExistingDirectory(path) {
|
|
243
|
+
let current = resolve(path);
|
|
244
|
+
while (true) {
|
|
245
|
+
try {
|
|
246
|
+
const details = await stat(current);
|
|
247
|
+
if (details.isDirectory())
|
|
248
|
+
return await realpath(current);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
if (!isMissingFile(error))
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
254
|
+
const parent = dirname(current);
|
|
255
|
+
if (parent === current)
|
|
256
|
+
return await realpath(current);
|
|
257
|
+
current = parent;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Probe existing directory entries without creating files. On a
|
|
262
|
+
* case-insensitive volume, changing an ASCII letter in a directory entry still
|
|
263
|
+
* resolves to the same directory inode. Climbing within the same device also
|
|
264
|
+
* handles an empty `.ensemble` directory.
|
|
265
|
+
*/
|
|
266
|
+
async function detectCaseInsensitiveLookup(directory) {
|
|
267
|
+
let current = directory;
|
|
268
|
+
while (true) {
|
|
269
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
270
|
+
for (const entry of entries) {
|
|
271
|
+
if (!entry.isDirectory())
|
|
272
|
+
continue;
|
|
273
|
+
const alternateName = toggleAsciiCase(entry.name);
|
|
274
|
+
if (!alternateName)
|
|
275
|
+
continue;
|
|
276
|
+
try {
|
|
277
|
+
const [original, alternate] = await Promise.all([
|
|
278
|
+
lstat(join(current, entry.name)),
|
|
279
|
+
lstat(join(current, alternateName)),
|
|
280
|
+
]);
|
|
281
|
+
return (original.isDirectory() &&
|
|
282
|
+
alternate.isDirectory() &&
|
|
283
|
+
original.dev === alternate.dev &&
|
|
284
|
+
original.ino === alternate.ino);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
if (isMissingFile(error))
|
|
288
|
+
return false;
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const parent = dirname(current);
|
|
293
|
+
if (parent === current)
|
|
294
|
+
return undefined;
|
|
295
|
+
const [currentDetails, parentDetails] = await Promise.all([stat(current), stat(parent)]);
|
|
296
|
+
if (currentDetails.dev !== parentDetails.dev)
|
|
297
|
+
return undefined;
|
|
298
|
+
current = parent;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function toggleAsciiCase(value) {
|
|
302
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
303
|
+
const character = value[index];
|
|
304
|
+
if (character >= 'a' && character <= 'z') {
|
|
305
|
+
return `${value.slice(0, index)}${character.toUpperCase()}${value.slice(index + 1)}`;
|
|
306
|
+
}
|
|
307
|
+
if (character >= 'A' && character <= 'Z') {
|
|
308
|
+
return `${value.slice(0, index)}${character.toLowerCase()}${value.slice(index + 1)}`;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
function isMissingFile(error) {
|
|
314
|
+
return (typeof error === 'object' &&
|
|
315
|
+
error !== null &&
|
|
316
|
+
'code' in error &&
|
|
317
|
+
error.code === 'ENOENT');
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=conductor-path-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conductor-path-safety.js","sourceRoot":"","sources":["../../src/conductor/conductor-path-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,16 @@ export interface PiProviderAuthStatus {
|
|
|
13
13
|
provider: string;
|
|
14
14
|
configured: boolean;
|
|
15
15
|
source?: string;
|
|
16
|
+
mode?: 'oauth' | 'api_key' | 'command';
|
|
17
|
+
scope?: 'user' | 'project';
|
|
18
|
+
configurationPath?: string;
|
|
19
|
+
/** Configured settings command metadata when it is not the selected source. */
|
|
20
|
+
commandConfiguration?: {
|
|
21
|
+
source: 'settings_json';
|
|
22
|
+
scope: 'user' | 'project';
|
|
23
|
+
path: string;
|
|
24
|
+
effective: boolean;
|
|
25
|
+
};
|
|
16
26
|
label?: string;
|
|
17
27
|
}
|
|
18
28
|
export interface PiConductorAuthStatus {
|
|
@@ -41,6 +51,32 @@ export interface PiConductorAuthOptions extends PiResourceLoaderOptions {
|
|
|
41
51
|
provider?: string;
|
|
42
52
|
modelId?: string;
|
|
43
53
|
}
|
|
54
|
+
export type PiConductorAuthTarget = 'user' | 'project';
|
|
55
|
+
export interface PiConductorCommandAuthResult {
|
|
56
|
+
backend: 'pi';
|
|
57
|
+
provider: string;
|
|
58
|
+
target: PiConductorAuthTarget;
|
|
59
|
+
settingsPath: string;
|
|
60
|
+
cleared?: boolean;
|
|
61
|
+
}
|
|
62
|
+
type PiOAuthPrompt = Parameters<OAuthLoginCallbacks['onPrompt']>[0] & {
|
|
63
|
+
type: 'text' | 'secret' | 'manual_code';
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
};
|
|
66
|
+
type PiOAuthManualCodePrompt = {
|
|
67
|
+
message?: string;
|
|
68
|
+
placeholder?: string;
|
|
69
|
+
signal?: AbortSignal;
|
|
70
|
+
};
|
|
71
|
+
type PiOAuthSelectPrompt = Parameters<OAuthLoginCallbacks['onSelect']>[0] & {
|
|
72
|
+
signal?: AbortSignal;
|
|
73
|
+
};
|
|
74
|
+
/** Pi prompts carry per-prompt cancellation signals through the CLI callbacks. */
|
|
75
|
+
export type PiConductorOAuthLoginCallbacks = Omit<OAuthLoginCallbacks, 'onPrompt' | 'onManualCodeInput' | 'onSelect'> & {
|
|
76
|
+
onPrompt(prompt: PiOAuthPrompt): Promise<string>;
|
|
77
|
+
onManualCodeInput?(prompt?: PiOAuthManualCodePrompt): Promise<string>;
|
|
78
|
+
onSelect(prompt: PiOAuthSelectPrompt): Promise<string | undefined>;
|
|
79
|
+
};
|
|
44
80
|
/** Create the Pi 1.x model runtime and registry for the resolved resource roots. */
|
|
45
81
|
export declare function createPiConductorAuthContext(options: PiResourceLoaderOptions, resources?: PiResources): Promise<PiConductorAuthContext>;
|
|
46
82
|
/** Resolve the provider used by `ensemble auth` from an explicit/default model. */
|
|
@@ -48,12 +84,21 @@ export declare function resolvePiConductorProvider(options: PiConductorAuthOptio
|
|
|
48
84
|
/** Login to a Pi provider. API-key login persists only in the user auth file. */
|
|
49
85
|
export declare function loginPiConductor(options: PiConductorAuthOptions & {
|
|
50
86
|
apiKey?: string;
|
|
51
|
-
oauthCallbacks?:
|
|
87
|
+
oauthCallbacks?: PiConductorOAuthLoginCallbacks;
|
|
52
88
|
}): Promise<PiConductorLoginResult>;
|
|
53
89
|
/** Whether the selected Pi provider exposes Pi's native OAuth login flow. */
|
|
54
90
|
export declare function isPiConductorOAuthProvider(options: PiConductorAuthOptions): Promise<boolean>;
|
|
55
91
|
/** Remove a Pi provider's user-layer credential. */
|
|
56
92
|
export declare function logoutPiConductor(options: PiConductorAuthOptions): Promise<PiConductorLogoutResult>;
|
|
93
|
+
/** Register a Pi `!command` in the selected settings.json apiKeys entry. */
|
|
94
|
+
export declare function setPiConductorCommandAuth(options: PiConductorAuthOptions & {
|
|
95
|
+
command: string;
|
|
96
|
+
target?: PiConductorAuthTarget;
|
|
97
|
+
}): Promise<PiConductorCommandAuthResult>;
|
|
98
|
+
/** Remove only a command value from the selected settings.json apiKeys entry. */
|
|
99
|
+
export declare function clearPiConductorCommandAuth(options: PiConductorAuthOptions & {
|
|
100
|
+
target?: PiConductorAuthTarget;
|
|
101
|
+
}): Promise<PiConductorCommandAuthResult>;
|
|
57
102
|
/** Return non-secret Pi auth metadata for the selected/default provider. */
|
|
58
103
|
export declare function getPiConductorAuthStatus(options: PiConductorAuthOptions): Promise<PiConductorAuthStatus>;
|
|
59
104
|
/** List only Pi models whose provider has usable configured auth. */
|
|
@@ -66,10 +111,20 @@ export declare function resolvePiConductorApiKey(options: {
|
|
|
66
111
|
explicitApiKey?: string;
|
|
67
112
|
env?: NodeJS.ProcessEnv;
|
|
68
113
|
}): Promise<string | undefined>;
|
|
114
|
+
/** Prepare configured Pi commands when a provider request asks ModelRuntime for auth. */
|
|
115
|
+
export declare function preparePiConductorCommandAuthForRequest(options: {
|
|
116
|
+
modelRuntime: ModelRuntime;
|
|
117
|
+
resources: Pick<PiResources, 'roots' | 'authLayers' | 'settings' | 'models'>;
|
|
118
|
+
provider: string;
|
|
119
|
+
env?: NodeJS.ProcessEnv;
|
|
120
|
+
}): Promise<void>;
|
|
121
|
+
/** Whether resolving this provider's configured Pi credential can run a command. */
|
|
122
|
+
export declare function hasPiConductorCommandCredential(resources: Pick<PiResources, 'roots' | 'authLayers' | 'settings' | 'models'>, provider: string, env?: NodeJS.ProcessEnv): boolean;
|
|
69
123
|
/** Return whether a provider has configured auth without exposing its value. */
|
|
70
|
-
export declare function hasPiProviderAuth(provider: string, context: PiConductorAuthContext, resources: Pick<PiResources, 'roots' | 'authLayers' | 'settings' | 'models'>, env?: NodeJS.ProcessEnv): boolean;
|
|
124
|
+
export declare function hasPiProviderAuth(provider: string, context: PiConductorAuthContext, resources: Pick<PiResources, 'roots' | 'authLayers' | 'settings' | 'settingsLayers' | 'models' | 'modelsLayers'>, env?: NodeJS.ProcessEnv): boolean;
|
|
71
125
|
/** Synchronous readiness check used by CLI/e2e guards before async loading. */
|
|
72
126
|
export declare function hasPiConductorAuth(options: PiConductorAuthOptions): boolean;
|
|
73
127
|
/** Return the concrete environment variables recognised by Pi for a provider. */
|
|
74
128
|
export declare function formatPiProviderEnvHint(provider: string): string;
|
|
129
|
+
export {};
|
|
75
130
|
//# sourceMappingURL=conductor-pi-auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conductor-pi-auth.d.ts","sourceRoot":"","sources":["../../src/conductor/conductor-pi-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conductor-pi-auth.d.ts","sourceRoot":"","sources":["../../src/conductor/conductor-pi-auth.ts"],"names":[],"mappings":"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"}
|