@basou/core 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -678,6 +678,7 @@ type BasouPaths = {
678
678
  readonly status: string;
679
679
  readonly handoff: string;
680
680
  readonly decisions: string;
681
+ readonly orientation: string;
681
682
  };
682
683
  };
683
684
  /**
@@ -2031,6 +2032,29 @@ type GitSnapshot = Omit<GitSnapshotEvent, "schema_version" | "id" | "session_id"
2031
2032
  * path; native errors are kept on `error.cause` for verbose surfacing.
2032
2033
  */
2033
2034
  declare function resolveRepositoryRoot(cwd: string): Promise<string>;
2035
+ /**
2036
+ * Resolve the repository root that owns the `.basou/` store for `cwd`, with a
2037
+ * fallback for agents-workspace "view" directories. A workspace view (e.g.
2038
+ * `~/projects/foo-workspace`) is intentionally OUTSIDE git and holds no `.basou/`
2039
+ * of its own; it aggregates sibling repos through symlinks (`foo-planning ->
2040
+ * ../foo-planning`). Running `basou orient` / `refresh` from there would
2041
+ * otherwise die with "Not a git repository" even though the view IS the
2042
+ * operator's daily cwd.
2043
+ *
2044
+ * Resolution:
2045
+ * 1. If `cwd` is inside a git repo, return its toplevel (unchanged behavior).
2046
+ * 2. Otherwise inspect `cwd`'s direct symlinks; if exactly one points at a
2047
+ * directory that has a `.basou/` store, redirect to that repo (firing
2048
+ * `onRedirect`). Zero candidates re-throws the original "Not a git
2049
+ * repository"; two or more throws an ambiguity error naming them so the
2050
+ * operator can `cd` into the right one.
2051
+ */
2052
+ declare function resolveBasouRepositoryRoot(cwd: string, opts?: {
2053
+ onRedirect?: (info: {
2054
+ via: string;
2055
+ root: string;
2056
+ }) => void;
2057
+ }): Promise<string>;
2034
2058
  /**
2035
2059
  * Read `remote.origin.url` from the local repository config. Returns
2036
2060
  * `undefined` if the remote is unset, the value is empty, or the lookup
@@ -3026,6 +3050,156 @@ type SanitizeRelatedFilesResult = {
3026
3050
  */
3027
3051
  declare function sanitizeRelatedFiles(paths: ReadonlyArray<string>, opts: SanitizePathOptions): SanitizeRelatedFilesResult;
3028
3052
 
