sidekick-shared 0.28.3 → 0.29.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.
Files changed (151) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +188 -27
  3. package/dist/aggregation/EventAggregator.d.ts +19 -0
  4. package/dist/aggregation/EventAggregator.js +174 -35
  5. package/dist/aggregation/snapshot.d.ts +37 -8
  6. package/dist/aggregation/snapshot.js +31 -9
  7. package/dist/aggregation/types.d.ts +13 -0
  8. package/dist/authStatus.d.ts +54 -0
  9. package/dist/authStatus.js +91 -0
  10. package/dist/browser.d.ts +16 -6
  11. package/dist/browser.js +24 -2
  12. package/dist/codex.d.ts +23 -0
  13. package/dist/codex.js +44 -0
  14. package/dist/codexProfiles.d.ts +1 -0
  15. package/dist/codexProfiles.js +8 -11
  16. package/dist/context/sessionContext.js +4 -0
  17. package/dist/esm/aggregation/EventAggregator.js +174 -35
  18. package/dist/esm/aggregation/snapshot.js +31 -9
  19. package/dist/esm/authStatus.js +87 -0
  20. package/dist/esm/browser.js +5 -2
  21. package/dist/esm/codex.js +18 -0
  22. package/dist/esm/codexProfiles.js +8 -11
  23. package/dist/esm/context/sessionContext.js +4 -0
  24. package/dist/esm/formatters/toolSummary.js +4 -1
  25. package/dist/esm/formatting.js +10 -1
  26. package/dist/esm/index.js +11 -6
  27. package/dist/esm/modelCatalog.js +7 -5
  28. package/dist/esm/modelContext.js +4 -3
  29. package/dist/esm/modelInfo.js +425 -47
  30. package/dist/esm/node.js +9 -3
  31. package/dist/esm/observedContextWindows.js +2 -1
  32. package/dist/esm/ownKey.js +26 -0
  33. package/dist/esm/parsers/codexParser.js +351 -54
  34. package/dist/esm/parsers/codexRolloutOrigin.js +107 -0
  35. package/dist/esm/parsers/openCodeParser.js +85 -22
  36. package/dist/esm/parsers/subagentScanner.js +33 -12
  37. package/dist/esm/parsers/subagentTraceParser.js +97 -37
  38. package/dist/esm/pricing.js +18 -0
  39. package/dist/esm/pricingCatalog.js +17 -9
  40. package/dist/esm/promptHistory.js +66 -4
  41. package/dist/esm/providerFailure.js +124 -3
  42. package/dist/esm/providers/claudeCode.js +10 -2
  43. package/dist/esm/providers/codex.js +84 -62
  44. package/dist/esm/providers/codexDatabase.js +3 -19
  45. package/dist/esm/providers/codexRollouts.js +24 -1
  46. package/dist/esm/providers/openCode.js +9 -17
  47. package/dist/esm/report/htmlReportGenerator.js +42 -5
  48. package/dist/esm/report/transcriptParser.js +13 -11
  49. package/dist/esm/schemas/providerFailure.js +3 -1
  50. package/dist/esm/schemas/sessionEvent.js +35 -14
  51. package/dist/esm/schemas/transcript.js +4 -0
  52. package/dist/esm/sessionPromptHistory.js +2 -2
  53. package/dist/esm/statusline/payload.js +9 -0
  54. package/dist/esm/subagentSpawn.js +163 -0
  55. package/dist/esm/testing/credentialGuard.js +87 -5
  56. package/dist/esm/toolCallOrigins.js +310 -0
  57. package/dist/esm/transcript.js +46 -3
  58. package/dist/esm/turns/assistantTurn.js +3 -2
  59. package/dist/esm/usage/claudeUsageDedupe.js +68 -0
  60. package/dist/esm/usage/usageEvents.js +146 -17
  61. package/dist/esm/usage/usageReports.js +39 -6
  62. package/dist/esm/watchers/eventBridge.js +15 -0
  63. package/dist/esm/watchers/factory.js +5 -3
  64. package/dist/esm/watchers/jsonlTail.js +442 -58
  65. package/dist/esm/watchers/jsonlWatcher.js +51 -4
  66. package/dist/esm/watchers/providerReaderWatcher.js +13 -0
  67. package/dist/esm/zaiQuota.js +2 -1
  68. package/dist/formatters/toolSummary.js +4 -1
  69. package/dist/formatting.d.ts +26 -1
  70. package/dist/formatting.js +11 -1
  71. package/dist/index.d.ts +22 -11
  72. package/dist/index.js +44 -12
  73. package/dist/modelCatalog.js +7 -5
  74. package/dist/modelContext.js +4 -3
  75. package/dist/modelInfo.d.ts +185 -16
  76. package/dist/modelInfo.js +434 -49
  77. package/dist/node.d.ts +16 -5
  78. package/dist/node.js +33 -2
  79. package/dist/observedContextWindows.js +2 -1
  80. package/dist/ownKey.d.ts +16 -0
  81. package/dist/ownKey.js +30 -0
  82. package/dist/parsers/codexParser.d.ts +118 -0
  83. package/dist/parsers/codexParser.js +352 -54
  84. package/dist/parsers/codexRolloutOrigin.d.ts +49 -0
  85. package/dist/parsers/codexRolloutOrigin.js +111 -0
  86. package/dist/parsers/openCodeParser.d.ts +38 -0
  87. package/dist/parsers/openCodeParser.js +88 -22
  88. package/dist/parsers/subagentScanner.d.ts +19 -6
  89. package/dist/parsers/subagentScanner.js +33 -12
  90. package/dist/parsers/subagentTraceParser.d.ts +25 -5
  91. package/dist/parsers/subagentTraceParser.js +97 -37
  92. package/dist/pricing.d.ts +22 -0
  93. package/dist/pricing.js +50 -0
  94. package/dist/pricingCatalog.d.ts +10 -0
  95. package/dist/pricingCatalog.js +16 -8
  96. package/dist/promptHistory.d.ts +65 -4
  97. package/dist/promptHistory.js +68 -5
  98. package/dist/providerFailure.d.ts +44 -0
  99. package/dist/providerFailure.js +126 -4
  100. package/dist/providers/claudeCode.js +9 -1
  101. package/dist/providers/codex.d.ts +3 -22
  102. package/dist/providers/codex.js +85 -64
  103. package/dist/providers/codexDatabase.d.ts +3 -2
  104. package/dist/providers/codexDatabase.js +4 -22
  105. package/dist/providers/codexRollouts.d.ts +22 -0
  106. package/dist/providers/codexRollouts.js +24 -0
  107. package/dist/providers/openCode.js +8 -16
  108. package/dist/providers/types.d.ts +14 -0
  109. package/dist/report/htmlReportGenerator.js +42 -5
  110. package/dist/report/transcriptParser.d.ts +10 -1
  111. package/dist/report/transcriptParser.js +13 -11
  112. package/dist/schemas/index.d.ts +1 -0
  113. package/dist/schemas/providerFailure.d.ts +39 -0
  114. package/dist/schemas/providerFailure.js +2 -0
  115. package/dist/schemas/sessionEvent.d.ts +27 -10
  116. package/dist/schemas/sessionEvent.js +35 -14
  117. package/dist/schemas/transcript.d.ts +2 -0
  118. package/dist/schemas/transcript.js +4 -0
  119. package/dist/sessionPromptHistory.d.ts +7 -1
  120. package/dist/sessionPromptHistory.js +1 -1
  121. package/dist/statusline/payload.d.ts +10 -0
  122. package/dist/statusline/payload.js +14 -0
  123. package/dist/subagentSpawn.d.ts +80 -0
  124. package/dist/subagentSpawn.js +174 -0
  125. package/dist/testing/credentialGuard.d.ts +14 -0
  126. package/dist/testing/credentialGuard.js +87 -5
  127. package/dist/toolCallOrigins.d.ts +70 -0
  128. package/dist/toolCallOrigins.js +346 -0
  129. package/dist/transcript.d.ts +12 -0
  130. package/dist/transcript.js +46 -3
  131. package/dist/turns/assistantTurn.d.ts +1 -0
  132. package/dist/turns/assistantTurn.js +3 -2
  133. package/dist/types/opencode.d.ts +2 -0
  134. package/dist/usage/claudeUsageDedupe.d.ts +31 -0
  135. package/dist/usage/claudeUsageDedupe.js +68 -0
  136. package/dist/usage/usageEvents.d.ts +54 -6
  137. package/dist/usage/usageEvents.js +146 -17
  138. package/dist/usage/usageReports.d.ts +35 -4
  139. package/dist/usage/usageReports.js +39 -6
  140. package/dist/watchers/eventBridge.js +15 -0
  141. package/dist/watchers/factory.d.ts +6 -0
  142. package/dist/watchers/factory.js +5 -3
  143. package/dist/watchers/jsonlTail.d.ts +124 -4
  144. package/dist/watchers/jsonlTail.js +446 -59
  145. package/dist/watchers/jsonlWatcher.d.ts +18 -1
  146. package/dist/watchers/jsonlWatcher.js +50 -3
  147. package/dist/watchers/providerReaderWatcher.d.ts +7 -0
  148. package/dist/watchers/providerReaderWatcher.js +13 -0
  149. package/dist/watchers/types.d.ts +12 -0
  150. package/dist/zaiQuota.js +2 -1
  151. package/package.json +41 -1
