@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.
- package/dist/src/diff.d.ts +15 -0
- package/dist/src/diff.d.ts.map +1 -0
- package/dist/src/diff.js +29 -0
- package/dist/src/diff.js.map +1 -0
- package/dist/src/errors.d.ts +4 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +7 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/exporters.d.ts +4 -0
- package/dist/src/exporters.d.ts.map +1 -0
- package/dist/src/exporters.js +16 -0
- package/dist/src/exporters.js.map +1 -0
- package/dist/src/git.d.ts +3 -0
- package/dist/src/git.d.ts.map +1 -0
- package/dist/src/git.js +29 -0
- package/dist/src/git.js.map +1 -0
- package/dist/src/importers.d.ts +4 -0
- package/dist/src/importers.d.ts.map +1 -0
- package/dist/src/importers.js +35 -0
- package/dist/src/importers.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/markdown.d.ts +3 -0
- package/dist/src/markdown.d.ts.map +1 -0
- package/dist/src/markdown.js +69 -0
- package/dist/src/markdown.js.map +1 -0
- package/dist/src/projector.d.ts +3 -0
- package/dist/src/projector.d.ts.map +1 -0
- package/dist/src/projector.js +89 -0
- package/dist/src/projector.js.map +1 -0
- package/dist/src/redact.d.ts +10 -0
- package/dist/src/redact.d.ts.map +1 -0
- package/dist/src/redact.js +223 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/store.d.ts +44 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +273 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/utils.d.ts +14 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +78 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/verify.d.ts +3 -0
- package/dist/src/verify.d.ts.map +1 -0
- package/dist/src/verify.js +33 -0
- package/dist/src/verify.js.map +1 -0
- 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"}
|