@astralyn/pi 0.85.3 → 0.86.1
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 +52 -0
- package/dist/bundle/chunks/anthropic-messages-R2LYJUDD.js +6 -0
- package/dist/bundle/chunks/azure-openai-responses-HS35BQV6.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +36 -32
- package/dist/bundle/chunks/{chunk-S2DJQQI2.js → chunk-2IO5GDBS.js} +10 -1
- package/dist/bundle/chunks/chunk-DAEM5JIZ.js +2 -0
- package/dist/bundle/chunks/{chunk-LB4P77SH.js → chunk-GTBMYBFG.js} +777 -762
- package/dist/bundle/chunks/{chunk-7LO5Z4WE.js → chunk-I5IVW2WS.js} +1 -1
- package/dist/bundle/chunks/chunk-JI4WGISU.js +2 -0
- package/dist/bundle/chunks/chunk-LPQCB2VJ.js +44 -0
- package/dist/bundle/chunks/chunk-NW5FIDD7.js +11 -0
- package/dist/bundle/chunks/chunk-PJVFYVHE.js +42 -0
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/google-generative-ai-NOVAJBFC.js +2 -0
- package/dist/bundle/chunks/google-vertex-4VHCZJV5.js +2 -0
- package/dist/bundle/chunks/https-proxy-agent-JOOPB4RE.js +16 -0
- package/dist/bundle/chunks/jiti-loader-BFSSLU7G.js +21 -0
- package/dist/bundle/chunks/jiti-static-loader-CLT3YR3B.js +2 -0
- package/dist/bundle/chunks/mistral-conversations-WC6A2WCJ.js +5 -0
- package/dist/bundle/chunks/{node-G4XOIDPH.js → node-CXWYTK2I.js} +1 -1
- package/dist/bundle/chunks/openai-codex-responses-XCDG75W2.js +10 -0
- package/dist/bundle/chunks/openai-completions-6SMWQWQN.js +7 -0
- package/dist/bundle/chunks/openai-responses-UT6XFKC7.js +2 -0
- package/dist/bundle/chunks/{pi-messages-PE6B42TG.js → pi-messages-MQMPIPNC.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-OHUZ2T7X.js +2 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/session-picker.d.ts +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +13 -11
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +56 -14
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +305 -176
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bug-report-upload.d.ts +12 -0
- package/dist/core/bug-report-upload.d.ts.map +1 -0
- package/dist/core/bug-report-upload.js +22 -0
- package/dist/core/bug-report-upload.js.map +1 -0
- package/dist/core/bug-report.d.ts +176 -0
- package/dist/core/bug-report.d.ts.map +1 -0
- package/dist/core/bug-report.js +292 -0
- package/dist/core/bug-report.js.map +1 -0
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js +12 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/cache-warmer.d.ts +102 -0
- package/dist/core/cache-warmer.d.ts.map +1 -0
- package/dist/core/cache-warmer.js +333 -0
- package/dist/core/cache-warmer.js.map +1 -0
- package/dist/core/compaction/branch-summarization.js +2 -2
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +14 -9
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +30 -23
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/settings.d.ts +17 -20
- package/dist/core/compaction/settings.d.ts.map +1 -1
- package/dist/core/compaction/settings.js +19 -26
- package/dist/core/compaction/settings.js.map +1 -1
- package/dist/core/context-snapshot.d.ts +16 -5
- package/dist/core/context-snapshot.d.ts.map +1 -1
- package/dist/core/context-snapshot.js +20 -10
- package/dist/core/context-snapshot.js.map +1 -1
- package/dist/core/crash-log.d.ts +22 -0
- package/dist/core/crash-log.d.ts.map +1 -0
- package/dist/core/crash-log.js +71 -0
- package/dist/core/crash-log.js.map +1 -0
- package/dist/core/experimental.d.ts +0 -4
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +0 -4
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/jiti-loader.d.ts +2 -0
- package/dist/core/extensions/jiti-loader.d.ts.map +1 -0
- package/dist/core/extensions/jiti-loader.js +4 -0
- package/dist/core/extensions/jiti-loader.js.map +1 -0
- package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
- package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
- package/dist/core/extensions/jiti-static-loader.js +4 -0
- package/dist/core/extensions/jiti-static-loader.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +38 -51
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +10 -7
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +85 -67
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +60 -50
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts +3 -0
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/virtual-modules.js +39 -0
- package/dist/core/extensions/virtual-modules.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +1 -20
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +1 -1
- package/dist/core/keybindings.js +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +1 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +101 -20
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +25 -18
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +8 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +2 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts +3 -2
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +2 -0
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/radius.d.ts +3 -0
- package/dist/core/radius.d.ts.map +1 -1
- package/dist/core/radius.js +6 -0
- package/dist/core/radius.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +46 -18
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-export.d.ts +6 -2
- package/dist/core/session-export.d.ts.map +1 -1
- package/dist/core/session-export.js +14 -13
- package/dist/core/session-export.js.map +1 -1
- package/dist/core/session-manager.d.ts +29 -6
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +159 -96
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +31 -4
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +65 -8
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +49 -6
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +121 -92
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +6 -3
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -2
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/shell-execution.js +2 -2
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/usage-totals.d.ts +1 -1
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +4 -1
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/background/schema.d.ts +1 -1
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +3 -2
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/extensions/llama/client.d.ts +2 -0
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js +7 -3
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +20 -5
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/provider/compat-fields.d.ts.map +1 -1
- package/dist/extensions/provider/compat-fields.js +5 -2
- package/dist/extensions/provider/compat-fields.js.map +1 -1
- package/dist/extensions/provider/ui/app.js +2 -2
- package/dist/extensions/provider/ui/app.js.map +1 -1
- package/dist/extensions/todo/schema.d.ts +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +13 -9
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -2
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/bug-report.d.ts +16 -0
- package/dist/modes/interactive/bug-report.d.ts.map +1 -0
- package/dist/modes/interactive/bug-report.js +206 -0
- package/dist/modes/interactive/bug-report.js.map +1 -0
- package/dist/modes/interactive/chat-viewport.js +1 -1
- package/dist/modes/interactive/chat-viewport.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +0 -5
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +2 -3
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +12 -5
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +12 -5
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +6 -13
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +15 -51
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +4 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +7 -2
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +2 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +6 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -2
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +4 -2
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +5 -8
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +72 -95
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +11 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +11 -4
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +2 -2
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +7 -7
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/tool-chrome.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-chrome.js +4 -1
- package/dist/modes/interactive/components/tool-chrome.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +4 -3
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -10
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +4 -51
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +15 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +234 -91
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-share.d.ts +2 -0
- package/dist/modes/interactive/session-share.d.ts.map +1 -1
- package/dist/modes/interactive/session-share.js +8 -4
- package/dist/modes/interactive/session-share.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.js +2 -2
- package/dist/modes/interactive/tui-renderer.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -2
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/utils/clipboard-command.d.ts +7 -0
- package/dist/utils/clipboard-command.d.ts.map +1 -0
- package/dist/utils/clipboard-command.js +45 -0
- package/dist/utils/clipboard-command.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +53 -81
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +111 -121
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/wsl.d.ts +3 -0
- package/dist/utils/wsl.d.ts.map +1 -0
- package/dist/utils/wsl.js +15 -0
- package/dist/utils/wsl.js.map +1 -0
- package/dist/utils/zip.d.ts +7 -0
- package/dist/utils/zip.d.ts.map +1 -0
- package/dist/utils/zip.js +60 -0
- package/dist/utils/zip.js.map +1 -0
- package/docs/compaction.md +32 -11
- package/docs/custom-provider.md +19 -8
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +50 -34
- package/docs/models.md +38 -3
- package/docs/providers.md +9 -1
- package/docs/sdk.md +4 -2
- package/docs/session-format.md +63 -24
- package/docs/sessions.md +28 -1
- package/docs/settings.md +58 -4
- package/docs/termux.md +0 -1
- package/docs/tui.md +2 -0
- package/docs/usage.md +1 -0
- package/examples/extensions/README.md +0 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +18 -12
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
- package/examples/extensions/prompt-customizer.ts +19 -67
- package/npm-shrinkwrap.json +275 -1028
- package/package.json +17 -23
- package/dist/bundle/chunks/anthropic-messages-IHRRITCV.js +0 -6
- package/dist/bundle/chunks/azure-openai-responses-QXBIDYXO.js +0 -2
- package/dist/bundle/chunks/chunk-JSJPY26N.js +0 -2
- package/dist/bundle/chunks/chunk-KI6LC764.js +0 -42
- package/dist/bundle/chunks/chunk-OWESLY5T.js +0 -11
- package/dist/bundle/chunks/chunk-RRBI7OUG.js +0 -50
- package/dist/bundle/chunks/chunk-YZJWMPUI.js +0 -2
- package/dist/bundle/chunks/google-generative-ai-NBOR3IQR.js +0 -2
- package/dist/bundle/chunks/google-vertex-VTHX3SUB.js +0 -2
- package/dist/bundle/chunks/https-proxy-agent-2VXB7436.js +0 -13
- package/dist/bundle/chunks/mistral-conversations-NO4ANAA5.js +0 -5
- package/dist/bundle/chunks/openai-codex-responses-5S3T3HMA.js +0 -10
- package/dist/bundle/chunks/openai-completions-CXRRTRWE.js +0 -7
- package/dist/bundle/chunks/openai-responses-CV3MH6VP.js +0 -2
- package/dist/utils/clipboard-native.d.ts +0 -11
- package/dist/utils/clipboard-native.d.ts.map +0 -1
- package/dist/utils/clipboard-native.js +0 -20
- package/dist/utils/clipboard-native.js.map +0 -1
- package/examples/extensions/kimi-deferred-tools.ts +0 -61
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
|
-
import { type ImageContent, type Message, type TextContent, type Usage } from "@earendil-works/pi-ai";
|
|
2
|
+
import { type ImageContent, type Message, type SystemMessage, type TextContent, type Usage } from "@earendil-works/pi-ai";
|
|
3
3
|
import { type BashExecutionMessage, type CustomMessage } from "./messages.ts";
|
|
4
4
|
export declare const CURRENT_SESSION_VERSION = 3;
|
|
5
5
|
export interface SessionHeader {
|
|
@@ -33,6 +33,16 @@ export interface ModelChangeEntry extends SessionEntryBase {
|
|
|
33
33
|
provider: string;
|
|
34
34
|
modelId: string;
|
|
35
35
|
}
|
|
36
|
+
export interface UsageEntry extends SessionEntryBase {
|
|
37
|
+
type: "usage";
|
|
38
|
+
/** Arbitrary usage category, such as "cache_warm". */
|
|
39
|
+
kind: string;
|
|
40
|
+
provider: string;
|
|
41
|
+
model: string;
|
|
42
|
+
usage: Usage;
|
|
43
|
+
/** Optional human-readable qualifier for usage notices. */
|
|
44
|
+
note?: string;
|
|
45
|
+
}
|
|
36
46
|
export interface CompactionEntry<T = unknown> extends SessionEntryBase {
|
|
37
47
|
type: "compaction";
|
|
38
48
|
summary: string;
|
|
@@ -44,6 +54,8 @@ export interface CompactionEntry<T = unknown> extends SessionEntryBase {
|
|
|
44
54
|
usage?: Usage;
|
|
45
55
|
/** True if generated by an extension, undefined/false if pi-generated (backward compatible) */
|
|
46
56
|
fromHook?: boolean;
|
|
57
|
+
/** Complete prompt and tool state at this compaction boundary. */
|
|
58
|
+
systemMessage?: SystemMessage;
|
|
47
59
|
}
|
|
48
60
|
export interface BranchSummaryEntry<T = unknown> extends SessionEntryBase {
|
|
49
61
|
type: "branch_summary";
|
|
@@ -102,7 +114,7 @@ export interface CustomMessageEntry<T = unknown> extends SessionEntryBase {
|
|
|
102
114
|
display: boolean;
|
|
103
115
|
}
|
|
104
116
|
/** Session entry - has id/parentId for tree structure (returned by "read" methods in SessionManager) */
|
|
105
|
-
export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | SessionInfoEntry;
|
|
117
|
+
export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | UsageEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | SessionInfoEntry;
|
|
106
118
|
/** Raw file entry (includes header) */
|
|
107
119
|
export type FileEntry = SessionHeader | SessionEntry;
|
|
108
120
|
/** Tree node for getTree() - defensive copy of session structure */
|
|
@@ -169,7 +181,9 @@ export declare function getDefaultSessionDir(cwd: string, agentDir?: string): st
|
|
|
169
181
|
export declare function loadEntriesFromFile(filePath: string): FileEntry[];
|
|
170
182
|
/** Exported for testing */
|
|
171
183
|
export declare function findMostRecentSession(sessionDir: string, cwd?: string): string | null;
|
|
172
|
-
export type SessionListProgress = (loaded: number, total: number
|
|
184
|
+
export type SessionListProgress = (loaded: number, total: number,
|
|
185
|
+
/** Sessions loaded so far, sorted by activity. Present on periodic updates. */
|
|
186
|
+
partialSessions?: readonly SessionInfo[]) => void;
|
|
173
187
|
/**
|
|
174
188
|
* Manages conversation sessions as append-only trees stored in JSONL files.
|
|
175
189
|
*
|
|
@@ -220,6 +234,8 @@ export declare class SessionManager {
|
|
|
220
234
|
appendThinkingLevelChange(thinkingLevel: string): string;
|
|
221
235
|
/** Append a model change as child of current leaf, then advance leaf. Returns entry id. */
|
|
222
236
|
appendModelChange(provider: string, modelId: string): string;
|
|
237
|
+
/** Append model-attributed usage that does not participate in LLM context. Returns the appended entry. */
|
|
238
|
+
appendUsage(kind: string, provider: string, model: string, usage: Usage, note?: string): UsageEntry;
|
|
223
239
|
/** Append a compaction summary as child of current leaf, then advance leaf. Returns entry id. */
|
|
224
240
|
appendCompaction<T = unknown>(summary: string, firstKeptEntryId: string, tokensBefore: number, details?: T, fromHook?: boolean, usage?: Usage): string;
|
|
225
241
|
/** Append a custom entry (for extensions) as child of current leaf, then advance leaf. Returns entry id. */
|
|
@@ -340,18 +356,25 @@ export declare class SessionManager {
|
|
|
340
356
|
* @param sessionDir Optional session directory. If omitted, uses default for targetCwd.
|
|
341
357
|
*/
|
|
342
358
|
static forkFrom(sourcePath: string, targetCwd: string, sessionDir?: string, options?: NewSessionOptions): SessionManager;
|
|
359
|
+
/**
|
|
360
|
+
* Find an exact session ID without loading transcript bodies.
|
|
361
|
+
* @param cwd Working directory (used to compute default session directory)
|
|
362
|
+
* @param id Exact session ID
|
|
363
|
+
* @param sessionDir Optional session directory. If omitted, uses default (~/.pi/agent/sessions/<encoded-cwd>/).
|
|
364
|
+
*/
|
|
365
|
+
static findById(cwd: string, id: string, sessionDir?: string): string | undefined;
|
|
343
366
|
/**
|
|
344
367
|
* List all sessions for a directory.
|
|
345
368
|
* @param cwd Working directory (used to compute default session directory)
|
|
346
369
|
* @param sessionDir Optional session directory. If omitted, uses default (~/.pi/agent/sessions/<encoded-cwd>/).
|
|
347
370
|
* @param onProgress Optional callback for progress updates (loaded, total)
|
|
348
371
|
*/
|
|
349
|
-
static list(cwd: string, sessionDir?: string, onProgress?: SessionListProgress): Promise<SessionInfo[]>;
|
|
372
|
+
static list(cwd: string, sessionDir?: string, onProgress?: SessionListProgress, signal?: AbortSignal): Promise<SessionInfo[]>;
|
|
350
373
|
/**
|
|
351
374
|
* List all sessions across all project directories.
|
|
352
375
|
* @param onProgress Optional callback for progress updates (loaded, total)
|
|
353
376
|
*/
|
|
354
|
-
static listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]>;
|
|
355
|
-
static listAll(sessionDir?: string, onProgress?: SessionListProgress): Promise<SessionInfo[]>;
|
|
377
|
+
static listAll(onProgress?: SessionListProgress, signal?: AbortSignal): Promise<SessionInfo[]>;
|
|
378
|
+
static listAll(sessionDir?: string, onProgress?: SessionListProgress, signal?: AbortSignal): Promise<SessionInfo[]>;
|
|
356
379
|
}
|
|
357
380
|
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { uuidv7 } from "@earendil-works/pi-ai";
|
|
1
|
+
import { getCurrentSystemMessage, uuidv7, } from "@earendil-works/pi-ai";
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
import { appendFileSync, closeSync, createReadStream, existsSync, mkdirSync, openSync, readdirSync, readSync, statSync, writeFileSync, } from "fs";
|
|
4
4
|
import { readdir, stat } from "fs/promises";
|
|
5
|
-
import { join, resolve } from "path";
|
|
5
|
+
import { basename, join, resolve } from "path";
|
|
6
6
|
import { createInterface } from "readline";
|
|
7
7
|
import { StringDecoder } from "string_decoder";
|
|
8
8
|
import { APP_NAME, getAgentDir as getDefaultAgentDir, getSessionsDir } from "../config.js";
|
|
@@ -168,6 +168,8 @@ export function sessionEntryToContextMessages(entry) {
|
|
|
168
168
|
const message = entry.message;
|
|
169
169
|
// Session files are parsed without validation; old versions, forks, or
|
|
170
170
|
// hand-edited files can contain messages with null/missing content.
|
|
171
|
+
if (message.role === "system" && message.content == null)
|
|
172
|
+
return [{ ...message, content: "" }];
|
|
171
173
|
if ((message.role === "user" || message.role === "assistant" || message.role === "toolResult") &&
|
|
172
174
|
message.content == null) {
|
|
173
175
|
return [{ ...message, content: [] }];
|
|
@@ -183,7 +185,8 @@ export function sessionEntryToContextMessages(entry) {
|
|
|
183
185
|
return [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)];
|
|
184
186
|
}
|
|
185
187
|
if (entry.type === "compaction") {
|
|
186
|
-
|
|
188
|
+
const summary = createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
|
|
189
|
+
return entry.systemMessage ? [entry.systemMessage, summary] : [summary];
|
|
187
190
|
}
|
|
188
191
|
return [];
|
|
189
192
|
}
|
|
@@ -217,7 +220,7 @@ export function buildContextEntries(entries, leafId, byId) {
|
|
|
217
220
|
if (entry.id === compaction.firstKeptEntryId) {
|
|
218
221
|
foundFirstKept = true;
|
|
219
222
|
}
|
|
220
|
-
if (foundFirstKept) {
|
|
223
|
+
if (foundFirstKept && !(entry.type === "message" && entry.message.role === "system")) {
|
|
221
224
|
contextEntries.push(entry);
|
|
222
225
|
}
|
|
223
226
|
}
|
|
@@ -399,14 +402,16 @@ export function findMostRecentSession(sessionDir, cwd) {
|
|
|
399
402
|
const resolvedCwd = cwd ? resolvePath(cwd) : undefined;
|
|
400
403
|
try {
|
|
401
404
|
const files = readdirSync(resolvedSessionDir)
|
|
402
|
-
.filter((
|
|
403
|
-
.map((
|
|
404
|
-
.map((path) => ({ path,
|
|
405
|
-
.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
405
|
+
.filter((file) => file.endsWith(".jsonl"))
|
|
406
|
+
.map((file) => join(resolvedSessionDir, file))
|
|
407
|
+
.map((path) => ({ path, mtime: statSync(path).mtimeMs }))
|
|
408
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
409
|
+
for (const { path } of files) {
|
|
410
|
+
const header = readSessionHeaderForDiscovery(path);
|
|
411
|
+
if (header && (!resolvedCwd || sessionCwdMatches(getSessionHeaderCwd(header), resolvedCwd)))
|
|
412
|
+
return path;
|
|
413
|
+
}
|
|
414
|
+
return null;
|
|
410
415
|
}
|
|
411
416
|
catch {
|
|
412
417
|
// Directory access and stat races make recent-session discovery unavailable.
|
|
@@ -439,9 +444,9 @@ function getMessageActivityTime(entry) {
|
|
|
439
444
|
const t = new Date(entry.timestamp).getTime();
|
|
440
445
|
return Number.isNaN(t) ? undefined : t;
|
|
441
446
|
}
|
|
442
|
-
async function buildSessionInfo(filePath) {
|
|
447
|
+
async function buildSessionInfo(filePath, signal, fileStats) {
|
|
443
448
|
try {
|
|
444
|
-
const stats = await stat(filePath);
|
|
449
|
+
const stats = fileStats ?? (await stat(filePath));
|
|
445
450
|
let header = null;
|
|
446
451
|
let messageCount = 0;
|
|
447
452
|
let firstMessage = "";
|
|
@@ -449,7 +454,7 @@ async function buildSessionInfo(filePath) {
|
|
|
449
454
|
let name;
|
|
450
455
|
let lastActivityTime;
|
|
451
456
|
const rl = createInterface({
|
|
452
|
-
input: createReadStream(filePath, { encoding: "utf8" }),
|
|
457
|
+
input: createReadStream(filePath, { encoding: "utf8", signal }),
|
|
453
458
|
crlfDelay: Infinity,
|
|
454
459
|
});
|
|
455
460
|
for await (const line of rl) {
|
|
@@ -510,67 +515,63 @@ async function buildSessionInfo(filePath) {
|
|
|
510
515
|
};
|
|
511
516
|
}
|
|
512
517
|
catch {
|
|
518
|
+
signal?.throwIfAborted();
|
|
513
519
|
return null;
|
|
514
520
|
}
|
|
515
521
|
}
|
|
516
522
|
const MAX_CONCURRENT_SESSION_INFO_LOADS = 10;
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
523
|
+
const MAX_CONCURRENT_SESSION_DISCOVERY_LOADS = 64;
|
|
524
|
+
const CURRENT_SESSION_LIST_PUBLISH_INTERVAL = 10;
|
|
525
|
+
const ALL_SESSION_LIST_PUBLISH_INTERVAL = 100;
|
|
526
|
+
async function mapWithConcurrency(items, limit, map, signal) {
|
|
527
|
+
const results = new Array(items.length);
|
|
520
528
|
let nextIndex = 0;
|
|
521
|
-
const
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
let task;
|
|
527
|
-
task = buildSessionInfo(file)
|
|
528
|
-
.then((info) => {
|
|
529
|
-
results[index] = info;
|
|
530
|
-
})
|
|
531
|
-
.catch(() => {
|
|
532
|
-
results[index] = null;
|
|
533
|
-
})
|
|
534
|
-
.finally(() => {
|
|
535
|
-
inFlight.delete(task);
|
|
536
|
-
onLoaded();
|
|
537
|
-
});
|
|
538
|
-
inFlight.add(task);
|
|
539
|
-
};
|
|
540
|
-
while (nextIndex < files.length || inFlight.size > 0) {
|
|
541
|
-
while (nextIndex < files.length && inFlight.size < MAX_CONCURRENT_SESSION_INFO_LOADS) {
|
|
542
|
-
startNext();
|
|
543
|
-
}
|
|
544
|
-
if (inFlight.size > 0) {
|
|
545
|
-
await Promise.race(inFlight);
|
|
529
|
+
const worker = async () => {
|
|
530
|
+
while (nextIndex < items.length) {
|
|
531
|
+
signal?.throwIfAborted();
|
|
532
|
+
const index = nextIndex++;
|
|
533
|
+
results[index] = await map(items[index], index);
|
|
546
534
|
}
|
|
547
|
-
}
|
|
535
|
+
};
|
|
536
|
+
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => worker()));
|
|
548
537
|
return results;
|
|
549
538
|
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
539
|
+
function sortSessionInfos(sessions) {
|
|
540
|
+
return sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
541
|
+
}
|
|
542
|
+
function buildSessionInfosWithConcurrency(files, onLoaded, signal) {
|
|
543
|
+
return mapWithConcurrency(files, MAX_CONCURRENT_SESSION_INFO_LOADS, async (file, index) => {
|
|
544
|
+
const info = await buildSessionInfo(file.path, signal, file.stats);
|
|
545
|
+
onLoaded(info, index);
|
|
546
|
+
return info;
|
|
547
|
+
}, signal);
|
|
548
|
+
}
|
|
549
|
+
async function listSessionsFromDir(dir, onProgress, signal) {
|
|
550
|
+
signal?.throwIfAborted();
|
|
551
|
+
if (!existsSync(dir))
|
|
552
|
+
return [];
|
|
555
553
|
try {
|
|
556
554
|
const dirEntries = await readdir(dir);
|
|
557
|
-
const files = dirEntries
|
|
558
|
-
|
|
555
|
+
const files = dirEntries
|
|
556
|
+
.filter((file) => file.endsWith(".jsonl"))
|
|
557
|
+
.sort((a, b) => b.localeCompare(a))
|
|
558
|
+
.map((file) => ({ path: join(dir, file) }));
|
|
559
|
+
const total = files.length;
|
|
560
|
+
const partialSessions = [];
|
|
559
561
|
let loaded = 0;
|
|
560
|
-
const results = await buildSessionInfosWithConcurrency(files, () => {
|
|
562
|
+
const results = await buildSessionInfosWithConcurrency(files, (info) => {
|
|
561
563
|
loaded++;
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
}
|
|
564
|
+
if (info)
|
|
565
|
+
partialSessions.push(info);
|
|
566
|
+
const publishPartial = loaded === 1 || loaded % CURRENT_SESSION_LIST_PUBLISH_INTERVAL === 0 || loaded === files.length;
|
|
567
|
+
onProgress?.(loaded, total, publishPartial ? sortSessionInfos([...partialSessions]) : undefined);
|
|
568
|
+
}, signal);
|
|
569
|
+
return results.filter((info) => info !== null);
|
|
569
570
|
}
|
|
570
571
|
catch {
|
|
571
|
-
|
|
572
|
+
signal?.throwIfAborted();
|
|
573
|
+
return [];
|
|
572
574
|
}
|
|
573
|
-
return sessions;
|
|
574
575
|
}
|
|
575
576
|
/**
|
|
576
577
|
* Manages conversation sessions as append-only trees stored in JSONL files.
|
|
@@ -810,19 +811,38 @@ export class SessionManager {
|
|
|
810
811
|
this._appendEntry(entry);
|
|
811
812
|
return entry.id;
|
|
812
813
|
}
|
|
814
|
+
/** Append model-attributed usage that does not participate in LLM context. Returns the appended entry. */
|
|
815
|
+
appendUsage(kind, provider, model, usage, note) {
|
|
816
|
+
const entry = {
|
|
817
|
+
type: "usage",
|
|
818
|
+
id: generateId(this.byId),
|
|
819
|
+
parentId: this.leafId,
|
|
820
|
+
timestamp: new Date().toISOString(),
|
|
821
|
+
kind,
|
|
822
|
+
provider,
|
|
823
|
+
model,
|
|
824
|
+
usage,
|
|
825
|
+
...(note ? { note } : {}),
|
|
826
|
+
};
|
|
827
|
+
this._appendEntry(entry);
|
|
828
|
+
return entry;
|
|
829
|
+
}
|
|
813
830
|
/** Append a compaction summary as child of current leaf, then advance leaf. Returns entry id. */
|
|
814
831
|
appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromHook, usage) {
|
|
832
|
+
const timestamp = new Date().toISOString();
|
|
833
|
+
const systemMessage = getCurrentSystemMessage(this.buildSessionContext().messages);
|
|
815
834
|
const entry = {
|
|
816
835
|
type: "compaction",
|
|
817
836
|
id: generateId(this.byId),
|
|
818
837
|
parentId: this.leafId,
|
|
819
|
-
timestamp
|
|
838
|
+
timestamp,
|
|
820
839
|
summary,
|
|
821
840
|
firstKeptEntryId,
|
|
822
841
|
tokensBefore,
|
|
823
842
|
details,
|
|
824
843
|
usage,
|
|
825
844
|
fromHook,
|
|
845
|
+
...(systemMessage ? { systemMessage: { ...systemMessage, timestamp: new Date(timestamp).getTime() } } : {}),
|
|
826
846
|
};
|
|
827
847
|
this._appendEntry(entry);
|
|
828
848
|
return entry.id;
|
|
@@ -1298,67 +1318,110 @@ export class SessionManager {
|
|
|
1298
1318
|
}
|
|
1299
1319
|
return new SessionManager(resolvedTargetCwd, dir, newSessionFile, true);
|
|
1300
1320
|
}
|
|
1321
|
+
/**
|
|
1322
|
+
* Find an exact session ID without loading transcript bodies.
|
|
1323
|
+
* @param cwd Working directory (used to compute default session directory)
|
|
1324
|
+
* @param id Exact session ID
|
|
1325
|
+
* @param sessionDir Optional session directory. If omitted, uses default (~/.pi/agent/sessions/<encoded-cwd>/).
|
|
1326
|
+
*/
|
|
1327
|
+
static findById(cwd, id, sessionDir) {
|
|
1328
|
+
const dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);
|
|
1329
|
+
const filterCwd = sessionDir !== undefined && dir !== getDefaultSessionDirPath(cwd);
|
|
1330
|
+
const resolvedCwd = resolvePath(cwd);
|
|
1331
|
+
try {
|
|
1332
|
+
for (const file of readdirSync(dir)) {
|
|
1333
|
+
if (!file.endsWith(".jsonl"))
|
|
1334
|
+
continue;
|
|
1335
|
+
const path = join(dir, file);
|
|
1336
|
+
const header = readSessionHeaderForDiscovery(path);
|
|
1337
|
+
if (header?.id !== id)
|
|
1338
|
+
continue;
|
|
1339
|
+
if (filterCwd && !sessionCwdMatches(getSessionHeaderCwd(header), resolvedCwd))
|
|
1340
|
+
continue;
|
|
1341
|
+
return path;
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
catch {
|
|
1345
|
+
// Exact session discovery is best-effort, matching list().
|
|
1346
|
+
}
|
|
1347
|
+
return undefined;
|
|
1348
|
+
}
|
|
1301
1349
|
/**
|
|
1302
1350
|
* List all sessions for a directory.
|
|
1303
1351
|
* @param cwd Working directory (used to compute default session directory)
|
|
1304
1352
|
* @param sessionDir Optional session directory. If omitted, uses default (~/.pi/agent/sessions/<encoded-cwd>/).
|
|
1305
1353
|
* @param onProgress Optional callback for progress updates (loaded, total)
|
|
1306
1354
|
*/
|
|
1307
|
-
static async list(cwd, sessionDir, onProgress) {
|
|
1355
|
+
static async list(cwd, sessionDir, onProgress, signal) {
|
|
1308
1356
|
const dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);
|
|
1309
1357
|
const filterCwd = sessionDir !== undefined && dir !== getDefaultSessionDirPath(cwd);
|
|
1310
1358
|
const resolvedCwd = resolvePath(cwd);
|
|
1311
|
-
const
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1359
|
+
const includeSession = (session) => !filterCwd || sessionCwdMatches(session.cwd, resolvedCwd);
|
|
1360
|
+
const progress = onProgress
|
|
1361
|
+
? (loaded, total, partialSessions) => onProgress(loaded, total, partialSessions?.filter(includeSession))
|
|
1362
|
+
: undefined;
|
|
1363
|
+
const sessions = (await listSessionsFromDir(dir, progress, signal)).filter(includeSession);
|
|
1364
|
+
return sortSessionInfos(sessions);
|
|
1365
|
+
}
|
|
1366
|
+
static async listAll(sessionDirOrOnProgress, onProgressOrSignal, signal) {
|
|
1316
1367
|
const customSessionDir = typeof sessionDirOrOnProgress === "string" ? normalizePath(sessionDirOrOnProgress) : undefined;
|
|
1317
|
-
const progress = typeof sessionDirOrOnProgress === "function"
|
|
1368
|
+
const progress = typeof sessionDirOrOnProgress === "function"
|
|
1369
|
+
? sessionDirOrOnProgress
|
|
1370
|
+
: typeof onProgressOrSignal === "function"
|
|
1371
|
+
? onProgressOrSignal
|
|
1372
|
+
: undefined;
|
|
1373
|
+
const abortSignal = typeof sessionDirOrOnProgress === "string" || typeof onProgressOrSignal === "function"
|
|
1374
|
+
? signal
|
|
1375
|
+
: (onProgressOrSignal ?? signal);
|
|
1376
|
+
abortSignal?.throwIfAborted();
|
|
1318
1377
|
if (customSessionDir) {
|
|
1319
|
-
|
|
1320
|
-
sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
1321
|
-
return sessions;
|
|
1378
|
+
return sortSessionInfos(await listSessionsFromDir(customSessionDir, progress, abortSignal));
|
|
1322
1379
|
}
|
|
1323
1380
|
const sessionsDir = getSessionsDir();
|
|
1324
1381
|
try {
|
|
1325
|
-
if (!existsSync(sessionsDir))
|
|
1382
|
+
if (!existsSync(sessionsDir))
|
|
1326
1383
|
return [];
|
|
1327
|
-
}
|
|
1328
1384
|
const entries = await readdir(sessionsDir, { withFileTypes: true });
|
|
1329
1385
|
const dirs = entries
|
|
1330
1386
|
.filter((entry) => entry.isDirectory() || entry.isSymbolicLink())
|
|
1331
1387
|
.map((entry) => join(sessionsDir, entry.name));
|
|
1332
|
-
|
|
1333
|
-
let totalFiles = 0;
|
|
1334
|
-
const dirFiles = [];
|
|
1335
|
-
for (const dir of dirs) {
|
|
1388
|
+
const dirFiles = await mapWithConcurrency(dirs, MAX_CONCURRENT_SESSION_DISCOVERY_LOADS, async (dir) => {
|
|
1336
1389
|
try {
|
|
1337
|
-
|
|
1338
|
-
dirFiles.push(files.map((f) => join(dir, f)));
|
|
1339
|
-
totalFiles += files.length;
|
|
1390
|
+
return (await readdir(dir)).filter((file) => file.endsWith(".jsonl")).map((file) => join(dir, file));
|
|
1340
1391
|
}
|
|
1341
1392
|
catch {
|
|
1342
|
-
|
|
1393
|
+
return [];
|
|
1343
1394
|
}
|
|
1344
|
-
}
|
|
1345
|
-
// Process all files with progress tracking
|
|
1346
|
-
let loaded = 0;
|
|
1347
|
-
const sessions = [];
|
|
1395
|
+
}, abortSignal);
|
|
1348
1396
|
const allFiles = dirFiles.flat();
|
|
1349
|
-
const
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
});
|
|
1353
|
-
for (const info of results) {
|
|
1354
|
-
if (info) {
|
|
1355
|
-
sessions.push(info);
|
|
1397
|
+
const candidates = await mapWithConcurrency(allFiles, MAX_CONCURRENT_SESSION_DISCOVERY_LOADS, async (path) => {
|
|
1398
|
+
try {
|
|
1399
|
+
return { path, stats: await stat(path) };
|
|
1356
1400
|
}
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1401
|
+
catch {
|
|
1402
|
+
return { path };
|
|
1403
|
+
}
|
|
1404
|
+
}, abortSignal);
|
|
1405
|
+
candidates.sort((a, b) => (b.stats?.mtimeMs ?? Number.NEGATIVE_INFINITY) - (a.stats?.mtimeMs ?? Number.NEGATIVE_INFINITY) ||
|
|
1406
|
+
basename(b.path).localeCompare(basename(a.path)));
|
|
1407
|
+
const totalFiles = candidates.length;
|
|
1408
|
+
let loaded = 0;
|
|
1409
|
+
let firstCandidateLoaded = false;
|
|
1410
|
+
const partialSessions = [];
|
|
1411
|
+
const results = await buildSessionInfosWithConcurrency(candidates, (info, index) => {
|
|
1412
|
+
loaded++;
|
|
1413
|
+
if (index === 0)
|
|
1414
|
+
firstCandidateLoaded = true;
|
|
1415
|
+
if (info)
|
|
1416
|
+
partialSessions.push(info);
|
|
1417
|
+
const publishPartial = firstCandidateLoaded &&
|
|
1418
|
+
(index === 0 || loaded % ALL_SESSION_LIST_PUBLISH_INTERVAL === 0 || loaded === totalFiles);
|
|
1419
|
+
progress?.(loaded, totalFiles, publishPartial ? sortSessionInfos([...partialSessions]) : undefined);
|
|
1420
|
+
}, abortSignal);
|
|
1421
|
+
return sortSessionInfos(results.filter((info) => info !== null));
|
|
1360
1422
|
}
|
|
1361
1423
|
catch {
|
|
1424
|
+
abortSignal?.throwIfAborted();
|
|
1362
1425
|
return [];
|
|
1363
1426
|
}
|
|
1364
1427
|
}
|