@latchet/core 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 (49) hide show
  1. package/dist/src/diff.d.ts +15 -0
  2. package/dist/src/diff.d.ts.map +1 -0
  3. package/dist/src/diff.js +29 -0
  4. package/dist/src/diff.js.map +1 -0
  5. package/dist/src/errors.d.ts +4 -0
  6. package/dist/src/errors.d.ts.map +1 -0
  7. package/dist/src/errors.js +7 -0
  8. package/dist/src/errors.js.map +1 -0
  9. package/dist/src/exporters.d.ts +4 -0
  10. package/dist/src/exporters.d.ts.map +1 -0
  11. package/dist/src/exporters.js +16 -0
  12. package/dist/src/exporters.js.map +1 -0
  13. package/dist/src/git.d.ts +3 -0
  14. package/dist/src/git.d.ts.map +1 -0
  15. package/dist/src/git.js +29 -0
  16. package/dist/src/git.js.map +1 -0
  17. package/dist/src/importers.d.ts +4 -0
  18. package/dist/src/importers.d.ts.map +1 -0
  19. package/dist/src/importers.js +35 -0
  20. package/dist/src/importers.js.map +1 -0
  21. package/dist/src/index.d.ts +11 -0
  22. package/dist/src/index.d.ts.map +1 -0
  23. package/dist/src/index.js +11 -0
  24. package/dist/src/index.js.map +1 -0
  25. package/dist/src/markdown.d.ts +3 -0
  26. package/dist/src/markdown.d.ts.map +1 -0
  27. package/dist/src/markdown.js +69 -0
  28. package/dist/src/markdown.js.map +1 -0
  29. package/dist/src/projector.d.ts +3 -0
  30. package/dist/src/projector.d.ts.map +1 -0
  31. package/dist/src/projector.js +89 -0
  32. package/dist/src/projector.js.map +1 -0
  33. package/dist/src/redact.d.ts +10 -0
  34. package/dist/src/redact.d.ts.map +1 -0
  35. package/dist/src/redact.js +223 -0
  36. package/dist/src/redact.js.map +1 -0
  37. package/dist/src/store.d.ts +44 -0
  38. package/dist/src/store.d.ts.map +1 -0
  39. package/dist/src/store.js +273 -0
  40. package/dist/src/store.js.map +1 -0
  41. package/dist/src/utils.d.ts +14 -0
  42. package/dist/src/utils.d.ts.map +1 -0
  43. package/dist/src/utils.js +78 -0
  44. package/dist/src/utils.js.map +1 -0
  45. package/dist/src/verify.d.ts +3 -0
  46. package/dist/src/verify.d.ts.map +1 -0
  47. package/dist/src/verify.js +33 -0
  48. package/dist/src/verify.js.map +1 -0
  49. package/package.json +28 -0
