@ashx-j/lunr 0.2.27 → 0.2.28

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 (138) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
  3. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
  4. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  5. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
  6. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  7. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
  8. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  9. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +5 -0
  10. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  11. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +2 -0
  12. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  13. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
  14. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +68 -40
  16. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
  18. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +28 -4
  20. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +1 -0
  23. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
  25. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
  27. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
  29. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  31. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
  33. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  37. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-tps.js +10 -2
  39. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  40. package/dist/catalog/models.json +1 -1
  41. package/dist/catalog/providers/google-vertex.json +1 -1
  42. package/dist/catalog/providers/google.json +1 -1
  43. package/dist/catalog/publication.json +3 -3
  44. package/dist/core/agent-session.d.ts +6 -15
  45. package/dist/core/agent-session.d.ts.map +1 -1
  46. package/dist/core/agent-session.js +35 -50
  47. package/dist/core/agent-session.js.map +1 -1
  48. package/dist/core/cache-stats.d.ts +1 -1
  49. package/dist/core/cache-stats.d.ts.map +1 -1
  50. package/dist/core/cache-stats.js +1 -1
  51. package/dist/core/cache-stats.js.map +1 -1
  52. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  53. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  54. package/dist/core/compaction/branch-summarization.js +1 -0
  55. package/dist/core/compaction/branch-summarization.js.map +1 -1
  56. package/dist/core/compaction/compaction.d.ts +5 -11
  57. package/dist/core/compaction/compaction.d.ts.map +1 -1
  58. package/dist/core/compaction/compaction.js +38 -92
  59. package/dist/core/compaction/compaction.js.map +1 -1
  60. package/dist/core/context-breakdown.d.ts +2 -2
  61. package/dist/core/context-breakdown.d.ts.map +1 -1
  62. package/dist/core/context-breakdown.js +22 -20
  63. package/dist/core/context-breakdown.js.map +1 -1
  64. package/dist/core/extensions/types.d.ts +3 -1
  65. package/dist/core/extensions/types.d.ts.map +1 -1
  66. package/dist/core/extensions/types.js.map +1 -1
  67. package/dist/core/session-manager.d.ts +5 -1
  68. package/dist/core/session-manager.d.ts.map +1 -1
  69. package/dist/core/session-manager.js +16 -1
  70. package/dist/core/session-manager.js.map +1 -1
  71. package/dist/core/usage-accounting.d.ts +47 -0
  72. package/dist/core/usage-accounting.d.ts.map +1 -0
  73. package/dist/core/usage-accounting.js +205 -0
  74. package/dist/core/usage-accounting.js.map +1 -0
  75. package/dist/core/usage-history.d.ts +1 -18
  76. package/dist/core/usage-history.d.ts.map +1 -1
  77. package/dist/core/usage-history.js +46 -114
  78. package/dist/core/usage-history.js.map +1 -1
  79. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  80. package/dist/gateway/mobile-commands.js +13 -1
  81. package/dist/gateway/mobile-commands.js.map +1 -1
  82. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  83. package/dist/modes/interactive/components/context-view.js +2 -2
  84. package/dist/modes/interactive/components/context-view.js.map +1 -1
  85. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/footer.js +8 -12
  87. package/dist/modes/interactive/components/footer.js.map +1 -1
  88. package/dist/modes/interactive/components/usage-view.d.ts +5 -0
  89. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/usage-view.js +21 -6
  91. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.d.ts +1 -5
  93. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-mode.js +55 -22
  95. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  96. package/dist/node-runtime/{agent-session-services-KDMSPQDY.js → agent-session-services-RTUGP3XR.js} +5 -4
  97. package/dist/node-runtime/{builtin-extensions-OX6KELNX.js → builtin-extensions-N4EUD6SB.js} +1 -1
  98. package/dist/node-runtime/{chunk-A2WO6WIN.js → chunk-4QRUZ64T.js} +11 -5
  99. package/dist/node-runtime/{chunk-ZDJUR45D.js → chunk-BMRXLQWQ.js} +41 -38
  100. package/dist/node-runtime/{chunk-MQPKUHRN.js → chunk-DFMPRAQQ.js} +8 -8
  101. package/dist/node-runtime/{chunk-C3P6Q3B2.js → chunk-E5DQGNJI.js} +10 -10
  102. package/dist/node-runtime/{chunk-FIRA54AC.js → chunk-ICKGAKWX.js} +22 -55
  103. package/dist/node-runtime/{chunk-JWEVT363.js → chunk-JEK35V2M.js} +14 -8
  104. package/dist/node-runtime/{chunk-EPR2F3GU.js → chunk-PWHTSQC4.js} +15 -1
  105. package/dist/node-runtime/{chunk-AYHH7YSD.js → chunk-QT3F6UEV.js} +61 -30
  106. package/dist/node-runtime/{chunk-JQYNHAKX.js → chunk-RY3FJ6WI.js} +29 -27
  107. package/dist/node-runtime/{chunk-I2H5QMWW.js → chunk-STMX7W5I.js} +1 -1
  108. package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
  109. package/dist/node-runtime/{chunk-QNVMKNNN.js → chunk-U3YVZ6UC.js} +4 -4
  110. package/dist/node-runtime/{command-3HMSY6W2.js → command-YRT7I2BW.js} +1 -1
  111. package/dist/node-runtime/{commands-OCSSEEWJ.js → commands-2ETOWWRA.js} +5 -5
  112. package/dist/node-runtime/{export-html-BRWF5AHI.js → export-html-DBQRRMAY.js} +1 -1
  113. package/dist/node-runtime/{gateway-6623C2U3.js → gateway-V6K2CDWN.js} +9 -9
  114. package/dist/node-runtime/{goal-AIHEDUYA.js → goal-J7TYMOBK.js} +9 -3
  115. package/dist/node-runtime/index.js +9 -8
  116. package/dist/node-runtime/{interactive-mode-FM5DNUSW.js → interactive-mode-ASZ7APYP.js} +7 -6
  117. package/dist/node-runtime/{lunr-cron-LKVA5CZZ.js → lunr-cron-WD3YH4CR.js} +4 -4
  118. package/dist/node-runtime/main.js +7 -6
  119. package/dist/node-runtime/{mobile-commands-XT3NQXLD.js → mobile-commands-ICUXFW5V.js} +2 -2
  120. package/dist/node-runtime/{pi-subagents-LT3CTO4E.js → pi-subagents-QPU3OXE4.js} +17 -62
  121. package/dist/node-runtime/rpc-entry.js +7 -6
  122. package/dist/node-runtime/{session-handoff-LNSPDTKY.js → session-handoff-LYH53ESV.js} +2 -2
  123. package/dist/node-runtime/{session-manager-YIFIAVGC.js → session-manager-ZJ3N5Q74.js} +1 -1
  124. package/dist/node-runtime/{subagent-executor-Q5F7DBVM.js → subagent-executor-UI6SHG3X.js} +294 -231
  125. package/docs/features.md +10 -0
  126. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  127. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  128. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  129. package/examples/extensions/gondolin/package-lock.json +2 -2
  130. package/examples/extensions/gondolin/package.json +1 -1
  131. package/examples/extensions/sandbox/package-lock.json +2 -2
  132. package/examples/extensions/sandbox/package.json +1 -1
  133. package/examples/extensions/with-deps/package-lock.json +2 -2
  134. package/examples/extensions/with-deps/package.json +1 -1
  135. package/install-lock/package-lock.json +24 -24
  136. package/install-lock/package.json +2 -2
  137. package/npm-shrinkwrap.json +21 -21
  138. package/package.json +7 -7
