opencode-stm 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +117 -2
- package/config.example.yaml +18 -0
- package/dist/src/config.d.ts +28 -0
- package/dist/src/config.js +161 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.js +210 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/injection.d.ts +63 -0
- package/dist/src/injection.js +103 -0
- package/dist/src/injection.js.map +1 -0
- package/dist/src/scheduler.d.ts +25 -0
- package/dist/src/scheduler.js +182 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/sdk.d.ts +50 -0
- package/dist/src/sdk.js +101 -0
- package/dist/src/sdk.js.map +1 -0
- package/dist/src/state.d.ts +70 -0
- package/dist/src/state.js +278 -0
- package/dist/src/state.js.map +1 -0
- package/dist/src/tools.d.ts +33 -0
- package/dist/src/tools.js +596 -0
- package/dist/src/tools.js.map +1 -0
- package/dist/src/transcript.d.ts +87 -0
- package/dist/src/transcript.js +376 -0
- package/dist/src/transcript.js.map +1 -0
- package/package.json +39 -4
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, closeSync, fchmodSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, writeSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
export const STATE_SCHEMA_VERSION = 1;
|
|
5
|
+
export const FRONTIER_MAX = 64;
|
|
6
|
+
export const ANCHOR_MAX = 32;
|
|
7
|
+
export function initialMeta() {
|
|
8
|
+
return {
|
|
9
|
+
schemaVersion: STATE_SCHEMA_VERSION,
|
|
10
|
+
activity: 0,
|
|
11
|
+
baselineMessageID: null,
|
|
12
|
+
frontier: [],
|
|
13
|
+
review: null,
|
|
14
|
+
anchors: [],
|
|
15
|
+
locked: false,
|
|
16
|
+
lockReason: "none",
|
|
17
|
+
titleDigest: null,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function hashSessionID(sessionID) {
|
|
21
|
+
return createHash("sha256").update(sessionID, "utf8").digest("hex");
|
|
22
|
+
}
|
|
23
|
+
export function hashTitle(title) {
|
|
24
|
+
return createHash("sha256").update(title, "utf8").digest("hex");
|
|
25
|
+
}
|
|
26
|
+
export function resolveStateDir(env, home) {
|
|
27
|
+
const xdg = env.XDG_STATE_HOME;
|
|
28
|
+
const base = xdg !== undefined && xdg.length > 0 && isAbsolute(xdg) ? xdg : join(home, ".local", "state");
|
|
29
|
+
return join(base, "opencode-stm");
|
|
30
|
+
}
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function hasOnlyKeys(value, keys) {
|
|
35
|
+
const actual = Object.keys(value);
|
|
36
|
+
return actual.length === keys.length && actual.every((key) => keys.includes(key));
|
|
37
|
+
}
|
|
38
|
+
const LOCK_REASONS = [
|
|
39
|
+
"none", "manual", "external", "non-default-title", "historical", "unreadable-state", "invalid-config",
|
|
40
|
+
];
|
|
41
|
+
const META_KEYS = [
|
|
42
|
+
"schemaVersion", "activity", "baselineMessageID", "frontier", "review", "anchors", "locked", "lockReason", "titleDigest",
|
|
43
|
+
];
|
|
44
|
+
const REVIEW_KEYS = ["id", "remindersSent", "nextTriggerAt"];
|
|
45
|
+
const ANCHOR_KEYS = ["reviewID", "reminderIndex", "anchorMessageID", "partID", "obsolete"];
|
|
46
|
+
function isReviewState(value) {
|
|
47
|
+
if (!isRecord(value))
|
|
48
|
+
return false;
|
|
49
|
+
if (!hasOnlyKeys(value, REVIEW_KEYS))
|
|
50
|
+
return false;
|
|
51
|
+
return (typeof value.id === "string" &&
|
|
52
|
+
Number.isInteger(value.remindersSent) &&
|
|
53
|
+
value.remindersSent >= 0 &&
|
|
54
|
+
Number.isInteger(value.nextTriggerAt) &&
|
|
55
|
+
value.nextTriggerAt >= 0);
|
|
56
|
+
}
|
|
57
|
+
function isAnchorState(value) {
|
|
58
|
+
if (!isRecord(value))
|
|
59
|
+
return false;
|
|
60
|
+
if (!hasOnlyKeys(value, ANCHOR_KEYS))
|
|
61
|
+
return false;
|
|
62
|
+
return (typeof value.reviewID === "string" &&
|
|
63
|
+
Number.isInteger(value.reminderIndex) &&
|
|
64
|
+
value.reminderIndex >= 0 &&
|
|
65
|
+
typeof value.anchorMessageID === "string" &&
|
|
66
|
+
typeof value.partID === "string" &&
|
|
67
|
+
typeof value.obsolete === "boolean");
|
|
68
|
+
}
|
|
69
|
+
export function parseMeta(value) {
|
|
70
|
+
if (!isRecord(value))
|
|
71
|
+
return null;
|
|
72
|
+
if (!hasOnlyKeys(value, META_KEYS))
|
|
73
|
+
return null;
|
|
74
|
+
if (value.schemaVersion !== STATE_SCHEMA_VERSION)
|
|
75
|
+
return null;
|
|
76
|
+
if (!Number.isInteger(value.activity) || value.activity < 0)
|
|
77
|
+
return null;
|
|
78
|
+
if (!(value.baselineMessageID === null || typeof value.baselineMessageID === "string"))
|
|
79
|
+
return null;
|
|
80
|
+
if (!Array.isArray(value.frontier) || value.frontier.length > FRONTIER_MAX || !value.frontier.every((item) => typeof item === "string"))
|
|
81
|
+
return null;
|
|
82
|
+
if (!(value.review === null || isReviewState(value.review)))
|
|
83
|
+
return null;
|
|
84
|
+
if (!Array.isArray(value.anchors) || value.anchors.length > ANCHOR_MAX || !value.anchors.every(isAnchorState))
|
|
85
|
+
return null;
|
|
86
|
+
if (typeof value.locked !== "boolean")
|
|
87
|
+
return null;
|
|
88
|
+
if (typeof value.lockReason !== "string" || !LOCK_REASONS.includes(value.lockReason))
|
|
89
|
+
return null;
|
|
90
|
+
if (!(value.titleDigest === null || typeof value.titleDigest === "string"))
|
|
91
|
+
return null;
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
export function createOperationGuard() {
|
|
95
|
+
const tails = new Map();
|
|
96
|
+
return {
|
|
97
|
+
run(key, fn) {
|
|
98
|
+
const previous = tails.get(key) ?? Promise.resolve();
|
|
99
|
+
const result = previous.then(fn, fn);
|
|
100
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
101
|
+
tails.set(key, tail);
|
|
102
|
+
void tail.then(() => {
|
|
103
|
+
if (tails.get(key) === tail)
|
|
104
|
+
tails.delete(key);
|
|
105
|
+
});
|
|
106
|
+
return result;
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function createStateStore(options) {
|
|
111
|
+
const queueTails = new Map();
|
|
112
|
+
function enqueue(key, task) {
|
|
113
|
+
const previous = queueTails.get(key) ?? Promise.resolve();
|
|
114
|
+
const result = previous.then(task, task);
|
|
115
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
116
|
+
queueTails.set(key, tail);
|
|
117
|
+
void tail.then(() => {
|
|
118
|
+
if (queueTails.get(key) === tail)
|
|
119
|
+
queueTails.delete(key);
|
|
120
|
+
});
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
function paths(sessionID) {
|
|
124
|
+
const name = hashSessionID(sessionID);
|
|
125
|
+
return {
|
|
126
|
+
file: join(options.stateDir, `${name}.json`),
|
|
127
|
+
lock: join(options.stateDir, `${name}.lock`),
|
|
128
|
+
temp: () => join(options.stateDir, `${name}.${process.pid}.${randomUUID()}.tmp`),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function ensureDir() {
|
|
132
|
+
// Fails closed: a directory that cannot be created or locked to mode 0700
|
|
133
|
+
// must disable persistence instead of falling back to permissive defaults.
|
|
134
|
+
mkdirSync(options.stateDir, { recursive: true, mode: 0o700 });
|
|
135
|
+
chmodSync(options.stateDir, 0o700);
|
|
136
|
+
}
|
|
137
|
+
class StoreLockError extends Error {
|
|
138
|
+
reason;
|
|
139
|
+
constructor(reason) {
|
|
140
|
+
super(reason);
|
|
141
|
+
this.reason = reason;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function withFileLock(sessionID, fn) {
|
|
145
|
+
let lockFd;
|
|
146
|
+
try {
|
|
147
|
+
lockFd = openSync(paths(sessionID).lock, "wx", 0o600);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error.code === "EEXIST")
|
|
151
|
+
throw new StoreLockError("state: lock contention");
|
|
152
|
+
throw new StoreLockError("state: lock unavailable");
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
return fn();
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
closeSync(lockFd);
|
|
159
|
+
rmSync(paths(sessionID).lock, { force: true });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function readUnlocked(sessionID) {
|
|
163
|
+
let text;
|
|
164
|
+
try {
|
|
165
|
+
text = readFileSync(paths(sessionID).file, "utf8");
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error.code === "ENOENT")
|
|
169
|
+
return { ok: true, value: null };
|
|
170
|
+
return { ok: false, reason: "state: unreadable" };
|
|
171
|
+
}
|
|
172
|
+
let parsed;
|
|
173
|
+
try {
|
|
174
|
+
parsed = JSON.parse(text);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return { ok: false, reason: "state: malformed or unsupported" };
|
|
178
|
+
}
|
|
179
|
+
const meta = parseMeta(parsed);
|
|
180
|
+
if (meta === null)
|
|
181
|
+
return { ok: false, reason: "state: malformed or unsupported" };
|
|
182
|
+
return { ok: true, value: meta };
|
|
183
|
+
}
|
|
184
|
+
function writeUnlocked(sessionID, meta) {
|
|
185
|
+
const temp = paths(sessionID).temp();
|
|
186
|
+
try {
|
|
187
|
+
const fd = openSync(temp, "w", 0o600);
|
|
188
|
+
try {
|
|
189
|
+
fchmodSync(fd, 0o600);
|
|
190
|
+
writeSync(fd, `${JSON.stringify(meta)}\n`);
|
|
191
|
+
fsyncSync(fd);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
closeSync(fd);
|
|
195
|
+
}
|
|
196
|
+
renameSync(temp, paths(sessionID).file);
|
|
197
|
+
return { ok: true };
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
rmSync(temp, { force: true });
|
|
201
|
+
return { ok: false, reason: "state: save failed" };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
load(sessionID) {
|
|
206
|
+
return enqueue(sessionID, async () => {
|
|
207
|
+
try {
|
|
208
|
+
ensureDir();
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return { ok: false, reason: "state: directory unavailable" };
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
return withFileLock(sessionID, () => readUnlocked(sessionID));
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
if (error instanceof StoreLockError)
|
|
218
|
+
return { ok: false, reason: error.reason };
|
|
219
|
+
return { ok: false, reason: "state: failed" };
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
save(sessionID, meta) {
|
|
224
|
+
return enqueue(sessionID, async () => {
|
|
225
|
+
try {
|
|
226
|
+
ensureDir();
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return { ok: false, reason: "state: directory unavailable" };
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
return withFileLock(sessionID, () => writeUnlocked(sessionID, meta));
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
if (error instanceof StoreLockError)
|
|
236
|
+
return { ok: false, reason: error.reason };
|
|
237
|
+
return { ok: false, reason: "state: failed" };
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
update(sessionID, fn) {
|
|
242
|
+
return enqueue(sessionID, async () => {
|
|
243
|
+
try {
|
|
244
|
+
ensureDir();
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return { ok: false, reason: "state: directory unavailable" };
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
return withFileLock(sessionID, () => {
|
|
251
|
+
const current = readUnlocked(sessionID);
|
|
252
|
+
if (!current.ok)
|
|
253
|
+
return { ok: false, reason: current.reason };
|
|
254
|
+
const { next, result } = fn(current.value);
|
|
255
|
+
const saved = writeUnlocked(sessionID, next);
|
|
256
|
+
if (!saved.ok)
|
|
257
|
+
return { ok: false, reason: saved.reason };
|
|
258
|
+
return { ok: true, value: result };
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
if (error instanceof StoreLockError)
|
|
263
|
+
return { ok: false, reason: error.reason };
|
|
264
|
+
return { ok: false, reason: "state: failed" };
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
},
|
|
268
|
+
async removeOwned(sessionID) {
|
|
269
|
+
try {
|
|
270
|
+
rmSync(paths(sessionID).file, { force: true });
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Session lifecycle cleanup is best effort; stale metadata is allowed.
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ToolDefinition } from "@opencode-ai/plugin";
|
|
2
|
+
import type { StmConfig } from "./config.js";
|
|
3
|
+
import { type SessionMeta, type StateStore, type OperationGuard } from "./state.js";
|
|
4
|
+
import { type Client, type RootCache } from "./sdk.js";
|
|
5
|
+
import { type TranscriptQueue } from "./transcript.js";
|
|
6
|
+
export declare const TITLE_MAX_CODE_POINTS = 120;
|
|
7
|
+
export type TitleValidation = {
|
|
8
|
+
ok: true;
|
|
9
|
+
value: string;
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function validateTitle(raw: string): TitleValidation;
|
|
15
|
+
export type StmServices = {
|
|
16
|
+
client: Client;
|
|
17
|
+
config: StmConfig;
|
|
18
|
+
state: StateStore;
|
|
19
|
+
queue: TranscriptQueue;
|
|
20
|
+
roots: RootCache;
|
|
21
|
+
guard: OperationGuard;
|
|
22
|
+
blocked: Map<string, Set<string>>;
|
|
23
|
+
now: () => number;
|
|
24
|
+
};
|
|
25
|
+
export declare function establishBaseline(services: StmServices, sessionID: string, signal?: AbortSignal, knownTitle?: string): Promise<{
|
|
26
|
+
ok: true;
|
|
27
|
+
meta: SessionMeta;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
reason: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function createCurrentTools(services: StmServices): Record<string, ToolDefinition>;
|
|
33
|
+
export declare function createHistoricalTools(services: StmServices): Record<string, ToolDefinition>;
|