3053
+ /** Input contract for {@link renderOrientation} and {@link summarizeOrientation}. */
3054
+ type OrientationRendererInput = {
3055
+ paths: BasouPaths;
3056
+ /** ISO timestamp embedded in the header AND used as "now" for freshness + suspect classification. */
3057
+ nowIso: string;
3058
+ onWarning?: (warning: ReplayWarning, sessionId: string) => void;
3059
+ onSessionSkip?: (sessionId: string, reason: SessionSkipReason) => void;
3060
+ onTaskSkip?: (taskId: string, reason: TaskSkipReason) => void;
3061
+ /** Maximum related_files entries to display before `... +N more`. Default 10. */
3062
+ relatedFilesLimit?: number;
3063
+ /**
3064
+ * Result of a read-only dry-run staleness probe (sessions a `basou refresh`
3065
+ * would add or update), computed by the CLI which holds the import context.
3066
+ * Drives the plain "これは最新か" verdict. `null` / omitted = not probed, so
3067
+ * the verdict says it cannot confirm freshness rather than claiming current.
3068
+ */
3069
+ staleness?: {
3070
+ newSessions: number;
3071
+ updatedSessions: number;
3072
+ unverifiableSessions?: number;
3073
+ } | null;
3074
+ /**
3075
+ * Append the raw freshness telemetry (ISO timestamp, per-source counts, source
3076
+ * roots, suspect count) under the plain verdict. Off by default so the section
3077
+ * reads as a verdict for a supervisor, not developer diagnostics.
3078
+ */
3079
+ verbose?: boolean;
3080
+ };
3081
+ type OrientationRendererResult = {
3082
+ /** Generated body. orientation.md is overwritten whole (no markers, gitignored). */
3083
+ body: string;
3084
+ sessionCount: number;
3085
+ pendingApprovalsCount: number;
3086
+ suspectCount: number;
3087
+ /** Tasks whose status is `planned` or `in_progress`. */
3088
+ inFlightTaskCount: number;
3089
+ decisionCount: number;
3090
+ };
3091
+ type DecisionRecord = {
3092
+ decisionId: string;
3093
+ title: string;
3094
+ occurredAt: string;
3095
+ };
3096
+ type PendingApproval = {
3097
+ id: string;
3098
+ risk: string;
3099
+ kind: string;
3100
+ reason: string;
3101
+ sessionId: string;
3102
+ createdAt: string;
3103
+ expired: boolean;
3104
+ };
3105
+ type InFlightTask = {
3106
+ id: string;
3107
+ title: string;
3108
+ status: string;
3109
+ linkedSessions: number;
3110
+ };
3111
+ type PlannedTask = {
3112
+ id: string;
3113
+ title: string;
3114
+ };
3115
+ type SuspectSession = {
3116
+ sessionId: string;
3117
+ status: string;
3118
+ reason: SuspectReason | null;
3119
+ };
3120
+ type LatestSession = {
3121
+ sessionId: string;
3122
+ label: string | null;
3123
+ status: string;
3124
+ };
3125
+ type SourceCount = {
3126
+ kind: string;
3127
+ count: number;
3128
+ };
3129
+ /**
3130
+ * The vendor-neutral, serializable structured summary behind orientation. This
3131
+ * is the single source of the four orientation questions (where am I now / what
3132
+ * is in flight / where am I heading / is this current). {@link renderOrientation}
3133
+ * formats it into markdown; programmatic consumers (e.g. a multi-workspace
3134
+ * portfolio view) read it directly without parsing prose.
3135
+ *
3136
+ * It carries STRUCTURED FACTS only — the pending-approval list with risk/reason,
3137
+ * suspect sessions, in-flight task linkage, capture freshness/coverage, the
3138
+ * latest decision. It deliberately holds NO work-stats (volume / active time /
3139
+ * tokens) and NO per-agent scorecards, productivity, or utilization metrics:
3140
+ * orientation shows product state, not surveillance of the fleet.
3141
+ */
3142
+ type OrientationSummary = {
3143
+ /** ISO "now"; the header timestamp and the basis for freshness/suspect classification. */
3144
+ generatedAt: string;
3145
+ /** All captured sessions (archived included), matching the count line. */
3146
+ sessionCount: number;
3147
+ /** Newest non-archived, non-import session ("where am I now"); null when none. */
3148
+ latestSession: LatestSession | null;
3149
+ /** Most recent `decision_recorded` across all sessions; null when none. */
3150
+ latestDecision: DecisionRecord | null;
3151
+ decisionCount: number;
3152
+ /** related_files of the latest session, deduped + sorted + capped at the display limit. */
3153
+ relatedFiles: {
3154
+ displayed: string[];
3155
+ overflow: number;
3156
+ };
3157
+ /** Tasks whose status is `planned` or `in_progress`. */
3158
+ inFlightTasks: InFlightTask[];
3159
+ /** Tasks whose status is `planned` ("where am I heading"). */
3160
+ plannedTasks: PlannedTask[];
3161
+ pendingApprovals: PendingApproval[];
3162
+ suspects: SuspectSession[];
3163
+ freshness: {
3164
+ /** started_at of the newest non-archived session, or null when none captured. */
3165
+ newestStartedAt: string | null;
3166
+ /** source.kind of the newest non-archived session, or null when none captured. */
3167
+ newestSource: string | null;
3168
+ /** Session counts per source kind, sorted by kind. Counts only — never volume/time. */
3169
+ bySource: SourceCount[];
3170
+ /** manifest `import.source_roots`, or null when single-root / unreadable. */
3171
+ sourceRoots: string[] | null;
3172
+ };
3173
+ };
3174
+ /**
3175
+ * Gather the structured orientation facts for a workspace. Read-only and runs
3176
+ * NO imports: freshness reflects already-captured state, so a stale capture is
3177
+ * visible rather than silently refreshed (run `basou refresh` to re-import).
3178
+ *
3179
+ * Returns a fully serializable {@link OrientationSummary}. See its docstring for
3180
+ * the positioning constraint (no work-stats, no surveillance metrics).
3181
+ */
3182
+ declare function summarizeOrientation(input: OrientationRendererInput): Promise<OrientationSummary>;
3183
+ /**
3184
+ * Render `.basou/orientation.md`: a point-in-time "current position" view for a
3185
+ * supervisor who delegated execution to AI agents. Unlike `handoff.md` (a
3186
+ * session-resume narrative) this answers four orientation questions —
3187
+ * where am I now / what is in flight / where am I heading / is this current —
3188
+ * and deliberately leads with STRUCTURED FACTS an LLM cannot reliably derive
3189
+ * from raw transcripts (the
3190
+ * pending-approval list with risk/reason, suspect sessions, in-flight task
3191
+ * linkage, capture freshness/coverage) rather than prose synthesis.
3192
+ *
3193
+ * The renderer is read-only and runs NO imports: the freshness section reflects
3194
+ * already-captured state, so a stale capture is visible rather than silently
3195
+ * refreshed (use `basou refresh` to re-import). It must never emit per-agent
3196
+ * scorecards, productivity, or utilization metrics — orientation shows product
3197
+ * state, not surveillance of the fleet.
3198
+ *
3199
+ * Formatting only: the facts come from {@link summarizeOrientation}.
3200
+ */
3201
+ declare function renderOrientation(input: OrientationRendererInput): Promise<OrientationRendererResult>;
3202
+
3029
3203
  /**
3030
3204
  * Schema version of the on-disk Basou v0.1 formats these JSON Schemas describe.
3031
3205
  * It tracks {@link SchemaVersionSchema} (the `schema_version` field), NOT the
@@ -3614,6 +3788,11 @@ type AppendBasouGitignoreResult = {
3614
3788
  /** True if the block was appended (or the file was newly created). */