@@ -1,3 +1,9 @@
1
- import type { TokenUsage } from "./types.ts";
1
+ import { type AccountedRequest } from "../../../../core/usage-accounting.ts";
2
+ import type { TokenUsage, Usage } from "./types.ts";
3
+ /** Scan all attempts, including older files; stable request IDs prevent fork duplication. */
4
+ export declare function parseSessionRequests(sessionPath: string | undefined): AccountedRequest[];
5
+ export declare function parseSessionUsage(sessionPath: string | undefined): Usage | null;
6
+ export declare function sessionUsageDelta(current: Usage, previous: Usage | null): Usage;
7
+ export declare function tokenUsageFromUsage(usage: Usage): TokenUsage;
2
8
  export declare function parseSessionTokens(sessionDir: string): TokenUsage | null;
3
9
  //# sourceMappingURL=session-tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-tokens.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/session-tokens.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgB7C,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAyBxE","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { TokenUsage } from \"./types.ts\";\n\nfunction findLatestSessionFile(sessionDir: string): string | null {\n\ttry {\n\t\tconst files = fs.readdirSync(sessionDir)\n\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t.map((f) => path.join(sessionDir, f));\n\t\tif (files.length === 0) return null;\n\t\tfiles.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);\n\t\treturn files[0] ?? null;\n\t} catch {\n\t\t// Session token lookup is optional metadata.\n\t\treturn null;\n\t}\n}\n\nexport function parseSessionTokens(sessionDir: string): TokenUsage | null {\n\tconst sessionFile = findLatestSessionFile(sessionDir);\n\tif (!sessionFile) return null;\n\ttry {\n\t\tconst content = fs.readFileSync(sessionFile, \"utf-8\");\n\t\tlet input = 0;\n\t\tlet output = 0;\n\t\tfor (const line of content.split(\"\\n\")) {\n\t\t\tif (!line.trim()) continue;\n\t\t\ttry {\n\t\t\t\tconst entry = JSON.parse(line);\n\t\t\t\tconst usage = entry.usage ?? entry.message?.usage;\n\t\t\t\tif (usage) {\n\t\t\t\t\tinput += usage.inputTokens ?? usage.input ?? 0;\n\t\t\t\t\toutput += usage.outputTokens ?? usage.output ?? 0;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed lines while scanning usage entries.\n\t\t\t}\n\t\t}\n\t\treturn { input, output, total: input + output };\n\t} catch {\n\t\t// Usage extraction should not fail the run.\n\t\treturn null;\n\t}\n}\n"]}
