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.
Files changed (110) hide show
  1. package/dist/app/commands/command-registry.js +2 -2
  2. package/dist/app/commands/command-session-actions.d.ts +0 -1
  3. package/dist/app/commands/command-session-actions.js +22 -13
  4. package/dist/app/icons.d.ts +14 -0
  5. package/dist/app/icons.js +33 -0
  6. package/dist/app/rendering/conversation-tool-renderer.js +2 -2
  7. package/dist/app/rendering/dcp-stats.d.ts +6 -1
  8. package/dist/app/rendering/dcp-stats.js +214 -46
  9. package/dist/app/rendering/editor-panels.js +8 -5
  10. package/dist/app/session/lazy-session-manager.js +12 -1
  11. package/dist/app/session/tabs-controller.d.ts +2 -5
  12. package/dist/app/session/tabs-controller.js +12 -21
  13. package/dist/app/subagents/subagents-model.d.ts +14 -1
  14. package/dist/app/subagents/subagents-model.js +34 -15
  15. package/dist/app/types.d.ts +2 -0
  16. package/dist/bundled-extensions/session-title/config.js +1 -1
  17. package/dist/markdown-format.js +27 -9
  18. package/dist/schemas/pi-tools-suite-schema.d.ts +29 -16
  19. package/dist/schemas/pi-tools-suite-schema.js +46 -31
  20. package/external/pi-tools-suite/README.md +188 -55
  21. package/external/pi-tools-suite/docs/browser-qa-subagent.md +31 -21
  22. package/external/pi-tools-suite/docs/context-gateway-p00-adr.md +216 -0
  23. package/external/pi-tools-suite/docs/context-gateway-p01n-gate-review.md +122 -0
  24. package/external/pi-tools-suite/docs/context-gateway-p01n-measurement.md +133 -0
  25. package/external/pi-tools-suite/docs/context-gateway-p01r-ra-evidence.md +111 -0
  26. package/external/pi-tools-suite/docs/context-gateway-p01r-rb-evidence.md +100 -0
  27. package/external/pi-tools-suite/docs/context-gateway-p01r-rc-evidence.md +69 -0
  28. package/external/pi-tools-suite/docs/context-gateway-p01r-rd-evidence.md +100 -0
  29. package/external/pi-tools-suite/docs/context-gateway-p01r-re-evidence.md +74 -0
  30. package/external/pi-tools-suite/docs/context-gateway-p01r-rf-evidence.md +153 -0
  31. package/external/pi-tools-suite/docs/context-gateway-p01r-rg-evidence.md +235 -0
  32. package/external/pi-tools-suite/docs/subagent-model-pools.md +109 -0
  33. package/external/pi-tools-suite/package.json +3 -0
  34. package/external/pi-tools-suite/src/async-subagents/{private-skills → agents}/browser-qa/scripts/browser-qa-runner.mjs +82 -1
  35. package/external/pi-tools-suite/src/async-subagents/{private-skills/browser-qa/SKILL.md → agents/browser-qa.md} +261 -12
  36. package/external/pi-tools-suite/src/async-subagents/agents/implement.md +20 -0
  37. package/external/pi-tools-suite/src/async-subagents/agents/oracle.md +16 -0
  38. package/external/pi-tools-suite/src/async-subagents/agents/research.md +18 -0
  39. package/external/pi-tools-suite/src/async-subagents/agents/verify.md +18 -0
  40. package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +27 -243
  41. package/external/pi-tools-suite/src/async-subagents/commands.ts +6 -2
  42. package/external/pi-tools-suite/src/async-subagents/core/agent-catalog.ts +41 -0
  43. package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +13 -93
  44. package/external/pi-tools-suite/src/async-subagents/core/agents-dir.ts +494 -0
  45. package/external/pi-tools-suite/src/async-subagents/core/browser-qa.ts +9 -0
  46. package/external/pi-tools-suite/src/async-subagents/core/config.ts +200 -143
  47. package/external/pi-tools-suite/src/async-subagents/core/model-fallback.ts +1 -1
  48. package/external/pi-tools-suite/src/async-subagents/core/model-selection.ts +54 -0
  49. package/external/pi-tools-suite/src/async-subagents/core/prompt.ts +7 -6
  50. package/external/pi-tools-suite/src/async-subagents/core/routing.ts +52 -45
  51. package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +12 -4
  52. package/external/pi-tools-suite/src/async-subagents/index.ts +11 -1
  53. package/external/pi-tools-suite/src/async-subagents/lib.ts +6 -2
  54. package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +46 -18
  55. package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +3 -2
  56. package/external/pi-tools-suite/src/async-subagents/types.ts +2 -0
  57. package/external/pi-tools-suite/src/config.ts +1 -1
  58. package/external/pi-tools-suite/src/context-gateway/accounting.ts +151 -0
  59. package/external/pi-tools-suite/src/context-gateway/config.ts +111 -0
  60. package/external/pi-tools-suite/src/context-gateway/index.ts +160 -0
  61. package/external/pi-tools-suite/src/context-gateway/metadata-normalization.ts +88 -0
  62. package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +89 -0
  63. package/external/pi-tools-suite/src/context-gateway/telemetry.ts +429 -0
  64. package/external/pi-tools-suite/src/context-gateway/test-output-parser.ts +326 -0
  65. package/external/pi-tools-suite/src/context-gateway/types.ts +152 -0
  66. package/external/pi-tools-suite/src/dcp/auto-compress-budget.ts +106 -0
  67. package/external/pi-tools-suite/src/dcp/auto-compress.ts +810 -106
  68. package/external/pi-tools-suite/src/dcp/commands.ts +64 -139
  69. package/external/pi-tools-suite/src/dcp/compress-tool.ts +369 -35
  70. package/external/pi-tools-suite/src/dcp/compression-blocks.ts +510 -64
  71. package/external/pi-tools-suite/src/dcp/compression-preview.ts +113 -0
  72. package/external/pi-tools-suite/src/dcp/compression-progress.ts +70 -0
  73. package/external/pi-tools-suite/src/dcp/config.ts +36 -61
  74. package/external/pi-tools-suite/src/dcp/conversation-index.ts +421 -0
  75. package/external/pi-tools-suite/src/dcp/debug-log.ts +7 -5
  76. package/external/pi-tools-suite/src/dcp/index.ts +617 -203
  77. package/external/pi-tools-suite/src/dcp/journal.ts +566 -0
  78. package/external/pi-tools-suite/src/dcp/progress-controller.ts +244 -0
  79. package/external/pi-tools-suite/src/dcp/prompts.ts +10 -7
  80. package/external/pi-tools-suite/src/dcp/provider-tool-results.ts +189 -0
  81. package/external/pi-tools-suite/src/dcp/pruner-candidates.ts +298 -78
  82. package/external/pi-tools-suite/src/dcp/pruner-compression-blocks.ts +173 -281
  83. package/external/pi-tools-suite/src/dcp/pruner-emergency.ts +2 -4
  84. package/external/pi-tools-suite/src/dcp/pruner-message-ids.ts +17 -5
  85. package/external/pi-tools-suite/src/dcp/pruner-metadata.ts +11 -1
  86. package/external/pi-tools-suite/src/dcp/pruner-nudge.ts +30 -82
  87. package/external/pi-tools-suite/src/dcp/pruner-tools.ts +22 -133
  88. package/external/pi-tools-suite/src/dcp/pruner.ts +18 -33
  89. package/external/pi-tools-suite/src/dcp/recovery.ts +129 -0
  90. package/external/pi-tools-suite/src/dcp/shadow-plan.ts +127 -0
  91. package/external/pi-tools-suite/src/dcp/state-transaction.ts +102 -0
  92. package/external/pi-tools-suite/src/dcp/state.ts +158 -580
  93. package/external/pi-tools-suite/src/dcp/ui.ts +1 -0
  94. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +32 -214
  95. package/external/pi-tools-suite/src/index.ts +9 -0
  96. package/external/pi-tools-suite/src/model-tools/index.ts +76 -42
  97. package/external/pi-tools-suite/src/repo-discovery/index.ts +84 -18
  98. package/external/pi-tools-suite/src/repo-discovery/native-compact.ts +458 -0
  99. package/external/pi-tools-suite/src/session-recovery/index.ts +189 -43
  100. package/external/pi-tools-suite/src/tool-descriptions.ts +39 -35
  101. package/external/pi-tools-suite/src/truncation-metadata-normalizer/index.ts +17 -0
  102. package/package.json +3 -2
  103. package/schemas/pi-tools-suite.json +159 -78
  104. package/external/pi-tools-suite/src/async-subagents/private-skills/browser-qa/references/auth-scaffold-spec.md +0 -78
  105. package/external/pi-tools-suite/src/async-subagents/private-skills/browser-qa/references/qa-design.md +0 -223
  106. package/external/pi-tools-suite/src/dcp/state-persistence.ts +0 -195
  107. /package/external/pi-tools-suite/src/async-subagents/{private-skills/browser-qa/references → agents/browser-qa/examples}/qa-auth.example.jsonc +0 -0
  108. /package/external/pi-tools-suite/src/async-subagents/{private-skills/browser-qa/references → agents/browser-qa/examples}/qa-flow.example.jsonc +0 -0
  109. /package/external/pi-tools-suite/src/async-subagents/{private-skills → agents}/browser-qa/vendor/fflate.LICENSE +0 -0
  110. /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
- }