3615
3789
  readonly appended: boolean;
3616
3790
  };
3791
+ /** Options for {@link appendBasouGitignore}. */
3792
+ type AppendBasouGitignoreOptions = {
3793
+ /** Write a `.basou/` full-exclude block instead of the default ignore+commit block. */
3794
+ readonly localOnly?: boolean;
3795
+ };
3617
3796
  /**
3618
3797
  * Append Basou's default `.gitignore` block to `repositoryRoot/.gitignore`.
3619
3798
  *
@@ -3621,11 +3800,15 @@ type AppendBasouGitignoreResult = {
3621
3800
  * standard ignore + commit recommendations). Callers must pass an absolute
3622
3801
  * path to a Git repository root.
3623
3802
  *
3803
+ * With `options.localOnly`, a `.basou/` full-exclude block is written instead
3804
+ * of the default ignore+commit block (the trail is kept out of version
3805
+ * control). The default (no options) is unchanged.
3806
+ *
3624
3807
  * Behavior:
3625
- * - If `.gitignore` does not exist, it is created with the Basou block.
3626
- * - If a line starting with `# Basou - default ignore` is already present,
3627
- * the file is left untouched and `appended: false` is returned
3628
- * (idempotent).
3808
+ * - If `.gitignore` does not exist, it is created with the chosen Basou block.
3809
+ * - If a `# Basou - default ignore` marker OR a standalone `.basou/` exclude
3810
+ * line is already present, the file is left untouched and `appended: false`
3811
+ * is returned (idempotent across both modes).
3629
3812
  * - If `.gitignore` is a symlink, the link is followed and the target file
3630
3813
  * is updated. Symlinks are not rejected.
3631
3814
  *
@@ -3633,7 +3816,7 @@ type AppendBasouGitignoreResult = {
3633
3816
  * (`Failed to read .gitignore` / `Failed to write .gitignore`) and the
3634
3817
  * original native error attached as `cause`.
3635
3818
  */
3636
- declare function appendBasouGitignore(repositoryRoot: string): Promise<AppendBasouGitignoreResult>;
3819
+ declare function appendBasouGitignore(repositoryRoot: string, options?: AppendBasouGitignoreOptions): Promise<AppendBasouGitignoreResult>;
3637
3820
 
3638
3821
  /**
3639
3822
  * The two lock scopes basou uses. `task` guards the read-modify-write window
@@ -4022,4 +4205,4 @@ declare function overwriteYamlFile(filePath: string, value: unknown): Promise<vo
4022
4205
  */
4023
4206
  declare const BASOU_CORE_VERSION = "0.1.0";
4024
4207
 