1
+ {"version":3,"file":"session-tokens.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/session-tokens.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,gBAAgB,EAA2C,MAAM,sCAAsC,CAAC;AACtH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEpD,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,EAAE,CA0BxF;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,CAe/E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,IAAI,GAAG,KAAK,CAY/E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAS5D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGxE","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { SessionEntry } from \"../../../../core/session-manager.ts\";\nimport { type AccountedRequest, collectUsageRequests, totalRequestUsage } from \"../../../../core/usage-accounting.ts\";\nimport type { TokenUsage, Usage } from \"./types.ts\";\n\n/** Scan all attempts, including older files; stable request IDs prevent fork duplication. */\nexport function parseSessionRequests(sessionPath: string | undefined): AccountedRequest[] {\n\tif (!sessionPath) return [];\n\ttry {\n\t\tconst files = fs.statSync(sessionPath).isDirectory()\n\t\t\t? fs\n\t\t\t\t\t.readdirSync(sessionPath)\n\t\t\t\t\t.filter((name) => name.endsWith(\".jsonl\"))\n\t\t\t\t\t.map((name) => path.join(sessionPath, name))\n\t\t\t: [sessionPath];\n\t\tconst requests = new Map<string, AccountedRequest>();\n\t\tfor (const file of files) {\n\t\t\tconst entries: SessionEntry[] = [];\n\t\t\tfor (const line of fs.readFileSync(file, \"utf-8\").split(\"\\n\")) {\n\t\t\t\ttry {\n\t\t\t\t\tconst entry = JSON.parse(line) as SessionEntry;\n\t\t\t\t\tif (entry?.type) entries.push(entry);\n\t\t\t\t} catch {\n\t\t\t\t\t/* A child may still be flushing its final line. */\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const request of collectUsageRequests(entries)) requests.set(request.id, request);\n\t\t}\n\t\treturn [...requests.values()];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport function parseSessionUsage(sessionPath: string | undefined): Usage | null {\n\tconst requests = parseSessionRequests(sessionPath);\n\tif (requests.length === 0) return null;\n\tconst total = totalRequestUsage(requests);\n\treturn {\n\t\tinput: total.input,\n\t\toutput: total.output,\n\t\tcacheRead: total.cacheRead,\n\t\tcacheWrite: total.cacheWrite,\n\t\tcost: total.cost,\n\t\tturns: requests.length,\n\t\tunknownRequests: total.unknownRequests,\n\t\tpartialRequests: total.partialRequests,\n\t\tunknownCosts: total.unknownCosts,\n\t};\n}\n\nexport function sessionUsageDelta(current: Usage, previous: Usage | null): Usage {\n\treturn {\n\t\tunknownRequests: Math.max(0, (current.unknownRequests ?? 0) - (previous?.unknownRequests ?? 0)),\n\t\tpartialRequests: Math.max(0, (current.partialRequests ?? 0) - (previous?.partialRequests ?? 0)),\n\t\tunknownCosts: Math.max(0, (current.unknownCosts ?? 0) - (previous?.unknownCosts ?? 0)),\n\t\tinput: Math.max(0, current.input - (previous?.input ?? 0)),\n\t\toutput: Math.max(0, current.output - (previous?.output ?? 0)),\n\t\tcacheRead: Math.max(0, current.cacheRead - (previous?.cacheRead ?? 0)),\n\t\tcacheWrite: Math.max(0, current.cacheWrite - (previous?.cacheWrite ?? 0)),\n\t\tcost: Math.max(0, current.cost - (previous?.cost ?? 0)),\n\t\tturns: Math.max(0, current.turns - (previous?.turns ?? 0)),\n\t};\n}\n\nexport function tokenUsageFromUsage(usage: Usage): TokenUsage {\n\tconst input = usage.input + usage.cacheRead + usage.cacheWrite;\n\treturn {\n\t\tinput,\n\t\toutput: usage.output,\n\t\ttotal: input + usage.output,\n\t\tcacheRead: usage.cacheRead,\n\t\tcacheWrite: usage.cacheWrite,\n\t};\n}\n\nexport function parseSessionTokens(sessionDir: string): TokenUsage | null {\n\tconst usage = parseSessionUsage(sessionDir);\n\treturn usage ? tokenUsageFromUsage(usage) : null;\n}\n"]}
@@ -1,49 +1,81 @@
1
- // @ts-nocheck
2
1
  import * as fs from "node:fs";
