sidekick-shared 0.19.2 → 0.19.3

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/README.md CHANGED
@@ -27,7 +27,7 @@ npm install sidekick-shared
27
27
  | **Search** | Cross-session full-text search, advanced filtering (substring, fuzzy, regex, date) |
28
28
  | **Aggregation** | Event aggregation, frequency tracking, activity heatmaps, pattern extraction |
29
29
  | **Session Context** | Provider-neutral context evidence snapshots (`buildSessionContextSnapshot()`, `calculateSessionContextPressure()`, `createSessionContextProjector()`, `readSessionContextSnapshot()`): layered evidence sources, low/medium/high context pressure, and observed capabilities (tools, MCP servers, permission mode, rate limits) |
30
- | **Assistant Turns** | Browser-safe process/answer projection for provider-normalized assistant turns (`segmentAssistantTurn()`, `assistantTurnEventsFromSessionEvents()`), including reasoning blocks, compact tool groups, and Claude `Task` subagent refs without prompt leakage |
30
+ | **Assistant Turns** | Browser-safe timeline/process/answer projection for provider-normalized assistant turns (`segmentAssistantTurn()`, `assistantTurnEventsFromSessionEvents()`), including interleaved reasoning, compact tool groups, and Claude `Task` subagent refs without prompt leakage |
31
31
  | **Report** | Self-contained HTML session report generation |
32
32
  | **Credentials** | Claude Max OAuth credential reading from `~/.claude/.credentials.json` |
33
33
  | **Quota** | Claude Max subscription quota fetching (5-hour and 7-day windows) and Codex rate-limit extraction from event streams |