4025
- export { ACTIVE_GAP_CAP_MS, type ActiveTimeBasis, type AdapterOutputEvent, type AppendBasouGitignoreResult, type AppendEventToExistingInput, type AppendEventToExistingResult, type Approval, type ApprovalApprovedEvent, type ApprovalExpiredEvent, ApprovalIdSchema, type ApprovalLocation, type ApprovalRejectedEvent, type ApprovalRequestedEvent, ApprovalSchema, type ApprovalStatus, ApprovalStatusSchema, type ArchiveTaskInput, type ArchiveTaskResult, type AttachTaskInput, type AttachUpdateTaskStatusInput, type AttachableStatus, BASOU_CORE_VERSION, type BasouPaths, type BulkChainResult, CLAUDE_IMPORT_SOURCE, CODEX_IMPORT_SOURCE, type CaptureMode, type ChainBreakReason, type ChainTailState, type ChainVerdict, type ChainVerdictStatus, type ChainedEvents, ChildProcessRunner, type ClaudeTranscriptRecord, type ClaudeTranscriptToPayloadOptions, type CodexRolloutRecord, type CodexRolloutToPayloadOptions, type CommandExecutedEvent, type CommandLookup, type CreateAdHocSessionInput, type CreateAdHocSessionResult, type CreateAdHocTaskInput, type CreateManifestInput, type CreateTaskInput, type CreateTaskResult, type DayWorkStats, DecisionIdSchema, type DecisionRecordedEvent, type DecisionsRendererInput, type DecisionsRendererResult, type DeleteTaskInput, type DeleteTaskResult, type DiffResult, type EditTaskInput, type EditTaskResult, type Event, EventIdSchema, EventSchema, EventSourceSchema, FailedToFinalizeError, type FileChange, type FileChangeStatus, type FileChangedEvent, GENERATED_END, GENERATED_START, type GitSnapshot, type GitSnapshotEvent, type HandoffRendererInput, type HandoffRendererResult, ID_PREFIXES, type IdPrefix, type ImportSessionOptions, type ImportSessionResult, IsoTimestampSchema, JSON_SCHEMA_VERSION, type JsonSchemaArtifact, type LoadSessionEntriesOptions, type LoadTaskEntriesOptions, type LoadedApproval, type LockHandle, type LockScope, type Manifest, ManifestSchema, type MarkerSection, type MeasureAvailability, type NoteAddedEvent, type PrefixedId, type ProcessRunner, type RechainOptions, type RechainResult, type ReconcileAllResult, type ReconcileAllTasksInput, type ReconcileAllTasksOptions, type ReconcileFailure, type ReconcileResult, type ReconcileTaskInput, type RefreshLinkageInput, type RefreshLinkageResult, type ReimportOptions, type ReimportResult, type ReplayOptions, type ReplayWarning, type ReportApprovalItem, type ReportData, type ReportDecisionItem, type ReportRendererInput, type ReportRendererResult, type ReportSessionItem, type ReportTaskItem, type RiskLevel, RiskLevelSchema, type RunOptions, type RunResult, STUCK_THRESHOLD_MS, type SanitizePathOptions, type SanitizeRelatedFilesResult, SchemaVersionSchema, type Session, type SessionEndedEvent, type SessionEntry, SessionIdSchema, type SessionImportPayload, SessionImportPayloadSchema, type SessionInnerImportInput, SessionInnerImportSchema, type SessionIntegrity, SessionIntegritySchema, type SessionMetrics, SessionMetricsSchema, SessionSchema, type SessionSkipReason, type SessionSourceKind, SessionSourceKindSchema, type SessionStartedEvent, type SessionStatus, type SessionStatusChangedEvent, SessionStatusSchema, type SessionWorkStats, type SourceWorkStats, type StatusCount, StatusSchema, type StatusSnapshot, type SuspectReason, type Task, type TaskArchivedEvent, type TaskCreatedEvent, type TaskDeletedEvent, type TaskDocument, TaskIdSchema, type TaskLinkageRefreshedEvent, type TaskReconciledEvent, TaskSchema, type TaskSkipReason, type TaskStatus, type TaskStatusChangedEvent, type TaskStatusCount, TaskStatusSchema, TaskWriteAfterEventError, type TaskWriteAfterEventPhase, type TokenTotals, type UpdateAdHocTaskStatusInput, type UpdateTaskStatusInput, type UpdateTaskStatusResult, type WorkStatsInput, type WorkStatsResult, type WorkStatsTotals, WorkspaceIdSchema, type WriteEventsBulkOptions, type WriteTaskFileMode, acquireLock, appendBasouGitignore, appendChainedEvent, appendChainedEventLocked, appendEvent, appendEventToExistingSession, archiveTask, assertBasouRootSafe, basouPaths, buildJsonSchemas, buildStatusSnapshot, chainEvents, chainRawJsonLines, classifySuspect, claudeCodeAdapterMetadata, claudeTranscriptToImportPayload, codexRolloutToImportPayload, computeWorkStats, createAdHocSessionWithEvent, createManifest, createTaskWithEvent, deleteTask, editTask, ensureBasouDirectory, enumerateApprovals, enumerateArchivedTaskIds, enumerateSessionDirs, enumerateTaskIds, finalizeSessionYaml, findErrorCode, formatDurationMs, genesisHash, getDiff, getSnapshot, importSessionFromJson, inspectChainTail, isImportDerivedSource, isLazyExpired, isValidPrefixedId, lineHash, linkYamlFile, loadApproval, loadSessionEntries, loadTaskEntries, overwriteYamlFile, parseDuration, parseMarkers, prefixedUlid, readAllEvents, readManifest, readMarkdownFile, readSessionYaml, readStatus, readTaskFile, readTaskFileWithArchiveFallback, readYamlFile, rechainSessionInPlace, reconcileAllTasks, reconcileTask, refreshTaskLinkedSessions, reimportPreservingId, renderDecisions, renderHandoff, renderReport, renderWithMarkers, replayEvents, resolveClaudeCodeCommand, resolveRepositoryRoot, resolveSessionId, resolveTaskId, sanitizePath, sanitizeRelatedFiles, sanitizeWorkingDirectory, serializeEventLine, serializeJsonSchema, sessionWorkStatsFromEvents, summarizeAdapterOutput, tryRemoteUrl, ulid, updateTaskStatusWithEvent, verifyEventsChain, writeEventsBulk, writeManifest, writeMarkdownFile, writeStatus, writeTaskFile, writeYamlFile };
4208
+ export { ACTIVE_GAP_CAP_MS, type ActiveTimeBasis, type AdapterOutputEvent, type AppendBasouGitignoreOptions, type AppendBasouGitignoreResult, type AppendEventToExistingInput, type AppendEventToExistingResult, type Approval, type ApprovalApprovedEvent, type ApprovalExpiredEvent, ApprovalIdSchema, type ApprovalLocation, type ApprovalRejectedEvent, type ApprovalRequestedEvent, ApprovalSchema, type ApprovalStatus, ApprovalStatusSchema, type ArchiveTaskInput, type ArchiveTaskResult, type AttachTaskInput, type AttachUpdateTaskStatusInput, type AttachableStatus, BASOU_CORE_VERSION, type BasouPaths, type BulkChainResult, CLAUDE_IMPORT_SOURCE, CODEX_IMPORT_SOURCE, type CaptureMode, type ChainBreakReason, type ChainTailState, type ChainVerdict, type ChainVerdictStatus, type ChainedEvents, ChildProcessRunner, type ClaudeTranscriptRecord, type ClaudeTranscriptToPayloadOptions, type CodexRolloutRecord, type CodexRolloutToPayloadOptions, type CommandExecutedEvent, type CommandLookup, type CreateAdHocSessionInput, type CreateAdHocSessionResult, type CreateAdHocTaskInput, type CreateManifestInput, type CreateTaskInput, type CreateTaskResult, type DayWorkStats, DecisionIdSchema, type DecisionRecordedEvent, type DecisionsRendererInput, type DecisionsRendererResult, type DeleteTaskInput, type DeleteTaskResult, type DiffResult, type EditTaskInput, type EditTaskResult, type Event, EventIdSchema, EventSchema, EventSourceSchema, FailedToFinalizeError, type FileChange, type FileChangeStatus, type FileChangedEvent, GENERATED_END, GENERATED_START, type GitSnapshot, type GitSnapshotEvent, type HandoffRendererInput, type HandoffRendererResult, ID_PREFIXES, type IdPrefix, type ImportSessionOptions, type ImportSessionResult, IsoTimestampSchema, JSON_SCHEMA_VERSION, type JsonSchemaArtifact, type LoadSessionEntriesOptions, type LoadTaskEntriesOptions, type LoadedApproval, type LockHandle, type LockScope, type Manifest, ManifestSchema, type MarkerSection, type MeasureAvailability, type NoteAddedEvent, type OrientationRendererInput, type OrientationRendererResult, type OrientationSummary, type PrefixedId, type ProcessRunner, type RechainOptions, type RechainResult, type ReconcileAllResult, type ReconcileAllTasksInput, type ReconcileAllTasksOptions, type ReconcileFailure, type ReconcileResult, type ReconcileTaskInput, type RefreshLinkageInput, type RefreshLinkageResult, type ReimportOptions, type ReimportResult, type ReplayOptions, type ReplayWarning, type ReportApprovalItem, type ReportData, type ReportDecisionItem, type ReportRendererInput, type ReportRendererResult, type ReportSessionItem, type ReportTaskItem, type RiskLevel, RiskLevelSchema, type RunOptions, type RunResult, STUCK_THRESHOLD_MS, type SanitizePathOptions, type SanitizeRelatedFilesResult, SchemaVersionSchema, type Session, type SessionEndedEvent, type SessionEntry, SessionIdSchema, type SessionImportPayload, SessionImportPayloadSchema, type SessionInnerImportInput, SessionInnerImportSchema, type SessionIntegrity, SessionIntegritySchema, type SessionMetrics, SessionMetricsSchema, SessionSchema, type SessionSkipReason, type SessionSourceKind, SessionSourceKindSchema, type SessionStartedEvent, type SessionStatus, type SessionStatusChangedEvent, SessionStatusSchema, type SessionWorkStats, type SourceWorkStats, type StatusCount, StatusSchema, type StatusSnapshot, type SuspectReason, type Task, type TaskArchivedEvent, type TaskCreatedEvent, type TaskDeletedEvent, type TaskDocument, TaskIdSchema, type TaskLinkageRefreshedEvent, type TaskReconciledEvent, TaskSchema, type TaskSkipReason, type TaskStatus, type TaskStatusChangedEvent, type TaskStatusCount, TaskStatusSchema, TaskWriteAfterEventError, type TaskWriteAfterEventPhase, type TokenTotals, type UpdateAdHocTaskStatusInput, type UpdateTaskStatusInput, type UpdateTaskStatusResult, type WorkStatsInput, type WorkStatsResult, type WorkStatsTotals, WorkspaceIdSchema, type WriteEventsBulkOptions, type WriteTaskFileMode, acquireLock, appendBasouGitignore, appendChainedEvent, appendChainedEventLocked, appendEvent, appendEventToExistingSession, archiveTask, assertBasouRootSafe, basouPaths, buildJsonSchemas, buildStatusSnapshot, chainEvents, chainRawJsonLines, classifySuspect, claudeCodeAdapterMetadata, claudeTranscriptToImportPayload, codexRolloutToImportPayload, computeWorkStats, createAdHocSessionWithEvent, createManifest, createTaskWithEvent, deleteTask, editTask, ensureBasouDirectory, enumerateApprovals, enumerateArchivedTaskIds, enumerateSessionDirs, enumerateTaskIds, finalizeSessionYaml, findErrorCode, formatDurationMs, genesisHash, getDiff, getSnapshot, importSessionFromJson, inspectChainTail, isImportDerivedSource, isLazyExpired, isValidPrefixedId, lineHash, linkYamlFile, loadApproval, loadSessionEntries, loadTaskEntries, overwriteYamlFile, parseDuration, parseMarkers, prefixedUlid, readAllEvents, readManifest, readMarkdownFile, readSessionYaml, readStatus, readTaskFile, readTaskFileWithArchiveFallback, readYamlFile, rechainSessionInPlace, reconcileAllTasks, reconcileTask, refreshTaskLinkedSessions, reimportPreservingId, renderDecisions, renderHandoff, renderOrientation, renderReport, renderWithMarkers, replayEvents, resolveBasouRepositoryRoot, resolveClaudeCodeCommand, resolveRepositoryRoot, resolveSessionId, resolveTaskId, sanitizePath, sanitizeRelatedFiles, sanitizeWorkingDirectory, serializeEventLine, serializeJsonSchema, sessionWorkStatsFromEvents, summarizeAdapterOutput, summarizeOrientation, tryRemoteUrl, ulid, updateTaskStatusWithEvent, verifyEventsChain, writeEventsBulk, writeManifest, writeMarkdownFile, writeStatus, writeTaskFile, writeYamlFile };