@@ -0,0 +1,223 @@
1
+ function resolveOptions(state, options) {
2
+ return {
3
+ ...options,
4
+ pathValues: [
5
+ state.task.workspace_root,
6
+ state.task.git?.root,
7
+ ...state.artifact_refs.map((event) => event.payload.path)
8
+ ].filter((value) => Boolean(value)),
9
+ revisionValues: [
10
+ state.task.git?.commit,
11
+ ...state.artifact_refs.map((event) => event.payload.revision)
12
+ ].filter((value) => Boolean(value))
13
+ };
14
+ }
15
+ function redactText(value, options) {
16
+ let result = value;
17
+ if (options.removePaths) {
18
+ for (const path of [...(options.pathValues ?? [])].sort((a, b) => b.length - a.length)) {
19
+ result = result.split(path).join("[REDACTED_PATH]");
20
+ }
21
+ }
22
+ if (options.removeRevisions) {
23
+ for (const revision of options.revisionValues ?? []) {
24
+ result = result.split(revision).join("[REDACTED_REVISION]");
25
+ }
26
+ }
27
+ if (options.maskSecrets) {
28
+ result = result
29
+ .replace(/\b(sk|pk|ghp|github_pat)_[A-Za-z0-9_]+\b/g, "[REDACTED_TOKEN]")
30
+ .replace(/\b[A-Z0-9]{20,}\b/g, "[REDACTED_SECRET]");
31
+ }
32
+ return result;
33
+ }
34
+ export function redactState(state, options) {
35
+ const resolved = resolveOptions(state, options);
36
+ return {
37
+ ...state,
38
+ task: {
39
+ ...state.task,
40
+ workspace_root: options.removePaths ? "[REDACTED_PATH]" : state.task.workspace_root,
41
+ git: state.task.git
42
+ ? {
43
+ ...state.task.git,
44
+ root: options.removePaths ? "[REDACTED_PATH]" : state.task.git.root,
45
+ commit: options.removeRevisions ? undefined : state.task.git.commit
46
+ }
47
+ : undefined
48
+ },
49
+ active_decisions: state.active_decisions.map((event) => ({
50
+ ...event,
51
+ payload: {
52
+ ...event.payload,
53
+ summary: redactText(event.payload.summary, resolved),
54
+ reason: options.removeReasons ? undefined : redactText(event.payload.reason ?? "", resolved) || undefined
55
+ }
56
+ })),
57
+ recent_failures: state.recent_failures.map((event) => ({
58
+ ...event,
59
+ payload: {
60
+ ...event.payload,
61
+ summary: redactText(event.payload.summary, resolved),
62
+ error: redactText(event.payload.error ?? "", resolved) || undefined,
63
+ suspected_cause: redactText(event.payload.suspected_cause ?? "", resolved) || undefined
64
+ }
65
+ })),
66
+ active_env_quirks: state.active_env_quirks.map((event) => ({
67
+ ...event,
68
+ payload: {
69
+ ...event.payload,
70
+ summary: redactText(event.payload.summary, resolved),
71
+ impact: redactText(event.payload.impact ?? "", resolved) || undefined,
72
+ workaround: redactText(event.payload.workaround ?? "", resolved) || undefined
73
+ }
74
+ })),
75
+ open_questions: state.open_questions.map((event) => ({
76
+ ...event,
77
+ payload: {
78
+ ...event.payload,
79
+ question: redactText(event.payload.question, resolved)
80
+ }
81
+ })),
82
+ next_action: state.next_action
83
+ ? {
84
+ ...state.next_action,
85
+ payload: {
86
+ ...state.next_action.payload,
87
+ summary: redactText(state.next_action.payload.summary, resolved)
88
+ }
89
+ }
90
+ : null,
91
+ artifact_refs: state.artifact_refs.map((event) => ({
92
+ ...event,
93
+ payload: {
94
+ ...event.payload,
95
+ path: options.removePaths ? "[REDACTED_PATH]" : event.payload.path,
96
+ revision: options.removeRevisions ? undefined : event.payload.revision
97
+ }
98
+ })),
99
+ notes: state.notes.map((event) => ({
100
+ ...event,
101
+ payload: {
102
+ summary: redactText(event.payload.summary, resolved)
103
+ }
104
+ })),
105
+ freshness: state.freshness
106
+ ? {
107
+ ...state.freshness,
108
+ checks: state.freshness.checks.map((check) => ({
109
+ ...check,
110
+ message: redactText(check.message, resolved)
111
+ }))
112
+ }
113
+ : undefined
114
+ };
115
+ }
116
+ function redactEvent(event, options) {
117
+ const type = event.type;
118
+ const payload = { ...event.payload };
119
+ if (type === "decision") {
120
+ if ("summary" in payload && typeof payload.summary === "string") {
121
+ payload.summary = redactText(payload.summary, options);
122
+ }
123
+ if ("reason" in payload && typeof payload.reason === "string") {
124
+ payload.reason = options.removeReasons ? undefined : redactText(payload.reason, options);
125
+ }
126
+ }
127
+ else if (type === "attempt") {
128
+ if ("summary" in payload && typeof payload.summary === "string") {
129
+ payload.summary = redactText(payload.summary, options);
130
+ }
131
+ }
132
+ else if (type === "failure") {
133
+ if ("summary" in payload && typeof payload.summary === "string") {
134
+ payload.summary = redactText(payload.summary, options);
135
+ }
136
+ if ("error" in payload && typeof payload.error === "string") {
137
+ payload.error = redactText(payload.error, options);
138
+ }
139
+ if ("suspected_cause" in payload && typeof payload.suspected_cause === "string") {
140
+ payload.suspected_cause = redactText(payload.suspected_cause, options);
141
+ }
142
+ }
143
+ else if (type === "env_quirk") {
144
+ if ("summary" in payload && typeof payload.summary === "string") {
145
+ payload.summary = redactText(payload.summary, options);
146
+ }
147
+ if ("impact" in payload && typeof payload.impact === "string") {
148
+ payload.impact = redactText(payload.impact, options);
149
+ }
150
+ if ("workaround" in payload && typeof payload.workaround === "string") {
151
+ payload.workaround = redactText(payload.workaround, options);
152
+ }
153
+ }
154
+ else if (type === "constraint") {
155
+ if ("summary" in payload && typeof payload.summary === "string") {
156
+ payload.summary = redactText(payload.summary, options);
157
+ }
158
+ }
159
+ else if (type === "artifact_ref") {
160
+ if ("path" in payload && typeof payload.path === "string") {
161
+ payload.path = options.removePaths ? "[REDACTED_PATH]" : payload.path;
162
+ }
163
+ if ("revision" in payload && typeof payload.revision === "string") {
164
+ payload.revision = options.removeRevisions ? undefined : payload.revision;
165
+ }
166
+ }
167
+ else if (type === "open_question") {
168
+ if ("question" in payload && typeof payload.question === "string") {
169
+ payload.question = redactText(payload.question, options);
170
+ }
171
+ }
172
+ else if (type === "next_action") {
173
+ if ("summary" in payload && typeof payload.summary === "string") {
174
+ payload.summary = redactText(payload.summary, options);
175
+ }
176
+ }
177
+ else if (type === "note") {
178
+ if ("summary" in payload && typeof payload.summary === "string") {
179
+ payload.summary = redactText(payload.summary, options);
180
+ }
181
+ }
182
+ else if (type === "evidence") {
183
+ if ("summary" in payload && typeof payload.summary === "string") {
184
+ payload.summary = redactText(payload.summary, options);
185
+ }
186
+ if ("details" in payload && typeof payload.details === "string") {
187
+ payload.details = redactText(payload.details, options);
188
+ }
189
+ }
190
+ else if (type === "status_change") {
191
+ if ("reason" in payload && typeof payload.reason === "string") {
192
+ payload.reason = options.removeReasons ? undefined : redactText(payload.reason, options);
193
+ }
194
+ }
195
+ // Clean undefined fields so they match original expectations
196
+ const payloadObj = payload;
197
+ for (const key of Object.keys(payloadObj)) {
198
+ if (payloadObj[key] === undefined) {
199
+ delete payloadObj[key];
200
+ }
201
+ }
202
+ return {
203
+ ...event,
204
+ source: {
205
+ ...event.source,
206
+ reference: typeof event.source.reference === "string"
207
+ ? redactText(event.source.reference, options)
208
+ : event.source.reference
209
+ },
210
+ payload
211
+ };
212
+ }
213
+ export function redactHandoff(pack, options) {
214
+ const resolved = resolveOptions(pack.state, options);
215
+ const state = redactState(pack.state, options);
216
+ return {
217
+ ...pack,
218
+ task: state.task,
219
+ state,
220
+ events: pack.events?.map((event) => redactEvent(event, resolved))
221
+ };
222
+ }
223
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type EventPayload, type LedgerEvent, type ProjectConfig, type TaskMetadata, type TaskState } from "@latchet/spec";
2
+ import { createHandoffPack } from "./exporters.js";
3
+ import { type RedactionOptions } from "./redact.js";
4
+ export interface LedgerPaths {
5
+ workspaceRoot: string;
6
+ ledgerRoot: string;
7
+ tasksRoot: string;
8
+ projectFile: string;
9
+ }
10
+ export interface CreateTaskInput {
11
+ id: string;
12
+ title: string;
13
+ goal: string;
14
+ status?: TaskMetadata["status"];
15
+ }
16
+ export interface AppendEventInput<TPayload extends EventPayload = EventPayload> {
17
+ task_id?: string;
18
+ type: LedgerEvent["type"];
19
+ payload: TPayload;
20
+ actor?: LedgerEvent["actor"];
21
+ source?: LedgerEvent["source"];
22
+ supersedes?: string[];
23
+ refs?: LedgerEvent["refs"];
24
+ verification?: LedgerEvent["verification"];
25
+ redaction?: LedgerEvent["redaction"];
26
+ id?: string;
27
+ timestamp?: string;
28
+ }
29
+ export declare function getLedgerPaths(workspaceRoot?: string): LedgerPaths;
30
+ export declare function ensureProject(workspaceRoot?: string, projectName?: string): ProjectConfig;
31
+ export declare function readProject(workspaceRoot?: string): ProjectConfig;
32
+ export declare function listTasks(workspaceRoot?: string): string[];
33
+ export declare function createTask(workspaceRoot: string, input: CreateTaskInput): TaskState;
34
+ export declare function readTaskState(workspaceRoot: string, taskId: string, bypassIntegrity?: boolean): TaskState;
35
+ export declare function readTaskEvents(workspaceRoot: string, taskId: string): LedgerEvent[];
36
+ export declare function getCurrentTaskId(workspaceRoot?: string): string;
37
+ export declare function selectTask(workspaceRoot: string, taskId: string): void;
38
+ export declare function appendEvent(workspaceRoot: string, input: AppendEventInput): TaskState;
39
+ export declare function deriveAndPersist(workspaceRoot: string, taskId: string): TaskState;
40
+ export declare function getCurrentTaskState(workspaceRoot?: string): TaskState;
41
+ export declare function exportTask(workspaceRoot: string, taskId: string, includeEvents?: boolean, redactionOptions?: RedactionOptions): ReturnType<typeof createHandoffPack>;
42
+ export declare function importTaskData(workspaceRoot: string, taskId: string, data: unknown): TaskState;
43
+ export declare function redactTaskState(workspaceRoot: string, taskId: string, options: RedactionOptions): TaskState;
44
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { Ajv2020 } from "ajv/dist/2020.js";
4
+ import { TASK_LEDGER_VERSION, taskLedgerSchema } from "@latchet/spec";
5
+ import { LedgerError } from "./errors.js";
6
+ import { createHandoffPack } from "./exporters.js";
7
+ import { getGitSnapshot } from "./git.js";
8
+ import { stateToSyntheticEvents } from "./importers.js";
9
+ import { renderStateMarkdown } from "./markdown.js";
10
+ import { deriveTaskState } from "./projector.js";
11
+ import { redactState, redactHandoff } from "./redact.js";
12
+ import { verifyTaskFreshness } from "./verify.js";
13
+ import { appendJsonLine, computeFileHash, createId, ensureDir, fileExists, listDirectories, nowIso, readJson, readJsonLines, writeJson } from "./utils.js";
14
+ const LEDGER_DIR = ".taskledger";
15
+ const ajv = new Ajv2020({
16
+ allErrors: true,
17
+ strict: false,
18
+ validateFormats: false
19
+ });
20
+ const validateEvent = ajv.compile(taskLedgerSchema);
21
+ function taskDir(paths, taskId) {
22
+ return join(paths.tasksRoot, taskId);
23
+ }
24
+ function taskEventsFile(paths, taskId) {
25
+ return join(taskDir(paths, taskId), "events.jsonl");
26
+ }
27
+ function taskStateJsonFile(paths, taskId) {
28
+ return join(taskDir(paths, taskId), "state.json");
29
+ }
30
+ function taskStateMarkdownFile(paths, taskId) {
31
+ return join(taskDir(paths, taskId), "state.md");
32
+ }
33
+ function taskAttachmentsDir(paths, taskId) {
34
+ return join(taskDir(paths, taskId), "attachments");
35
+ }
36
+ export function getLedgerPaths(workspaceRoot = process.cwd()) {
37
+ const resolvedRoot = resolve(workspaceRoot);
38
+ const ledgerRoot = join(resolvedRoot, LEDGER_DIR);
39
+ return {
40
+ workspaceRoot: resolvedRoot,
41
+ ledgerRoot,
42
+ tasksRoot: join(ledgerRoot, "tasks"),
43
+ projectFile: join(ledgerRoot, "project.json")
44
+ };
45
+ }
46
+ export function ensureProject(workspaceRoot = process.cwd(), projectName) {
47
+ const paths = getLedgerPaths(workspaceRoot);
48
+ ensureDir(paths.tasksRoot);
49
+ if (!fileExists(paths.projectFile)) {
50
+ const project = {
51
+ version: TASK_LEDGER_VERSION,
52
+ created_at: nowIso(),
53
+ project_name: projectName
54
+ };
55
+ writeJson(paths.projectFile, project);
56
+ return project;
57
+ }
58
+ return readJson(paths.projectFile);
59
+ }
60
+ export function readProject(workspaceRoot = process.cwd()) {
61
+ const paths = getLedgerPaths(workspaceRoot);
62
+ if (!fileExists(paths.projectFile)) {
63
+ throw new LedgerError("No task ledger found. Run `latchet init` first.");
64
+ }
65
+ return readJson(paths.projectFile);
66
+ }
67
+ function writeProject(workspaceRoot, project) {
68
+ const paths = getLedgerPaths(workspaceRoot);
69
+ writeJson(paths.projectFile, project);
70
+ }
71
+ export function listTasks(workspaceRoot = process.cwd()) {
72
+ const paths = getLedgerPaths(workspaceRoot);
73
+ return listDirectories(paths.tasksRoot);
74
+ }
75
+ export function createTask(workspaceRoot, input) {
76
+ const project = ensureProject(workspaceRoot);
77
+ const paths = getLedgerPaths(workspaceRoot);
78
+ const dir = taskDir(paths, input.id);
79
+ if (existsSync(dir)) {
80
+ throw new LedgerError(`Task already exists: ${input.id}`);
81
+ }
82
+ mkdirSync(dir, { recursive: true });
83
+ mkdirSync(taskAttachmentsDir(paths, input.id), { recursive: true });
84
+ const eventsFile = taskEventsFile(paths, input.id);
85
+ const initialTask = {
86
+ id: input.id,
87
+ title: input.title,
88
+ goal: input.goal,
89
+ status: input.status ?? "in_progress",
90
+ created_at: nowIso(),
91
+ updated_at: nowIso(),
92
+ workspace_root: resolve(workspaceRoot),
93
+ git: getGitSnapshot(workspaceRoot)
94
+ };
95
+ const state = deriveTaskState(initialTask, []);
96
+ const verified = {
97
+ ...state,
98
+ freshness: verifyTaskFreshness(workspaceRoot, state)
99
+ };
100
+ writeFileSync(eventsFile, "", "utf8");
101
+ const finalState = writeTaskState(workspaceRoot, input.id, verified);
102
+ writeProject(workspaceRoot, {
103
+ ...project,
104
+ current_task_id: input.id
105
+ });
106
+ return finalState;
107
+ }
108
+ export function readTaskState(workspaceRoot, taskId, bypassIntegrity = false) {
109
+ const paths = getLedgerPaths(workspaceRoot);
110
+ const statePath = taskStateJsonFile(paths, taskId);
111
+ if (!fileExists(statePath)) {
112
+ throw new LedgerError(`Task state not found for ${taskId}`);
113
+ }
114
+ const state = readJson(statePath);
115
+ if (!bypassIntegrity) {
116
+ const eventsPath = taskEventsFile(paths, taskId);
117
+ const currentHash = computeFileHash(eventsPath);
118
+ const storedHash = state.integrity?.event_log_hash;
119
+ if (currentHash !== storedHash) {
120
+ return deriveAndPersist(workspaceRoot, taskId);
121
+ }
122
+ }
123
+ return state;
124
+ }
125
+ export function readTaskEvents(workspaceRoot, taskId) {
126
+ return readJsonLines(taskEventsFile(getLedgerPaths(workspaceRoot), taskId));
127
+ }
128
+ function writeTaskState(workspaceRoot, taskId, state) {
129
+ const paths = getLedgerPaths(workspaceRoot);
130
+ const eventsFile = taskEventsFile(paths, taskId);
131
+ const hash = computeFileHash(eventsFile);
132
+ const stateWithHash = {
133
+ ...state,
134
+ integrity: {
135
+ event_log_hash: hash
136
+ }
137
+ };
138
+ writeJson(taskStateJsonFile(paths, taskId), stateWithHash);
139
+ writeFileSync(taskStateMarkdownFile(paths, taskId), `${renderStateMarkdown(stateWithHash)}\n`, "utf8");
140
+ return stateWithHash;
141
+ }
142
+ function assertValidEvent(event) {
143
+ if (!validateEvent(event)) {
144
+ const message = ajv.errorsText(validateEvent.errors);
145
+ throw new LedgerError(`Invalid event: ${message}`);
146
+ }
147
+ }
148
+ function currentTaskId(workspaceRoot) {
149
+ const project = readProject(workspaceRoot);
150
+ if (!project.current_task_id) {
151
+ throw new LedgerError("No current task is selected.");
152
+ }
153
+ return project.current_task_id;
154
+ }
155
+ export function getCurrentTaskId(workspaceRoot = process.cwd()) {
156
+ return currentTaskId(workspaceRoot);
157
+ }
158
+ export function selectTask(workspaceRoot, taskId) {
159
+ const state = readTaskState(workspaceRoot, taskId);
160
+ const project = readProject(workspaceRoot);
161
+ writeProject(workspaceRoot, {
162
+ ...project,
163
+ current_task_id: state.task.id
164
+ });
165
+ }
166
+ export function appendEvent(workspaceRoot, input) {
167
+ const paths = getLedgerPaths(workspaceRoot);
168
+ const taskId = input.task_id || currentTaskId(workspaceRoot);
169
+ const event = {
170
+ id: input.id ?? createId(),
171
+ task_id: taskId,
172
+ timestamp: input.timestamp ?? nowIso(),
173
+ actor: input.actor ?? { kind: "user", name: "local-user" },
174
+ source: input.source ?? { kind: "cli", provider: "latchet" },
175
+ type: input.type,
176
+ payload: input.payload,
177
+ supersedes: input.supersedes,
178
+ refs: input.refs,
179
+ verification: input.verification ?? { status: "user_asserted" },
180
+ redaction: input.redaction
181
+ };
182
+ assertValidEvent(event);
183
+ appendJsonLine(taskEventsFile(paths, taskId), event);
184
+ return deriveAndPersist(workspaceRoot, taskId);
185
+ }
186
+ export function deriveAndPersist(workspaceRoot, taskId) {
187
+ const current = readTaskState(workspaceRoot, taskId, true);
188
+ const state = deriveTaskState(current.task, readTaskEvents(workspaceRoot, taskId));
189
+ const verified = {
190
+ ...state,
191
+ freshness: verifyTaskFreshness(workspaceRoot, state)
192
+ };
193
+ return writeTaskState(workspaceRoot, taskId, verified);
194
+ }
195
+ export function getCurrentTaskState(workspaceRoot = process.cwd()) {
196
+ return readTaskState(workspaceRoot, currentTaskId(workspaceRoot));
197
+ }
198
+ export function exportTask(workspaceRoot, taskId, includeEvents = true, redactionOptions) {
199
+ const state = readTaskState(workspaceRoot, taskId);
200
+ const derivedState = redactionOptions ? redactState(state, redactionOptions) : state;
201
+ const pack = createHandoffPack(derivedState, includeEvents ? readTaskEvents(workspaceRoot, taskId) : undefined);
202
+ return redactionOptions ? redactHandoff(pack, redactionOptions) : pack;
203
+ }
204
+ export function importTaskData(workspaceRoot, taskId, data) {
205
+ const project = ensureProject(workspaceRoot);
206
+ const paths = getLedgerPaths(workspaceRoot);
207
+ const importedState = typeof data === "object" && data && !Array.isArray(data)
208
+ ? "format" in data
209
+ ? data.state
210
+ : "task" in data
211
+ ? data
212
+ : undefined
213
+ : undefined;
214
+ if (!fileExists(taskStateJsonFile(paths, taskId))) {
215
+ const importedTask = {
216
+ id: taskId,
217
+ title: importedState?.task.title ?? `Imported ${taskId}`,
218
+ goal: importedState?.task.goal ?? "Imported from external task state.",
219
+ status: importedState?.task.status ?? "in_progress",
220
+ created_at: nowIso(),
221
+ updated_at: nowIso(),
222
+ workspace_root: resolve(workspaceRoot),
223
+ git: getGitSnapshot(workspaceRoot)
224
+ };
225
+ ensureDir(taskDir(paths, taskId));
226
+ ensureDir(taskAttachmentsDir(paths, taskId));
227
+ writeTaskState(workspaceRoot, taskId, deriveTaskState(importedTask, []));
228
+ writeProject(workspaceRoot, {
229
+ ...project,
230
+ current_task_id: taskId
231
+ });
232
+ }
233
+ let events = [];
234
+ if (Array.isArray(data)) {
235
+ events = data;
236
+ }
237
+ else if (typeof data === "object" && data && "format" in data) {
238
+ const pack = data;
239
+ events = pack.events ?? stateToSyntheticEvents(taskId, pack.state);
240
+ }
241
+ else if (typeof data === "object" && data && "task" in data) {
242
+ events = stateToSyntheticEvents(taskId, data);
243
+ }
244
+ else {
245
+ throw new LedgerError("Unsupported import format.");
246
+ }
247
+ const existingEvents = readTaskEvents(workspaceRoot, taskId);
248
+ const existingIds = new Set(existingEvents.map((event) => event.id));
249
+ // Use a stable stringification for payload comparison
250
+ const existingSignatures = new Set(existingEvents.map((event) => JSON.stringify({ type: event.type, payload: event.payload })));
251
+ for (const event of events) {
252
+ const signature = JSON.stringify({ type: event.type, payload: event.payload });
253
+ if (existingIds.has(event.id) || existingSignatures.has(signature)) {
254
+ continue; // Skip duplicate events
255
+ }
256
+ const importedEvent = {
257
+ ...event,
258
+ task_id: taskId,
259
+ id: event.id // ID is guaranteed new at this point
260
+ };
261
+ // Add to existing tracking sets to prevent duplicates within the same import payload
262
+ existingIds.add(importedEvent.id);
263
+ existingSignatures.add(signature);
264
+ assertValidEvent(importedEvent);
265
+ appendJsonLine(taskEventsFile(paths, taskId), importedEvent);
266
+ }
267
+ return deriveAndPersist(workspaceRoot, taskId);
268
+ }
269
+ export function redactTaskState(workspaceRoot, taskId, options) {
270
+ const state = readTaskState(workspaceRoot, taskId);
271
+ return redactState(state, options);
272
+ }
273
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare function nowIso(): string;
2
+ export declare function createId(prefix?: string): string;
3
+ export declare function ensureDir(path: string): void;
4
+ export declare function writeJson(path: string, value: unknown): void;
5
+ export declare function readJson<T>(path: string): T;
6
+ export declare function appendJsonLine(path: string, value: unknown): void;
7
+ export declare function readJsonLines<T>(path: string): T[];
8
+ export declare function listDirectories(path: string): string[];
9
+ export declare function fileExists(path: string): boolean;
10
+ export declare function cleanString(value: string | undefined | null): string | undefined;
11
+ export declare function uniqueBy<T>(items: T[], getKey: (item: T) => string): T[];
12
+ export declare function resolvePath(...parts: string[]): string;
13
+ export declare function computeFileHash(path: string): string;
14
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,QAAQ,CAAC,MAAM,SAAQ,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAG5D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAE3C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGjE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CAYlD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOtD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAMhF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CAYxE;AAED,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD"}