@nt-ai-lab/deterministic-agent-workflow-claude-code 0.1.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.
@@ -0,0 +1,4 @@
1
+ import type { BaseWorkflowState, RehydratableWorkflow } from '@nt-ai-lab/deterministic-agent-workflow-engine';
2
+ import type { ClaudeCodeWorkflowCliConfig } from '../../../platform/domain/claude-code-workflow-cli-types';
3
+ /** @riviere-role cli-entrypoint */
4
+ export declare function createClaudeCodeWorkflowCli<TWorkflow extends RehydratableWorkflow<TState>, TState extends BaseWorkflowState, TDeps>(config: ClaudeCodeWorkflowCliConfig<TWorkflow, TState, TDeps>): void;
@@ -0,0 +1,9 @@
1
+ import { createWorkflowCli } from '@nt-ai-lab/deterministic-agent-workflow-cli';
2
+ import { ClaudeCodeTranscriptReader } from '../../../platform/infra/external-clients/claude-code/claude-code-transcript-reader.js';
3
+ /** @riviere-role cli-entrypoint */
4
+ export function createClaudeCodeWorkflowCli(config) {
5
+ createWorkflowCli({
6
+ ...config,
7
+ transcriptReader: new ClaudeCodeTranscriptReader(),
8
+ });
9
+ }
@@ -0,0 +1,3 @@
1
+ export { ClaudeCodeTranscriptReader } from './platform/infra/external-clients/claude-code/claude-code-transcript-reader';
2
+ export { createClaudeCodeWorkflowCli } from './features/claude-code-cli/entrypoint/claude-code-workflow-cli';
3
+ export type { ClaudeCodeWorkflowCliConfig } from './platform/domain/claude-code-workflow-cli-types';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ClaudeCodeTranscriptReader } from './platform/infra/external-clients/claude-code/claude-code-transcript-reader.js';
2
+ export { createClaudeCodeWorkflowCli } from './features/claude-code-cli/entrypoint/claude-code-workflow-cli.js';
@@ -0,0 +1,4 @@
1
+ import type { BaseWorkflowState, RehydratableWorkflow } from '@nt-ai-lab/deterministic-agent-workflow-engine';
2
+ import type { WorkflowCliConfig } from '@nt-ai-lab/deterministic-agent-workflow-cli';
3
+ /** @riviere-role value-object */
4
+ export type ClaudeCodeWorkflowCliConfig<TWorkflow extends RehydratableWorkflow<TState>, TState extends BaseWorkflowState, TDeps> = Omit<WorkflowCliConfig<TWorkflow, TState, TDeps>, 'transcriptReader'>;
@@ -0,0 +1,5 @@
1
+ import type { TranscriptMessage, TranscriptReader } from '@nt-ai-lab/deterministic-agent-workflow-engine';
2
+ /** @riviere-role external-client-model */
3
+ export declare class ClaudeCodeTranscriptReader implements TranscriptReader {
4
+ readMessages(transcriptPath: string): readonly TranscriptMessage[];
5
+ }
@@ -0,0 +1,72 @@
1
+ import { closeSync, openSync, readSync, statSync, } from 'node:fs';
2
+ import { z } from 'zod';
3
+ const READ_TAIL_BYTES = 50_000;
4
+ const textBlock = z.object({
5
+ type: z.literal('text'),
6
+ text: z.string(),
7
+ });
8
+ const otherBlock = z.object({ type: z.string() });
9
+ const contentBlock = z.union([textBlock, otherBlock]);
10
+ const assistantEntrySchema = z.object({
11
+ type: z.literal('message'),
12
+ role: z.literal('assistant'),
13
+ id: z.string(),
14
+ content: z.array(contentBlock),
15
+ });
16
+ /** @riviere-role external-client-model */
17
+ export class ClaudeCodeTranscriptReader {
18
+ readMessages(transcriptPath) {
19
+ const tail = readFileTail(transcriptPath);
20
+ return parseJsonlLines(tail);
21
+ }
22
+ }
23
+ function readFileTail(filePath) {
24
+ const fileSize = statSync(filePath).size;
25
+ const offset = Math.max(0, fileSize - READ_TAIL_BYTES);
26
+ const bytesToRead = fileSize - offset;
27
+ const buffer = Buffer.alloc(bytesToRead);
28
+ const fd = openSync(filePath, 'r');
29
+ readSync(fd, buffer, 0, bytesToRead, offset);
30
+ closeSync(fd);
31
+ return buffer.toString('utf-8');
32
+ }
33
+ function parseJsonlLines(content) {
34
+ return content
35
+ .split('\n')
36
+ .filter((line) => line.trim().length > 0)
37
+ .flatMap((line) => parseJsonlLine(line));
38
+ }
39
+ function parseJsonlLine(line) {
40
+ const entry = tryParseEntry(line);
41
+ if (entry === undefined) {
42
+ return [];
43
+ }
44
+ return [toTranscriptMessage(entry)];
45
+ }
46
+ function tryParseEntry(line) {
47
+ try {
48
+ const result = assistantEntrySchema.safeParse(JSON.parse(line));
49
+ if (result.success) {
50
+ return result.data;
51
+ }
52
+ return undefined;
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ function toTranscriptMessage(entry) {
59
+ return {
60
+ id: entry.id,
61
+ textContent: extractFirstText(entry),
62
+ };
63
+ }
64
+ function extractFirstText(entry) {
65
+ for (const block of entry.content) {
66
+ const result = textBlock.safeParse(block);
67
+ if (result.success) {
68
+ return result.data.text;
69
+ }
70
+ }
71
+ return undefined;
72
+ }
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@nt-ai-lab/deterministic-agent-workflow-claude-code",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./dist/index.js"
8
+ },
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "@nt-ai-lab/deterministic-agent-workflow-cli": "workspace:*",
15
+ "@nt-ai-lab/deterministic-agent-workflow-engine": "workspace:*",
16
+ "zod": "^3.25.76"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public"
20
+ }
21
+ }