@@ -9,6 +9,7 @@ const jsonlTail_1 = require("./jsonlTail");
9
9
  const codexParser_1 = require("../parsers/codexParser");
10
10
  const toolSummary_1 = require("../formatters/toolSummary");
11
11
  const claudeUsageDedupe_1 = require("../usage/claudeUsageDedupe");
12
+ const subagentSpawn_1 = require("../subagentSpawn");
12
13
  // ── Normalizers ──
13
14
  /**
14
15
  * Split lines of one Claude response repeat its usage; run the raw usage
@@ -24,7 +25,7 @@ function dedupedClaudeUsage(raw, deduper) {
24
25
  }));
25
26
  return { usage: event.message?.usage, usageKind: event.message?.usageKind };
26
27
  }
27
- function normalizeClaudeCodeEvent(raw, deduper) {
28
+ function normalizeClaudeCodeEvent(raw, deduper, includeTaskNotifications) {
28
29
  const events = [];
29
30
  const ts = raw.timestamp || new Date().toISOString();
30
31
  const permissionMode = raw.permissionMode;
@@ -136,6 +137,19 @@ function normalizeClaudeCodeEvent(raw, deduper) {
136
137
  raw,
137
138
  });
138
139
  }
140
+ else if (includeTaskNotifications) {
141
+ // A task notification that landed mid-turn is only an attachment line.
142
+ const notification = (0, subagentSpawn_1.parseTaskNotification)((0, subagentSpawn_1.taskNotificationPromptFromAttachment)(raw));
143
+ if (notification) {
144
+ events.push({
145
+ providerId: 'claude-code',
146
+ type: 'system',
147
+ timestamp: ts,
148
+ summary: notification.summary ?? `Background task ${notification.status ?? 'finished'}`,
149
+ raw,
150
+ });
151
+ }
152
+ }
139
153
  }
140
154
  // Propagate permission mode to all generated events
141
155
  if (permissionMode) {
@@ -207,16 +221,18 @@ class JsonlSessionWatcher {
207
221
  providerId;
208
222
  sessionPath;
209
223
  callbacks;
224
+ options;
210
225
  tail;
211
226
  startOffset;
212
227
  codexInPlanMode = false;
213
228
  claudeUsageDeduper = new claudeUsageDedupe_1.ClaudeUsageDeduper();
214
229
  /** Last Codex cumulative usage seen; repeated `token_count` events carry the same value. */
