claude-code-jsonl-parser 0.0.0 → 0.1.0-beta.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.
- package/LICENSE +21 -0
- package/README.md +127 -0
- package/dist/index.cjs +813 -0
- package/dist/index.d.cts +548 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +548 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +802 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -5
- package/index.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/result.ts","../src/generated/guards.ts","../src/parse-line.ts","../src/errors.ts","../src/parse.ts"],"sourcesContent":["/**\n * Zero-dependency Result / ResultAsync implementation.\n *\n * neverthrow に近い使い勝手を、外部依存なしで提供する。\n */\n\n// ---------------------------------------------------------------------------\n// Result<T, E>\n// ---------------------------------------------------------------------------\n\n/** 成功を表す。`value` を保持する。 */\nexport interface OkResult<T> {\n readonly isOk: true\n readonly isErr: false\n readonly value: T\n map<U>(fn: (value: T) => U): OkResult<U>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- ErrResult.mapErr<F> と対称の公開契約\n mapErr<F>(_fn: (error: never) => F): OkResult<T>\n andThen<U, F>(fn: (value: T) => Result<U, F>): Result<U, F>\n match<U>(onOk: (value: T) => U, _onErr: (error: never) => U): U\n unwrapOr(_fallback: T): T\n}\n\n/** 失敗を表す。`error` を保持する。 */\nexport interface ErrResult<E> {\n readonly isOk: false\n readonly isErr: true\n readonly error: E\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- OkResult.map<U> と対称の公開契約\n map<U>(_fn: (value: never) => U): ErrResult<E>\n mapErr<F>(fn: (error: E) => F): ErrResult<F>\n andThen<U, F>(_fn: (value: never) => Result<U, F>): ErrResult<E>\n match<U>(_onOk: (value: never) => U, onErr: (error: E) => U): U\n unwrapOr<T>(fallback: T): T\n}\n\n/** `OkResult<T>` または `ErrResult<E>`。 */\nexport type Result<T, E> = OkResult<T> | ErrResult<E>\n\n/** `OkResult<T>` の実装。 */\nclass OkResultImpl<T> implements OkResult<T> {\n readonly isOk = true as const\n readonly isErr = false as const\n\n constructor(readonly value: T) {}\n\n map<U>(fn: (value: T) => U): OkResult<U> {\n return new OkResultImpl(fn(this.value))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters, @typescript-eslint/no-unused-vars -- OkResult.mapErr は no-op\n mapErr<F>(_fn: (error: never) => F): OkResult<T> {\n return this\n }\n\n andThen<U, F>(fn: (value: T) => Result<U, F>): Result<U, F> {\n return fn(this.value)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- OkResult.match は常に onOk を呼ぶ\n match<U>(onOk: (value: T) => U, _onErr: (error: never) => U): U {\n return onOk(this.value)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- OkResult.unwrapOr は常に value を返す\n unwrapOr(_fallback: T): T {\n return this.value\n }\n}\n\n/** `ErrResult<E>` の実装。 */\nclass ErrResultImpl<E> implements ErrResult<E> {\n readonly isOk = false as const\n readonly isErr = true as const\n\n // eslint-disable-next-line n/handle-callback-err -- 'error' は格納値であり Node コールバックのエラー引数ではない\n constructor(readonly error: E) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters, @typescript-eslint/no-unused-vars -- ErrResult.map は no-op\n map<U>(_fn: (value: never) => U): ErrResult<E> {\n return this\n }\n\n mapErr<F>(fn: (error: E) => F): ErrResult<F> {\n return new ErrResultImpl(fn(this.error))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- ErrResult.andThen は no-op\n andThen<U, F>(_fn: (value: never) => Result<U, F>): ErrResult<E> {\n return this\n }\n\n match<U>(_onOk: (value: never) => U, onErr: (error: E) => U): U {\n return onErr(this.error)\n }\n\n unwrapOr<T>(fallback: T): T {\n return fallback\n }\n}\n\n/**\n * 成功 `Result<T, never>` を生成する。\n *\n * @param value - 成功値\n */\nexport function ok<T>(value: T): OkResult<T> {\n return new OkResultImpl(value)\n}\n\n/**\n * 失敗 `Result<never, E>` を生成する。\n *\n * @param error - エラー値\n */\nexport function err<E>(error: E): ErrResult<E> {\n return new ErrResultImpl(error)\n}\n\n// ---------------------------------------------------------------------------\n// ResultAsync<T, E>\n// ---------------------------------------------------------------------------\n\n/**\n * `await` 可能で `map / mapErr / andThen` を連鎖できる `PromiseLike<Result<T, E>>`。\n */\nexport class ResultAsync<T, E> implements PromiseLike<Result<T, E>> {\n private readonly _promise: Promise<Result<T, E>>\n\n constructor(promise: Promise<Result<T, E>>) {\n this._promise = promise\n }\n\n // eslint-disable-next-line unicorn/no-thenable -- await 可能にするため意図的に PromiseLike を実装する\n then<TResult1 = Result<T, E>, TResult2 = never>(\n onfulfilled?:\n | ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this._promise.then(onfulfilled, onrejected as never)\n }\n\n /**\n * `Promise<T>` を `ResultAsync<T, E>` に包む。reject 時は `onError` で E に写像する。\n *\n * @param promise - 対象 Promise\n * @param onError - エラー写像\n */\n static fromPromise<T, E>(\n promise: Promise<T>,\n onError: (reason: unknown) => E\n ): ResultAsync<T, E> {\n return new ResultAsync(\n promise.then(\n (v) => ok(v) as Result<T, E>,\n (error: unknown) => err(onError(error)) as Result<T, E>\n )\n )\n }\n\n /**\n * 解決済み `Result<T, E>` を `ResultAsync<T, E>` に包む。\n *\n * @param result - 対象 Result\n */\n static fromResult<T, E>(result: Result<T, E>): ResultAsync<T, E> {\n return new ResultAsync(Promise.resolve(result))\n }\n\n /**\n * 成功値を変換する。\n *\n * @param fn - 同期写像\n */\n map<U>(fn: (value: T) => U): ResultAsync<U, E> {\n return new ResultAsync(\n // eslint-disable-next-line unicorn/no-array-callback-reference -- fn は利用者供給の写像であり配列メソッド参照ではない\n this._promise.then((r) => r.map(fn) as Result<U, E>)\n )\n }\n\n /**\n * エラー値を変換する。\n *\n * @param fn - 同期エラー写像\n */\n mapErr<F>(fn: (error: E) => F): ResultAsync<T, F> {\n return new ResultAsync(\n this._promise.then((r) => r.mapErr(fn) as Result<T, F>)\n )\n }\n\n /**\n * 失敗しうる非同期処理を連鎖する。\n *\n * @param fn - `ResultAsync<U, F>` または `Result<U, F>` を返す写像\n */\n andThen<U, F>(\n fn: (value: T) => ResultAsync<U, F> | Result<U, F>\n ): ResultAsync<U, E | F> {\n return new ResultAsync(\n this._promise.then(async (r): Promise<Result<U, E | F>> => {\n if (r.isErr) return r\n const next = fn(r.value)\n if (next instanceof ResultAsync) {\n return next._promise\n }\n return next\n })\n )\n }\n\n /**\n * 成功 / 失敗でパターンマッチする。\n *\n * @param onOk - 成功値ハンドラ\n * @param onErr - エラー値ハンドラ\n */\n async match<U>(\n onOk: (value: T) => U | Promise<U>,\n onErr: (error: E) => U | Promise<U>\n ): Promise<U> {\n const r = await this._promise\n if (r.isOk) return onOk(r.value)\n return onErr(r.error)\n }\n\n /**\n * 成功なら value、失敗なら fallback を返す。\n *\n * @param fallback - フォールバック値\n */\n async unwrapOr(fallback: T): Promise<T> {\n const r = await this._promise\n if (r.isOk) return r.value\n return fallback\n }\n}\n","/**\n * Claude Code JSONL の各エントリ型に対する zod 非依存の純粋な型ガード。\n * トップレベル必須フィールドの最小検査のみ行う。\n *\n * claude-code-jsonl-generator でコーパスから再生成できるが、\n * content-block guards は手動でキュレーションしているため、\n * 生成結果をそのまま上書きするのではなく差分を確認して反映すること。\n */\nimport type {\n AssistantContentBlock, UserContentBlock, ToolResultBlock,\n ToolResultContentBlock, UnknownContentBlock,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// プリミティブ検査ヘルパ\n// ---------------------------------------------------------------------------\n\n/** 配列でも null でもないプレーンオブジェクトかどうかを判定する。 */\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v)\n}\n/** `string` かどうかを判定する。 */\nfunction isString(v: unknown): v is string {\n return typeof v === 'string'\n}\n/** `number` かどうかを判定する。 */\nfunction isNumber(v: unknown): v is number {\n return typeof v === 'number'\n}\n/** `boolean` かどうかを判定する。 */\nfunction isBoolean(v: unknown): v is boolean {\n return typeof v === 'boolean'\n}\n\n/**\n * ガード判定結果。`ok: false` の場合、`reason` に不一致だったフィールド名などの\n * 診断メッセージを含む (どこが shape 不一致の原因かを consumer が把握できるように)。\n */\nexport interface GuardResult {\n ok: boolean\n reason?: string\n}\n\n/** `[フィールド名, 検査結果]` の配列から、不一致だったフィールド名をまとめた診断メッセージを作る。 */\nfunction fieldCheck(fields: [string, boolean][]): string | undefined {\n const failing = fields.filter(([, ok]) => !ok).map(([name]) => name)\n return failing.length > 0\n ? `missing/invalid field(s): ${failing.join(', ')}`\n : undefined\n}\n\n/** フルメタデータ系の共通必須フィールドを検査し、不一致理由を返す (一致なら undefined)。 */\nfunction entryBaseReason(o: Record<string, unknown>): string | undefined {\n return fieldCheck([\n ['cwd', isString(o.cwd)],\n ['entrypoint', isString(o.entrypoint)],\n ['gitBranch', isString(o.gitBranch)],\n ['isSidechain', isBoolean(o.isSidechain)],\n ['parentUuid', o.parentUuid === null || isString(o.parentUuid)],\n ['sessionId', isString(o.sessionId)],\n ['timestamp', isString(o.timestamp)],\n ['userType', isString(o.userType)],\n ['uuid', isString(o.uuid)],\n ['version', isString(o.version)],\n ])\n}\n\n// ---------------------------------------------------------------------------\n// 個別ガード (raw: unknown を受け、GuardResult を返す)\n// ---------------------------------------------------------------------------\n\nfunction isAssistant(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'assistant') return { ok: false, reason: 'type is not \"assistant\"' }\n const baseReason = entryBaseReason(v)\n if (baseReason !== undefined) return { ok: false, reason: baseReason }\n if (!isObject(v.message)) return { ok: false, reason: 'message is not an object' }\n const reason = fieldCheck([\n ['message.role', isString(v.message.role)],\n ['message.id', isString(v.message.id)],\n ['message.model', isString(v.message.model)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isUser(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'user') return { ok: false, reason: 'type is not \"user\"' }\n const baseReason = entryBaseReason(v)\n if (baseReason !== undefined) return { ok: false, reason: baseReason }\n if (!isObject(v.message)) return { ok: false, reason: 'message is not an object' }\n const reason = fieldCheck([['message.role', isString(v.message.role)]])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isAttachment(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'attachment') return { ok: false, reason: 'type is not \"attachment\"' }\n const baseReason = entryBaseReason(v)\n if (baseReason !== undefined) return { ok: false, reason: baseReason }\n const reason = fieldCheck([['attachment', isObject(v.attachment)]])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isSystem(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'system') return { ok: false, reason: 'type is not \"system\"' }\n const baseReason = entryBaseReason(v)\n if (baseReason !== undefined) return { ok: false, reason: baseReason }\n const reason = fieldCheck([['subtype', isString(v.subtype)]])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isMode(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'mode') return { ok: false, reason: 'type is not \"mode\"' }\n const reason = fieldCheck([\n ['mode', isString(v.mode)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isPermissionMode(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'permission-mode') return { ok: false, reason: 'type is not \"permission-mode\"' }\n const reason = fieldCheck([\n ['permissionMode', isString(v.permissionMode)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isAiTitle(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'ai-title') return { ok: false, reason: 'type is not \"ai-title\"' }\n const reason = fieldCheck([\n ['aiTitle', isString(v.aiTitle)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isAgentName(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'agent-name') return { ok: false, reason: 'type is not \"agent-name\"' }\n const reason = fieldCheck([\n ['agentName', isString(v.agentName)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isAgentSetting(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'agent-setting') return { ok: false, reason: 'type is not \"agent-setting\"' }\n const reason = fieldCheck([\n ['agentSetting', isString(v.agentSetting)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isRelocated(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'relocated') return { ok: false, reason: 'type is not \"relocated\"' }\n const reason = fieldCheck([\n ['relocatedCwd', isString(v.relocatedCwd)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isLastPrompt(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'last-prompt') return { ok: false, reason: 'type is not \"last-prompt\"' }\n const reason = fieldCheck([\n ['leafUuid', isString(v.leafUuid)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isWorktreeState(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'worktree-state') return { ok: false, reason: 'type is not \"worktree-state\"' }\n const reason = fieldCheck([\n ['sessionId', isString(v.sessionId)],\n ['worktreeSession', v.worktreeSession === null || isObject(v.worktreeSession)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isBridgeSession(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'bridge-session') return { ok: false, reason: 'type is not \"bridge-session\"' }\n const reason = fieldCheck([\n ['bridgeSessionId', isString(v.bridgeSessionId)],\n ['lastSequenceNum', isNumber(v.lastSequenceNum)],\n ['sessionId', isString(v.sessionId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isQueueOperation(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'queue-operation') return { ok: false, reason: 'type is not \"queue-operation\"' }\n const reason = fieldCheck([\n ['operation', isString(v.operation)],\n ['sessionId', isString(v.sessionId)],\n ['timestamp', isString(v.timestamp)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isPrLink(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'pr-link') return { ok: false, reason: 'type is not \"pr-link\"' }\n const reason = fieldCheck([\n ['prNumber', isNumber(v.prNumber)],\n ['prRepository', isString(v.prRepository)],\n ['prUrl', isString(v.prUrl)],\n ['sessionId', isString(v.sessionId)],\n ['timestamp', isString(v.timestamp)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isFrameLink(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'frame-link') return { ok: false, reason: 'type is not \"frame-link\"' }\n const reason = fieldCheck([\n ['frameUrl', isString(v.frameUrl)],\n ['path', isString(v.path)],\n ['sessionId', isString(v.sessionId)],\n ['timestamp', isString(v.timestamp)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isFileHistorySnapshot(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'file-history-snapshot') return { ok: false, reason: 'type is not \"file-history-snapshot\"' }\n const reason = fieldCheck([\n ['isSnapshotUpdate', isBoolean(v.isSnapshotUpdate)],\n ['messageId', isString(v.messageId)],\n ['snapshot', isObject(v.snapshot)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isStarted(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'started') return { ok: false, reason: 'type is not \"started\"' }\n const reason = fieldCheck([\n ['key', isString(v.key)],\n ['agentId', isString(v.agentId)],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\nfunction isResult(v: unknown): GuardResult {\n if (!isObject(v)) return { ok: false, reason: 'not an object' }\n if (v.type !== 'result') return { ok: false, reason: 'type is not \"result\"' }\n const reason = fieldCheck([\n ['key', isString(v.key)],\n ['agentId', isString(v.agentId)],\n ['result', 'result' in v],\n ])\n return reason === undefined ? { ok: true } : { ok: false, reason }\n}\n\n// ---------------------------------------------------------------------------\n// レジストリ\n// ---------------------------------------------------------------------------\n\n/** type 文字列 → ガード関数のマップ。 */\nexport const guards = {\n assistant: isAssistant,\n user: isUser,\n attachment: isAttachment,\n system: isSystem,\n mode: isMode,\n 'permission-mode': isPermissionMode,\n 'ai-title': isAiTitle,\n 'agent-name': isAgentName,\n 'agent-setting': isAgentSetting,\n relocated: isRelocated,\n 'last-prompt': isLastPrompt,\n 'worktree-state': isWorktreeState,\n 'bridge-session': isBridgeSession,\n 'queue-operation': isQueueOperation,\n 'pr-link': isPrLink,\n 'frame-link': isFrameLink,\n 'file-history-snapshot': isFileHistorySnapshot,\n started: isStarted,\n result: isResult,\n} as const satisfies Record<string, (v: unknown) => GuardResult>\n\n/** 既知 type 名の配列。 */\nexport const KNOWN_TYPES = Object.keys(guards) as (keyof typeof guards)[]\n\n/**\n * 指定 type のガードを適用する。ガードが存在しない type なら undefined。\n * 一致すれば `{ ok: true }`、不一致なら `{ ok: false, reason }` (reason に\n * 診断メッセージ、どのフィールドが原因で shape 不一致になったかを含む)。\n *\n * @param type - 判別子\n * @param v - 検査対象の生 JSON\n */\nexport function guardByType(type: string, v: unknown): GuardResult | undefined {\n const g = (guards as Record<string, (x: unknown) => GuardResult>)[type]\n if (g === undefined) return undefined\n return g(v)\n}\n\n// ---------------------------------------------------------------------------\n// content ブロックガード\n// ---------------------------------------------------------------------------\n\nfunction unknownBlock(raw: unknown): UnknownContentBlock {\n return { _kind: 'unknown', raw }\n}\n\nfunction isTextBlock(v: Record<string, unknown>): boolean {\n return v.type === 'text' && isString(v.text)\n}\nfunction isThinkingBlock(v: Record<string, unknown>): boolean {\n return v.type === 'thinking' && isString(v.thinking) && isString(v.signature)\n}\nfunction isToolUseBlock(v: Record<string, unknown>): boolean {\n return v.type === 'tool_use' && isString(v.id) && isString(v.name) && 'input' in v\n}\nfunction isImageBlock(v: Record<string, unknown>): boolean {\n return (\n v.type === 'image' && isObject(v.source) &&\n isString((v.source as Record<string, unknown>).media_type) &&\n isString((v.source as Record<string, unknown>).data)\n )\n}\nfunction isToolReferenceBlock(v: Record<string, unknown>): boolean {\n return v.type === 'tool_reference' && isString(v.tool_name)\n}\n\n/** tool_result の inner content 配列を正規化する。 */\nfunction normalizeToolResultContent(\n content: unknown\n): string | ToolResultContentBlock[] {\n if (isString(content)) return content\n if (!Array.isArray(content)) return [unknownBlock(content)]\n return content.map((el): ToolResultContentBlock => {\n if (!isObject(el)) return unknownBlock(el)\n if (isTextBlock(el) || isImageBlock(el) || isToolReferenceBlock(el)) {\n return { ...el, _kind: 'known' } as unknown as ToolResultContentBlock\n }\n return unknownBlock(el)\n })\n}\n\n/** tool_result ブロック全体を検査・正規化する。 */\nfunction normalizeToolResultBlock(v: Record<string, unknown>): UserContentBlock {\n if (v.type !== 'tool_result' || !isString(v.tool_use_id)) return unknownBlock(v)\n const block: ToolResultBlock = {\n _kind: 'known',\n type: 'tool_result',\n tool_use_id: v.tool_use_id,\n content: normalizeToolResultContent(v.content),\n }\n if (isBoolean(v.is_error)) block.is_error = v.is_error\n return block\n}\n\n/**\n * assistant の message.content 配列を正規化する。\n * 既知ブロックはそのまま、未知は UnknownContentBlock に降格する。\n *\n * @param content - 生の content 配列\n */\nexport function normalizeAssistantContent(\n content: unknown\n): AssistantContentBlock[] {\n if (!Array.isArray(content)) return [unknownBlock(content)]\n return content.map((el): AssistantContentBlock => {\n if (!isObject(el)) return unknownBlock(el)\n if (isTextBlock(el) || isThinkingBlock(el) || isToolUseBlock(el)) {\n return { ...el, _kind: 'known' } as unknown as AssistantContentBlock\n }\n return unknownBlock(el)\n })\n}\n\n/**\n * user の message.content を正規化する。string ならそのまま、配列なら要素ごとに正規化。\n *\n * @param content - 生の content (string または配列)\n */\nexport function normalizeUserContent(\n content: unknown\n): string | UserContentBlock[] {\n if (isString(content)) return content\n if (!Array.isArray(content)) return [unknownBlock(content)]\n return content.map((el): UserContentBlock => {\n if (!isObject(el)) return unknownBlock(el)\n if (isTextBlock(el)) return { ...el, _kind: 'known' } as unknown as UserContentBlock\n if (el.type === 'tool_result') return normalizeToolResultBlock(el)\n return unknownBlock(el)\n })\n}\n","import type { ParsedLine, KnownEntry } from './generated/types'\nimport {\n guardByType, normalizeAssistantContent, normalizeUserContent,\n} from './generated/guards'\n\n/**\n * JSONL 1 行を ParsedLine に変換する。\n *\n * - JSON 構文エラー: `LineParseError`\n * - 既知 type かつ shape 一致: `KnownEntry` (_kind='known' 付与、content 正規化)\n * - 既知 type だが shape 不一致: `UnknownEntry` (typeHint に type 値)\n * - 未知 type / type 無し: `UnknownEntry` (typeHint 無し)\n *\n * @param rawLine - 1 行分の文字列 (改行を含まない)\n * @param lineNumber - 1 始まりの行番号\n */\nexport function parseLine(rawLine: string, lineNumber: number): ParsedLine {\n let parsed: unknown\n try {\n parsed = JSON.parse(rawLine)\n } catch (error) {\n return {\n _kind: 'error',\n lineNumber,\n rawLine,\n message: error instanceof Error ? error.message : String(error),\n }\n }\n\n // オブジェクトでない、または type が文字列でない場合は未知扱い\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n Array.isArray(parsed) ||\n typeof (parsed as Record<string, unknown>).type !== 'string'\n ) {\n return { _kind: 'unknown', lineNumber, raw: parsed }\n }\n\n const obj = parsed as Record<string, unknown>\n const type = obj.type as string\n const matched = guardByType(type, obj)\n\n if (matched === undefined) {\n // ガードが存在しない = 未知 type\n return { _kind: 'unknown', lineNumber, raw: parsed }\n }\n if (!matched.ok) {\n // 既知 type だが shape 不一致\n return { _kind: 'unknown', lineNumber, raw: parsed, typeHint: type, reason: matched.reason }\n }\n\n // shape 一致: _kind を付与し、content をハイブリッド正規化する\n const entry = { ...obj, _kind: 'known' } as unknown as KnownEntry\n\n if (entry.type === 'assistant') {\n entry.message = {\n ...entry.message,\n content: normalizeAssistantContent(entry.message.content),\n }\n } else if (entry.type === 'user') {\n entry.message = {\n ...entry.message,\n content: normalizeUserContent(entry.message.content),\n }\n }\n\n return entry\n}\n","/** ファイル読み込み (I/O) 起因のエラー。JSON 構文エラーや未知 type は含まない。 */\nexport interface FileReadError {\n _tag: 'FileReadError'\n path: string\n /** Node.js のエラーコード (ENOENT / EACCES など)。取得できなければ undefined。 */\n code?: string\n message: string\n}\n\n/**\n * FileReadError を生成する。\n *\n * @param path - 対象パス\n * @param error - 捕捉した例外\n */\nexport function fileReadError(path: string, error: unknown): FileReadError {\n const code =\n typeof error === 'object' && error !== null && 'code' in error\n ? String((error).code)\n : undefined\n return {\n _tag: 'FileReadError',\n path,\n code,\n message: error instanceof Error ? error.message : String(error),\n }\n}\n","import { createReadStream } from 'node:fs'\nimport { createInterface } from 'node:readline'\nimport type { ParsedLine } from './generated/types'\nimport { ok, ResultAsync, type Result } from './result'\nimport { parseLine } from './parse-line'\nimport { fileReadError, type FileReadError } from './errors'\n\n/**\n * JSONL 文字列を行単位で逐次パースする同期イテレータ。\n * `text.split('\\n')` で全行配列を作らず、`indexOf` で 1 行ずつ切り出すため、\n * 追加メモリは 1 行分にとどまる (全行配列分の追加確保が発生しない)。\n *\n * 空行 (トリム後に空) はスキップし、行番号カウントには含めない。\n *\n * @param text - JSONL テキスト全体\n */\nexport function* parseJsonlLines(text: string): Iterable<ParsedLine> {\n let lineNumber = 0\n let start = 0\n while (start <= text.length) {\n const nlIndex = text.indexOf('\\n', start)\n const end = nlIndex === -1 ? text.length : nlIndex\n // CRLF の \\r を除去\n const rawEnd = end > start && text[end - 1] === '\\r' ? end - 1 : end\n const line = text.slice(start, rawEnd)\n if (line.trim() !== '') {\n lineNumber += 1\n yield parseLine(line, lineNumber)\n }\n if (nlIndex === -1) break\n start = end + 1\n }\n}\n\n/**\n * JSONL 文字列全体を一括パースして配列で返す。\n * 行単位のエラーは配列要素として表現されるため、この関数は Err を返さない。\n *\n * @param text - JSONL テキスト全体\n */\nexport function parseJsonl(text: string): Result<ParsedLine[], never> {\n return ok([...parseJsonlLines(text)])\n}\n\n/**\n * ファイルを行単位で逐次読み込み・パースする非同期イテレータ (定数メモリ)。\n * I/O エラーは反復時に FileReadError を throw する。\n *\n * @param path - JSONL ファイルパス\n */\nexport async function* parseJsonlFileStream(\n path: string\n): AsyncIterable<ParsedLine> {\n const stream = createReadStream(path, { encoding: 'utf8' })\n // 'error' を Promise 化して throw に載せるためのハンドリング\n const rl = createInterface({ input: stream, crlfDelay: Infinity })\n let lineNumber = 0\n try {\n for await (const raw of rl) {\n if (raw.trim() === '') continue\n lineNumber += 1\n yield parseLine(raw, lineNumber)\n }\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error -- FileReadError は意図的な判別可能 union (Error 継承ではない)\n throw fileReadError(path, error)\n } finally {\n rl.close()\n stream.destroy()\n }\n}\n\n/**\n * ファイル全体を読み込み一括パースする。I/O エラーのみ Err になる。\n *\n * @param path - JSONL ファイルパス\n */\nexport function parseJsonlFile(\n path: string\n): ResultAsync<ParsedLine[], FileReadError> {\n return ResultAsync.fromPromise(\n (async () => {\n const out: ParsedLine[] = []\n for await (const line of parseJsonlFileStream(path)) out.push(line)\n return out\n })(),\n (error) => {\n // parseJsonlFileStream が投げた FileReadError はそのまま通す\n if (\n typeof error === 'object' &&\n error !== null &&\n (error as { _tag?: string })._tag === 'FileReadError'\n ) {\n return error as FileReadError\n }\n return fileReadError(path, error)\n }\n )\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-jsonl-parser",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
|
+
"description": "Zero-dependency parser for Claude Code JSONL conversation logs",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"claude-code",
|
|
7
|
+
"jsonl",
|
|
8
|
+
"parser",
|
|
9
|
+
"typescript"
|
|
10
|
+
],
|
|
5
11
|
"license": "MIT",
|
|
6
12
|
"author": "Tomachi <tomachi@tomacheese.com>",
|
|
7
13
|
"repository": {
|
|
8
14
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/book000/claude-code-jsonl-parser.git"
|
|
15
|
+
"url": "git+https://github.com/book000/claude-code-jsonl-parser.git",
|
|
16
|
+
"directory": "packages/parser"
|
|
10
17
|
},
|
|
11
|
-
"
|
|
12
|
-
|
|
18
|
+
"type": "module",
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"!dist/*.tsbuildinfo"
|
|
22
|
+
],
|
|
23
|
+
"main": "./dist/index.cjs",
|
|
24
|
+
"module": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/index.d.cts",
|
|
34
|
+
"default": "./dist/index.cjs"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsdown && node ../../scripts/check-dts-no-zod.mjs",
|
|
40
|
+
"clean": "rimraf dist",
|
|
41
|
+
"lint": "tsc -p tsconfig.test.json"
|
|
42
|
+
}
|
|
43
|
+
}
|
package/index.js
DELETED