@chipschat/harness 0.0.0-stage → 1.0.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 (79) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +66 -2
  3. package/dist/asks.d.ts +75 -0
  4. package/dist/asks.d.ts.map +1 -0
  5. package/dist/asks.js +103 -0
  6. package/dist/asks.js.map +1 -0
  7. package/dist/connect.d.ts +406 -0
  8. package/dist/connect.d.ts.map +1 -0
  9. package/dist/connect.js +883 -0
  10. package/dist/connect.js.map +1 -0
  11. package/dist/events.d.ts +89 -0
  12. package/dist/events.d.ts.map +1 -0
  13. package/dist/events.js +36 -0
  14. package/dist/events.js.map +1 -0
  15. package/dist/files.d.ts +34 -0
  16. package/dist/files.d.ts.map +1 -0
  17. package/dist/files.js +78 -0
  18. package/dist/files.js.map +1 -0
  19. package/dist/heard.d.ts +22 -0
  20. package/dist/heard.d.ts.map +1 -0
  21. package/dist/heard.js +32 -0
  22. package/dist/heard.js.map +1 -0
  23. package/dist/index.d.ts +56 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +29 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/join.d.ts +101 -0
  28. package/dist/join.d.ts.map +1 -0
  29. package/dist/join.js +289 -0
  30. package/dist/join.js.map +1 -0
  31. package/dist/keep.d.ts +33 -0
  32. package/dist/keep.d.ts.map +1 -0
  33. package/dist/keep.js +160 -0
  34. package/dist/keep.js.map +1 -0
  35. package/dist/lane.d.ts +73 -0
  36. package/dist/lane.d.ts.map +1 -0
  37. package/dist/lane.js +105 -0
  38. package/dist/lane.js.map +1 -0
  39. package/dist/outbox.d.ts +50 -0
  40. package/dist/outbox.d.ts.map +1 -0
  41. package/dist/outbox.js +52 -0
  42. package/dist/outbox.js.map +1 -0
  43. package/dist/project.d.ts +224 -0
  44. package/dist/project.d.ts.map +1 -0
  45. package/dist/project.js +619 -0
  46. package/dist/project.js.map +1 -0
  47. package/dist/prompt.d.ts +61 -0
  48. package/dist/prompt.d.ts.map +1 -0
  49. package/dist/prompt.js +87 -0
  50. package/dist/prompt.js.map +1 -0
  51. package/dist/rules.d.ts +18 -0
  52. package/dist/rules.d.ts.map +1 -0
  53. package/dist/rules.js +25 -0
  54. package/dist/rules.js.map +1 -0
  55. package/dist/run.d.ts +246 -0
  56. package/dist/run.d.ts.map +1 -0
  57. package/dist/run.js +295 -0
  58. package/dist/run.js.map +1 -0
  59. package/dist/sending.d.ts +78 -0
  60. package/dist/sending.d.ts.map +1 -0
  61. package/dist/sending.js +149 -0
  62. package/dist/sending.js.map +1 -0
  63. package/dist/service.d.ts +124 -0
  64. package/dist/service.d.ts.map +1 -0
  65. package/dist/service.js +349 -0
  66. package/dist/service.js.map +1 -0
  67. package/dist/settings.d.ts +137 -0
  68. package/dist/settings.d.ts.map +1 -0
  69. package/dist/settings.js +228 -0
  70. package/dist/settings.js.map +1 -0
  71. package/dist/steps.d.ts +27 -0
  72. package/dist/steps.d.ts.map +1 -0
  73. package/dist/steps.js +26 -0
  74. package/dist/steps.js.map +1 -0
  75. package/dist/store.d.ts +35 -0
  76. package/dist/store.d.ts.map +1 -0
  77. package/dist/store.js +52 -0
  78. package/dist/store.js.map +1 -0
  79. package/package.json +37 -3