@@ -204,9 +204,9 @@ if (provider) {
204
204
 
205
205
  Use `createSessionContextProjector()` for incremental updates as new events stream in, or `calculateSessionContextPressure(contextTokens, contextWindow)` for the pressure band alone.
206
206
 
207
- ### Project an assistant turn into Process + Answer
207
+ ### Project an assistant turn into Timeline + Process + Answer
208
208
 
209
- Build a compact UI-safe projection from provider-normalized turn events. The final contiguous text run becomes `answer`; earlier narration, tools, and reasoning stay in `process` / `reasoningBlocks`.
209
+ Build a compact UI-safe projection from provider-normalized turn events. The final contiguous text run becomes `answer`; earlier narration, tools, and reasoning stay in `process` / `reasoningBlocks`, and `timeline` preserves their interleaved arrival order for rendering.
210
210
 
211
211
  ```typescript
212
212
  import {
@@ -217,6 +217,7 @@ import {
217
217
  const projection = segmentAssistantTurn(assistantTurnEventsFromSessionEvents(sessionEvents));
218
218
 
219
219
  console.log(projection.answer);
220
+ console.log(projection.timeline);
220
221
  console.log(projection.process.steps);
221
222
  console.log(projection.subagents); // Claude Task spawns, prompt text omitted
222
223
  ```
package/dist/browser.d.ts CHANGED
@@ -13,6 +13,6 @@ export type { FormatDurationMsOptions, FormatTokenCountOptions } from './formatt
13
13
  export { buildSessionContextSnapshot, calculateSessionContextPressure, createSessionContextProjector, } from './context/sessionContext';
14
14
  export type { BuildSessionContextSnapshotOptions, SessionContextCapabilities, SessionContextLayerBreakdown, SessionContextPressure, SessionContextProjector, SessionContextSnapshot, SessionContextSource, SessionContextSourceType, } from './context/sessionContext';
15
15
  export { assistantTurnEventsFromSessionEvents, extractTurnSubagents, isAssistantTurnSubagentTool, reasoningSummary, segmentAssistantTurn, } from './turns/assistantTurn';
16
- export type { AssistantTurnEvent, AssistantTurnEventType, AssistantTurnProcess, AssistantTurnProcessStep, AssistantTurnProjection, AssistantTurnSubagent, AssistantTurnSubagentStatus, AssistantTurnToolRef, ExtractTurnSubagentsOptions, ReasoningSummary, SegmentAssistantTurnOptions, } from './turns/assistantTurn';
16
+ export type { AssistantTurnEvent, AssistantTurnEventType, AssistantTurnProcess, AssistantTurnProcessStep, AssistantTurnProjection, AssistantTurnSubagent, AssistantTurnSubagentStatus, AssistantTurnTimelineItem, AssistantTurnToolRef, ExtractTurnSubagentsOptions, ReasoningSummary, SegmentAssistantTurnOptions, } from './turns/assistantTurn';
17
17
  export { parseModelId, getModelPricing, getModelInfo, calculateCost, calculateCostWithPricing, calculateCostWithProvenance, mergeCostSources, shortModelName, getModelDisplayInfo, compareModelIds, sortModelIds, formatCost, } from './modelInfo';
18
18
  export type { ModelPricing, CostTokenUsage, CostSource, CostProvenanceInput, CostWithProvenance, ModelProvider, ParsedModelId, ModelInfo, ModelDisplayInfo, } from './modelInfo';
package/dist/index.d.ts CHANGED
@@ -53,7 +53,7 @@ export type { Fidelity, ContextResult } from './context/composer';
53
53
  export { buildSessionContextSnapshot, calculateSessionContextPressure, createSessionContextProjector, readSessionContextSnapshot, } from './context/sessionContext';
54
54
  export type { BuildSessionContextSnapshotOptions, ReadSessionContextSnapshotOptions, SessionContextCapabilities, SessionContextLayerBreakdown, SessionContextPressure, SessionContextProjector, SessionContextSnapshot, SessionContextSource, SessionContextSourceType, } from './context/sessionContext';
55
55
  export { assistantTurnEventsFromSessionEvents, extractTurnSubagents, isAssistantTurnSubagentTool, reasoningSummary, segmentAssistantTurn, } from './turns/assistantTurn';
56
- export type { AssistantTurnEvent, AssistantTurnEventType, AssistantTurnProcess, AssistantTurnProcessStep, AssistantTurnProjection, AssistantTurnSubagent, AssistantTurnSubagentStatus, AssistantTurnToolRef, ExtractTurnSubagentsOptions, ReasoningSummary, SegmentAssistantTurnOptions, } from './turns/assistantTurn';
56
+ export type { AssistantTurnEvent, AssistantTurnEventType, AssistantTurnProcess, AssistantTurnProcessStep, AssistantTurnProjection, AssistantTurnSubagent, AssistantTurnSubagentStatus, AssistantTurnTimelineItem, AssistantTurnToolRef, ExtractTurnSubagentsOptions, ReasoningSummary, SegmentAssistantTurnOptions, } from './turns/assistantTurn';
57
57
  export { PlanExtractor, parsePlanMarkdown as parsePlanMarkdownShared, extractProposedPlan as extractProposedPlanShared } from './parsers/planExtractor';
58
58
  export type { ExtractedPlan, ExtractedPlanStep } from './parsers/planExtractor';
59
59
  export { parseChangelog } from './parsers/changelogParser';
@@ -128,7 +128,7 @@ export { messageUsageSchema, sessionMessageSchema, sessionEventSchema, permissio
128
128
  export { quotaWindowSchema, quotaStateSchema, quotaFailureKindSchema, quotaProviderIdSchema, quotaSourceSchema, peakHoursStateSchema, quotaFailureDescriptorSchema, runtimeQuotaProviderSchema, providerQuotaStateSchema, claudeProviderQuotaStateSchema, codexProviderQuotaStateSchema, providerQuotaMapSchema, } from './schemas/quota';
129
129
  export { quotaHistoryRuntimeProviderSchema, quotaHistorySampleSchema, quotaHistoryDailyBucketSchema, } from './schemas/quotaHistory';
130
130
  export { activeProviderAccountStatusSchema, activeAccountStatusSchema, } from './schemas/accountStatus';
131
- export { assistantTurnEventSchema, assistantTurnEventTypeSchema, assistantTurnNarrationStepSchema, assistantTurnProcessSchema, assistantTurnProcessStepSchema, assistantTurnProjectionSchema, assistantTurnSubagentSchema, assistantTurnSubagentStatusSchema, assistantTurnToolGroupStepSchema, assistantTurnToolRefSchema, } from './schemas/assistantTurn';
131
+ export { assistantTurnEventSchema, assistantTurnEventTypeSchema, assistantTurnNarrationStepSchema, assistantTurnProcessSchema, assistantTurnProcessStepSchema, assistantTurnProjectionSchema, assistantTurnReasoningTimelineItemSchema, assistantTurnSubagentSchema, assistantTurnSubagentStatusSchema, assistantTurnTimelineItemSchema, assistantTurnToolGroupStepSchema, assistantTurnToolRefSchema, } from './schemas/assistantTurn';
132
132
  export { fetchProviderStatus, fetchOpenAIStatus } from './providerStatus';
133
133
  export type { ProviderStatusState } from './providerStatus';
134
134
  export { createPeakHoursNotApplicableState, fetchPeakHoursStatus, isClaudeCodeSessionProvider, scopePeakHoursToSessionProvider, } from './peakHours';
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.get
7
7
  exports.clearHighlightCache = exports.highlightEvent = exports.formatSessionJson = exports.formatSessionMarkdown = exports.formatSessionText = exports.classifyNoise = exports.shouldMergeWithPrevious = exports.classifyFollowEvent = exports.classifyMessage = exports.getSoftNoiseReason = exports.isHardNoiseFollowEvent = exports.isHardNoise = exports.formatToolSummary = exports.formatTokenCount = exports.formatDurationMs = exports.createJsonlTail = exports.toFollowEvents = exports.createWatcher = exports.parseChangelog = exports.extractProposedPlanShared = exports.parsePlanMarkdownShared = exports.PlanExtractor = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.readSessionContextSnapshot = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.composeContext = exports.FilterEngine = exports.searchSessions = exports.CodexDatabase = exports.OpenCodeDatabase = exports.discoverDebugLogs = exports.collapseDuplicates = exports.filterByLevel = exports.parseDebugLog = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionsInDirectory = exports.findAllClaudeSessions = void 0;
8
8
  exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.getActiveCodexAccount = exports.listCodexAccounts = exports.getSystemCodexHome = exports.getCodexMonitoringHomes = exports.getCodexProfileHome = exports.getCodexProfilesDir = exports.getActiveAccountStatus = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = exports.upsertSavedAccountProfile = exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.isMultiAccountEnabled = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.PHRASE_CATEGORIES = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = void 0;
9
9
  exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = exports.extractToolCalls = exports.extractToolCall = exports.extractTokenUsage = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.formatCost = exports.sortModelIds = exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = exports.MultiProviderQuotaService = exports.CodexQuotaWatcher = exports.resolveCodexQuotaFromLocalSources = exports.resolveCodexQuota = exports.readLatestCodexQuotaFromRollouts = exports.quotaFromCodexRateLimits = exports.fetchCodexQuotaFromApi = exports.getWorkspaceIdFromPath = exports.pruneQuotaHistory = exports.readQuotaHistoryDailyBuckets = exports.readQuotaHistoryRange = exports.appendQuotaHistorySample = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = exports.fetchQuota = exports.removeCodexAccount = exports.switchToCodexAccount = exports.finalizeCodexAccount = exports.prepareCodexAccount = void 0;
10
- exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaSourceSchema = void 0;
10
+ exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaSourceSchema = void 0;
11
11
  var taskPersistence_1 = require("./types/taskPersistence");
12
12
  Object.defineProperty(exports, "TASK_PERSISTENCE_SCHEMA_VERSION", { enumerable: true, get: function () { return taskPersistence_1.TASK_PERSISTENCE_SCHEMA_VERSION; } });
13
13
  Object.defineProperty(exports, "normalizeTaskStatus", { enumerable: true, get: function () { return taskPersistence_1.normalizeTaskStatus; } });
@@ -334,8 +334,10 @@ Object.defineProperty(exports, "assistantTurnNarrationStepSchema", { enumerable:
334
334
  Object.defineProperty(exports, "assistantTurnProcessSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnProcessSchema; } });
335
335
  Object.defineProperty(exports, "assistantTurnProcessStepSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnProcessStepSchema; } });
336
336
  Object.defineProperty(exports, "assistantTurnProjectionSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnProjectionSchema; } });
337
+ Object.defineProperty(exports, "assistantTurnReasoningTimelineItemSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnReasoningTimelineItemSchema; } });
337
338
  Object.defineProperty(exports, "assistantTurnSubagentSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnSubagentSchema; } });
338
339
  Object.defineProperty(exports, "assistantTurnSubagentStatusSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnSubagentStatusSchema; } });
340
+ Object.defineProperty(exports, "assistantTurnTimelineItemSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnTimelineItemSchema; } });
339
341
  Object.defineProperty(exports, "assistantTurnToolGroupStepSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnToolGroupStepSchema; } });
340
342
  Object.defineProperty(exports, "assistantTurnToolRefSchema", { enumerable: true, get: function () { return assistantTurn_2.assistantTurnToolRefSchema; } });
341
343
  // Provider Status
@@ -64,6 +64,24 @@ export declare const assistantTurnProcessStepSchema: z.ZodDiscriminatedUnion<[z.
64
64
  toolUseId: z.ZodOptional<z.ZodString>;
65
65
  }, z.core.$strip>>;
66
66
  }, z.core.$strip>], "kind">;
67
+ export declare const assistantTurnReasoningTimelineItemSchema: z.ZodObject<{
68
+ kind: z.ZodLiteral<"reasoning">;
69
+ text: z.ZodString;
70
+ }, z.core.$strip>;
71
+ export declare const assistantTurnTimelineItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
72
+ kind: z.ZodLiteral<"reasoning">;
73
+ text: z.ZodString;
74
+ }, z.core.$strip>, z.ZodObject<{
75
+ kind: z.ZodLiteral<"narration">;
76
+ text: z.ZodString;
77
+ }, z.core.$strip>, z.ZodObject<{
78
+ kind: z.ZodLiteral<"toolGroup">;
79
+ tools: z.ZodArray<z.ZodObject<{
80
+ toolName: z.ZodString;
81
+ toolInput: z.ZodOptional<z.ZodString>;
82
+ toolUseId: z.ZodOptional<z.ZodString>;
83
+ }, z.core.$strip>>;
84
+ }, z.core.$strip>], "kind">;
67
85
  export declare const assistantTurnProcessSchema: z.ZodObject<{
68
86
  steps: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
69
87
  kind: z.ZodLiteral<"narration">;
@@ -93,7 +111,7 @@ export declare const assistantTurnSubagentSchema: z.ZodObject<{
93
111
  }>;
94
112
  }, z.core.$strip>;
95
113
  export declare const assistantTurnProjectionSchema: z.ZodObject<{
96
- schemaVersion: z.ZodLiteral<1>;
114
+ schemaVersion: z.ZodLiteral<2>;
97
115
  answer: z.ZodString;
98
116
  reasoning: z.ZodString;
99
117
  reasoningBlocks: z.ZodArray<z.ZodString>;
@@ -110,6 +128,20 @@ export declare const assistantTurnProjectionSchema: z.ZodObject<{
110
128
  }, z.core.$strip>>;
111
129
  }, z.core.$strip>], "kind">>;
112
130
  }, z.core.$strip>;
131
+ timeline: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
132
+ kind: z.ZodLiteral<"reasoning">;
133
+ text: z.ZodString;
134
+ }, z.core.$strip>, z.ZodObject<{
135
+ kind: z.ZodLiteral<"narration">;
136
+ text: z.ZodString;
137
+ }, z.core.$strip>, z.ZodObject<{
138
+ kind: z.ZodLiteral<"toolGroup">;
139
+ tools: z.ZodArray<z.ZodObject<{
140
+ toolName: z.ZodString;
141
+ toolInput: z.ZodOptional<z.ZodString>;
142
+ toolUseId: z.ZodOptional<z.ZodString>;
143
+ }, z.core.$strip>>;
144
+ }, z.core.$strip>], "kind">>;
113
145
  subagents: z.ZodArray<z.ZodObject<{
114
146
  id: z.ZodString;
115
147
  label: z.ZodString;
@@ -6,7 +6,7 @@
6
6
  * process/answer shape used at UI and IPC boundaries.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.assistantTurnProjectionSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnProcessSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnToolRefSchema = exports.assistantTurnEventSchema = exports.assistantTurnEventTypeSchema = void 0;
9
+ exports.assistantTurnProjectionSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnProcessSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnToolRefSchema = exports.assistantTurnEventSchema = exports.assistantTurnEventTypeSchema = void 0;
10
10
  const zod_1 = require("zod");
11
11
  exports.assistantTurnEventTypeSchema = zod_1.z.enum([
12
12
  'text',
@@ -43,6 +43,15 @@ exports.assistantTurnProcessStepSchema = zod_1.z.discriminatedUnion('kind', [
43
43
  exports.assistantTurnNarrationStepSchema,
44
44
  exports.assistantTurnToolGroupStepSchema,
45
45
  ]);
46
+ exports.assistantTurnReasoningTimelineItemSchema = zod_1.z.object({
47
+ kind: zod_1.z.literal('reasoning'),
48
+ text: zod_1.z.string(),
49
+ });
50
+ exports.assistantTurnTimelineItemSchema = zod_1.z.discriminatedUnion('kind', [
51
+ exports.assistantTurnReasoningTimelineItemSchema,
52
+ exports.assistantTurnNarrationStepSchema,
53
+ exports.assistantTurnToolGroupStepSchema,
54
+ ]);
46
55
  exports.assistantTurnProcessSchema = zod_1.z.object({
47
56
  steps: zod_1.z.array(exports.assistantTurnProcessStepSchema),
48
57
  });
@@ -58,10 +67,11 @@ exports.assistantTurnSubagentSchema = zod_1.z.object({
58
67
  status: exports.assistantTurnSubagentStatusSchema,
59
68
  });
60
69
  exports.assistantTurnProjectionSchema = zod_1.z.object({
61
- schemaVersion: zod_1.z.literal(1),
70
+ schemaVersion: zod_1.z.literal(2),
62
71
  answer: zod_1.z.string(),
63
72
  reasoning: zod_1.z.string(),
64
73
  reasoningBlocks: zod_1.z.array(zod_1.z.string()),
65
74
  process: exports.assistantTurnProcessSchema,
75
+ timeline: zod_1.z.array(exports.assistantTurnTimelineItemSchema),
66
76
  subagents: zod_1.z.array(exports.assistantTurnSubagentSchema),
67
77
  });
@@ -21,5 +21,5 @@ export { quotaHistoryRuntimeProviderSchema, quotaHistorySampleSchema, quotaHisto
21
21
  export type { QuotaHistoryRuntimeProvider, QuotaHistorySample, QuotaHistoryDailyBucket, } from '../quotaHistory';
22
22
  export { activeProviderAccountStatusSchema, activeAccountStatusSchema, } from './accountStatus';
23
23
  export type { ActiveProviderAccountStatus, ActiveAccountStatus, } from '../accountStatus';
24
- export { assistantTurnEventSchema, assistantTurnEventTypeSchema, assistantTurnNarrationStepSchema, assistantTurnProcessSchema, assistantTurnProcessStepSchema, assistantTurnProjectionSchema, assistantTurnSubagentSchema, assistantTurnSubagentStatusSchema, assistantTurnToolGroupStepSchema, assistantTurnToolRefSchema, } from './assistantTurn';
25
- export type { AssistantTurnEvent, AssistantTurnEventType, AssistantTurnProcess, AssistantTurnProcessStep, AssistantTurnProjection, AssistantTurnSubagent, AssistantTurnSubagentStatus, AssistantTurnToolRef, } from '../turns/assistantTurn';
24
+ export { assistantTurnEventSchema, assistantTurnEventTypeSchema, assistantTurnNarrationStepSchema, assistantTurnProcessSchema, assistantTurnProcessStepSchema, assistantTurnProjectionSchema, assistantTurnReasoningTimelineItemSchema, assistantTurnSubagentSchema, assistantTurnSubagentStatusSchema, assistantTurnTimelineItemSchema, assistantTurnToolGroupStepSchema, assistantTurnToolRefSchema, } from './assistantTurn';
25
+ export type { AssistantTurnEvent, AssistantTurnEventType, AssistantTurnProcess, AssistantTurnProcessStep, AssistantTurnProjection, AssistantTurnSubagent, AssistantTurnSubagentStatus, AssistantTurnTimelineItem, AssistantTurnToolRef, } from '../turns/assistantTurn';
@@ -12,7 +12,7 @@
12
12
  * subpath is self-sufficient for boundary-validation modules.
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = void 0;
15
+ exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = void 0;
16
16
  var sessionEvent_1 = require("./sessionEvent");
17
17
  Object.defineProperty(exports, "messageUsageSchema", { enumerable: true, get: function () { return sessionEvent_1.messageUsageSchema; } });
18
18
  Object.defineProperty(exports, "sessionMessageSchema", { enumerable: true, get: function () { return sessionEvent_1.sessionMessageSchema; } });
@@ -46,7 +46,9 @@ Object.defineProperty(exports, "assistantTurnNarrationStepSchema", { enumerable:
46
46
  Object.defineProperty(exports, "assistantTurnProcessSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnProcessSchema; } });
47
47
  Object.defineProperty(exports, "assistantTurnProcessStepSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnProcessStepSchema; } });
48
48
  Object.defineProperty(exports, "assistantTurnProjectionSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnProjectionSchema; } });
49
+ Object.defineProperty(exports, "assistantTurnReasoningTimelineItemSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnReasoningTimelineItemSchema; } });
49
50
  Object.defineProperty(exports, "assistantTurnSubagentSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnSubagentSchema; } });
50
51
  Object.defineProperty(exports, "assistantTurnSubagentStatusSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnSubagentStatusSchema; } });
52
+ Object.defineProperty(exports, "assistantTurnTimelineItemSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnTimelineItemSchema; } });
51
53
  Object.defineProperty(exports, "assistantTurnToolGroupStepSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnToolGroupStepSchema; } });
52
54
  Object.defineProperty(exports, "assistantTurnToolRefSchema", { enumerable: true, get: function () { return assistantTurn_1.assistantTurnToolRefSchema; } });
@@ -20,6 +20,16 @@ export type AssistantTurnProcessStep = {
20
20
  kind: 'toolGroup';
21
21
  tools: AssistantTurnToolRef[];
22
22
  };
23
+ export type AssistantTurnTimelineItem = {
24
+ kind: 'reasoning';
25
+ text: string;
26
+ } | {
27
+ kind: 'narration';
28
+ text: string;
29
+ } | {
30
+ kind: 'toolGroup';
31
+ tools: AssistantTurnToolRef[];
32
+ };
23
33
  export interface AssistantTurnProcess {
24
34
  steps: AssistantTurnProcessStep[];
25
35
  }
@@ -31,11 +41,12 @@ export interface AssistantTurnSubagent {
31
41
  status: AssistantTurnSubagentStatus;
32
42
  }
33
43
  export interface AssistantTurnProjection {
34
- schemaVersion: 1;
44
+ schemaVersion: 2;
35
45
  answer: string;
36
46
  reasoning: string;
37
47
  reasoningBlocks: string[];
38
48
  process: AssistantTurnProcess;
49
+ timeline: AssistantTurnTimelineItem[];
39
50
  subagents: AssistantTurnSubagent[];
40
51
  }
41
52
  export interface SegmentAssistantTurnOptions {
@@ -40,18 +40,24 @@ function segmentAssistantTurn(events, options = {}) {
40
40
  const subagentStatus = options.subagentStatus ?? 'completed';
41
41
  const reasoningParts = [];
42
42
  const steps = [];
43
+ const timelineItems = [];
43
44
  let textBuffer = [];
44
45
  let toolGroup = null;
45
46
  function closeToolGroup() {
46
47
  if (toolGroup != null && toolGroup.tools.length > 0) {
48
+ const processStepIndex = steps.length;
47
49
  steps.push(toolGroup);
50
+ timelineItems.push({ kind: 'toolGroup', tools: toolGroup.tools, processStepIndex });
48
51
  }
49
52
  toolGroup = null;
50
53
  }
51
54
  function sealTextAsNarration() {
52
55
  const text = joinText(textBuffer);
53
56
  if (text !== '') {
54
- steps.push({ kind: 'narration', text: capText(text, maxNarrationChars) });
57
+ const processStepIndex = steps.length;
58
+ const step = { kind: 'narration', text: capText(text, maxNarrationChars) };
59
+ steps.push(step);
60
+ timelineItems.push({ kind: 'narration', text: step.text, processStepIndex });
55
61
  }
56
62
  textBuffer = [];
57
63
  }
@@ -69,7 +75,13 @@ function segmentAssistantTurn(events, options = {}) {
69
75
  break;
70
76
  sealTextAsNarration();
71
77
  closeToolGroup();
78
+ const reasoningIndex = reasoningParts.length;
72
79
  reasoningParts.push(event.content);
80
+ timelineItems.push({
81
+ kind: 'reasoning',
82
+ text: capText(event.content, maxReasoningChars),
83
+ reasoningIndex,
84
+ });
73
85
  break;
74
86
  }
75
87
  case 'tool_use': {
@@ -92,16 +104,16 @@ function segmentAssistantTurn(events, options = {}) {
92
104
  }
93
105
  const answer = joinText(textBuffer);
94
106
  closeToolGroup();
95
- const reasoningBlocks = capReasoningBlocks(reasoningParts
96
- .filter((part) => part.trim() !== '')
97
- .map((part) => capText(part, maxReasoningChars)), maxReasoningBlocks);
98
- const process = { steps: capProcessSteps(steps, maxProcessSteps) };
107
+ const cappedReasoning = capReasoningBlocks(reasoningParts.map((part) => capText(part, maxReasoningChars)), maxReasoningBlocks);
108
+ const cappedProcess = capProcessSteps(steps, maxProcessSteps);
109
+ const process = { steps: cappedProcess.steps };
99
110
  return {
100
- schemaVersion: 1,
111
+ schemaVersion: 2,
101
112
  answer,
102
113
  reasoning: capText(joinText(reasoningParts), maxReasoningChars),
103
- reasoningBlocks,
114
+ reasoningBlocks: cappedReasoning.blocks,
104
115
  process,
116
+ timeline: capTimelineItems(timelineItems, cappedReasoning, cappedProcess),
105
117
  subagents: extractTurnSubagents(flattenProcessTools(process), { status: subagentStatus }),
106
118
  };
107
119
  }
@@ -235,24 +247,74 @@ function flattenProcessTools(process) {
235
247
  return result;
236
248
  }
237
249
  function capProcessSteps(steps, maxRetainedSteps) {
250
+ const retainedIndexes = new Set();
238
251
  if (!Number.isFinite(maxRetainedSteps) || maxRetainedSteps < 0)
239
- return [];
252
+ return { steps: [], retainedIndexes };
240
253
  const retainedCount = Math.floor(maxRetainedSteps);
241
- if (steps.length <= retainedCount)
242
- return steps;
243
- const kept = retainedCount > 0 ? steps.slice(steps.length - retainedCount) : [];
254
+ if (steps.length <= retainedCount) {
255
+ steps.forEach((_step, index) => retainedIndexes.add(index));
256
+ return { steps, retainedIndexes };
257
+ }
258
+ const firstKeptIndex = Math.max(steps.length - retainedCount, 0);
259
+ const kept = retainedCount > 0 ? steps.slice(firstKeptIndex) : [];
260
+ for (let index = firstKeptIndex; index < steps.length; index += 1) {
261
+ retainedIndexes.add(index);
262
+ }
244
263
  const omitted = steps.length - kept.length;
245
- return [{ kind: 'narration', text: `... ${omitted} earlier process step${omitted === 1 ? '' : 's'} omitted` }, ...kept];
264
+ const omittedMarker = `... ${omitted} earlier process step${omitted === 1 ? '' : 's'} omitted`;
265
+ return { steps: [{ kind: 'narration', text: omittedMarker }, ...kept], retainedIndexes, omittedMarker };
246
266
  }
247
267
  function capReasoningBlocks(blocks, maxRetainedBlocks) {
268
+ const retainedIndexes = new Set();
248
269
  if (!Number.isFinite(maxRetainedBlocks) || maxRetainedBlocks < 0)
249
- return [];
270
+ return { blocks: [], retainedIndexes };
250
271
  const retainedCount = Math.floor(maxRetainedBlocks);
251
- if (blocks.length <= retainedCount)
252
- return blocks;
272
+ if (blocks.length <= retainedCount) {
273
+ blocks.forEach((_block, index) => retainedIndexes.add(index));
274
+ return { blocks, retainedIndexes };
275
+ }
253
276
  const kept = retainedCount > 0 ? blocks.slice(0, retainedCount) : [];
277
+ for (let index = 0; index < kept.length; index += 1) {
278
+ retainedIndexes.add(index);
279
+ }
254
280
  const omitted = blocks.length - kept.length;
255
- return [...kept, `... ${omitted} more reasoning block${omitted === 1 ? '' : 's'} omitted`];
281
+ const omittedMarker = `... ${omitted} more reasoning block${omitted === 1 ? '' : 's'} omitted`;
282
+ return { blocks: [...kept, omittedMarker], retainedIndexes, omittedMarker };
283
+ }
284
+ function capTimelineItems(items, reasoning, process) {
285
+ const result = [];
286
+ let insertedReasoningOmission = false;
287
+ let insertedProcessOmission = false;
288
+ for (const item of items) {
289
+ if (item.kind === 'reasoning') {
290
+ if (reasoning.retainedIndexes.has(item.reasoningIndex)) {
291
+ result.push({ kind: 'reasoning', text: item.text });
292
+ }
293
+ else if (reasoning.omittedMarker != null && !insertedReasoningOmission) {
294
+ result.push({ kind: 'reasoning', text: reasoning.omittedMarker });
295
+ insertedReasoningOmission = true;
296
+ }
297
+ continue;
298
+ }
299
+ if (!process.retainedIndexes.has(item.processStepIndex)) {
300
+ if (process.omittedMarker != null && !insertedProcessOmission) {
301
+ result.push({ kind: 'narration', text: process.omittedMarker });
302
+ insertedProcessOmission = true;
303
+ }
304
+ continue;
305
+ }
306
+ if (process.omittedMarker != null && !insertedProcessOmission) {
307
+ result.push({ kind: 'narration', text: process.omittedMarker });
308
+ insertedProcessOmission = true;
309
+ }
310
+ if (item.kind === 'narration') {
311
+ result.push({ kind: 'narration', text: item.text });
312
+ }
313
+ else {
314
+ result.push({ kind: 'toolGroup', tools: item.tools });
315
+ }
316
+ }
317
+ return result;
256
318
  }
257
319
  function parseSubagentInput(input) {
258
320
  const record = coerceRecord(input);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sidekick-shared",
3
- "version": "0.19.2",
3
+ "version": "0.19.3",
4
4
  "description": "Shared data access layer for Sidekick — readers, types, providers, credentials, quota",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",