pi-ui-extend 1.0.40 → 1.0.41
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/dist/app/commands/command-registry.js +2 -2
- package/dist/app/commands/command-session-actions.d.ts +0 -1
- package/dist/app/commands/command-session-actions.js +22 -13
- package/dist/app/icons.d.ts +14 -0
- package/dist/app/icons.js +33 -0
- package/dist/app/rendering/conversation-tool-renderer.js +2 -2
- package/dist/app/rendering/dcp-stats.d.ts +6 -1
- package/dist/app/rendering/dcp-stats.js +214 -46
- package/dist/app/rendering/editor-panels.js +8 -5
- package/dist/app/session/lazy-session-manager.js +12 -1
- package/dist/app/session/tabs-controller.d.ts +2 -5
- package/dist/app/session/tabs-controller.js +12 -21
- package/dist/app/subagents/subagents-model.d.ts +14 -1
- package/dist/app/subagents/subagents-model.js +34 -15
- package/dist/app/types.d.ts +2 -0
- package/dist/bundled-extensions/session-title/config.js +1 -1
- package/dist/markdown-format.js +27 -9
- package/dist/schemas/pi-tools-suite-schema.d.ts +29 -16
- package/dist/schemas/pi-tools-suite-schema.js +46 -31
- package/external/pi-tools-suite/README.md +188 -55
- package/external/pi-tools-suite/docs/browser-qa-subagent.md +31 -21
- package/external/pi-tools-suite/docs/context-gateway-p00-adr.md +216 -0
- package/external/pi-tools-suite/docs/context-gateway-p01n-gate-review.md +122 -0
- package/external/pi-tools-suite/docs/context-gateway-p01n-measurement.md +133 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-ra-evidence.md +111 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-rb-evidence.md +100 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-rc-evidence.md +69 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-rd-evidence.md +100 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-re-evidence.md +74 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-rf-evidence.md +153 -0
- package/external/pi-tools-suite/docs/context-gateway-p01r-rg-evidence.md +235 -0
- package/external/pi-tools-suite/docs/subagent-model-pools.md +109 -0
- package/external/pi-tools-suite/package.json +3 -0
- package/external/pi-tools-suite/src/async-subagents/{private-skills → agents}/browser-qa/scripts/browser-qa-runner.mjs +82 -1
- package/external/pi-tools-suite/src/async-subagents/{private-skills/browser-qa/SKILL.md → agents/browser-qa.md} +261 -12
- package/external/pi-tools-suite/src/async-subagents/agents/implement.md +20 -0
- package/external/pi-tools-suite/src/async-subagents/agents/oracle.md +16 -0
- package/external/pi-tools-suite/src/async-subagents/agents/research.md +18 -0
- package/external/pi-tools-suite/src/async-subagents/agents/verify.md +18 -0
- package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +27 -243
- package/external/pi-tools-suite/src/async-subagents/commands.ts +6 -2
- package/external/pi-tools-suite/src/async-subagents/core/agent-catalog.ts +41 -0
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +13 -93
- package/external/pi-tools-suite/src/async-subagents/core/agents-dir.ts +494 -0
- package/external/pi-tools-suite/src/async-subagents/core/browser-qa.ts +9 -0
- package/external/pi-tools-suite/src/async-subagents/core/config.ts +200 -143
- package/external/pi-tools-suite/src/async-subagents/core/model-fallback.ts +1 -1
- package/external/pi-tools-suite/src/async-subagents/core/model-selection.ts +54 -0
- package/external/pi-tools-suite/src/async-subagents/core/prompt.ts +7 -6
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +52 -45
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +12 -4
- package/external/pi-tools-suite/src/async-subagents/index.ts +11 -1
- package/external/pi-tools-suite/src/async-subagents/lib.ts +6 -2
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +46 -18
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +3 -2
- package/external/pi-tools-suite/src/async-subagents/types.ts +2 -0
- package/external/pi-tools-suite/src/config.ts +1 -1
- package/external/pi-tools-suite/src/context-gateway/accounting.ts +151 -0
- package/external/pi-tools-suite/src/context-gateway/config.ts +111 -0
- package/external/pi-tools-suite/src/context-gateway/index.ts +160 -0
- package/external/pi-tools-suite/src/context-gateway/metadata-normalization.ts +88 -0
- package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +89 -0
- package/external/pi-tools-suite/src/context-gateway/telemetry.ts +429 -0
- package/external/pi-tools-suite/src/context-gateway/test-output-parser.ts +326 -0
- package/external/pi-tools-suite/src/context-gateway/types.ts +152 -0
- package/external/pi-tools-suite/src/dcp/auto-compress-budget.ts +106 -0
- package/external/pi-tools-suite/src/dcp/auto-compress.ts +810 -106
- package/external/pi-tools-suite/src/dcp/commands.ts +64 -139
- package/external/pi-tools-suite/src/dcp/compress-tool.ts +369 -35
- package/external/pi-tools-suite/src/dcp/compression-blocks.ts +510 -64
- package/external/pi-tools-suite/src/dcp/compression-preview.ts +113 -0
- package/external/pi-tools-suite/src/dcp/compression-progress.ts +70 -0
- package/external/pi-tools-suite/src/dcp/config.ts +36 -61
- package/external/pi-tools-suite/src/dcp/conversation-index.ts +421 -0
- package/external/pi-tools-suite/src/dcp/debug-log.ts +7 -5
- package/external/pi-tools-suite/src/dcp/index.ts +617 -203
- package/external/pi-tools-suite/src/dcp/journal.ts +566 -0
- package/external/pi-tools-suite/src/dcp/progress-controller.ts +244 -0
- package/external/pi-tools-suite/src/dcp/prompts.ts +10 -7
- package/external/pi-tools-suite/src/dcp/provider-tool-results.ts +189 -0
- package/external/pi-tools-suite/src/dcp/pruner-candidates.ts +298 -78
- package/external/pi-tools-suite/src/dcp/pruner-compression-blocks.ts +173 -281
- package/external/pi-tools-suite/src/dcp/pruner-emergency.ts +2 -4
- package/external/pi-tools-suite/src/dcp/pruner-message-ids.ts +17 -5
- package/external/pi-tools-suite/src/dcp/pruner-metadata.ts +11 -1
- package/external/pi-tools-suite/src/dcp/pruner-nudge.ts +30 -82
- package/external/pi-tools-suite/src/dcp/pruner-tools.ts +22 -133
- package/external/pi-tools-suite/src/dcp/pruner.ts +18 -33
- package/external/pi-tools-suite/src/dcp/recovery.ts +129 -0
- package/external/pi-tools-suite/src/dcp/shadow-plan.ts +127 -0
- package/external/pi-tools-suite/src/dcp/state-transaction.ts +102 -0
- package/external/pi-tools-suite/src/dcp/state.ts +158 -580
- package/external/pi-tools-suite/src/dcp/ui.ts +1 -0
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +32 -214
- package/external/pi-tools-suite/src/index.ts +9 -0
- package/external/pi-tools-suite/src/model-tools/index.ts +76 -42
- package/external/pi-tools-suite/src/repo-discovery/index.ts +84 -18
- package/external/pi-tools-suite/src/repo-discovery/native-compact.ts +458 -0
- package/external/pi-tools-suite/src/session-recovery/index.ts +189 -43
- package/external/pi-tools-suite/src/tool-descriptions.ts +39 -35
- package/external/pi-tools-suite/src/truncation-metadata-normalizer/index.ts +17 -0
- package/package.json +3 -2
- package/schemas/pi-tools-suite.json +159 -78
- package/external/pi-tools-suite/src/async-subagents/private-skills/browser-qa/references/auth-scaffold-spec.md +0 -78
- package/external/pi-tools-suite/src/async-subagents/private-skills/browser-qa/references/qa-design.md +0 -223
- package/external/pi-tools-suite/src/dcp/state-persistence.ts +0 -195
- /package/external/pi-tools-suite/src/async-subagents/{private-skills/browser-qa/references → agents/browser-qa/examples}/qa-auth.example.jsonc +0 -0
- /package/external/pi-tools-suite/src/async-subagents/{private-skills/browser-qa/references → agents/browser-qa/examples}/qa-flow.example.jsonc +0 -0
- /package/external/pi-tools-suite/src/async-subagents/{private-skills → agents}/browser-qa/vendor/fflate.LICENSE +0 -0
- /package/external/pi-tools-suite/src/async-subagents/{private-skills → agents}/browser-qa/vendor/fflate.mjs +0 -0
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { mkdir, open, readFile, readdir, stat, unlink, writeFile } from "node:fs/promises"
|
|
2
|
-
import type { Dirent } from "node:fs"
|
|
3
|
-
import { dirname, join } from "node:path"
|
|
4
|
-
import type { ExtensionContext } from "@earendil-works/pi-coding-agent"
|
|
5
|
-
import { hashSerializedState, serializeState, type DcpState, type SerializedDcpState } from "./state.js"
|
|
6
|
-
|
|
7
|
-
const DCP_STATE_DIR = "dcp-state"
|
|
8
|
-
const DCP_STATE_EXT = ".json"
|
|
9
|
-
const DCP_STATE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000
|
|
10
|
-
const MAX_SESSION_HEADER_BYTES = 64 * 1024
|
|
11
|
-
|
|
12
|
-
let lastPersistedStateHash: string | undefined
|
|
13
|
-
let saveQueue: Promise<void> = Promise.resolve()
|
|
14
|
-
|
|
15
|
-
function safeSessionFileName(sessionId: string): string {
|
|
16
|
-
return sessionId.replace(/[^a-zA-Z0-9._-]/g, "_") + DCP_STATE_EXT
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export async function readSessionIdFromFile(sessionPath: string): Promise<string | undefined> {
|
|
20
|
-
const file = await open(sessionPath, "r")
|
|
21
|
-
try {
|
|
22
|
-
const buffer = Buffer.alloc(MAX_SESSION_HEADER_BYTES)
|
|
23
|
-
const { bytesRead } = await file.read(buffer, 0, buffer.length, 0)
|
|
24
|
-
if (bytesRead <= 0) return undefined
|
|
25
|
-
|
|
26
|
-
const content = buffer.subarray(0, bytesRead)
|
|
27
|
-
const newlineIndex = content.indexOf(0x0a)
|
|
28
|
-
if (newlineIndex < 0 && bytesRead === buffer.length) return undefined
|
|
29
|
-
|
|
30
|
-
const firstLine = content.subarray(0, newlineIndex >= 0 ? newlineIndex : bytesRead).toString("utf8").trim()
|
|
31
|
-
if (!firstLine) return undefined
|
|
32
|
-
const parsed = JSON.parse(firstLine) as { type?: string; id?: unknown }
|
|
33
|
-
return parsed.type === "session" && typeof parsed.id === "string" && parsed.id.length > 0
|
|
34
|
-
? parsed.id
|
|
35
|
-
: undefined
|
|
36
|
-
} finally {
|
|
37
|
-
await file.close()
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async function listSessionIds(sessionDir: string): Promise<string[]> {
|
|
42
|
-
let entries: Dirent[]
|
|
43
|
-
try {
|
|
44
|
-
entries = await readdir(sessionDir, { withFileTypes: true })
|
|
45
|
-
} catch (error) {
|
|
46
|
-
if ((error as NodeJS.ErrnoException).code === "ENOENT") return []
|
|
47
|
-
throw error
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const sessionIds = new Set<string>()
|
|
51
|
-
for (const entry of entries) {
|
|
52
|
-
if (!entry.isFile() || !entry.name.endsWith(".jsonl")) continue
|
|
53
|
-
|
|
54
|
-
const sessionPath = join(sessionDir, entry.name)
|
|
55
|
-
try {
|
|
56
|
-
const sessionId = await readSessionIdFromFile(sessionPath)
|
|
57
|
-
if (sessionId) sessionIds.add(sessionId)
|
|
58
|
-
} catch {
|
|
59
|
-
// Ignore malformed or transient session files during cleanup.
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return [...sessionIds]
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function resolveDcpStateDir(ctx: ExtensionContext): string | undefined {
|
|
67
|
-
const sessionDir = ctx.sessionManager?.getSessionDir?.()
|
|
68
|
-
if (!sessionDir) return undefined
|
|
69
|
-
return join(sessionDir, DCP_STATE_DIR)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function resolveDcpStatePath(ctx: ExtensionContext): string | undefined {
|
|
73
|
-
const sessionId = ctx.sessionManager?.getSessionId?.()
|
|
74
|
-
const stateDir = resolveDcpStateDir(ctx)
|
|
75
|
-
if (!sessionId || !stateDir) return undefined
|
|
76
|
-
return join(stateDir, safeSessionFileName(sessionId))
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export function resetDcpPersistenceDedup(): void {
|
|
80
|
-
lastPersistedStateHash = undefined
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export async function loadDcpState(ctx: ExtensionContext): Promise<SerializedDcpState | undefined> {
|
|
84
|
-
const statePath = resolveDcpStatePath(ctx)
|
|
85
|
-
if (!statePath) return undefined
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
const text = await readFile(statePath, "utf8")
|
|
89
|
-
const data = JSON.parse(text) as SerializedDcpState
|
|
90
|
-
lastPersistedStateHash = hashSerializedState(data)
|
|
91
|
-
return data
|
|
92
|
-
} catch (error) {
|
|
93
|
-
if ((error as NodeJS.ErrnoException).code === "ENOENT") return undefined
|
|
94
|
-
throw error
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Load the DCP sidecar for an arbitrary session file path, e.g. the previous
|
|
100
|
-
* session during fork/resume/new. Resolves the sidecar via the session file's
|
|
101
|
-
* first-line session id rather than the live session manager, so it works
|
|
102
|
-
* independent of the current ctx.sessionManager state.
|
|
103
|
-
*/
|
|
104
|
-
export async function loadDcpStateFromSessionFile(
|
|
105
|
-
sessionFile: string,
|
|
106
|
-
): Promise<SerializedDcpState | undefined> {
|
|
107
|
-
if (!sessionFile) return undefined
|
|
108
|
-
|
|
109
|
-
try {
|
|
110
|
-
const sessionId = await readSessionIdFromFile(sessionFile)
|
|
111
|
-
if (!sessionId) return undefined
|
|
112
|
-
const stateDir = join(dirname(sessionFile), DCP_STATE_DIR)
|
|
113
|
-
const statePath = join(stateDir, safeSessionFileName(sessionId))
|
|
114
|
-
const text = await readFile(statePath, "utf8")
|
|
115
|
-
return JSON.parse(text) as SerializedDcpState
|
|
116
|
-
} catch {
|
|
117
|
-
// A missing/unreadable sidecar for the previous session (e.g. a fresh
|
|
118
|
-
// fork with no prior compression) means there is simply nothing to inherit.
|
|
119
|
-
return undefined
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export async function cleanupStaleDcpStateFiles(ctx: ExtensionContext): Promise<number> {
|
|
124
|
-
const stateDir = resolveDcpStateDir(ctx)
|
|
125
|
-
const sessionDir = ctx.sessionManager.getSessionDir()
|
|
126
|
-
if (!stateDir || !sessionDir) return 0
|
|
127
|
-
|
|
128
|
-
const currentSessionId = ctx.sessionManager.getSessionId()
|
|
129
|
-
const liveStateFiles = new Set<string>()
|
|
130
|
-
if (currentSessionId) liveStateFiles.add(safeSessionFileName(currentSessionId))
|
|
131
|
-
|
|
132
|
-
const sessionIds = await listSessionIds(sessionDir)
|
|
133
|
-
for (const sessionId of sessionIds) {
|
|
134
|
-
liveStateFiles.add(safeSessionFileName(sessionId))
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
let entries: Dirent[]
|
|
138
|
-
try {
|
|
139
|
-
entries = await readdir(stateDir, { withFileTypes: true })
|
|
140
|
-
} catch (error) {
|
|
141
|
-
if ((error as NodeJS.ErrnoException).code === "ENOENT") return 0
|
|
142
|
-
throw error
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const now = Date.now()
|
|
146
|
-
let deleted = 0
|
|
147
|
-
for (const entry of entries) {
|
|
148
|
-
if (!entry.isFile() || !entry.name.endsWith(DCP_STATE_EXT)) continue
|
|
149
|
-
if (currentSessionId && entry.name === safeSessionFileName(currentSessionId)) continue
|
|
150
|
-
|
|
151
|
-
const statePath = join(stateDir, entry.name)
|
|
152
|
-
const isLiveSession = liveStateFiles.has(entry.name)
|
|
153
|
-
let isTooOld = false
|
|
154
|
-
try {
|
|
155
|
-
const info = await stat(statePath)
|
|
156
|
-
isTooOld = now - info.mtimeMs > DCP_STATE_MAX_AGE_MS
|
|
157
|
-
} catch (error) {
|
|
158
|
-
if ((error as NodeJS.ErrnoException).code === "ENOENT") continue
|
|
159
|
-
throw error
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (isLiveSession && !isTooOld) continue
|
|
163
|
-
|
|
164
|
-
await unlink(statePath)
|
|
165
|
-
deleted++
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return deleted
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
export async function saveDcpState(ctx: ExtensionContext, state: DcpState): Promise<void> {
|
|
172
|
-
const statePath = resolveDcpStatePath(ctx)
|
|
173
|
-
if (!statePath) return
|
|
174
|
-
|
|
175
|
-
const serialized = serializeState(state)
|
|
176
|
-
const hash = hashSerializedState(serialized)
|
|
177
|
-
if (hash === lastPersistedStateHash) return
|
|
178
|
-
lastPersistedStateHash = hash
|
|
179
|
-
|
|
180
|
-
saveQueue = saveQueue
|
|
181
|
-
.catch(() => {
|
|
182
|
-
// Keep later saves moving even if an earlier write failed.
|
|
183
|
-
})
|
|
184
|
-
.then(async () => {
|
|
185
|
-
await mkdir(dirname(statePath), { recursive: true })
|
|
186
|
-
await writeFile(statePath, JSON.stringify(serialized), "utf8")
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
await saveQueue
|
|
191
|
-
} catch (error) {
|
|
192
|
-
if (lastPersistedStateHash === hash) lastPersistedStateHash = undefined
|
|
193
|
-
throw error
|
|
194
|
-
}
|
|
195
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|