@kynetic-ai/spec 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.
- package/README.md +263 -0
- package/dist/acp/client.d.ts +159 -0
- package/dist/acp/client.d.ts.map +1 -0
- package/dist/acp/client.js +255 -0
- package/dist/acp/client.js.map +1 -0
- package/dist/acp/framing.d.ts +119 -0
- package/dist/acp/framing.d.ts.map +1 -0
- package/dist/acp/framing.js +302 -0
- package/dist/acp/framing.js.map +1 -0
- package/dist/acp/index.d.ts +14 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +13 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/types.d.ts +89 -0
- package/dist/acp/types.d.ts.map +1 -0
- package/dist/acp/types.js +99 -0
- package/dist/acp/types.js.map +1 -0
- package/dist/agents/adapters.d.ts +55 -0
- package/dist/agents/adapters.d.ts.map +1 -0
- package/dist/agents/adapters.js +84 -0
- package/dist/agents/adapters.js.map +1 -0
- package/dist/agents/index.d.ts +8 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +10 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/spawner.d.ts +53 -0
- package/dist/agents/spawner.d.ts.map +1 -0
- package/dist/agents/spawner.js +83 -0
- package/dist/agents/spawner.js.map +1 -0
- package/dist/cli/batch.d.ts +82 -0
- package/dist/cli/batch.d.ts.map +1 -0
- package/dist/cli/batch.js +162 -0
- package/dist/cli/batch.js.map +1 -0
- package/dist/cli/commands/clone-for-testing.d.ts +6 -0
- package/dist/cli/commands/clone-for-testing.d.ts.map +1 -0
- package/dist/cli/commands/clone-for-testing.js +176 -0
- package/dist/cli/commands/clone-for-testing.js.map +1 -0
- package/dist/cli/commands/derive.d.ts +6 -0
- package/dist/cli/commands/derive.d.ts.map +1 -0
- package/dist/cli/commands/derive.js +450 -0
- package/dist/cli/commands/derive.js.map +1 -0
- package/dist/cli/commands/help.d.ts +6 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +196 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +6 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +235 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/index.d.ts +20 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +21 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +245 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/item.d.ts +6 -0
- package/dist/cli/commands/item.d.ts.map +1 -0
- package/dist/cli/commands/item.js +1311 -0
- package/dist/cli/commands/item.js.map +1 -0
- package/dist/cli/commands/link.d.ts +6 -0
- package/dist/cli/commands/link.d.ts.map +1 -0
- package/dist/cli/commands/link.js +288 -0
- package/dist/cli/commands/link.js.map +1 -0
- package/dist/cli/commands/log.d.ts +16 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +291 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/meta.d.ts +15 -0
- package/dist/cli/commands/meta.d.ts.map +1 -0
- package/dist/cli/commands/meta.js +1378 -0
- package/dist/cli/commands/meta.js.map +1 -0
- package/dist/cli/commands/module.d.ts +6 -0
- package/dist/cli/commands/module.d.ts.map +1 -0
- package/dist/cli/commands/module.js +102 -0
- package/dist/cli/commands/module.js.map +1 -0
- package/dist/cli/commands/ralph.d.ts +9 -0
- package/dist/cli/commands/ralph.d.ts.map +1 -0
- package/dist/cli/commands/ralph.js +465 -0
- package/dist/cli/commands/ralph.js.map +1 -0
- package/dist/cli/commands/search.d.ts +6 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +134 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/session.d.ts +164 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +745 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +26 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +586 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/shadow.d.ts +6 -0
- package/dist/cli/commands/shadow.d.ts.map +1 -0
- package/dist/cli/commands/shadow.js +299 -0
- package/dist/cli/commands/shadow.js.map +1 -0
- package/dist/cli/commands/task.d.ts +6 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1514 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/tasks.d.ts +6 -0
- package/dist/cli/commands/tasks.d.ts.map +1 -0
- package/dist/cli/commands/tasks.js +347 -0
- package/dist/cli/commands/tasks.js.map +1 -0
- package/dist/cli/commands/trait.d.ts +10 -0
- package/dist/cli/commands/trait.d.ts.map +1 -0
- package/dist/cli/commands/trait.js +295 -0
- package/dist/cli/commands/trait.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +6 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +626 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/exit-codes.d.ts +62 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/exit-codes.js +65 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/help/content.d.ts +35 -0
- package/dist/cli/help/content.d.ts.map +1 -0
- package/dist/cli/help/content.js +312 -0
- package/dist/cli/help/content.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +85 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/introspection.d.ts +87 -0
- package/dist/cli/introspection.d.ts.map +1 -0
- package/dist/cli/introspection.js +127 -0
- package/dist/cli/introspection.js.map +1 -0
- package/dist/cli/output.d.ts +56 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +467 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/suggest.d.ts +16 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +72 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/alignment.d.ts +113 -0
- package/dist/parser/alignment.d.ts.map +1 -0
- package/dist/parser/alignment.js +261 -0
- package/dist/parser/alignment.js.map +1 -0
- package/dist/parser/assess.d.ts +81 -0
- package/dist/parser/assess.d.ts.map +1 -0
- package/dist/parser/assess.js +197 -0
- package/dist/parser/assess.js.map +1 -0
- package/dist/parser/convention-validation.d.ts +48 -0
- package/dist/parser/convention-validation.d.ts.map +1 -0
- package/dist/parser/convention-validation.js +167 -0
- package/dist/parser/convention-validation.js.map +1 -0
- package/dist/parser/fix.d.ts +38 -0
- package/dist/parser/fix.d.ts.map +1 -0
- package/dist/parser/fix.js +185 -0
- package/dist/parser/fix.js.map +1 -0
- package/dist/parser/index.d.ts +12 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +13 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/items.d.ts +138 -0
- package/dist/parser/items.d.ts.map +1 -0
- package/dist/parser/items.js +321 -0
- package/dist/parser/items.js.map +1 -0
- package/dist/parser/meta.d.ts +120 -0
- package/dist/parser/meta.d.ts.map +1 -0
- package/dist/parser/meta.js +441 -0
- package/dist/parser/meta.js.map +1 -0
- package/dist/parser/refs.d.ts +185 -0
- package/dist/parser/refs.d.ts.map +1 -0
- package/dist/parser/refs.js +404 -0
- package/dist/parser/refs.js.map +1 -0
- package/dist/parser/shadow.d.ts +253 -0
- package/dist/parser/shadow.d.ts.map +1 -0
- package/dist/parser/shadow.js +1053 -0
- package/dist/parser/shadow.js.map +1 -0
- package/dist/parser/traits.d.ts +72 -0
- package/dist/parser/traits.d.ts.map +1 -0
- package/dist/parser/traits.js +120 -0
- package/dist/parser/traits.js.map +1 -0
- package/dist/parser/validate.d.ts +89 -0
- package/dist/parser/validate.d.ts.map +1 -0
- package/dist/parser/validate.js +817 -0
- package/dist/parser/validate.js.map +1 -0
- package/dist/parser/yaml.d.ts +326 -0
- package/dist/parser/yaml.d.ts.map +1 -0
- package/dist/parser/yaml.js +1383 -0
- package/dist/parser/yaml.js.map +1 -0
- package/dist/ralph/cli-renderer.d.ts +20 -0
- package/dist/ralph/cli-renderer.d.ts.map +1 -0
- package/dist/ralph/cli-renderer.js +179 -0
- package/dist/ralph/cli-renderer.js.map +1 -0
- package/dist/ralph/events.d.ts +65 -0
- package/dist/ralph/events.d.ts.map +1 -0
- package/dist/ralph/events.js +397 -0
- package/dist/ralph/events.js.map +1 -0
- package/dist/ralph/index.d.ts +8 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +10 -0
- package/dist/ralph/index.js.map +1 -0
- package/dist/schema/common.d.ts +46 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +71 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/inbox.d.ts +90 -0
- package/dist/schema/inbox.d.ts.map +1 -0
- package/dist/schema/inbox.js +30 -0
- package/dist/schema/inbox.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +7 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/meta.d.ts +762 -0
- package/dist/schema/meta.d.ts.map +1 -0
- package/dist/schema/meta.js +144 -0
- package/dist/schema/meta.js.map +1 -0
- package/dist/schema/spec.d.ts +912 -0
- package/dist/schema/spec.d.ts.map +1 -0
- package/dist/schema/spec.js +104 -0
- package/dist/schema/spec.js.map +1 -0
- package/dist/schema/task.d.ts +664 -0
- package/dist/schema/task.d.ts.map +1 -0
- package/dist/schema/task.js +130 -0
- package/dist/schema/task.js.map +1 -0
- package/dist/sessions/index.d.ts +11 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +13 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +144 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +325 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/types.d.ts +157 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +90 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/strings/errors.d.ts +420 -0
- package/dist/strings/errors.d.ts.map +1 -0
- package/dist/strings/errors.js +282 -0
- package/dist/strings/errors.js.map +1 -0
- package/dist/strings/guidance.d.ts +65 -0
- package/dist/strings/guidance.d.ts.map +1 -0
- package/dist/strings/guidance.js +66 -0
- package/dist/strings/guidance.js.map +1 -0
- package/dist/strings/index.d.ts +12 -0
- package/dist/strings/index.d.ts.map +1 -0
- package/dist/strings/index.js +12 -0
- package/dist/strings/index.js.map +1 -0
- package/dist/strings/labels.d.ts +74 -0
- package/dist/strings/labels.d.ts.map +1 -0
- package/dist/strings/labels.js +75 -0
- package/dist/strings/labels.js.map +1 -0
- package/dist/strings/validation.d.ts +126 -0
- package/dist/strings/validation.d.ts.map +1 -0
- package/dist/strings/validation.js +135 -0
- package/dist/strings/validation.js.map +1 -0
- package/dist/utils/commit.d.ts +23 -0
- package/dist/utils/commit.d.ts.map +1 -0
- package/dist/utils/commit.js +67 -0
- package/dist/utils/commit.js.map +1 -0
- package/dist/utils/git.d.ts +57 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +192 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/grep.d.ts +28 -0
- package/dist/utils/grep.d.ts.map +1 -0
- package/dist/utils/grep.js +86 -0
- package/dist/utils/grep.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/time.d.ts +18 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +61 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { UlidSchema, SlugSchema, RefSchema, DateTimeSchema, TaskStatusSchema, TaskTypeSchema, VcsRefSchema, } from './common.js';
|
|
3
|
+
/**
|
|
4
|
+
* Automation eligibility status for tasks
|
|
5
|
+
* AC: @task-automation-eligibility ac-1
|
|
6
|
+
* - eligible: Task can be processed by automation loops
|
|
7
|
+
* - needs_review: Task was rejected by automation and needs human review
|
|
8
|
+
* - manual_only: Task should only be handled by humans
|
|
9
|
+
* - undefined/absent: Task has not been assessed for automation (unassessed)
|
|
10
|
+
*/
|
|
11
|
+
export const AutomationStatusSchema = z.enum(['eligible', 'needs_review', 'manual_only']);
|
|
12
|
+
/**
|
|
13
|
+
* Note entry - append-only work log
|
|
14
|
+
*/
|
|
15
|
+
export const NoteSchema = z.object({
|
|
16
|
+
_ulid: UlidSchema,
|
|
17
|
+
created_at: DateTimeSchema,
|
|
18
|
+
author: z.string().optional(),
|
|
19
|
+
content: z.string(),
|
|
20
|
+
supersedes: UlidSchema.nullable().optional(),
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Todo item - lightweight checklist
|
|
24
|
+
*/
|
|
25
|
+
export const TodoSchema = z.object({
|
|
26
|
+
id: z.number().int().positive(),
|
|
27
|
+
text: z.string(),
|
|
28
|
+
done: z.boolean().default(false),
|
|
29
|
+
done_at: DateTimeSchema.optional(),
|
|
30
|
+
added_at: DateTimeSchema,
|
|
31
|
+
added_by: z.string().optional(),
|
|
32
|
+
promoted_to: RefSchema.optional(),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Full task schema
|
|
36
|
+
* Note: created_at defaults to now if not provided (auto-populated on load)
|
|
37
|
+
*/
|
|
38
|
+
export const TaskSchema = z.object({
|
|
39
|
+
// Identity
|
|
40
|
+
_ulid: UlidSchema,
|
|
41
|
+
slugs: z.array(SlugSchema).default([]),
|
|
42
|
+
title: z.string().min(1, 'Title is required'),
|
|
43
|
+
type: TaskTypeSchema.default('task'),
|
|
44
|
+
// Content (doesn't duplicate spec - brief description for standalone context)
|
|
45
|
+
description: z.string().optional(),
|
|
46
|
+
// Spec relationship
|
|
47
|
+
spec_ref: RefSchema.nullable().optional(),
|
|
48
|
+
derivation: z.enum(['auto', 'manual']).optional(),
|
|
49
|
+
// Meta relationship (links to workflow, agent, or convention for process improvement tracking)
|
|
50
|
+
meta_ref: RefSchema.nullable().optional(),
|
|
51
|
+
// Origin tracking (where this task came from)
|
|
52
|
+
origin: z.enum(['manual', 'derived', 'observation_promotion']).optional(),
|
|
53
|
+
// State
|
|
54
|
+
status: TaskStatusSchema.default('pending'),
|
|
55
|
+
blocked_by: z.array(z.string()).default([]),
|
|
56
|
+
closed_reason: z.string().nullable().optional(),
|
|
57
|
+
// Dependencies
|
|
58
|
+
depends_on: z.array(RefSchema).default([]),
|
|
59
|
+
context: z.array(RefSchema).default([]),
|
|
60
|
+
// Work metadata
|
|
61
|
+
priority: z.number().int().min(1).max(5).default(3),
|
|
62
|
+
complexity: z.number().int().min(1).max(5).optional(),
|
|
63
|
+
tags: z.array(z.string()).default([]),
|
|
64
|
+
assignee: z.string().nullable().optional(),
|
|
65
|
+
// VCS references
|
|
66
|
+
vcs_refs: z.array(VcsRefSchema).default([]),
|
|
67
|
+
// Timestamps (auto-populated if not provided)
|
|
68
|
+
created_at: DateTimeSchema.default(() => new Date().toISOString()),
|
|
69
|
+
started_at: DateTimeSchema.nullable().optional(),
|
|
70
|
+
completed_at: DateTimeSchema.nullable().optional(),
|
|
71
|
+
// Notes (work log)
|
|
72
|
+
notes: z.array(NoteSchema).default([]),
|
|
73
|
+
// Todos (emergent subtasks)
|
|
74
|
+
todos: z.array(TodoSchema).default([]),
|
|
75
|
+
// Automation eligibility (AC: @task-automation-eligibility ac-1, ac-2)
|
|
76
|
+
// Optional - absent means unassessed
|
|
77
|
+
automation: AutomationStatusSchema.optional(),
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* Task input schema (for creating new tasks, some fields auto-generated)
|
|
81
|
+
* All fields except title are optional - defaults will be applied
|
|
82
|
+
*/
|
|
83
|
+
export const TaskInputSchema = z.object({
|
|
84
|
+
// Identity (auto-generated if not provided)
|
|
85
|
+
_ulid: UlidSchema.optional(),
|
|
86
|
+
slugs: z.array(SlugSchema).optional(),
|
|
87
|
+
title: z.string().min(1, 'Title is required'),
|
|
88
|
+
type: TaskTypeSchema.optional(),
|
|
89
|
+
// Content
|
|
90
|
+
description: z.string().optional(),
|
|
91
|
+
// Spec relationship
|
|
92
|
+
spec_ref: RefSchema.nullable().optional(),
|
|
93
|
+
derivation: z.enum(['auto', 'manual']).optional(),
|
|
94
|
+
// Meta relationship
|
|
95
|
+
meta_ref: RefSchema.nullable().optional(),
|
|
96
|
+
// Origin tracking
|
|
97
|
+
origin: z.enum(['manual', 'derived', 'observation_promotion']).optional(),
|
|
98
|
+
// State
|
|
99
|
+
status: TaskStatusSchema.optional(),
|
|
100
|
+
blocked_by: z.array(z.string()).optional(),
|
|
101
|
+
closed_reason: z.string().nullable().optional(),
|
|
102
|
+
// Dependencies
|
|
103
|
+
depends_on: z.array(RefSchema).optional(),
|
|
104
|
+
context: z.array(RefSchema).optional(),
|
|
105
|
+
// Work metadata
|
|
106
|
+
priority: z.number().int().min(1).max(5).optional(),
|
|
107
|
+
complexity: z.number().int().min(1).max(5).optional(),
|
|
108
|
+
tags: z.array(z.string()).optional(),
|
|
109
|
+
assignee: z.string().nullable().optional(),
|
|
110
|
+
// VCS references
|
|
111
|
+
vcs_refs: z.array(VcsRefSchema).optional(),
|
|
112
|
+
// Timestamps
|
|
113
|
+
created_at: DateTimeSchema.optional(),
|
|
114
|
+
started_at: DateTimeSchema.nullable().optional(),
|
|
115
|
+
completed_at: DateTimeSchema.nullable().optional(),
|
|
116
|
+
// Notes (work log)
|
|
117
|
+
notes: z.array(NoteSchema).optional(),
|
|
118
|
+
// Todos (emergent subtasks)
|
|
119
|
+
todos: z.array(TodoSchema).optional(),
|
|
120
|
+
// Automation eligibility (AC: @task-automation-eligibility ac-1, ac-2, ac-13)
|
|
121
|
+
automation: AutomationStatusSchema.optional(),
|
|
122
|
+
});
|
|
123
|
+
/**
|
|
124
|
+
* Tasks file schema (collection of tasks)
|
|
125
|
+
*/
|
|
126
|
+
export const TasksFileSchema = z.object({
|
|
127
|
+
kynetic_tasks: z.string().default('1.0'),
|
|
128
|
+
tasks: z.array(TaskSchema),
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/schema/task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session event storage module.
|
|
3
|
+
*
|
|
4
|
+
* Provides JSONL-based event storage for agent sessions with:
|
|
5
|
+
* - Append-only event logs for auditability
|
|
6
|
+
* - Session metadata tracking
|
|
7
|
+
* - Integration with kspec commit boundaries
|
|
8
|
+
*/
|
|
9
|
+
export * from './types.js';
|
|
10
|
+
export * from './store.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session event storage module.
|
|
3
|
+
*
|
|
4
|
+
* Provides JSONL-based event storage for agent sessions with:
|
|
5
|
+
* - Append-only event logs for auditability
|
|
6
|
+
* - Session metadata tracking
|
|
7
|
+
* - Integration with kspec commit boundaries
|
|
8
|
+
*/
|
|
9
|
+
// Re-export types
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
// Re-export storage functions
|
|
12
|
+
export * from './store.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,8BAA8B;AAC9B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session event storage.
|
|
3
|
+
*
|
|
4
|
+
* JSONL-based event storage for agent sessions with:
|
|
5
|
+
* - Atomic appends for crash safety (AC-3)
|
|
6
|
+
* - Auto-assigned timestamps and sequence numbers (AC-2)
|
|
7
|
+
* - Session metadata management
|
|
8
|
+
*
|
|
9
|
+
* Storage structure:
|
|
10
|
+
* .kspec/sessions/{session-id}/
|
|
11
|
+
* session.yaml # Metadata
|
|
12
|
+
* events.jsonl # Append-only event log
|
|
13
|
+
*/
|
|
14
|
+
import { type SessionMetadata, type SessionMetadataInput, type SessionEvent, type SessionEventInput, type SessionStatus } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Get the sessions directory path within a spec directory.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getSessionsDir(specDir: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get the path to a specific session's directory.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSessionDir(specDir: string, sessionId: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Get the path to a session's metadata file.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSessionMetadataPath(specDir: string, sessionId: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get the path to a session's events file.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getSessionEventsPath(specDir: string, sessionId: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get the path to a session's context snapshot file for a given iteration.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getSessionContextPath(specDir: string, sessionId: string, iteration: number): string;
|
|
35
|
+
/**
|
|
36
|
+
* Create a new session with metadata.
|
|
37
|
+
*
|
|
38
|
+
* AC-1: Creates .kspec/sessions/{id}/ directory with session.yaml metadata file.
|
|
39
|
+
* AC-5: Metadata includes task_id (optional), agent_type, status, started_at, ended_at.
|
|
40
|
+
*
|
|
41
|
+
* @param specDir - The .kspec directory path
|
|
42
|
+
* @param input - Session metadata input
|
|
43
|
+
* @returns The created session metadata
|
|
44
|
+
*/
|
|
45
|
+
export declare function createSession(specDir: string, input: SessionMetadataInput): Promise<SessionMetadata>;
|
|
46
|
+
/**
|
|
47
|
+
* Read session metadata.
|
|
48
|
+
*
|
|
49
|
+
* @param specDir - The .kspec directory path
|
|
50
|
+
* @param sessionId - Session ID
|
|
51
|
+
* @returns Session metadata or null if not found
|
|
52
|
+
*/
|
|
53
|
+
export declare function getSession(specDir: string, sessionId: string): Promise<SessionMetadata | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Update session status.
|
|
56
|
+
*
|
|
57
|
+
* AC-6: Updates metadata with status and ended_at timestamp when session ends.
|
|
58
|
+
*
|
|
59
|
+
* @param specDir - The .kspec directory path
|
|
60
|
+
* @param sessionId - Session ID
|
|
61
|
+
* @param status - New status
|
|
62
|
+
* @returns Updated metadata or null if session not found
|
|
63
|
+
*/
|
|
64
|
+
export declare function updateSessionStatus(specDir: string, sessionId: string, status: SessionStatus): Promise<SessionMetadata | null>;
|
|
65
|
+
/**
|
|
66
|
+
* List all sessions.
|
|
67
|
+
*
|
|
68
|
+
* @param specDir - The .kspec directory path
|
|
69
|
+
* @returns Array of session IDs
|
|
70
|
+
*/
|
|
71
|
+
export declare function listSessions(specDir: string): Promise<string[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a session exists.
|
|
74
|
+
*/
|
|
75
|
+
export declare function sessionExists(specDir: string, sessionId: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Append an event to a session's event log.
|
|
78
|
+
*
|
|
79
|
+
* AC-2: Appends JSON line to events.jsonl with auto-assigned ts and seq.
|
|
80
|
+
* AC-3: Uses atomic append (appendFileSync) for crash safety.
|
|
81
|
+
*
|
|
82
|
+
* Creates the session directory if it doesn't exist (lazy creation).
|
|
83
|
+
*
|
|
84
|
+
* Note: This function is not safe for concurrent access to the same session.
|
|
85
|
+
* The sequence number assignment has a race condition between reading the
|
|
86
|
+
* event count and appending the event. This is acceptable for CLI use
|
|
87
|
+
* (single-process, sequential event logging). If concurrent access is needed
|
|
88
|
+
* in the future, consider file locking or an in-memory counter per session.
|
|
89
|
+
*
|
|
90
|
+
* @param specDir - The .kspec directory path
|
|
91
|
+
* @param input - Event input (ts and seq are auto-assigned if not provided)
|
|
92
|
+
* @returns The appended event with auto-assigned fields
|
|
93
|
+
*/
|
|
94
|
+
export declare function appendEvent(specDir: string, input: SessionEventInput): Promise<SessionEvent>;
|
|
95
|
+
/**
|
|
96
|
+
* Read all events from a session.
|
|
97
|
+
*
|
|
98
|
+
* AC-4: Returns all events in sequence order.
|
|
99
|
+
*
|
|
100
|
+
* @param specDir - The .kspec directory path
|
|
101
|
+
* @param sessionId - Session ID
|
|
102
|
+
* @returns Array of events sorted by sequence number
|
|
103
|
+
*/
|
|
104
|
+
export declare function readEvents(specDir: string, sessionId: string): Promise<SessionEvent[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Read events within a time range.
|
|
107
|
+
*
|
|
108
|
+
* @param specDir - The .kspec directory path
|
|
109
|
+
* @param sessionId - Session ID
|
|
110
|
+
* @param since - Start timestamp (inclusive)
|
|
111
|
+
* @param until - End timestamp (inclusive)
|
|
112
|
+
* @returns Array of events within the time range
|
|
113
|
+
*/
|
|
114
|
+
export declare function readEventsSince(specDir: string, sessionId: string, since: number, until?: number): Promise<SessionEvent[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Get the last event in a session.
|
|
117
|
+
*
|
|
118
|
+
* @param specDir - The .kspec directory path
|
|
119
|
+
* @param sessionId - Session ID
|
|
120
|
+
* @returns The last event or null if no events
|
|
121
|
+
*/
|
|
122
|
+
export declare function getLastEvent(specDir: string, sessionId: string): Promise<SessionEvent | null>;
|
|
123
|
+
/**
|
|
124
|
+
* Save session context snapshot for a given iteration.
|
|
125
|
+
*
|
|
126
|
+
* This creates an audit trail of what context the agent saw at each iteration,
|
|
127
|
+
* useful for debugging and reviewing agent behavior.
|
|
128
|
+
*
|
|
129
|
+
* @param specDir - The .kspec directory path
|
|
130
|
+
* @param sessionId - Session ID
|
|
131
|
+
* @param iteration - Iteration number
|
|
132
|
+
* @param context - The session context data
|
|
133
|
+
*/
|
|
134
|
+
export declare function saveSessionContext(specDir: string, sessionId: string, iteration: number, context: unknown): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Read session context snapshot for a given iteration.
|
|
137
|
+
*
|
|
138
|
+
* @param specDir - The .kspec directory path
|
|
139
|
+
* @param sessionId - Session ID
|
|
140
|
+
* @param iteration - Iteration number
|
|
141
|
+
* @returns The context snapshot or null if not found
|
|
142
|
+
*/
|
|
143
|
+
export declare function readSessionContext(specDir: string, sessionId: string, iteration: number): Promise<unknown | null>;
|
|
144
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sessions/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAUpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnG;AAID;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAUjC;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkBjC;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWrE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQxF;AAuBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAuBzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,EAAE,CAAC,CAOzB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAM9B;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CASzB"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session event storage.
|
|
3
|
+
*
|
|
4
|
+
* JSONL-based event storage for agent sessions with:
|
|
5
|
+
* - Atomic appends for crash safety (AC-3)
|
|
6
|
+
* - Auto-assigned timestamps and sequence numbers (AC-2)
|
|
7
|
+
* - Session metadata management
|
|
8
|
+
*
|
|
9
|
+
* Storage structure:
|
|
10
|
+
* .kspec/sessions/{session-id}/
|
|
11
|
+
* session.yaml # Metadata
|
|
12
|
+
* events.jsonl # Append-only event log
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import * as fsPromises from 'node:fs/promises';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import * as YAML from 'yaml';
|
|
18
|
+
import { SessionMetadataSchema, SessionEventSchema, } from './types.js';
|
|
19
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
20
|
+
const SESSIONS_DIR = 'sessions';
|
|
21
|
+
const METADATA_FILE = 'session.yaml';
|
|
22
|
+
const EVENTS_FILE = 'events.jsonl';
|
|
23
|
+
// ─── Path Helpers ────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Get the sessions directory path within a spec directory.
|
|
26
|
+
*/
|
|
27
|
+
export function getSessionsDir(specDir) {
|
|
28
|
+
return path.join(specDir, SESSIONS_DIR);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the path to a specific session's directory.
|
|
32
|
+
*/
|
|
33
|
+
export function getSessionDir(specDir, sessionId) {
|
|
34
|
+
return path.join(getSessionsDir(specDir), sessionId);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the path to a session's metadata file.
|
|
38
|
+
*/
|
|
39
|
+
export function getSessionMetadataPath(specDir, sessionId) {
|
|
40
|
+
return path.join(getSessionDir(specDir, sessionId), METADATA_FILE);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the path to a session's events file.
|
|
44
|
+
*/
|
|
45
|
+
export function getSessionEventsPath(specDir, sessionId) {
|
|
46
|
+
return path.join(getSessionDir(specDir, sessionId), EVENTS_FILE);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the path to a session's context snapshot file for a given iteration.
|
|
50
|
+
*/
|
|
51
|
+
export function getSessionContextPath(specDir, sessionId, iteration) {
|
|
52
|
+
return path.join(getSessionDir(specDir, sessionId), `context-iter-${iteration}.json`);
|
|
53
|
+
}
|
|
54
|
+
// ─── Session CRUD ────────────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Create a new session with metadata.
|
|
57
|
+
*
|
|
58
|
+
* AC-1: Creates .kspec/sessions/{id}/ directory with session.yaml metadata file.
|
|
59
|
+
* AC-5: Metadata includes task_id (optional), agent_type, status, started_at, ended_at.
|
|
60
|
+
*
|
|
61
|
+
* @param specDir - The .kspec directory path
|
|
62
|
+
* @param input - Session metadata input
|
|
63
|
+
* @returns The created session metadata
|
|
64
|
+
*/
|
|
65
|
+
export async function createSession(specDir, input) {
|
|
66
|
+
const sessionDir = getSessionDir(specDir, input.id);
|
|
67
|
+
const metadataPath = getSessionMetadataPath(specDir, input.id);
|
|
68
|
+
// Create session directory
|
|
69
|
+
await fsPromises.mkdir(sessionDir, { recursive: true });
|
|
70
|
+
// Build full metadata
|
|
71
|
+
const metadata = {
|
|
72
|
+
id: input.id,
|
|
73
|
+
task_id: input.task_id,
|
|
74
|
+
agent_type: input.agent_type,
|
|
75
|
+
status: input.status ?? 'active',
|
|
76
|
+
started_at: input.started_at ?? new Date().toISOString(),
|
|
77
|
+
ended_at: undefined,
|
|
78
|
+
};
|
|
79
|
+
// Validate and write metadata
|
|
80
|
+
const validated = SessionMetadataSchema.parse(metadata);
|
|
81
|
+
const content = YAML.stringify(validated, { indent: 2, lineWidth: 100, sortMapEntries: false });
|
|
82
|
+
await fsPromises.writeFile(metadataPath, content, 'utf-8');
|
|
83
|
+
return validated;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Read session metadata.
|
|
87
|
+
*
|
|
88
|
+
* @param specDir - The .kspec directory path
|
|
89
|
+
* @param sessionId - Session ID
|
|
90
|
+
* @returns Session metadata or null if not found
|
|
91
|
+
*/
|
|
92
|
+
export async function getSession(specDir, sessionId) {
|
|
93
|
+
const metadataPath = getSessionMetadataPath(specDir, sessionId);
|
|
94
|
+
try {
|
|
95
|
+
const content = await fsPromises.readFile(metadataPath, 'utf-8');
|
|
96
|
+
const raw = YAML.parse(content);
|
|
97
|
+
return SessionMetadataSchema.parse(raw);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Update session status.
|
|
105
|
+
*
|
|
106
|
+
* AC-6: Updates metadata with status and ended_at timestamp when session ends.
|
|
107
|
+
*
|
|
108
|
+
* @param specDir - The .kspec directory path
|
|
109
|
+
* @param sessionId - Session ID
|
|
110
|
+
* @param status - New status
|
|
111
|
+
* @returns Updated metadata or null if session not found
|
|
112
|
+
*/
|
|
113
|
+
export async function updateSessionStatus(specDir, sessionId, status) {
|
|
114
|
+
const metadata = await getSession(specDir, sessionId);
|
|
115
|
+
if (!metadata) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
// Update status and ended_at if transitioning away from active
|
|
119
|
+
const updated = {
|
|
120
|
+
...metadata,
|
|
121
|
+
status,
|
|
122
|
+
ended_at: status !== 'active' ? new Date().toISOString() : metadata.ended_at,
|
|
123
|
+
};
|
|
124
|
+
const metadataPath = getSessionMetadataPath(specDir, sessionId);
|
|
125
|
+
const content = YAML.stringify(updated, { indent: 2, lineWidth: 100, sortMapEntries: false });
|
|
126
|
+
await fsPromises.writeFile(metadataPath, content, 'utf-8');
|
|
127
|
+
return updated;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List all sessions.
|
|
131
|
+
*
|
|
132
|
+
* @param specDir - The .kspec directory path
|
|
133
|
+
* @returns Array of session IDs
|
|
134
|
+
*/
|
|
135
|
+
export async function listSessions(specDir) {
|
|
136
|
+
const sessionsDir = getSessionsDir(specDir);
|
|
137
|
+
try {
|
|
138
|
+
const entries = await fsPromises.readdir(sessionsDir, { withFileTypes: true });
|
|
139
|
+
return entries
|
|
140
|
+
.filter(e => e.isDirectory())
|
|
141
|
+
.map(e => e.name);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if a session exists.
|
|
149
|
+
*/
|
|
150
|
+
export async function sessionExists(specDir, sessionId) {
|
|
151
|
+
const metadataPath = getSessionMetadataPath(specDir, sessionId);
|
|
152
|
+
try {
|
|
153
|
+
await fsPromises.access(metadataPath);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// ─── Event Storage ───────────────────────────────────────────────────────────
|
|
161
|
+
/**
|
|
162
|
+
* Get the current event count for a session (for seq assignment).
|
|
163
|
+
*
|
|
164
|
+
* @param specDir - The .kspec directory path
|
|
165
|
+
* @param sessionId - Session ID
|
|
166
|
+
* @returns Number of events in the session
|
|
167
|
+
*/
|
|
168
|
+
async function getEventCount(specDir, sessionId) {
|
|
169
|
+
const eventsPath = getSessionEventsPath(specDir, sessionId);
|
|
170
|
+
try {
|
|
171
|
+
const content = await fsPromises.readFile(eventsPath, 'utf-8');
|
|
172
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
173
|
+
return lines.length;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Append an event to a session's event log.
|
|
181
|
+
*
|
|
182
|
+
* AC-2: Appends JSON line to events.jsonl with auto-assigned ts and seq.
|
|
183
|
+
* AC-3: Uses atomic append (appendFileSync) for crash safety.
|
|
184
|
+
*
|
|
185
|
+
* Creates the session directory if it doesn't exist (lazy creation).
|
|
186
|
+
*
|
|
187
|
+
* Note: This function is not safe for concurrent access to the same session.
|
|
188
|
+
* The sequence number assignment has a race condition between reading the
|
|
189
|
+
* event count and appending the event. This is acceptable for CLI use
|
|
190
|
+
* (single-process, sequential event logging). If concurrent access is needed
|
|
191
|
+
* in the future, consider file locking or an in-memory counter per session.
|
|
192
|
+
*
|
|
193
|
+
* @param specDir - The .kspec directory path
|
|
194
|
+
* @param input - Event input (ts and seq are auto-assigned if not provided)
|
|
195
|
+
* @returns The appended event with auto-assigned fields
|
|
196
|
+
*/
|
|
197
|
+
export async function appendEvent(specDir, input) {
|
|
198
|
+
const sessionDir = getSessionDir(specDir, input.session_id);
|
|
199
|
+
const eventsPath = getSessionEventsPath(specDir, input.session_id);
|
|
200
|
+
// Ensure session directory exists (lazy creation)
|
|
201
|
+
await fsPromises.mkdir(sessionDir, { recursive: true });
|
|
202
|
+
// Get current event count for seq assignment
|
|
203
|
+
const seq = input.seq ?? await getEventCount(specDir, input.session_id);
|
|
204
|
+
// Build full event
|
|
205
|
+
const event = {
|
|
206
|
+
ts: input.ts ?? Date.now(),
|
|
207
|
+
seq,
|
|
208
|
+
type: input.type,
|
|
209
|
+
session_id: input.session_id,
|
|
210
|
+
trace_id: input.trace_id,
|
|
211
|
+
data: input.data,
|
|
212
|
+
};
|
|
213
|
+
// Validate event
|
|
214
|
+
const validated = SessionEventSchema.parse(event);
|
|
215
|
+
// AC-3: Use synchronous append for crash safety
|
|
216
|
+
// This ensures the line is fully written before returning
|
|
217
|
+
const line = JSON.stringify(validated) + '\n';
|
|
218
|
+
fs.appendFileSync(eventsPath, line, 'utf-8');
|
|
219
|
+
return validated;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Read all events from a session.
|
|
223
|
+
*
|
|
224
|
+
* AC-4: Returns all events in sequence order.
|
|
225
|
+
*
|
|
226
|
+
* @param specDir - The .kspec directory path
|
|
227
|
+
* @param sessionId - Session ID
|
|
228
|
+
* @returns Array of events sorted by sequence number
|
|
229
|
+
*/
|
|
230
|
+
export async function readEvents(specDir, sessionId) {
|
|
231
|
+
const eventsPath = getSessionEventsPath(specDir, sessionId);
|
|
232
|
+
try {
|
|
233
|
+
const content = await fsPromises.readFile(eventsPath, 'utf-8');
|
|
234
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
235
|
+
const events = [];
|
|
236
|
+
for (const line of lines) {
|
|
237
|
+
try {
|
|
238
|
+
const raw = JSON.parse(line);
|
|
239
|
+
const event = SessionEventSchema.parse(raw);
|
|
240
|
+
events.push(event);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Skip invalid lines
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// AC-4: Sort by sequence number
|
|
247
|
+
return events.sort((a, b) => a.seq - b.seq);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Read events within a time range.
|
|
255
|
+
*
|
|
256
|
+
* @param specDir - The .kspec directory path
|
|
257
|
+
* @param sessionId - Session ID
|
|
258
|
+
* @param since - Start timestamp (inclusive)
|
|
259
|
+
* @param until - End timestamp (inclusive)
|
|
260
|
+
* @returns Array of events within the time range
|
|
261
|
+
*/
|
|
262
|
+
export async function readEventsSince(specDir, sessionId, since, until) {
|
|
263
|
+
const events = await readEvents(specDir, sessionId);
|
|
264
|
+
return events.filter(e => {
|
|
265
|
+
if (e.ts < since)
|
|
266
|
+
return false;
|
|
267
|
+
if (until !== undefined && e.ts > until)
|
|
268
|
+
return false;
|
|
269
|
+
return true;
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get the last event in a session.
|
|
274
|
+
*
|
|
275
|
+
* @param specDir - The .kspec directory path
|
|
276
|
+
* @param sessionId - Session ID
|
|
277
|
+
* @returns The last event or null if no events
|
|
278
|
+
*/
|
|
279
|
+
export async function getLastEvent(specDir, sessionId) {
|
|
280
|
+
const events = await readEvents(specDir, sessionId);
|
|
281
|
+
if (events.length === 0) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
return events[events.length - 1];
|
|
285
|
+
}
|
|
286
|
+
// ─── Context Snapshots ───────────────────────────────────────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Save session context snapshot for a given iteration.
|
|
289
|
+
*
|
|
290
|
+
* This creates an audit trail of what context the agent saw at each iteration,
|
|
291
|
+
* useful for debugging and reviewing agent behavior.
|
|
292
|
+
*
|
|
293
|
+
* @param specDir - The .kspec directory path
|
|
294
|
+
* @param sessionId - Session ID
|
|
295
|
+
* @param iteration - Iteration number
|
|
296
|
+
* @param context - The session context data
|
|
297
|
+
*/
|
|
298
|
+
export async function saveSessionContext(specDir, sessionId, iteration, context) {
|
|
299
|
+
const sessionDir = getSessionDir(specDir, sessionId);
|
|
300
|
+
const contextPath = getSessionContextPath(specDir, sessionId, iteration);
|
|
301
|
+
// Ensure session directory exists
|
|
302
|
+
await fsPromises.mkdir(sessionDir, { recursive: true });
|
|
303
|
+
// Write context snapshot as pretty JSON
|
|
304
|
+
const content = JSON.stringify(context, null, 2);
|
|
305
|
+
await fsPromises.writeFile(contextPath, content, 'utf-8');
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Read session context snapshot for a given iteration.
|
|
309
|
+
*
|
|
310
|
+
* @param specDir - The .kspec directory path
|
|
311
|
+
* @param sessionId - Session ID
|
|
312
|
+
* @param iteration - Iteration number
|
|
313
|
+
* @returns The context snapshot or null if not found
|
|
314
|
+
*/
|
|
315
|
+
export async function readSessionContext(specDir, sessionId, iteration) {
|
|
316
|
+
const contextPath = getSessionContextPath(specDir, sessionId, iteration);
|
|
317
|
+
try {
|
|
318
|
+
const content = await fsPromises.readFile(contextPath, 'utf-8');
|
|
319
|
+
return JSON.parse(content);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/sessions/store.ts"],"names":[],"mappings":"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"}
|