@oh-my-pi/pi-coding-agent 15.7.6 → 15.8.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/CHANGELOG.md +146 -198
- package/dist/types/async/job-manager.d.ts +3 -3
- package/dist/types/cli/args.d.ts +1 -0
- package/dist/types/cli/claude-trace-cli.d.ts +54 -0
- package/dist/types/cli/session-picker.d.ts +10 -3
- package/dist/types/cli/update-cli.d.ts +17 -0
- package/dist/types/commands/launch.d.ts +3 -0
- package/dist/types/config/keybindings.d.ts +5 -0
- package/dist/types/config/settings-schema.d.ts +2 -2
- package/dist/types/config/settings.d.ts +13 -0
- package/dist/types/eval/concurrency-bridge.d.ts +26 -0
- package/dist/types/eval/js/tool-bridge.d.ts +2 -1
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +11 -0
- package/dist/types/main.d.ts +5 -0
- package/dist/types/modes/components/custom-editor.d.ts +3 -1
- package/dist/types/modes/components/hook-selector.d.ts +3 -0
- package/dist/types/modes/components/session-selector.d.ts +32 -5
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +2 -2
- package/dist/types/modes/controllers/input-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +9 -2
- package/dist/types/modes/types.d.ts +4 -2
- package/dist/types/registry/agent-registry.d.ts +1 -1
- package/dist/types/sdk.d.ts +2 -2
- package/dist/types/session/agent-session.d.ts +4 -2
- package/dist/types/session/history-storage.d.ts +16 -1
- package/dist/types/session/session-manager.d.ts +4 -0
- package/dist/types/task/output-manager.d.ts +6 -15
- package/dist/types/tools/find.d.ts +0 -9
- package/dist/types/tools/index.d.ts +1 -1
- package/dist/types/tools/path-utils.d.ts +16 -0
- package/dist/types/tools/sqlite-reader.d.ts +25 -8
- package/dist/types/utils/clipboard.d.ts +4 -0
- package/dist/types/web/kagi.d.ts +76 -0
- package/dist/types/web/search/providers/exa.d.ts +7 -1
- package/dist/types/web/search/providers/kagi.d.ts +1 -0
- package/package.json +9 -9
- package/src/async/job-manager.ts +3 -3
- package/src/cli/args.ts +6 -2
- package/src/cli/claude-trace-cli.ts +783 -0
- package/src/cli/session-picker.ts +36 -10
- package/src/cli/update-cli.ts +35 -2
- package/src/commands/launch.ts +3 -0
- package/src/config/keybindings.ts +6 -0
- package/src/config/settings-schema.ts +2 -2
- package/src/config/settings.ts +23 -0
- package/src/discovery/claude-plugins.ts +7 -9
- package/src/eval/__tests__/agent-bridge.test.ts +58 -4
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/js/shared/prelude.txt +20 -17
- package/src/eval/js/tool-bridge.ts +5 -0
- package/src/eval/py/prelude.py +23 -15
- package/src/extensibility/plugins/legacy-pi-compat.ts +115 -131
- package/src/extensibility/skills.ts +0 -1
- package/src/internal-urls/docs-index.generated.ts +11 -10
- package/src/main.ts +92 -24
- package/src/modes/acp/acp-event-mapper.ts +54 -4
- package/src/modes/components/custom-editor.ts +10 -0
- package/src/modes/components/hook-selector.ts +89 -31
- package/src/modes/components/oauth-selector.ts +12 -6
- package/src/modes/components/session-selector.ts +179 -24
- package/src/modes/components/tool-execution.ts +16 -3
- package/src/modes/controllers/command-controller.ts +2 -11
- package/src/modes/controllers/extension-ui-controller.ts +3 -2
- package/src/modes/controllers/input-controller.ts +19 -1
- package/src/modes/controllers/selector-controller.ts +61 -21
- package/src/modes/interactive-mode.ts +125 -15
- package/src/modes/types.ts +5 -2
- package/src/prompts/system/orchestrate-notice.md +5 -3
- package/src/prompts/system/workflow-notice.md +2 -2
- package/src/prompts/tools/eval.md +5 -5
- package/src/prompts/tools/find.md +1 -1
- package/src/prompts/tools/irc.md +6 -6
- package/src/prompts/tools/search.md +1 -1
- package/src/prompts/tools/task.md +1 -1
- package/src/registry/agent-registry.ts +1 -1
- package/src/sdk.ts +85 -31
- package/src/session/agent-session.ts +62 -46
- package/src/session/history-storage.ts +56 -12
- package/src/session/session-manager.ts +34 -0
- package/src/task/output-manager.ts +40 -48
- package/src/task/render.ts +3 -8
- package/src/tools/browser/tab-worker.ts +8 -5
- package/src/tools/find.ts +5 -29
- package/src/tools/index.ts +1 -1
- package/src/tools/path-utils.ts +144 -1
- package/src/tools/read.ts +47 -0
- package/src/tools/search.ts +2 -27
- package/src/tools/sqlite-reader.ts +92 -9
- package/src/utils/clipboard.ts +38 -1
- package/src/utils/open.ts +37 -2
- package/src/web/kagi.ts +168 -49
- package/src/web/search/providers/anthropic.ts +1 -1
- package/src/web/search/providers/exa.ts +20 -86
- package/src/web/search/providers/kagi.ts +4 -0
|
@@ -9,8 +9,8 @@ export interface AsyncJob {
|
|
|
9
9
|
resultText?: string;
|
|
10
10
|
errorText?: string;
|
|
11
11
|
/**
|
|
12
|
-
* Registry id of the agent that registered the job (e.g. "
|
|
13
|
-
* "
|
|
12
|
+
* Registry id of the agent that registered the job (e.g. "Main",
|
|
13
|
+
* "AuthLoader"). Used by scoped cancel/list APIs so a subagent's teardown
|
|
14
14
|
* does not cancel its parent's jobs. Undefined for callers that don't
|
|
15
15
|
* supply an id (e.g. legacy tests, SDK consumers without an agent context).
|
|
16
16
|
*/
|
|
@@ -36,7 +36,7 @@ export interface AsyncJobRegisterOptions {
|
|
|
36
36
|
/**
|
|
37
37
|
* Filter applied to job query/cancel APIs. With `ownerId`, results are
|
|
38
38
|
* restricted to jobs registered by that agent (registry id from
|
|
39
|
-
* `AgentRegistry`, e.g. "
|
|
39
|
+
* `AgentRegistry`, e.g. "Main", "AuthLoader").
|
|
40
40
|
*/
|
|
41
41
|
export interface AsyncJobFilter {
|
|
42
42
|
ownerId?: string;
|
package/dist/types/cli/args.d.ts
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare const CLAUDE_TRACE_DEBUG_CERT = "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIUAe9omAqLbydZc5ZYZGhwbbpMSF0wDQYJKoZIhvcNAQEL\nBQAwGzEZMBcGA1UEAwwQb21wLWNsYXVkZS10cmFjZTAeFw0yNjA2MDIwODA2MjFa\nFw0zNjA1MzAwODA2MjFaMBsxGTAXBgNVBAMMEG9tcC1jbGF1ZGUtdHJhY2UwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmpGe5T8B0oA2L82Rn5JJdXOBS\nZX0DyBjiIK+Tqe8T3oAr41XDLnweqtrMDSBDYbVqAoKjNbaTUSYYcxSm0MAVs63w\n08SfJmShZM9pElfANqXqMiyhksFgji7JEyt/rbbId207a7s5KvRvm3g/sxN/wGtr\nC5LCLMlc2GWEGD8qrVIQbmLw884qvtXi70RFUPP3Wpy4wGMWSdE+9IA27R5cMJS5\noHsO4HGB6J8VzLY+HGY2yr4BJ9qrAyjd1UetFd9RdcjyWpsbAfX8nWP+uleTNOiT\nExNz7dPt/k6OPLNmI1iT/ruRS0uUzHZTimPd67TPQR/70RaW7Bh5wArawGw9AgMB\nAAGjUzBRMB0GA1UdDgQWBBQa4Ir8P3GAolZoPiuB4V2cq3riAjAfBgNVHSMEGDAW\ngBQa4Ir8P3GAolZoPiuB4V2cq3riAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3\nDQEBCwUAA4IBAQClPYki235gDEUu7eDm60qsAGWxbKVv4pSh+vB+xgNgzMk4aOuU\nmSfp8Y8covwklph8VfDoKTaEGqqX0Q5s74Ctl6Mwy7b0u8Zztk/g4GynLocI7TQD\nftZMgZka49+FkEsjp+XZtQbO4vOL5UsccpsLhFQQQuhVyiJ4gNo/VzgvSDkBuf3Q\nRz7xFiDKCqFEoMPty4+nKEw5832FJ5mDCOyMk6fGSO8Wbt/hmRQQFu2cSdoBs0OT\nAQQJETQjPkKeTDX4jdSAlOeKwfyjfdfgeQuMkzX8xafisJa66MLPzOVbIuGbvbWD\nQVCd76iYPcfNK+JZUhmAUvTHSuwgJMZ6+NgI\n-----END CERTIFICATE-----";
|
|
2
|
+
export declare const CLAUDE_TRACE_DEBUG_KEY = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmpGe5T8B0oA2L\n82Rn5JJdXOBSZX0DyBjiIK+Tqe8T3oAr41XDLnweqtrMDSBDYbVqAoKjNbaTUSYY\ncxSm0MAVs63w08SfJmShZM9pElfANqXqMiyhksFgji7JEyt/rbbId207a7s5KvRv\nm3g/sxN/wGtrC5LCLMlc2GWEGD8qrVIQbmLw884qvtXi70RFUPP3Wpy4wGMWSdE+\n9IA27R5cMJS5oHsO4HGB6J8VzLY+HGY2yr4BJ9qrAyjd1UetFd9RdcjyWpsbAfX8\nnWP+uleTNOiTExNz7dPt/k6OPLNmI1iT/ruRS0uUzHZTimPd67TPQR/70RaW7Bh5\nwArawGw9AgMBAAECggEADX2mhA3H0pPuj35J36X/5Me9xWM//AwOr6febwGalazg\nCtg3EOZ01/VptzaiKQetAdhoLmxidooNn9HD7JQJKPid7q7w7m1+R26mN/xrLD2A\nWyBqv+iQoo+ANs5y1BMChuIxmVY/FwFk6UWDNlekuXqgzPln4okbrYTmBbaszniO\nMu1SI/3fpnTA3iJ634FUSRVoUPP8r0WEEUtpW1wAhsJR701gvKRYw/+YcRglkhm7\nT4l6TuBcgIVzUqAc3oZLHVIMKN0ZprZSeopSRozTcUANfYONakvK9Hx1qf+/rmTR\nqZHg2uOxlqvxyABnwdk8rmyFx8YqUeN9jaAbbXxtBQKBgQDQRjc0gVg4STqcFqUu\nFW35MZ88S7+xTuRd/EG1dpsu2lptx1yhSLTsF5GfxBQKXCQUfWrpkyuCmlV6s+wJ\nH0LSyAJQ4ffBsFterQz7dRKTlhRJNk5PYn8jjNCAuBYVSbQZqZ3yZgG3CT3G5+PZ\n8Ln3tJHqTRfP5B8KTMcNYiLI0wKBgQDM0/gdb9Dvdz/32GIpxwNNIb52IxnNVVrm\nM69+4XNg6CqvctZFuaMQ03W2J5IKAdESaCGLz9pwHZRjfBORcw3BPKD2QkfN5NJg\nhWvLlfAsblCYiCCjTCB6rf1OJOQ5fHoNFh1wqDaQCk0flsb9nlZmQQR5ZUHaJhSC\nQqMmeKvMrwKBgQDDzp+sH0Z/dGlDwg59auw/caWRHG4WFmOg8L4eCmoO/H4z41B0\n2VQu+mGQYNmue733/Yl8Gz62xL5EY88vLFK4tA1pWWiCknj0Y6Fm70QNuPVNd17c\nR2/cTlDgEzG/xdEqp0q1T62hFXEdBXoztZxBA2SDcQNIEeIU3uXs8SxevQKBgFp4\nacf+wody4aNERR900sV32RtvJ49lWxAA1kwxone0NF5oV7JWa2scK4r4cW3QHZuG\nuQJ7HV2WAxvqCu6cpf+rGuGKpxKPNkkBxXoX0Qye8SReRCQ8lL/7J74jV1b43yP2\nl6xR8D+w/R2tyFjvXfQuVZ6VFgAX/8kFS/DLLf7rAoGAcnFgCwyzcq6FWL8iW23J\nGnbZ0IQk6SPch87MzMmnOFlEXrCf5l832vwI65tNzOoB0yQoWVfBv5sb4Zy9zeFj\nFbkpRZC0Kfi9PLzDV4IawoIINYthOJxIKJg+yrmrUWCggXxwdzYIYKLRIskMXoYs\nmNMXfUstElEcKO7+DKiPi6U=\n-----END PRIVATE KEY-----";
|
|
3
|
+
export interface HeaderEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CapturedRequest {
|
|
8
|
+
method: string;
|
|
9
|
+
path: string;
|
|
10
|
+
version: string;
|
|
11
|
+
headers: HeaderEntry[];
|
|
12
|
+
body: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CapturedResponse {
|
|
15
|
+
statusCode: number | undefined;
|
|
16
|
+
statusMessage: string;
|
|
17
|
+
version: string;
|
|
18
|
+
headers: HeaderEntry[];
|
|
19
|
+
body: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CapturedMessagesExchange {
|
|
22
|
+
target: string;
|
|
23
|
+
request: CapturedRequest;
|
|
24
|
+
response: CapturedResponse;
|
|
25
|
+
}
|
|
26
|
+
export interface ClaudeMessagesProxyOptions {
|
|
27
|
+
host?: string;
|
|
28
|
+
port?: number;
|
|
29
|
+
upstreamTlsRejectUnauthorized?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface ClaudeTraceCommandArgs {
|
|
32
|
+
command?: string;
|
|
33
|
+
message?: string;
|
|
34
|
+
cwd?: string;
|
|
35
|
+
host?: string;
|
|
36
|
+
port?: number;
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
inputDelayMs?: number;
|
|
39
|
+
json?: boolean;
|
|
40
|
+
upstreamTlsRejectUnauthorized?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare function formatCapturedMessagesExchange(exchange: CapturedMessagesExchange): string;
|
|
43
|
+
export declare class ClaudeMessagesProxy {
|
|
44
|
+
#private;
|
|
45
|
+
constructor(options?: ClaudeMessagesProxyOptions);
|
|
46
|
+
get host(): string;
|
|
47
|
+
get port(): number;
|
|
48
|
+
get url(): string;
|
|
49
|
+
start(): Promise<void>;
|
|
50
|
+
stop(): Promise<void>;
|
|
51
|
+
waitForCapture(timeoutMs: number): Promise<CapturedMessagesExchange>;
|
|
52
|
+
}
|
|
53
|
+
export declare function runClaudeMessagesCapture(args?: ClaudeTraceCommandArgs): Promise<CapturedMessagesExchange>;
|
|
54
|
+
export declare function runClaudeTraceCommand(args?: ClaudeTraceCommandArgs): Promise<void>;
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type
|
|
2
|
-
/**
|
|
3
|
-
|
|
1
|
+
import { type SessionInfo } from "../session/session-manager";
|
|
2
|
+
/**
|
|
3
|
+
* Show the TUI session selector and return the selected session, or null if
|
|
4
|
+
* cancelled. Tab toggles between current-folder and all-projects scope; the
|
|
5
|
+
* all-projects list is loaded lazily via `SessionManager.listAll`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function selectSession(sessions: SessionInfo[], options?: {
|
|
8
|
+
allSessions?: SessionInfo[];
|
|
9
|
+
startInAllScope?: boolean;
|
|
10
|
+
}): Promise<SessionInfo | null>;
|
|
@@ -25,6 +25,23 @@ export declare function resolveUpdateMethodForTest(ompPath: string, bunBinDir: s
|
|
|
25
25
|
* Atomically replace the installed binary and roll back if version verification fails.
|
|
26
26
|
*/
|
|
27
27
|
export declare function replaceBinaryForUpdate(options: BinaryReplacementOptions): Promise<InstalledVersionVerification>;
|
|
28
|
+
/**
|
|
29
|
+
* Build the bun argv used to globally install a specific omp version.
|
|
30
|
+
*
|
|
31
|
+
* The version is selected by hitting {@link NPM_REGISTRY} directly in
|
|
32
|
+
* {@link getLatestRelease}, so the install MUST observe the same catalog:
|
|
33
|
+
*
|
|
34
|
+
* - `--registry=${NPM_REGISTRY}` pins the install to the official registry
|
|
35
|
+
* regardless of the user's bunfig/`.npmrc`. A mirror (corporate proxy,
|
|
36
|
+
* Taobao, …) that hasn't yet replicated the release would otherwise reject
|
|
37
|
+
* a version the upstream registry already advertises.
|
|
38
|
+
* - `--no-cache` tells bun to ignore its on-disk manifest snapshot so it
|
|
39
|
+
* re-fetches metadata from that registry on every invocation.
|
|
40
|
+
*
|
|
41
|
+
* Together these two flags make `omp update` produce exactly the registry
|
|
42
|
+
* lookup the version check just performed. See #1686.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildBunInstallArgs(expectedVersion: string): string[];
|
|
28
45
|
/**
|
|
29
46
|
* Run the update command.
|
|
30
47
|
*/
|
|
@@ -81,6 +81,9 @@ export default class Index extends Command {
|
|
|
81
81
|
description: string;
|
|
82
82
|
options: import("@oh-my-pi/pi-ai").Effort[];
|
|
83
83
|
};
|
|
84
|
+
"hide-thinking": import("@oh-my-pi/pi-utils/cli").FlagDescriptor<"boolean"> & {
|
|
85
|
+
description: string;
|
|
86
|
+
};
|
|
84
87
|
hook: import("@oh-my-pi/pi-utils/cli").FlagDescriptor<"string"> & {
|
|
85
88
|
description: string;
|
|
86
89
|
multiple: true;
|
|
@@ -19,6 +19,7 @@ interface AppKeybindings {
|
|
|
19
19
|
"app.message.followUp": true;
|
|
20
20
|
"app.message.dequeue": true;
|
|
21
21
|
"app.clipboard.pasteImage": true;
|
|
22
|
+
"app.clipboard.pasteTextRaw": true;
|
|
22
23
|
"app.clipboard.copyLine": true;
|
|
23
24
|
"app.clipboard.copyPrompt": true;
|
|
24
25
|
"app.session.new": true;
|
|
@@ -230,6 +231,10 @@ export declare const KEYBINDINGS: {
|
|
|
230
231
|
readonly defaultKeys: "alt+v" | "ctrl+v";
|
|
231
232
|
readonly description: "Paste image from clipboard";
|
|
232
233
|
};
|
|
234
|
+
readonly "app.clipboard.pasteTextRaw": {
|
|
235
|
+
readonly defaultKeys: ["ctrl+shift+v", "alt+shift+v"];
|
|
236
|
+
readonly description: "Paste text from clipboard as raw text (no collapse)";
|
|
237
|
+
};
|
|
233
238
|
readonly "app.clipboard.copyLine": {
|
|
234
239
|
readonly defaultKeys: "alt+shift+l";
|
|
235
240
|
readonly description: "Copy current line";
|
|
@@ -3281,7 +3281,7 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
3281
3281
|
}, {
|
|
3282
3282
|
readonly value: "exa";
|
|
3283
3283
|
readonly label: "Exa";
|
|
3284
|
-
readonly description: "
|
|
3284
|
+
readonly description: "Requires EXA_API_KEY";
|
|
3285
3285
|
}, {
|
|
3286
3286
|
readonly value: "brave";
|
|
3287
3287
|
readonly label: "Brave";
|
|
@@ -3321,7 +3321,7 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
3321
3321
|
}, {
|
|
3322
3322
|
readonly value: "kagi";
|
|
3323
3323
|
readonly label: "Kagi";
|
|
3324
|
-
readonly description: "Requires KAGI_API_KEY
|
|
3324
|
+
readonly description: "Requires KAGI_API_KEY (Kagi V1 Search API)";
|
|
3325
3325
|
}, {
|
|
3326
3326
|
readonly value: "synthetic";
|
|
3327
3327
|
readonly label: "Synthetic";
|
|
@@ -74,6 +74,19 @@ export declare class Settings {
|
|
|
74
74
|
*/
|
|
75
75
|
flush(): Promise<void>;
|
|
76
76
|
cloneForCwd(cwd: string): Promise<Settings>;
|
|
77
|
+
/**
|
|
78
|
+
* Re-scope this instance to a new working directory *in place*: reload the
|
|
79
|
+
* project layer (`.claude/settings.yml` etc.) from `cwd`, re-resolve
|
|
80
|
+
* path-scoped settings against it, and re-fire side-effect hooks (theme,
|
|
81
|
+
* symbols, tab width, …). Global settings and runtime overrides are preserved.
|
|
82
|
+
*
|
|
83
|
+
* Unlike {@link cloneForCwd}, this mutates the live instance, so every holder
|
|
84
|
+
* (the `settings` proxy, the active session, controllers) observes the new
|
|
85
|
+
* project scope without swapping references — used when the process changes
|
|
86
|
+
* directory mid-run (`/move`, cross-project resume). No-op when `cwd` is
|
|
87
|
+
* already the current scope.
|
|
88
|
+
*/
|
|
89
|
+
reloadForCwd(cwd: string): Promise<void>;
|
|
77
90
|
getStorage(): AgentStorage | null;
|
|
78
91
|
getCwd(): string;
|
|
79
92
|
getAgentDir(): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side handler for the eval `parallel()` / `pipeline()` worker pool.
|
|
3
|
+
*
|
|
4
|
+
* The pool ceiling is not a kernel-side knob: it tracks the `task.maxConcurrency`
|
|
5
|
+
* setting so an eval fan-out runs as wide as a `task` tool batch would. `0` means
|
|
6
|
+
* unbounded — run every item at once, exactly like `task.maxConcurrency = 0`.
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolSession } from "../tools";
|
|
9
|
+
import type { JsStatusEvent } from "./js/shared/types";
|
|
10
|
+
/** Synthetic bridge name reserved for the parallel-pool ceiling across both runtimes. */
|
|
11
|
+
export declare const EVAL_CONCURRENCY_BRIDGE_NAME = "__concurrency__";
|
|
12
|
+
export interface EvalConcurrencyBridgeOptions {
|
|
13
|
+
session: ToolSession;
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
emitStatus?: (event: JsStatusEvent) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface EvalConcurrencyResult {
|
|
18
|
+
/** Worker-pool ceiling; `0` means unbounded (run every item at once). */
|
|
19
|
+
limit: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the worker-pool ceiling for an eval cell's `parallel()`/`pipeline()`
|
|
23
|
+
* helpers from the live `task.maxConcurrency` setting. Negative/non-finite
|
|
24
|
+
* values collapse to `0` (unbounded), matching the `task` tool's own handling.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runEvalConcurrency(_args: unknown, options: EvalConcurrencyBridgeOptions): EvalConcurrencyResult;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ToolSession } from "../../tools";
|
|
2
2
|
import { type EvalBudgetResult } from "../budget-bridge";
|
|
3
|
+
import { type EvalConcurrencyResult } from "../concurrency-bridge";
|
|
3
4
|
import type { JsStatusEvent } from "./shared/types";
|
|
4
5
|
export type { JsStatusEvent } from "./shared/types";
|
|
5
6
|
interface ToolBridgeOptions {
|
|
@@ -7,7 +8,7 @@ interface ToolBridgeOptions {
|
|
|
7
8
|
signal?: AbortSignal;
|
|
8
9
|
emitStatus?: (event: JsStatusEvent) => void;
|
|
9
10
|
}
|
|
10
|
-
type ToolValue = string | EvalBudgetResult | {
|
|
11
|
+
type ToolValue = string | EvalBudgetResult | EvalConcurrencyResult | {
|
|
11
12
|
text: string;
|
|
12
13
|
details?: unknown;
|
|
13
14
|
images?: Array<{
|
|
@@ -13,6 +13,17 @@ import * as path from "node:path";
|
|
|
13
13
|
* Exported for tests; production callers use `BUNFS_PACKAGE_ROOT` below.
|
|
14
14
|
*/
|
|
15
15
|
export declare function __computeBunfsPackageRoot(metaDir: string, pathImpl?: typeof path): string;
|
|
16
|
+
/**
|
|
17
|
+
* Load a legacy Pi extension module from its real on-disk location.
|
|
18
|
+
*
|
|
19
|
+
* The extension runs in place, so its `import.meta.url` is the real source file
|
|
20
|
+
* and `__dirname`-relative `readFileSync` asset loads (HTML/CSS bundled next to
|
|
21
|
+
* the entry) resolve exactly as they do under the original Pi runtime — no
|
|
22
|
+
* temp-directory mirroring and no asset copying. An `onLoad` hook scoped to the
|
|
23
|
+
* entry's relative-import graph rewrites only the legacy `@(scope)/pi-*` and
|
|
24
|
+
* `@sinclair/typebox` imports in the extension's own source; everything else
|
|
25
|
+
* resolves natively.
|
|
26
|
+
*/
|
|
16
27
|
export declare function loadLegacyPiModule(resolvedPath: string): Promise<unknown>;
|
|
17
28
|
export declare function installLegacyPiSpecifierShim(): void;
|
|
18
29
|
/** Test seam: clears the memoized canonical specifier resolutions. */
|
package/dist/types/main.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type { SubmittedUserInput } from "./modes/types";
|
|
|
12
12
|
import { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession, discoverAuthStorage } from "./sdk";
|
|
13
13
|
import type { AgentSession } from "./session/agent-session";
|
|
14
14
|
import type { AuthStorage } from "./session/auth-storage";
|
|
15
|
+
import { type SessionInfo, SessionManager } from "./session/session-manager";
|
|
15
16
|
export interface InteractiveModeNotify {
|
|
16
17
|
kind: "warn" | "error" | "info";
|
|
17
18
|
message: string;
|
|
@@ -39,6 +40,10 @@ export interface AcpSessionFactoryOptions {
|
|
|
39
40
|
* tool registry and shadow the client-supplied servers (issue #1234).
|
|
40
41
|
*/
|
|
41
42
|
export declare function createAcpSessionFactory(args: AcpSessionFactoryOptions): AcpSessionFactory;
|
|
43
|
+
type ForkSessionPromptResult = "accepted" | "declined" | "unavailable";
|
|
44
|
+
type ForkSessionPrompt = (session: SessionInfo) => Promise<ForkSessionPromptResult>;
|
|
45
|
+
/** Resolves CLI session flags into an existing, forked, in-memory, or cancelled session manager. */
|
|
46
|
+
export declare function createSessionManager(parsed: Args, cwd: string, activeSettings?: Settings, askToForkSession?: ForkSessionPrompt): Promise<SessionManager | undefined>;
|
|
42
47
|
interface RunRootCommandDependencies {
|
|
43
48
|
createAgentSession?: typeof createAgentSession;
|
|
44
49
|
discoverAuthStorage?: typeof discoverAuthStorage;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Editor, type KeyId } from "@oh-my-pi/pi-tui";
|
|
2
2
|
import type { AppKeybinding } from "../../config/keybindings";
|
|
3
|
-
type ConfigurableEditorAction = Extract<AppKeybinding, "app.interrupt" | "app.clear" | "app.exit" | "app.suspend" | "app.thinking.cycle" | "app.model.cycleForward" | "app.model.cycleBackward" | "app.model.select" | "app.model.selectTemporary" | "app.tools.expand" | "app.thinking.toggle" | "app.editor.external" | "app.history.search" | "app.message.dequeue" | "app.clipboard.pasteImage" | "app.clipboard.copyPrompt">;
|
|
3
|
+
type ConfigurableEditorAction = Extract<AppKeybinding, "app.interrupt" | "app.clear" | "app.exit" | "app.suspend" | "app.thinking.cycle" | "app.model.cycleForward" | "app.model.cycleBackward" | "app.model.select" | "app.model.selectTemporary" | "app.tools.expand" | "app.thinking.toggle" | "app.editor.external" | "app.history.search" | "app.message.dequeue" | "app.clipboard.pasteImage" | "app.clipboard.pasteTextRaw" | "app.clipboard.copyPrompt">;
|
|
4
4
|
/**
|
|
5
5
|
* Custom editor that handles configurable app-level shortcuts for coding-agent.
|
|
6
6
|
*/
|
|
@@ -26,6 +26,8 @@ export declare class CustomEditor extends Editor {
|
|
|
26
26
|
onCopyPrompt?: () => void;
|
|
27
27
|
/** Called when the configured image-paste shortcut is pressed. */
|
|
28
28
|
onPasteImage?: () => Promise<boolean>;
|
|
29
|
+
/** Called when the configured raw text-paste shortcut is pressed. */
|
|
30
|
+
onPasteTextRaw?: () => void;
|
|
29
31
|
/** Called when the configured dequeue shortcut is pressed. */
|
|
30
32
|
onDequeue?: () => void;
|
|
31
33
|
/** Called when Caps Lock is pressed. */
|
|
@@ -41,6 +41,9 @@ export interface HookSelectorOptions {
|
|
|
41
41
|
onExternalEditor?: () => void;
|
|
42
42
|
helpText?: string;
|
|
43
43
|
slider?: HookSelectorSlider;
|
|
44
|
+
/** Indices into the original options that cannot be selected: they render
|
|
45
|
+
* dimmed, are skipped during navigation, and reject enter/timeout. */
|
|
46
|
+
disabledIndices?: readonly number[];
|
|
44
47
|
}
|
|
45
48
|
export interface HookSelectorOption {
|
|
46
49
|
label: string;
|
|
@@ -1,28 +1,55 @@
|
|
|
1
1
|
import { type Component, Container } from "@oh-my-pi/pi-tui";
|
|
2
2
|
import type { SessionInfo } from "../../session/session-manager";
|
|
3
|
+
/** Returns the IDs of sessions whose recorded prompts match a query, best first. */
|
|
4
|
+
export type SessionHistoryMatcher = (query: string) => string[];
|
|
5
|
+
/**
|
|
6
|
+
* Combine fuzzy session matches with prompt-history matches for ranking, using
|
|
7
|
+
* both signals rather than replacing one with the other.
|
|
8
|
+
*
|
|
9
|
+
* - `fuzzy` is the ordered fuzzy-filter result over session metadata (best first).
|
|
10
|
+
* - `historyIds` are session IDs whose recorded prompts matched the query,
|
|
11
|
+
* ordered by history relevance (best first); duplicates are tolerated.
|
|
12
|
+
*
|
|
13
|
+
* Ranking: sessions matched by **both** signals lead (keeping fuzzy order), then
|
|
14
|
+
* fuzzy-only matches, then history-only matches (by history order). A fuzzy match
|
|
15
|
+
* is never dropped, and history matches not present in `allSessions` (e.g. deleted
|
|
16
|
+
* or out-of-scope sessions) are ignored since they cannot be resumed from here.
|
|
17
|
+
*/
|
|
18
|
+
export declare function mergeSessionRanking(allSessions: SessionInfo[], fuzzy: SessionInfo[], historyIds: string[]): SessionInfo[];
|
|
3
19
|
/**
|
|
4
20
|
* Custom session list component with multi-line items and search
|
|
5
21
|
*/
|
|
6
22
|
declare class SessionList implements Component {
|
|
7
23
|
#private;
|
|
8
|
-
|
|
9
|
-
private readonly showCwd;
|
|
10
|
-
onSelect?: (sessionPath: string) => void;
|
|
24
|
+
onSelect?: (session: SessionInfo) => void;
|
|
11
25
|
onCancel?: () => void;
|
|
12
26
|
onExit: () => void;
|
|
27
|
+
onToggleScope?: () => void;
|
|
13
28
|
onDeleteRequest?: (session: SessionInfo) => void;
|
|
14
|
-
constructor(
|
|
29
|
+
constructor(sessions: SessionInfo[], showCwd?: boolean, historyMatcher?: SessionHistoryMatcher);
|
|
30
|
+
/** Replace the visible dataset, e.g. when toggling folder/all-projects scope. */
|
|
31
|
+
setSessions(sessions: SessionInfo[], showCwd: boolean): void;
|
|
15
32
|
removeSession(sessionPath: string): void;
|
|
16
33
|
invalidate(): void;
|
|
17
34
|
render(width: number): string[];
|
|
18
35
|
handleInput(keyData: string): void;
|
|
19
36
|
}
|
|
37
|
+
export interface SessionSelectorOptions {
|
|
38
|
+
onDelete?: (session: SessionInfo) => Promise<boolean>;
|
|
39
|
+
historyMatcher?: SessionHistoryMatcher;
|
|
40
|
+
/** Loads sessions across all projects for the all-projects scope toggle (Tab). */
|
|
41
|
+
loadAllSessions?: () => Promise<SessionInfo[]>;
|
|
42
|
+
/** Preloaded all-projects list; cached so the first Tab toggle is instant. */
|
|
43
|
+
allSessions?: SessionInfo[];
|
|
44
|
+
/** Open directly in all-projects scope (e.g. the current folder has no sessions). */
|
|
45
|
+
startInAllScope?: boolean;
|
|
46
|
+
}
|
|
20
47
|
/**
|
|
21
48
|
* Component that renders a session selector with optional confirmation dialog
|
|
22
49
|
*/
|
|
23
50
|
export declare class SessionSelectorComponent extends Container {
|
|
24
51
|
#private;
|
|
25
|
-
constructor(sessions: SessionInfo[], onSelect: (
|
|
52
|
+
constructor(sessions: SessionInfo[], onSelect: (session: SessionInfo) => void, onCancel: () => void, onExit: () => void, options?: SessionSelectorOptions);
|
|
26
53
|
setOnRequestRender(callback: () => void): void;
|
|
27
54
|
handleInput(keyData: string): void;
|
|
28
55
|
getSessionList(): SessionList;
|
|
@@ -34,6 +34,14 @@ export declare class ToolExecutionComponent extends Container {
|
|
|
34
34
|
* This triggers an immediate final diff computation for edit-like tools.
|
|
35
35
|
*/
|
|
36
36
|
setArgsComplete(_toolCallId?: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Await the streaming diff recompute kicked off by the most recent
|
|
39
|
+
* `updateArgs`/`setArgsComplete`. The recompute reads the file and re-runs the
|
|
40
|
+
* whole-file Myers diff off the render path, signalling completion only via a
|
|
41
|
+
* throttled `requestRender`. Tests await this to sample a *settled* preview
|
|
42
|
+
* deterministically instead of racing the spinner's render ticks.
|
|
43
|
+
*/
|
|
44
|
+
whenPreviewSettled(): Promise<void>;
|
|
37
45
|
updateResult(result: {
|
|
38
46
|
content: Array<{
|
|
39
47
|
type: string;
|
|
@@ -3,7 +3,7 @@ import { KeybindingsManager } from "../../config/keybindings";
|
|
|
3
3
|
import type { ExtensionUIContext, ExtensionUIDialogOptions, ExtensionUISelectItem, ExtensionWidgetContent, ExtensionWidgetOptions, TerminalInputHandler } from "../../extensibility/extensions";
|
|
4
4
|
import { type HookSelectorSlider } from "../../modes/components/hook-selector";
|
|
5
5
|
import { type Theme } from "../../modes/theme/theme";
|
|
6
|
-
import type { InteractiveModeContext } from "../../modes/types";
|
|
6
|
+
import type { InteractiveModeContext, InteractiveSelectorDialogOptions } from "../../modes/types";
|
|
7
7
|
export declare class ExtensionUiController {
|
|
8
8
|
#private;
|
|
9
9
|
private ctx;
|
|
@@ -30,7 +30,7 @@ export declare class ExtensionUiController {
|
|
|
30
30
|
/**
|
|
31
31
|
* Show a selector for hooks.
|
|
32
32
|
*/
|
|
33
|
-
showHookSelector(title: string, options: ExtensionUISelectItem[], dialogOptions?:
|
|
33
|
+
showHookSelector(title: string, options: ExtensionUISelectItem[], dialogOptions?: InteractiveSelectorDialogOptions, extra?: {
|
|
34
34
|
slider?: HookSelectorSlider;
|
|
35
35
|
}): Promise<string | undefined>;
|
|
36
36
|
/**
|
|
@@ -18,6 +18,7 @@ export declare class InputController {
|
|
|
18
18
|
}): number;
|
|
19
19
|
handleBackgroundCommand(): void;
|
|
20
20
|
handleImagePaste(): Promise<boolean>;
|
|
21
|
+
handleClipboardTextRawPaste(): Promise<void>;
|
|
21
22
|
createAutocompleteProvider(commands: SlashCommand[], basePath: string): AutocompleteProvider;
|
|
22
23
|
/** Copy the current editor line to the system clipboard. */
|
|
23
24
|
handleCopyCurrentLine(): void;
|
|
@@ -26,7 +26,7 @@ import type { ToolExecutionHandle } from "./components/tool-execution";
|
|
|
26
26
|
import { type LoopLimitRuntime } from "./loop-limit";
|
|
27
27
|
import { OAuthManualInputManager } from "./oauth-manual-input";
|
|
28
28
|
import type { Theme } from "./theme/theme";
|
|
29
|
-
import type { CompactionQueuedMessage, InteractiveModeContext, InteractiveModeInitOptions, SubmittedUserInput, TodoItem, TodoPhase } from "./types";
|
|
29
|
+
import type { CompactionQueuedMessage, InteractiveModeContext, InteractiveModeInitOptions, InteractiveSelectorDialogOptions, SubmittedUserInput, TodoItem, TodoPhase } from "./types";
|
|
30
30
|
/** Options for creating an InteractiveMode instance (for future API use) */
|
|
31
31
|
export interface InteractiveModeOptions {
|
|
32
32
|
/** Providers that were migrated during startup */
|
|
@@ -112,6 +112,13 @@ export declare class InteractiveMode implements InteractiveModeContext {
|
|
|
112
112
|
init(options?: InteractiveModeInitOptions): Promise<void>;
|
|
113
113
|
/** Reload slash commands and autocomplete for the provided working directory. */
|
|
114
114
|
refreshSlashCommandState(cwd?: string): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Re-point the process and every cwd-derived cache at `newCwd` after the
|
|
117
|
+
* active session's working directory changed (`/move` relocation or resuming
|
|
118
|
+
* a session from another project). The SessionManager's cwd MUST already
|
|
119
|
+
* reflect `newCwd` before this is called.
|
|
120
|
+
*/
|
|
121
|
+
applyCwdChange(newCwd: string): Promise<void>;
|
|
115
122
|
getUserInput(): Promise<SubmittedUserInput>;
|
|
116
123
|
disableLoopMode(message?: string): void;
|
|
117
124
|
/**
|
|
@@ -253,7 +260,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
|
|
|
253
260
|
emitCustomToolSessionEvent(reason: "start" | "switch" | "branch" | "tree" | "shutdown", previousSessionFile?: string): Promise<void>;
|
|
254
261
|
setHookWidget(key: string, content: ExtensionWidgetContent, options?: ExtensionWidgetOptions): void;
|
|
255
262
|
setHookStatus(key: string, text: string | undefined): void;
|
|
256
|
-
showHookSelector(title: string, options: ExtensionUISelectItem[], dialogOptions?:
|
|
263
|
+
showHookSelector(title: string, options: ExtensionUISelectItem[], dialogOptions?: InteractiveSelectorDialogOptions, extra?: {
|
|
257
264
|
slider?: HookSelectorSlider;
|
|
258
265
|
}): Promise<string | undefined>;
|
|
259
266
|
hideHookSelector(): void;
|
|
@@ -19,7 +19,7 @@ import type { CustomEditor } from "./components/custom-editor";
|
|
|
19
19
|
import type { EvalExecutionComponent } from "./components/eval-execution";
|
|
20
20
|
import type { HookEditorComponent } from "./components/hook-editor";
|
|
21
21
|
import type { HookInputComponent } from "./components/hook-input";
|
|
22
|
-
import type { HookSelectorComponent } from "./components/hook-selector";
|
|
22
|
+
import type { HookSelectorComponent, HookSelectorOptions } from "./components/hook-selector";
|
|
23
23
|
import type { StatusLineComponent } from "./components/status-line";
|
|
24
24
|
import type { ToolExecutionHandle } from "./components/tool-execution";
|
|
25
25
|
import type { LoopLimitRuntime } from "./loop-limit";
|
|
@@ -51,6 +51,7 @@ export type TodoPhase = {
|
|
|
51
51
|
export interface InteractiveModeInitOptions {
|
|
52
52
|
suppressWelcomeIntro?: boolean;
|
|
53
53
|
}
|
|
54
|
+
export type InteractiveSelectorDialogOptions = ExtensionUIDialogOptions & Pick<HookSelectorOptions, "disabledIndices">;
|
|
54
55
|
export interface InteractiveModeContext {
|
|
55
56
|
ui: TUI;
|
|
56
57
|
chatContainer: Container;
|
|
@@ -217,6 +218,7 @@ export interface InteractiveModeContext {
|
|
|
217
218
|
executeCompaction(customInstructionsOrOptions?: string | CompactOptions, isAuto?: boolean): Promise<CompactionOutcome>;
|
|
218
219
|
openInBrowser(urlOrPath: string): void;
|
|
219
220
|
refreshSlashCommandState(cwd?: string): Promise<void>;
|
|
221
|
+
applyCwdChange(newCwd: string): Promise<void>;
|
|
220
222
|
showSettingsSelector(): void;
|
|
221
223
|
showHistorySearch(): void;
|
|
222
224
|
showExtensionsDashboard(): void;
|
|
@@ -264,7 +266,7 @@ export interface InteractiveModeContext {
|
|
|
264
266
|
emitCustomToolSessionEvent(reason: "start" | "switch" | "branch" | "tree" | "shutdown", previousSessionFile?: string): Promise<void>;
|
|
265
267
|
setHookWidget(key: string, content: ExtensionWidgetContent, options?: ExtensionWidgetOptions): void;
|
|
266
268
|
setHookStatus(key: string, text: string | undefined): void;
|
|
267
|
-
showHookSelector(title: string, options: ExtensionUISelectItem[], dialogOptions?:
|
|
269
|
+
showHookSelector(title: string, options: ExtensionUISelectItem[], dialogOptions?: InteractiveSelectorDialogOptions): Promise<string | undefined>;
|
|
268
270
|
hideHookSelector(): void;
|
|
269
271
|
showHookInput(title: string, placeholder?: string): Promise<string | undefined>;
|
|
270
272
|
hideHookInput(): void;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* creation and removed when the owner releases them.
|
|
7
7
|
*/
|
|
8
8
|
import type { AgentSession } from "../session/agent-session";
|
|
9
|
-
export declare const MAIN_AGENT_ID = "
|
|
9
|
+
export declare const MAIN_AGENT_ID = "Main";
|
|
10
10
|
export type AgentStatus = "running" | "idle" | "completed" | "aborted";
|
|
11
11
|
export type AgentKind = "main" | "sub";
|
|
12
12
|
export interface AgentRef {
|
package/dist/types/sdk.d.ts
CHANGED
|
@@ -101,13 +101,13 @@ export interface CreateAgentSessionOptions {
|
|
|
101
101
|
parentHindsightSessionState?: HindsightSessionState;
|
|
102
102
|
/** Parent Mnemopi state to alias for subagent memory tools. */
|
|
103
103
|
parentMnemopiSessionState?: MnemopiSessionState;
|
|
104
|
-
/** Pre-allocated agent identity for IRC routing. Default: "
|
|
104
|
+
/** Pre-allocated agent identity for IRC routing. Default: "Main" for top-level, parentTaskPrefix-derived for sub. */
|
|
105
105
|
agentId?: string;
|
|
106
106
|
/** Display name for the agent in IRC. Default: "main" or "sub". */
|
|
107
107
|
agentDisplayName?: string;
|
|
108
108
|
/** Optional shared agent registry for IRC routing. Default: AgentRegistry.global(). */
|
|
109
109
|
agentRegistry?: AgentRegistry;
|
|
110
|
-
/** Parent task ID prefix for nested artifact naming (e.g., "
|
|
110
|
+
/** Parent task ID prefix for nested artifact naming (e.g., "Extensions") */
|
|
111
111
|
parentTaskPrefix?: string;
|
|
112
112
|
/** Inherited eval executor session id for subagents sharing parent eval state. */
|
|
113
113
|
parentEvalSessionId?: string;
|
|
@@ -201,7 +201,7 @@ export interface AgentSessionConfig {
|
|
|
201
201
|
* **MUST NOT** dispose it on their own teardown.
|
|
202
202
|
*/
|
|
203
203
|
ownedAsyncJobManager?: AsyncJobManager;
|
|
204
|
-
/** Agent identity (registry id like "
|
|
204
|
+
/** Agent identity (registry id like "Main" or "Alice") used for IRC routing. */
|
|
205
205
|
agentId?: string;
|
|
206
206
|
/** Shared agent registry (for forwarding IRC observations to the main session UI). */
|
|
207
207
|
agentRegistry?: AgentRegistry;
|
|
@@ -973,7 +973,9 @@ export declare class AgentSession {
|
|
|
973
973
|
* Uses the last assistant message's usage data when available,
|
|
974
974
|
* otherwise estimates tokens for all messages.
|
|
975
975
|
*/
|
|
976
|
-
getContextUsage(
|
|
976
|
+
getContextUsage(options?: {
|
|
977
|
+
contextWindow?: number;
|
|
978
|
+
}): ContextUsage | undefined;
|
|
977
979
|
fetchUsageReports(signal?: AbortSignal): Promise<UsageReport[] | null>;
|
|
978
980
|
/**
|
|
979
981
|
* Export session to HTML.
|
|
@@ -3,6 +3,8 @@ export interface HistoryEntry {
|
|
|
3
3
|
prompt: string;
|
|
4
4
|
created_at: number;
|
|
5
5
|
cwd?: string;
|
|
6
|
+
/** ID of the session the prompt was submitted from, if known. */
|
|
7
|
+
sessionId?: string;
|
|
6
8
|
}
|
|
7
9
|
export declare class HistoryStorage {
|
|
8
10
|
#private;
|
|
@@ -10,7 +12,20 @@ export declare class HistoryStorage {
|
|
|
10
12
|
static open(dbPath?: string): HistoryStorage;
|
|
11
13
|
/** @internal Reset the singleton — test-only. */
|
|
12
14
|
static resetInstance(): void;
|
|
13
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Register a resolver that supplies the current session ID for prompts added
|
|
17
|
+
* without an explicit `sessionId`. Evaluated synchronously at `add()` time so
|
|
18
|
+
* batched writes capture the session active when the prompt was submitted.
|
|
19
|
+
*/
|
|
20
|
+
setSessionResolver(resolver: () => string | undefined): void;
|
|
21
|
+
add(prompt: string, cwd?: string, sessionId?: string): Promise<void>;
|
|
14
22
|
getRecent(limit: number): HistoryEntry[];
|
|
15
23
|
search(query: string, limit: number): HistoryEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* IDs of the sessions whose stored prompts match `query`, ordered by match
|
|
26
|
+
* relevance (most relevant/recent first) and de-duplicated. Prompts with no
|
|
27
|
+
* recorded session are skipped. Used to augment session ranking in the
|
|
28
|
+
* resume picker with prompts that the 4KB session-list prefix never sees.
|
|
29
|
+
*/
|
|
30
|
+
matchingSessionIds(query: string, limit?: number): string[];
|
|
16
31
|
}
|
|
@@ -169,6 +169,8 @@ export interface SessionContext {
|
|
|
169
169
|
/** Mode-specific data from the last mode_change entry */
|
|
170
170
|
modeData?: Record<string, unknown>;
|
|
171
171
|
}
|
|
172
|
+
/** Lists session model strings to try when restoring, in fallback order. */
|
|
173
|
+
export declare function getRestorableSessionModels(models: Readonly<Record<string, string>>, lastModelChangeRole: string | undefined): string[];
|
|
172
174
|
export interface SessionInfo {
|
|
173
175
|
path: string;
|
|
174
176
|
id: string;
|
|
@@ -253,6 +255,8 @@ export interface ResolvedSessionMatch {
|
|
|
253
255
|
}
|
|
254
256
|
export declare function resolveResumableSession(sessionArg: string, cwd: string, sessionDir?: string, storage?: SessionStorage): Promise<ResolvedSessionMatch | undefined>;
|
|
255
257
|
interface SessionManagerStateSnapshot {
|
|
258
|
+
cwd: string;
|
|
259
|
+
sessionDir: string;
|
|
256
260
|
sessionId: string;
|
|
257
261
|
sessionName: string | undefined;
|
|
258
262
|
titleSource: "auto" | "user" | undefined;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Manages agent output ID allocation to ensure uniqueness.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* On resume, scans existing files to find the next available index.
|
|
4
|
+
* The first allocation of a given name keeps the name as-is; subsequent
|
|
5
|
+
* allocations of the same name get a `-2`, `-3`, … suffix. On resume, scans
|
|
6
|
+
* existing output files so previously written outputs are never overwritten.
|
|
8
7
|
*/
|
|
9
8
|
export declare class AgentOutputManager {
|
|
10
9
|
#private;
|
|
@@ -12,10 +11,10 @@ export declare class AgentOutputManager {
|
|
|
12
11
|
parentPrefix?: string;
|
|
13
12
|
});
|
|
14
13
|
/**
|
|
15
|
-
* Allocate a unique ID
|
|
14
|
+
* Allocate a unique ID.
|
|
16
15
|
*
|
|
17
|
-
* @param id Requested ID (e.g., "
|
|
18
|
-
* @returns Unique ID
|
|
16
|
+
* @param id Requested ID (e.g., "Anna")
|
|
17
|
+
* @returns Unique ID ("Anna" first, then "Anna-2", "Anna-3", …)
|
|
19
18
|
*/
|
|
20
19
|
allocate(id: string): Promise<string>;
|
|
21
20
|
/**
|
|
@@ -25,12 +24,4 @@ export declare class AgentOutputManager {
|
|
|
25
24
|
* @returns Array of unique IDs in same order
|
|
26
25
|
*/
|
|
27
26
|
allocateBatch(ids: string[]): Promise<string[]>;
|
|
28
|
-
/**
|
|
29
|
-
* Get the next ID that would be allocated (without allocating).
|
|
30
|
-
*/
|
|
31
|
-
peekNextIndex(): Promise<number>;
|
|
32
|
-
/**
|
|
33
|
-
* Reset state (primarily for testing).
|
|
34
|
-
*/
|
|
35
|
-
reset(): void;
|
|
36
27
|
}
|