215
230
  codexPrevTotal;
216
- constructor(providerId, sessionPath, callbacks) {
231
+ constructor(providerId, sessionPath, callbacks, options = {}) {
217
232
  this.providerId = providerId;
218
233
  this.sessionPath = sessionPath;
219
234
  this.callbacks = callbacks;
235
+ this.options = options;
220
236
  }
221
237
  get isActive() {
222
238
  return this.tail?.isActive ?? false;
@@ -230,6 +246,37 @@ class JsonlSessionWatcher {
230
246
  getPosition() {
231
247
  return this.tail?.getOffset() ?? this.startOffset ?? 0;
232
248
  }
249
+ /**
250
+ * Parse state for {@link getPosition}: for Claude Code, the usage deduper's
251
+ * recent message ids (a `ClaudeUsageDedupeState`); for Codex, the previous
252
+ * cumulative token total and plan mode.
253
+ */
254
+ getResumeState() {
255
+ if (this.providerId === 'codex') {
256
+ return {
257
+ version: 1,
258
+ prevTotalUsage: this.codexPrevTotal ? { ...this.codexPrevTotal } : null,
259
+ inPlanMode: this.codexInPlanMode,
260
+ };
261
+ }
262
+ return this.claudeUsageDeduper.exportState();
263
+ }
264
+ /** Restores state from {@link getResumeState} after `seekTo()` and before `start()`. */
265
+ restoreResumeState(state) {
266
+ if (this.providerId !== 'codex')
267
+ return this.claudeUsageDeduper.importState(state);
268
+ if (!state || typeof state !== 'object')
269
+ return false;
270
+ const { version, prevTotalUsage, inPlanMode } = state;
271
+ if (version !== 1 || typeof inPlanMode !== 'boolean')
272
+ return false;
273
+ const total = (0, codexParser_1.codexTokenUsageFrom)(prevTotalUsage);
274
+ if (total === undefined)
275
+ return false;
276
+ this.codexPrevTotal = total ?? undefined;
277
+ this.codexInPlanMode = inPlanMode;
278
+ return true;
279
+ }
233
280
  start(replay) {
234
281
  if (this.isActive)
235
282
  return;
@@ -261,7 +308,7 @@ class JsonlSessionWatcher {
261
308
  // JsonlParser parses any JSON object. Cast to Record for codex normalizer.
262
309
  const followEvents = this.providerId === 'codex'
263
310
  ? this.normalizeCodexEvent(event)
264
- : normalizeClaudeCodeEvent(event, this.claudeUsageDeduper);
311
+ : normalizeClaudeCodeEvent(event, this.claudeUsageDeduper, this.options.includeTaskNotifications === true);
265
312
  for (const fe of followEvents) {
266
313
  this.callbacks.onEvent(fe);
267
314
  }
@@ -19,6 +19,13 @@ export declare class ProviderReaderSessionWatcher implements SessionWatcher {
19
19
  get isActive(): boolean;
20
20
  seekTo(position: number): void;
21
21
  getPosition(): number;
22
+ /** The reader's resume state, if it keeps any. */
23
+ getResumeState(): unknown;
24
+ /**
25
+ * Restores the reader's resume state after `seekTo()`. A reader that keeps
26
+ * none accepts only `undefined`.
27
+ */
28
+ restoreResumeState(state: unknown): boolean;
22
29
  start(replay: boolean): void;
23
30
  stop(): void;
24
31
  private seekToEnd;
@@ -68,6 +68,19 @@ class ProviderReaderSessionWatcher {
68
68
  getPosition() {
69
69
  return this.reader.getPosition();
70
70
  }
71
+ /** The reader's resume state, if it keeps any. */
72
+ getResumeState() {
73
+ return this.reader.getResumeState?.();
74
+ }
75
+ /**
76
+ * Restores the reader's resume state after `seekTo()`. A reader that keeps
77
+ * none accepts only `undefined`.
78
+ */
79
+ restoreResumeState(state) {
80
+ if (!this.reader.restoreResumeState)
81
+ return state === undefined;
82
+ return this.reader.restoreResumeState(state);
83
+ }
71
84
  start(replay) {
72
85
  if (this._isActive)
73
86
  return;
@@ -70,6 +70,18 @@ export interface SessionWatcher {
70
70
  seekTo?(position: number): void;
71
71
  /** Get current reader position (byte offset or timestamp). */
72
72
  getPosition?(): number;
73
+ /**
74
+ * Parse state to persist with `getPosition()` so a later watcher can
75
+ * resume there without recounting (see `SessionReader.getResumeState`).
76
+ * `undefined` when the watcher keeps none.
77
+ */
78
+ getResumeState?(): unknown;
79
+ /**
80
+ * Restores state from `getResumeState()` right after `seekTo()` and before
81
+ * `start()`. Returns false, changing nothing, when `state` is missing or
82
+ * not valid; replay from the start instead.
83
+ */
84
+ restoreResumeState?(state: unknown): boolean;
73
85
  }
74
86
  export interface CreateWatcherOptions {
75
87
  providerId: ProviderId;
package/dist/zaiQuota.js CHANGED
@@ -10,6 +10,7 @@ exports.parseZaiQuotaError = parseZaiQuotaError;
10
10
  exports.extractNextFlushTime = extractNextFlushTime;
11
11
  exports.makeUnavailableZaiQuotaState = makeUnavailableZaiQuotaState;
12
12
  exports.rowsToZaiTurnsAndErrors = rowsToZaiTurnsAndErrors;
13
+ const ownKey_1 = require("./ownKey");
13
14
  // ── Tier budgets ──
14
15
  /**
15
16
  * Published z.ai coding-plan prompt budgets.
@@ -227,7 +228,7 @@ function parseZaiQuotaError(error) {
227
228
  if (!error)
228
229
  return null;
229
230
  const code = String(error.code ?? '');
230
- const kind = ZAI_ERROR_CODES[code];
231
+ const kind = (0, ownKey_1.ownValue)(ZAI_ERROR_CODES, code);
231
232
  if (!kind)
232
233
  return null;
233
234
  const message = error.message ?? '';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sidekick-shared",
3
- "version": "0.28.3",
3
+ "version": "0.29.1",
4
4
  "description": "Shared data access layer for Sidekick — readers, types, providers, credentials, quota",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -103,6 +103,34 @@
103
103
  "require": "./dist/testing/index.js",
104
104
  "default": "./dist/testing/index.js"
105
105
  },
106
+ "./pricing": {
107
+ "types": "./dist/pricing.d.ts",
108
+ "module": "./dist/esm/pricing.js",
109
+ "import": "./dist/pricing.js",
110
+ "require": "./dist/pricing.js",
111
+ "default": "./dist/pricing.js"
112
+ },
113
+ "./codex": {
114
+ "types": "./dist/codex.d.ts",
115
+ "module": "./dist/esm/codex.js",
116
+ "import": "./dist/codex.js",
117
+ "require": "./dist/codex.js",
118
+ "default": "./dist/codex.js"
119
+ },
120
+ "./providerFailure": {
121
+ "types": "./dist/providerFailure.d.ts",
122
+ "module": "./dist/esm/providerFailure.js",
123
+ "import": "./dist/providerFailure.js",
124
+ "require": "./dist/providerFailure.js",
125
+ "default": "./dist/providerFailure.js"
126
+ },
127
+ "./statusline/payload": {
128
+ "types": "./dist/statusline/payload.d.ts",
129
+ "module": "./dist/esm/statusline/payload.js",
130
+ "import": "./dist/statusline/payload.js",
131
+ "require": "./dist/statusline/payload.js",
132
+ "default": "./dist/statusline/payload.js"
133
+ },
106
134
  "./dist/esm/*": null,
107
135
  "./dist/*": {
108
136
  "types": "./dist/*.d.ts",
@@ -140,6 +168,18 @@
140
168
  ],
141
169
  "testing": [
142
170
  "dist/testing/index.d.ts"
171
+ ],
172
+ "pricing": [
173
+ "dist/pricing.d.ts"
174
+ ],
175
+ "codex": [
176
+ "dist/codex.d.ts"
177
+ ],
178
+ "providerFailure": [
179
+ "dist/providerFailure.d.ts"
180
+ ],
181
+ "statusline/payload": [
182
+ "dist/statusline/payload.d.ts"
143
183
  ]
144
184
  }
145
185
  },