3
2
  import * as path from "node:path";
4
- function findLatestSessionFile(sessionDir) {
3
+ import { collectUsageRequests, totalRequestUsage } from "../../../../core/usage-accounting.js";
4
+ /** Scan all attempts, including older files; stable request IDs prevent fork duplication. */
5
+ export function parseSessionRequests(sessionPath) {
6
+ if (!sessionPath)
7
+ return [];
5
8
  try {
6
- const files = fs.readdirSync(sessionDir)
7
- .filter((f) => f.endsWith(".jsonl"))
8
- .map((f) => path.join(sessionDir, f));
9
- if (files.length === 0)
10
- return null;
11
- files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
12
- return files[0] ?? null;
13
- }
14
- catch {
15
- // Session token lookup is optional metadata.
16
- return null;
17
- }
18
- }
19
- export function parseSessionTokens(sessionDir) {
20
- const sessionFile = findLatestSessionFile(sessionDir);
21
- if (!sessionFile)
22
- return null;
23
- try {
24
- const content = fs.readFileSync(sessionFile, "utf-8");
25
- let input = 0;
26
- let output = 0;
27
- for (const line of content.split("\n")) {
28
- if (!line.trim())
29
- continue;
30
- try {
31
- const entry = JSON.parse(line);
32
- const usage = entry.usage ?? entry.message?.usage;
33
- if (usage) {
34
- input += usage.inputTokens ?? usage.input ?? 0;
35
- output += usage.outputTokens ?? usage.output ?? 0;
9
+ const files = fs.statSync(sessionPath).isDirectory()
10
+ ? fs
11
+ .readdirSync(sessionPath)
12
+ .filter((name) => name.endsWith(".jsonl"))
13
+ .map((name) => path.join(sessionPath, name))
14
+ : [sessionPath];
15
+ const requests = new Map();
16
+ for (const file of files) {
17
+ const entries = [];
18
+ for (const line of fs.readFileSync(file, "utf-8").split("\n")) {
19
+ try {
20
+ const entry = JSON.parse(line);
21
+ if (entry?.type)
22
+ entries.push(entry);
23
+ }
24
+ catch {
25
+ /* A child may still be flushing its final line. */
36
26
  }
37
27
  }
38
- catch {
39
- // Ignore malformed lines while scanning usage entries.
40
- }
28
+ for (const request of collectUsageRequests(entries))
29
+ requests.set(request.id, request);
41
30
  }
42
- return { input, output, total: input + output };
31
+ return [...requests.values()];
43
32
  }
44
33
  catch {
45
- // Usage extraction should not fail the run.
46
- return null;
34
+ return [];
47
35
  }
48
36
  }
37
+ export function parseSessionUsage(sessionPath) {
38
+ const requests = parseSessionRequests(sessionPath);
39
+ if (requests.length === 0)
40
+ return null;
41
+ const total = totalRequestUsage(requests);
42
+ return {
43
+ input: total.input,
44
+ output: total.output,
45
+ cacheRead: total.cacheRead,
46
+ cacheWrite: total.cacheWrite,
47
+ cost: total.cost,
48
+ turns: requests.length,
49
+ unknownRequests: total.unknownRequests,
50
+ partialRequests: total.partialRequests,
51
+ unknownCosts: total.unknownCosts,
52
+ };
53
+ }
54
+ export function sessionUsageDelta(current, previous) {
55
+ return {
56
+ unknownRequests: Math.max(0, (current.unknownRequests ?? 0) - (previous?.unknownRequests ?? 0)),
57
+ partialRequests: Math.max(0, (current.partialRequests ?? 0) - (previous?.partialRequests ?? 0)),
58
+ unknownCosts: Math.max(0, (current.unknownCosts ?? 0) - (previous?.unknownCosts ?? 0)),
59
+ input: Math.max(0, current.input - (previous?.input ?? 0)),
60
+ output: Math.max(0, current.output - (previous?.output ?? 0)),
61
+ cacheRead: Math.max(0, current.cacheRead - (previous?.cacheRead ?? 0)),
62
+ cacheWrite: Math.max(0, current.cacheWrite - (previous?.cacheWrite ?? 0)),
63
+ cost: Math.max(0, current.cost - (previous?.cost ?? 0)),
64
+ turns: Math.max(0, current.turns - (previous?.turns ?? 0)),
65
+ };
66
+ }
67
+ export function tokenUsageFromUsage(usage) {
68
+ const input = usage.input + usage.cacheRead + usage.cacheWrite;
69
+ return {
70
+ input,
71
+ output: usage.output,
72
+ total: input + usage.output,
73
+ cacheRead: usage.cacheRead,
74
+ cacheWrite: usage.cacheWrite,
75
+ };
76
+ }
77
+ export function parseSessionTokens(sessionDir) {
78
+ const usage = parseSessionUsage(sessionDir);
79
+ return usage ? tokenUsageFromUsage(usage) : null;
80
+ }
49
81
  //# sourceMappingURL=session-tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-tokens.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/session-tokens.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,SAAS,qBAAqB,CAAC,UAAkB,EAAiB;IACjE,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,6CAA6C;QAC7C,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAqB;IACzE,MAAM,WAAW,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;gBAClD,IAAI,KAAK,EAAE,CAAC;oBACX,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBACnD,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,uDAAuD;YACxD,CAAC;QACF,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACR,4CAA4C;QAC5C,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { TokenUsage } from \"./types.ts\";\n\nfunction findLatestSessionFile(sessionDir: string): string | null {\n\ttry {\n\t\tconst files = fs.readdirSync(sessionDir)\n\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t.map((f) => path.join(sessionDir, f));\n\t\tif (files.length === 0) return null;\n\t\tfiles.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);\n\t\treturn files[0] ?? null;\n\t} catch {\n\t\t// Session token lookup is optional metadata.\n\t\treturn null;\n\t}\n}\n\nexport function parseSessionTokens(sessionDir: string): TokenUsage | null {\n\tconst sessionFile = findLatestSessionFile(sessionDir);\n\tif (!sessionFile) return null;\n\ttry {\n\t\tconst content = fs.readFileSync(sessionFile, \"utf-8\");\n\t\tlet input = 0;\n\t\tlet output = 0;\n\t\tfor (const line of content.split(\"\\n\")) {\n\t\t\tif (!line.trim()) continue;\n\t\t\ttry {\n\t\t\t\tconst entry = JSON.parse(line);\n\t\t\t\tconst usage = entry.usage ?? entry.message?.usage;\n\t\t\t\tif (usage) {\n\t\t\t\t\tinput += usage.inputTokens ?? usage.input ?? 0;\n\t\t\t\t\toutput += usage.outputTokens ?? usage.output ?? 0;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed lines while scanning usage entries.\n\t\t\t}\n\t\t}\n\t\treturn { input, output, total: input + output };\n\t} catch {\n\t\t// Usage extraction should not fail the run.\n\t\treturn null;\n\t}\n}\n"]}
1
+ {"version":3,"file":"session-tokens.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/session-tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { SessionEntry } from \"../../../../core/session-manager.ts\";\nimport { type AccountedRequest, collectUsageRequests, totalRequestUsage } from \"../../../../core/usage-accounting.ts\";\nimport type { TokenUsage, Usage } from \"./types.ts\";\n\n/** Scan all attempts, including older files; stable request IDs prevent fork duplication. */\nexport function parseSessionRequests(sessionPath: string | undefined): AccountedRequest[] {\n\tif (!sessionPath) return [];\n\ttry {\n\t\tconst files = fs.statSync(sessionPath).isDirectory()\n\t\t\t? fs\n\t\t\t\t\t.readdirSync(sessionPath)\n\t\t\t\t\t.filter((name) => name.endsWith(\".jsonl\"))\n\t\t\t\t\t.map((name) => path.join(sessionPath, name))\n\t\t\t: [sessionPath];\n\t\tconst requests = new Map<string, AccountedRequest>();\n\t\tfor (const file of files) {\n\t\t\tconst entries: SessionEntry[] = [];\n\t\t\tfor (const line of fs.readFileSync(file, \"utf-8\").split(\"\\n\")) {\n\t\t\t\ttry {\n\t\t\t\t\tconst entry = JSON.parse(line) as SessionEntry;\n\t\t\t\t\tif (entry?.type) entries.push(entry);\n\t\t\t\t} catch {\n\t\t\t\t\t/* A child may still be flushing its final line. */\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const request of collectUsageRequests(entries)) requests.set(request.id, request);\n\t\t}\n\t\treturn [...requests.values()];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport function parseSessionUsage(sessionPath: string | undefined): Usage | null {\n\tconst requests = parseSessionRequests(sessionPath);\n\tif (requests.length === 0) return null;\n\tconst total = totalRequestUsage(requests);\n\treturn {\n\t\tinput: total.input,\n\t\toutput: total.output,\n\t\tcacheRead: total.cacheRead,\n\t\tcacheWrite: total.cacheWrite,\n\t\tcost: total.cost,\n\t\tturns: requests.length,\n\t\tunknownRequests: total.unknownRequests,\n\t\tpartialRequests: total.partialRequests,\n\t\tunknownCosts: total.unknownCosts,\n\t};\n}\n\nexport function sessionUsageDelta(current: Usage, previous: Usage | null): Usage {\n\treturn {\n\t\tunknownRequests: Math.max(0, (current.unknownRequests ?? 0) - (previous?.unknownRequests ?? 0)),\n\t\tpartialRequests: Math.max(0, (current.partialRequests ?? 0) - (previous?.partialRequests ?? 0)),\n\t\tunknownCosts: Math.max(0, (current.unknownCosts ?? 0) - (previous?.unknownCosts ?? 0)),\n\t\tinput: Math.max(0, current.input - (previous?.input ?? 0)),\n\t\toutput: Math.max(0, current.output - (previous?.output ?? 0)),\n\t\tcacheRead: Math.max(0, current.cacheRead - (previous?.cacheRead ?? 0)),\n\t\tcacheWrite: Math.max(0, current.cacheWrite - (previous?.cacheWrite ?? 0)),\n\t\tcost: Math.max(0, current.cost - (previous?.cost ?? 0)),\n\t\tturns: Math.max(0, current.turns - (previous?.turns ?? 0)),\n\t};\n}\n\nexport function tokenUsageFromUsage(usage: Usage): TokenUsage {\n\tconst input = usage.input + usage.cacheRead + usage.cacheWrite;\n\treturn {\n\t\tinput,\n\t\toutput: usage.output,\n\t\ttotal: input + usage.output,\n\t\tcacheRead: usage.cacheRead,\n\t\tcacheWrite: usage.cacheWrite,\n\t};\n}\n\nexport function parseSessionTokens(sessionDir: string): TokenUsage | null {\n\tconst usage = parseSessionUsage(sessionDir);\n\treturn usage ? tokenUsageFromUsage(usage) : null;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Type definitions for the subagent extension
3
3
  */
4
+ import type { AccountedRequest } from "../../../../core/usage-accounting.ts";
4
5
  import type { Message } from "@ashx-j/lunr-ai";
5
6
  import type { FSWatcher } from "node:fs";
6
7
  import type { ExtensionContext } from "@ashx-j/lunr";
@@ -133,6 +134,9 @@ interface TruncationResult {
133
134
  artifactPath?: string;
134
135
  }
135
136
  export interface Usage {
137
+ unknownRequests?: number;
138
+ partialRequests?: number;
139
+ unknownCosts?: number;
136
140
  input: number;
137
141
  output: number;
138
142
  cacheRead: number;
@@ -174,6 +178,9 @@ export interface TurnBudgetState extends ResolvedTurnBudget {
174
178
  exceededAtTurn?: number;
175
179
  }
176
180
  export interface TokenUsage {
181
+ /** Input includes cache reads and writes. */
182
+ cacheRead?: number;
183
+ cacheWrite?: number;
177
184
  input: number;
178
185
  output: number;
179
186
  total: number;
@@ -572,6 +579,8 @@ export interface SingleResult {
572
579
  toolBudgetBlocked?: boolean;
573
580
  messages?: Message[];
574
581
  usage: Usage;
582
+ /** Durable request receipts deduplicate fallback, completion, wait, and resume. */
583
+ usageRequests?: AccountedRequest[];
575
584
  model?: string;
576
585
  thinking?: string;
577
586
  modelSelection?: ModelSelection;