@@ -0,0 +1,228 @@
1
+ /**
2
+ * What a person changes about an agent from its page, kept by the harness (ADRs 0134, 0140, 0143,
3
+ * 0146): its context files, its model and effort, its heartbeat, its context window; and the jobs
4
+ * the harness runs on its own, from the harness's page (ADR 0252). One pattern five times. The harness sends its copy (`put…`) when it connects and whenever it changes on its
5
+ * own side; a person's change arrives as a frame, now or never; the harness makes it in its own way
6
+ * and answers with the copy as it is now. Here a handler does the making and returns the copy, and
7
+ * the answer — `answers`, or `refuses` when the handler throws — is sent for it.
8
+ */
9
+ import { contextEditFrame, heartbeatChangeFrame, JOB_RUNS_POST_MAX, jobChangeFrame, modelChangeFrame, windowChangeFrame, windowCompactFrame, } from "@chipschat/protocol";
10
+ /**
11
+ * A change the harness won't or can't make. Throw it from a handler with the copy as it is now:
12
+ * the person is told `message`, and sees the copy. Anything else thrown refuses the same way, with
13
+ * the copy last sent for that agent, and its message.
14
+ */
15
+ export class Refuse extends Error {
16
+ copy;
17
+ reason;
18
+ name = "Refuse";
19
+ constructor(message,
20
+ /** The copy as it is now. Absent: the one last sent for that agent. */
21
+ copy,
22
+ /** For a context file only: `changed` when the file moved on since the person's version. */
23
+ reason) {
24
+ super(message);
25
+ this.copy = copy;
26
+ this.reason = reason;
27
+ }
28
+ }
29
+ /** What `hello.accepts` says for these handlers, beside `restart` for a restart handler. */
30
+ export function acceptsFor(handlers) {
31
+ if (handlers === undefined)
32
+ return [];
33
+ return [
34
+ ...(handlers.context === undefined ? [] : ["context"]),
35
+ ...(handlers.models === undefined ? [] : ["models"]),
36
+ ...(handlers.heartbeats === undefined ? [] : ["heartbeats"]),
37
+ ...(handlers.contextWindows === undefined ? [] : ["context_windows"]),
38
+ ...(handlers.jobs === undefined ? [] : ["jobs"]),
39
+ ];
40
+ }
41
+ const PATHS = {
42
+ context: (id) => `/v1/agents/${encodeURIComponent(id)}/context`,
43
+ "harness-context": (id) => `/v1/harnesses/${encodeURIComponent(id)}/context`,
44
+ model: (id) => `/v1/agents/${encodeURIComponent(id)}/model`,
45
+ heartbeat: (id) => `/v1/agents/${encodeURIComponent(id)}/heartbeat`,
46
+ "context-window": (id) => `/v1/agents/${encodeURIComponent(id)}/context-window`,
47
+ jobs: (id) => `/v1/harnesses/${encodeURIComponent(id)}/jobs`,
48
+ };
49
+ /** The frames heard here, each by the schema it is read by (SEC-14). */
50
+ const FRAMES = {
51
+ "context.edit": contextEditFrame,
52
+ "model.change": modelChangeFrame,
53
+ "heartbeat.change": heartbeatChangeFrame,
54
+ "context_window.compact": windowCompactFrame,
55
+ "context_window.change": windowChangeFrame,
56
+ "job.change": jobChangeFrame,
57
+ };
58
+ /**
59
+ * The harness's copies, sent and remembered: `chips.settings`. Each `put` sends the whole copy;
60
+ * the last one sent for each agent is what a refusal carries when a handler gives none. A copy
61
+ * the same as the last one Chips took for that agent is not sent again, unless it answers a
62
+ * person, so a harness may send its copies as often as it reads them; and one agent's copies of
63
+ * a kind go one after another, so a later one never lands before an earlier one.
64
+ */
65
+ export class Settings {
66
+ put;
67
+ harnessId;
68
+ handlers;
69
+ post;
70
+ /** The copy last given for each `kind:id`, for a refusal to carry. */
71
+ sent = new Map();
72
+ /** The copy Chips last took for each `kind:id`, as JSON. */
73
+ landed = new Map();
74
+ chains = new Map();
75
+ constructor(put, harnessId, handlers,
76
+ /** A `POST` to chipsd with the harness's token, for its jobs' runs. */
77
+ post) {
78
+ this.put = put;
79
+ this.harnessId = harnessId;
80
+ this.handlers = handlers;
81
+ this.post = post;
82
+ }
83
+ /** An agent's context files (`context_files`). */
84
+ context(agentId, copy) {
85
+ return this.send("context", agentId, copy, {});
86
+ }
87
+ /** The harness's own shared set, which its agents read or start from (`context_files`). */
88
+ harnessContext(copy) {
89
+ return this.send("harness-context", this.harnessId(), copy, {});
90
+ }
91
+ /** An agent's model and effort, what it may run on instead, and the words for each (`models`). */
92
+ model(agentId, copy) {
93
+ return this.send("model", agentId, copy, {});
94
+ }
95
+ /** An agent's heartbeat (`heartbeats`). */
96
+ heartbeat(agentId, copy) {
97
+ return this.send("heartbeat", agentId, copy, {});
98
+ }
99
+ /** An agent's context window: how full, its limit, its last compaction (`context_windows`). */
100
+ contextWindow(agentId, copy) {
101
+ return this.send("context-window", agentId, copy, {});
102
+ }
103
+ /** The jobs the harness runs on its own, all of them (`jobs`). */
104
+ jobs(copy) {
105
+ return this.send("jobs", this.harnessId(), copy, {});
106
+ }
107
+ /**
108
+ * Runs of its jobs the harness finished (`jobs`), two hundred to a post. A run sent again says
109
+ * what it says over the one before, and what it leaves out stays, so send it once more when its
110
+ * cost is known, and again without one does no harm. Send the copy first:
111
+ * Chips refuses runs of a job its copy doesn't list.
112
+ */
113
+ async jobRuns(runs) {
114
+ if (this.post === undefined)
115
+ throw new Error("This connection can't post a job's runs.");
116
+ const path = `${PATHS.jobs(this.harnessId())}/runs`;
117
+ for (let at = 0; at < runs.length; at += JOB_RUNS_POST_MAX) {
118
+ await this.post(path, { runs: runs.slice(at, at + JOB_RUNS_POST_MAX) });
119
+ }
120
+ }
121
+ /** An agent deleted: nothing is remembered of it, so a copy for an agent made again is sent. */
122
+ forget(agentId) {
123
+ for (const kind of Object.keys(PATHS)) {
124
+ const key = `${kind}:${agentId}`;
125
+ this.sent.delete(key);
126
+ this.landed.delete(key);
127
+ this.chains.delete(key);
128
+ }
129
+ }
130
+ /**
131
+ * A compaction taken (its handler returned) that then failed: the ask refused after all, with
132
+ * the harness's words, beside the copy as it is now, or the one last sent.
133
+ */
134
+ contextWindowFailed(agentId, changeId, message, copy) {
135
+ const now = copy ?? this.sent.get(`context-window:${agentId}`);
136
+ if (now === undefined)
137
+ return Promise.resolve(undefined);
138
+ const words = message.slice(0, 300);
139
+ return this.send("context-window", agentId, now, {
140
+ refuses: { change_id: changeId, ...(words === "" ? {} : { message: words }) },
141
+ });
142
+ }
143
+ /**
144
+ * A frame from Chips, if it is one of these: read by its schema (SEC-14), handed to its handler
145
+ * and answered. The answer's promise, which never rejects; nothing for any other frame, and
146
+ * nothing for a frame that is not what it says it is.
147
+ */
148
+ hear(frame) {
149
+ const name = frame["frame"];
150
+ const schema = typeof name === "string" && name in FRAMES ? FRAMES[name] : undefined;
151
+ if (schema === undefined)
152
+ return undefined;
153
+ // Read by its schema, not cast (SEC-14): what is acted on here is written to disk by the
154
+ // harness — a context file under the agent's folder, by the name the frame gives — so a frame
155
+ // that is not what it says it is, a name that climbs out of the folder among them, reaches no
156
+ // handler. Chips never sends one; the person is told the edit was missed after a minute.
157
+ const parsed = schema.safeParse(frame);
158
+ return parsed.success ? this.heard(parsed.data) : undefined;
159
+ }
160
+ /** One of the frames read, handed to its handler and answered. */
161
+ heard(frame) {
162
+ const handlers = this.handlers;
163
+ switch (frame.frame) {
164
+ case "context.edit": {
165
+ const kind = frame.agent_id === undefined ? "harness-context" : "context";
166
+ return this.answer(kind, frame.agent_id ?? this.harnessId(), frame.edit_id, "edit_id", () => handlers?.context?.(frame));
167
+ }
168
+ case "model.change":
169
+ return this.answer("model", frame.agent_id, frame.change_id, "change_id", () => handlers?.models?.(frame));
170
+ case "heartbeat.change":
171
+ return this.answer("heartbeat", frame.agent_id, frame.change_id, "change_id", () => handlers?.heartbeats?.(frame));
172
+ case "job.change":
173
+ return this.answer("jobs", this.harnessId(), frame.change_id, "change_id", () => handlers?.jobs?.(frame));
174
+ case "context_window.compact":
175
+ return this.answer("context-window", frame.agent_id, frame.change_id, "change_id", () => handlers?.contextWindows?.compact(frame));
176
+ default:
177
+ return this.answer("context-window", frame.agent_id, frame.change_id, "change_id", () => handlers?.contextWindows?.change(frame));
178
+ }
179
+ }
180
+ send(kind, id, copy, answer) {
181
+ const key = `${kind}:${id}`;
182
+ this.sent.set(key, copy);
183
+ const print = JSON.stringify(copy);
184
+ const answering = Object.keys(answer).length > 0;
185
+ const next = (this.chains.get(key) ?? Promise.resolve())
186
+ .catch(() => undefined)
187
+ .then(async () => {
188
+ if (!answering && this.landed.get(key) === print)
189
+ return undefined;
190
+ const taken = await this.put(PATHS[kind](id), { ...copy, ...answer });
191
+ this.landed.set(key, print);
192
+ return taken;
193
+ });
194
+ this.chains.set(key, next);
195
+ return next;
196
+ }
197
+ /**
198
+ * Make the change with its handler and answer with the copy: `answers` when it returns,
199
+ * `refuses` when it throws. With no handler and no copy ever sent there is nothing to answer
200
+ * with, and the person is told it was missed after a minute.
201
+ */
202
+ async answer(kind, id, askId, idField, make) {
203
+ try {
204
+ const made = make();
205
+ if (made === undefined)
206
+ throw new Refuse("This harness doesn't take that change.");
207
+ await this.send(kind, id, await made, { answers: askId });
208
+ }
209
+ catch (error) {
210
+ const copy = (error instanceof Refuse ? error.copy : undefined) ?? this.sent.get(`${kind}:${id}`);
211
+ if (copy === undefined)
212
+ return;
213
+ const refuses = { [idField]: askId, ...refusalOf(kind, error) };
214
+ await this.send(kind, id, copy, { refuses }).catch(() => undefined);
215
+ }
216
+ }
217
+ }
218
+ /** What a refusal says beside its id: the harness's words, and for a file whether it moved on. */
219
+ function refusalOf(kind, error) {
220
+ const message = (error instanceof Error ? error.message : String(error)).slice(0, 300);
221
+ const file = kind === "context" || kind === "harness-context";
222
+ const reason = error instanceof Refuse ? error.reason : undefined;
223
+ return {
224
+ ...(file ? { reason: reason ?? "failed" } : {}),
225
+ ...(message === "" ? {} : { message }),
226
+ };
227
+ }
228
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A bridge's steps, said to the `chips connect` that started it (ADR 0218). `chips connect` sets
3
+ * `CHIPS_STEPS=json` and reads standard output for lines that open with `chips-step `: `joining`
4
+ * when `join()` starts, `keeping` when keep starts the service. A bridge says its own check of its
5
+ * harness, `checking` and `checked`, with a few words of its own under it (`detail`), and where it
6
+ * stopped, `failed`, with its words for a sheet (`StopWords`), which Chips for Mac shows (phase 5).
7
+ * Everything else a bridge writes is its own, and passed on as it is. With nothing set, nothing is
8
+ * written.
9
+ */
10
+ import type { Environment } from "./keep.js";
11
+ /** What opens a step's line: the rest of it is JSON. */
12
+ export declare const STEP_MARK = "chips-step ";
13
+ export type StepName = "checking" | "checked" | "joining" | "keeping" | "failed";
14
+ /**
15
+ * Where a bridge stopped, for a sheet: a few words under the step ("Nothing answers on port
16
+ * 8642"), its sentence ("Its API server is off."), what to do, and a line to copy. Its full
17
+ * sentence still goes to standard error, for a terminal.
18
+ */
19
+ export interface StopWords {
20
+ readonly detail?: string;
21
+ readonly says?: string;
22
+ readonly doing?: string;
23
+ readonly copy?: string;
24
+ }
25
+ /** The step on standard output, as a line, when `chips connect` asked for them. */
26
+ export declare function reportStep(step: StepName, detail?: Readonly<Record<string, string>> | StopWords, env?: Environment, write?: (line: string) => void): void;
27
+ //# sourceMappingURL=steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,wDAAwD;AACxD,eAAO,MAAM,SAAS,gBAAgB,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAc,EAEzD,GAAG,GAAE,WAAyB,EAC9B,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAwC,GAChE,IAAI,CAON"}
package/dist/steps.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * A bridge's steps, said to the `chips connect` that started it (ADR 0218). `chips connect` sets
3
+ * `CHIPS_STEPS=json` and reads standard output for lines that open with `chips-step `: `joining`
4
+ * when `join()` starts, `keeping` when keep starts the service. A bridge says its own check of its
5
+ * harness, `checking` and `checked`, with a few words of its own under it (`detail`), and where it
6
+ * stopped, `failed`, with its words for a sheet (`StopWords`), which Chips for Mac shows (phase 5).
7
+ * Everything else a bridge writes is its own, and passed on as it is. With nothing set, nothing is
8
+ * written.
9
+ */
10
+ import { writeSync } from "node:fs";
11
+ /** What opens a step's line: the rest of it is JSON. */
12
+ export const STEP_MARK = "chips-step ";
13
+ /** The step on standard output, as a line, when `chips connect` asked for them. */
14
+ export function reportStep(step, detail = {},
15
+ // biome-ignore lint/style/noProcessEnv: `chips connect` asks for the steps in the environment.
16
+ env = process.env, write = (line) => void writeSync(1, line)) {
17
+ if (env["CHIPS_STEPS"] !== "json")
18
+ return;
19
+ try {
20
+ write(`${STEP_MARK}${JSON.stringify({ step, ...detail })}\n`);
21
+ }
22
+ catch {
23
+ // Nobody is reading: the step was for them alone.
24
+ }
25
+ }
26
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,wDAAwD;AACxD,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;AAgBvC,mFAAmF;AACnF,MAAM,UAAU,UAAU,CACxB,IAAc,EACd,SAAuD,EAAE;AACzD,+FAA+F;AAC/F,MAAmB,OAAO,CAAC,GAAG,EAC9B,QAAgC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;IAEjE,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,MAAM;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,KAAK,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * What a harness keeps across a restart, so a restart loses nothing and leaves nothing hanging:
3
+ * the last `seq` it heard (a decision made while it was down still reaches it), the events it sent
4
+ * that the server never answered (sent again, which the idempotency key makes safe), and the runs
5
+ * it started that never ended (ended for it when it comes back, so no thinking bubble waits for
6
+ * ever). `connect({ store: fileStore(path) })`; without a store, all of it lives as long as the
7
+ * process does.
8
+ */
9
+ /** A run this harness started and has not ended: enough to end it after a restart. */
10
+ export interface OpenRun {
11
+ readonly runId: string;
12
+ readonly spaceId: string;
13
+ /** The agent it was started as, when it was one (ADR 0087). */
14
+ readonly agentId?: string | undefined;
15
+ }
16
+ export interface HarnessState {
17
+ readonly since?: number | undefined;
18
+ readonly outbox: readonly Readonly<Record<string, unknown>>[];
19
+ readonly runs: readonly OpenRun[];
20
+ }
21
+ /** Where the state is kept. `load` is read once, at connect; `save` is called after changes. */
22
+ export interface HarnessStore {
23
+ readonly load: () => HarnessState | undefined;
24
+ readonly save: (state: HarnessState) => void;
25
+ }
26
+ /**
27
+ * A JSON file only its user can read, written whole and renamed into place so a crash mid-write
28
+ * leaves the last good one. Its folder is made when missing.
29
+ */
30
+ export declare function fileStore(path: string): HarnessStore;
31
+ /** A store in memory, for tests and for a harness that keeps its state somewhere of its own. */
32
+ export declare function memoryStore(initial?: HarnessState): HarnessStore & {
33
+ readonly state: () => HarnessState | undefined;
34
+ };
35
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,sFAAsF;AACtF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CACnC;AAED,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAuBpD;AAED,gGAAgG;AAChG,wBAAgB,WAAW,CACzB,OAAO,CAAC,EAAE,YAAY,GACrB,YAAY,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,YAAY,GAAG,SAAS,CAAA;CAAE,CASnE"}
package/dist/store.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * What a harness keeps across a restart, so a restart loses nothing and leaves nothing hanging:
3
+ * the last `seq` it heard (a decision made while it was down still reaches it), the events it sent
4
+ * that the server never answered (sent again, which the idempotency key makes safe), and the runs
5
+ * it started that never ended (ended for it when it comes back, so no thinking bubble waits for
6
+ * ever). `connect({ store: fileStore(path) })`; without a store, all of it lives as long as the
7
+ * process does.
8
+ */
9
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
10
+ import { dirname } from "node:path";
11
+ /**
12
+ * A JSON file only its user can read, written whole and renamed into place so a crash mid-write
13
+ * leaves the last good one. Its folder is made when missing.
14
+ */
15
+ export function fileStore(path) {
16
+ return {
17
+ load() {
18
+ if (!existsSync(path))
19
+ return undefined;
20
+ try {
21
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
22
+ return {
23
+ ...(typeof parsed.since === "number" ? { since: parsed.since } : {}),
24
+ outbox: Array.isArray(parsed.outbox) ? parsed.outbox : [],
25
+ runs: Array.isArray(parsed.runs) ? parsed.runs : [],
26
+ };
27
+ }
28
+ catch {
29
+ // A file nobody can read is a fresh start, not a harness that cannot start.
30
+ return undefined;
31
+ }
32
+ },
33
+ save(state) {
34
+ mkdirSync(dirname(path), { recursive: true });
35
+ const next = `${path}.next`;
36
+ writeFileSync(next, `${JSON.stringify(state)}\n`, { mode: 0o600 });
37
+ renameSync(next, path);
38
+ },
39
+ };
40
+ }
41
+ /** A store in memory, for tests and for a harness that keeps its state somewhere of its own. */
42
+ export function memoryStore(initial) {
43
+ let kept = initial;
44
+ return {
45
+ load: () => kept,
46
+ save: (state) => {
47
+ kept = state;
48
+ },
49
+ state: () => kept,
50
+ };
51
+ }
52
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO;QACL,IAAI;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA0B,CAAC;gBAC/E,OAAO;oBACL,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACzD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;iBACpD,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,4EAA4E;gBAC5E,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK;YACR,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,GAAG,IAAI,OAAO,CAAC;YAC5B,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,WAAW,CACzB,OAAsB;IAEtB,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;QAChB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;YACd,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "@chipschat/harness",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.0",
4
+ "description": "The Agent Connect client for a harness you control: connect, start runs, log steps, ask, and hear what people say back.",
5
+ "license": "Apache-2.0",
6
+ "homepage": "https://chipschat.ai/connect/sdk/",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/arjungupta99/chips.git",
10
+ "directory": "packages/sdk-ts"
11
+ },
12
+ "type": "module",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "dependencies": {
26
+ "@chipschat/protocol": "1.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "kysely": "0.29.5",
30
+ "vitest": "4.1.11",
31
+ "@chipschat/platform": "0.0.0",
32
+ "@chipschat/server": "0.0.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.build.json",
36
+ "typecheck": "tsc -p tsconfig.json",
37
+ "test": "vitest run",
38
+ "lint": "biome check ."
39
+ }
6
40
  }