@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.
Files changed (278) hide show
  1. package/README.md +263 -0
  2. package/dist/acp/client.d.ts +159 -0
  3. package/dist/acp/client.d.ts.map +1 -0
  4. package/dist/acp/client.js +255 -0
  5. package/dist/acp/client.js.map +1 -0
  6. package/dist/acp/framing.d.ts +119 -0
  7. package/dist/acp/framing.d.ts.map +1 -0
  8. package/dist/acp/framing.js +302 -0
  9. package/dist/acp/framing.js.map +1 -0
  10. package/dist/acp/index.d.ts +14 -0
  11. package/dist/acp/index.d.ts.map +1 -0
  12. package/dist/acp/index.js +13 -0
  13. package/dist/acp/index.js.map +1 -0
  14. package/dist/acp/types.d.ts +89 -0
  15. package/dist/acp/types.d.ts.map +1 -0
  16. package/dist/acp/types.js +99 -0
  17. package/dist/acp/types.js.map +1 -0
  18. package/dist/agents/adapters.d.ts +55 -0
  19. package/dist/agents/adapters.d.ts.map +1 -0
  20. package/dist/agents/adapters.js +84 -0
  21. package/dist/agents/adapters.js.map +1 -0
  22. package/dist/agents/index.d.ts +8 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +10 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/spawner.d.ts +53 -0
  27. package/dist/agents/spawner.d.ts.map +1 -0
  28. package/dist/agents/spawner.js +83 -0
  29. package/dist/agents/spawner.js.map +1 -0
  30. package/dist/cli/batch.d.ts +82 -0
  31. package/dist/cli/batch.d.ts.map +1 -0
  32. package/dist/cli/batch.js +162 -0
  33. package/dist/cli/batch.js.map +1 -0
  34. package/dist/cli/commands/clone-for-testing.d.ts +6 -0
  35. package/dist/cli/commands/clone-for-testing.d.ts.map +1 -0
  36. package/dist/cli/commands/clone-for-testing.js +176 -0
  37. package/dist/cli/commands/clone-for-testing.js.map +1 -0
  38. package/dist/cli/commands/derive.d.ts +6 -0
  39. package/dist/cli/commands/derive.d.ts.map +1 -0
  40. package/dist/cli/commands/derive.js +450 -0
  41. package/dist/cli/commands/derive.js.map +1 -0
  42. package/dist/cli/commands/help.d.ts +6 -0
  43. package/dist/cli/commands/help.d.ts.map +1 -0
  44. package/dist/cli/commands/help.js +196 -0
  45. package/dist/cli/commands/help.js.map +1 -0
  46. package/dist/cli/commands/inbox.d.ts +6 -0
  47. package/dist/cli/commands/inbox.d.ts.map +1 -0
  48. package/dist/cli/commands/inbox.js +235 -0
  49. package/dist/cli/commands/inbox.js.map +1 -0
  50. package/dist/cli/commands/index.d.ts +20 -0
  51. package/dist/cli/commands/index.d.ts.map +1 -0
  52. package/dist/cli/commands/index.js +21 -0
  53. package/dist/cli/commands/index.js.map +1 -0
  54. package/dist/cli/commands/init.d.ts +6 -0
  55. package/dist/cli/commands/init.d.ts.map +1 -0
  56. package/dist/cli/commands/init.js +245 -0
  57. package/dist/cli/commands/init.js.map +1 -0
  58. package/dist/cli/commands/item.d.ts +6 -0
  59. package/dist/cli/commands/item.d.ts.map +1 -0
  60. package/dist/cli/commands/item.js +1311 -0
  61. package/dist/cli/commands/item.js.map +1 -0
  62. package/dist/cli/commands/link.d.ts +6 -0
  63. package/dist/cli/commands/link.d.ts.map +1 -0
  64. package/dist/cli/commands/link.js +288 -0
  65. package/dist/cli/commands/link.js.map +1 -0
  66. package/dist/cli/commands/log.d.ts +16 -0
  67. package/dist/cli/commands/log.d.ts.map +1 -0
  68. package/dist/cli/commands/log.js +291 -0
  69. package/dist/cli/commands/log.js.map +1 -0
  70. package/dist/cli/commands/meta.d.ts +15 -0
  71. package/dist/cli/commands/meta.d.ts.map +1 -0
  72. package/dist/cli/commands/meta.js +1378 -0
  73. package/dist/cli/commands/meta.js.map +1 -0
  74. package/dist/cli/commands/module.d.ts +6 -0
  75. package/dist/cli/commands/module.d.ts.map +1 -0
  76. package/dist/cli/commands/module.js +102 -0
  77. package/dist/cli/commands/module.js.map +1 -0
  78. package/dist/cli/commands/ralph.d.ts +9 -0
  79. package/dist/cli/commands/ralph.d.ts.map +1 -0
  80. package/dist/cli/commands/ralph.js +465 -0
  81. package/dist/cli/commands/ralph.js.map +1 -0
  82. package/dist/cli/commands/search.d.ts +6 -0
  83. package/dist/cli/commands/search.d.ts.map +1 -0
  84. package/dist/cli/commands/search.js +134 -0
  85. package/dist/cli/commands/search.js.map +1 -0
  86. package/dist/cli/commands/session.d.ts +164 -0
  87. package/dist/cli/commands/session.d.ts.map +1 -0
  88. package/dist/cli/commands/session.js +745 -0
  89. package/dist/cli/commands/session.js.map +1 -0
  90. package/dist/cli/commands/setup.d.ts +26 -0
  91. package/dist/cli/commands/setup.d.ts.map +1 -0
  92. package/dist/cli/commands/setup.js +586 -0
  93. package/dist/cli/commands/setup.js.map +1 -0
  94. package/dist/cli/commands/shadow.d.ts +6 -0
  95. package/dist/cli/commands/shadow.d.ts.map +1 -0
  96. package/dist/cli/commands/shadow.js +299 -0
  97. package/dist/cli/commands/shadow.js.map +1 -0
  98. package/dist/cli/commands/task.d.ts +6 -0
  99. package/dist/cli/commands/task.d.ts.map +1 -0
  100. package/dist/cli/commands/task.js +1514 -0
  101. package/dist/cli/commands/task.js.map +1 -0
  102. package/dist/cli/commands/tasks.d.ts +6 -0
  103. package/dist/cli/commands/tasks.d.ts.map +1 -0
  104. package/dist/cli/commands/tasks.js +347 -0
  105. package/dist/cli/commands/tasks.js.map +1 -0
  106. package/dist/cli/commands/trait.d.ts +10 -0
  107. package/dist/cli/commands/trait.d.ts.map +1 -0
  108. package/dist/cli/commands/trait.js +295 -0
  109. package/dist/cli/commands/trait.js.map +1 -0
  110. package/dist/cli/commands/validate.d.ts +6 -0
  111. package/dist/cli/commands/validate.d.ts.map +1 -0
  112. package/dist/cli/commands/validate.js +626 -0
  113. package/dist/cli/commands/validate.js.map +1 -0
  114. package/dist/cli/exit-codes.d.ts +62 -0
  115. package/dist/cli/exit-codes.d.ts.map +1 -0
  116. package/dist/cli/exit-codes.js +65 -0
  117. package/dist/cli/exit-codes.js.map +1 -0
  118. package/dist/cli/help/content.d.ts +35 -0
  119. package/dist/cli/help/content.d.ts.map +1 -0
  120. package/dist/cli/help/content.js +312 -0
  121. package/dist/cli/help/content.js.map +1 -0
  122. package/dist/cli/index.d.ts +5 -0
  123. package/dist/cli/index.d.ts.map +1 -0
  124. package/dist/cli/index.js +85 -0
  125. package/dist/cli/index.js.map +1 -0
  126. package/dist/cli/introspection.d.ts +87 -0
  127. package/dist/cli/introspection.d.ts.map +1 -0
  128. package/dist/cli/introspection.js +127 -0
  129. package/dist/cli/introspection.js.map +1 -0
  130. package/dist/cli/output.d.ts +56 -0
  131. package/dist/cli/output.d.ts.map +1 -0
  132. package/dist/cli/output.js +467 -0
  133. package/dist/cli/output.js.map +1 -0
  134. package/dist/cli/suggest.d.ts +16 -0
  135. package/dist/cli/suggest.d.ts.map +1 -0
  136. package/dist/cli/suggest.js +72 -0
  137. package/dist/cli/suggest.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +5 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/parser/alignment.d.ts +113 -0
  143. package/dist/parser/alignment.d.ts.map +1 -0
  144. package/dist/parser/alignment.js +261 -0
  145. package/dist/parser/alignment.js.map +1 -0
  146. package/dist/parser/assess.d.ts +81 -0
  147. package/dist/parser/assess.d.ts.map +1 -0
  148. package/dist/parser/assess.js +197 -0
  149. package/dist/parser/assess.js.map +1 -0
  150. package/dist/parser/convention-validation.d.ts +48 -0
  151. package/dist/parser/convention-validation.d.ts.map +1 -0
  152. package/dist/parser/convention-validation.js +167 -0
  153. package/dist/parser/convention-validation.js.map +1 -0
  154. package/dist/parser/fix.d.ts +38 -0
  155. package/dist/parser/fix.d.ts.map +1 -0
  156. package/dist/parser/fix.js +185 -0
  157. package/dist/parser/fix.js.map +1 -0
  158. package/dist/parser/index.d.ts +12 -0
  159. package/dist/parser/index.d.ts.map +1 -0
  160. package/dist/parser/index.js +13 -0
  161. package/dist/parser/index.js.map +1 -0
  162. package/dist/parser/items.d.ts +138 -0
  163. package/dist/parser/items.d.ts.map +1 -0
  164. package/dist/parser/items.js +321 -0
  165. package/dist/parser/items.js.map +1 -0
  166. package/dist/parser/meta.d.ts +120 -0
  167. package/dist/parser/meta.d.ts.map +1 -0
  168. package/dist/parser/meta.js +441 -0
  169. package/dist/parser/meta.js.map +1 -0
  170. package/dist/parser/refs.d.ts +185 -0
  171. package/dist/parser/refs.d.ts.map +1 -0
  172. package/dist/parser/refs.js +404 -0
  173. package/dist/parser/refs.js.map +1 -0
  174. package/dist/parser/shadow.d.ts +253 -0
  175. package/dist/parser/shadow.d.ts.map +1 -0
  176. package/dist/parser/shadow.js +1053 -0
  177. package/dist/parser/shadow.js.map +1 -0
  178. package/dist/parser/traits.d.ts +72 -0
  179. package/dist/parser/traits.d.ts.map +1 -0
  180. package/dist/parser/traits.js +120 -0
  181. package/dist/parser/traits.js.map +1 -0
  182. package/dist/parser/validate.d.ts +89 -0
  183. package/dist/parser/validate.d.ts.map +1 -0
  184. package/dist/parser/validate.js +817 -0
  185. package/dist/parser/validate.js.map +1 -0
  186. package/dist/parser/yaml.d.ts +326 -0
  187. package/dist/parser/yaml.d.ts.map +1 -0
  188. package/dist/parser/yaml.js +1383 -0
  189. package/dist/parser/yaml.js.map +1 -0
  190. package/dist/ralph/cli-renderer.d.ts +20 -0
  191. package/dist/ralph/cli-renderer.d.ts.map +1 -0
  192. package/dist/ralph/cli-renderer.js +179 -0
  193. package/dist/ralph/cli-renderer.js.map +1 -0
  194. package/dist/ralph/events.d.ts +65 -0
  195. package/dist/ralph/events.d.ts.map +1 -0
  196. package/dist/ralph/events.js +397 -0
  197. package/dist/ralph/events.js.map +1 -0
  198. package/dist/ralph/index.d.ts +8 -0
  199. package/dist/ralph/index.d.ts.map +1 -0
  200. package/dist/ralph/index.js +10 -0
  201. package/dist/ralph/index.js.map +1 -0
  202. package/dist/schema/common.d.ts +46 -0
  203. package/dist/schema/common.d.ts.map +1 -0
  204. package/dist/schema/common.js +71 -0
  205. package/dist/schema/common.js.map +1 -0
  206. package/dist/schema/inbox.d.ts +90 -0
  207. package/dist/schema/inbox.d.ts.map +1 -0
  208. package/dist/schema/inbox.js +30 -0
  209. package/dist/schema/inbox.js.map +1 -0
  210. package/dist/schema/index.d.ts +6 -0
  211. package/dist/schema/index.d.ts.map +1 -0
  212. package/dist/schema/index.js +7 -0
  213. package/dist/schema/index.js.map +1 -0
  214. package/dist/schema/meta.d.ts +762 -0
  215. package/dist/schema/meta.d.ts.map +1 -0
  216. package/dist/schema/meta.js +144 -0
  217. package/dist/schema/meta.js.map +1 -0
  218. package/dist/schema/spec.d.ts +912 -0
  219. package/dist/schema/spec.d.ts.map +1 -0
  220. package/dist/schema/spec.js +104 -0
  221. package/dist/schema/spec.js.map +1 -0
  222. package/dist/schema/task.d.ts +664 -0
  223. package/dist/schema/task.d.ts.map +1 -0
  224. package/dist/schema/task.js +130 -0
  225. package/dist/schema/task.js.map +1 -0
  226. package/dist/sessions/index.d.ts +11 -0
  227. package/dist/sessions/index.d.ts.map +1 -0
  228. package/dist/sessions/index.js +13 -0
  229. package/dist/sessions/index.js.map +1 -0
  230. package/dist/sessions/store.d.ts +144 -0
  231. package/dist/sessions/store.d.ts.map +1 -0
  232. package/dist/sessions/store.js +325 -0
  233. package/dist/sessions/store.js.map +1 -0
  234. package/dist/sessions/types.d.ts +157 -0
  235. package/dist/sessions/types.d.ts.map +1 -0
  236. package/dist/sessions/types.js +90 -0
  237. package/dist/sessions/types.js.map +1 -0
  238. package/dist/strings/errors.d.ts +420 -0
  239. package/dist/strings/errors.d.ts.map +1 -0
  240. package/dist/strings/errors.js +282 -0
  241. package/dist/strings/errors.js.map +1 -0
  242. package/dist/strings/guidance.d.ts +65 -0
  243. package/dist/strings/guidance.d.ts.map +1 -0
  244. package/dist/strings/guidance.js +66 -0
  245. package/dist/strings/guidance.js.map +1 -0
  246. package/dist/strings/index.d.ts +12 -0
  247. package/dist/strings/index.d.ts.map +1 -0
  248. package/dist/strings/index.js +12 -0
  249. package/dist/strings/index.js.map +1 -0
  250. package/dist/strings/labels.d.ts +74 -0
  251. package/dist/strings/labels.d.ts.map +1 -0
  252. package/dist/strings/labels.js +75 -0
  253. package/dist/strings/labels.js.map +1 -0
  254. package/dist/strings/validation.d.ts +126 -0
  255. package/dist/strings/validation.d.ts.map +1 -0
  256. package/dist/strings/validation.js +135 -0
  257. package/dist/strings/validation.js.map +1 -0
  258. package/dist/utils/commit.d.ts +23 -0
  259. package/dist/utils/commit.d.ts.map +1 -0
  260. package/dist/utils/commit.js +67 -0
  261. package/dist/utils/commit.js.map +1 -0
  262. package/dist/utils/git.d.ts +57 -0
  263. package/dist/utils/git.d.ts.map +1 -0
  264. package/dist/utils/git.js +192 -0
  265. package/dist/utils/git.js.map +1 -0
  266. package/dist/utils/grep.d.ts +28 -0
  267. package/dist/utils/grep.d.ts.map +1 -0
  268. package/dist/utils/grep.js +86 -0
  269. package/dist/utils/grep.js.map +1 -0
  270. package/dist/utils/index.d.ts +8 -0
  271. package/dist/utils/index.d.ts.map +1 -0
  272. package/dist/utils/index.js +6 -0
  273. package/dist/utils/index.js.map +1 -0
  274. package/dist/utils/time.d.ts +18 -0
  275. package/dist/utils/time.d.ts.map +1 -0
  276. package/dist/utils/time.js +61 -0
  277. package/dist/utils/time.js.map +1 -0
  278. 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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"}