@inhuman.tools/harness-sdk 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.
Files changed (123) hide show
  1. package/LICENSE.md +7 -0
  2. package/dist/client-agents-tree.d.ts +123 -0
  3. package/dist/client-agents-tree.d.ts.map +1 -0
  4. package/dist/client-agents-tree.js +504 -0
  5. package/dist/client-agents-tree.js.map +1 -0
  6. package/dist/client-agents.d.ts +50 -0
  7. package/dist/client-agents.d.ts.map +1 -0
  8. package/dist/client-agents.js +299 -0
  9. package/dist/client-agents.js.map +1 -0
  10. package/dist/client.d.ts +89 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +589 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +10 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/launch/continue-pick.d.ts +17 -0
  19. package/dist/launch/continue-pick.d.ts.map +1 -0
  20. package/dist/launch/continue-pick.js +20 -0
  21. package/dist/launch/continue-pick.js.map +1 -0
  22. package/dist/launch/index.d.ts +6 -0
  23. package/dist/launch/index.d.ts.map +1 -0
  24. package/dist/launch/index.js +6 -0
  25. package/dist/launch/index.js.map +1 -0
  26. package/dist/launch/model-flags.d.ts +44 -0
  27. package/dist/launch/model-flags.d.ts.map +1 -0
  28. package/dist/launch/model-flags.js +216 -0
  29. package/dist/launch/model-flags.js.map +1 -0
  30. package/dist/launch/streams.d.ts +15 -0
  31. package/dist/launch/streams.d.ts.map +1 -0
  32. package/dist/launch/streams.js +2 -0
  33. package/dist/launch/streams.js.map +1 -0
  34. package/dist/launch/term-continue.d.ts +13 -0
  35. package/dist/launch/term-continue.d.ts.map +1 -0
  36. package/dist/launch/term-continue.js +17 -0
  37. package/dist/launch/term-continue.js.map +1 -0
  38. package/dist/launch/term-session-key.d.ts +8 -0
  39. package/dist/launch/term-session-key.d.ts.map +1 -0
  40. package/dist/launch/term-session-key.js +76 -0
  41. package/dist/launch/term-session-key.js.map +1 -0
  42. package/dist/observable-abort-signal.d.ts +7 -0
  43. package/dist/observable-abort-signal.d.ts.map +1 -0
  44. package/dist/observable-abort-signal.js +56 -0
  45. package/dist/observable-abort-signal.js.map +1 -0
  46. package/dist/open-external.d.ts +2 -0
  47. package/dist/open-external.d.ts.map +1 -0
  48. package/dist/open-external.js +24 -0
  49. package/dist/open-external.js.map +1 -0
  50. package/dist/paths.d.ts +7 -0
  51. package/dist/paths.d.ts.map +1 -0
  52. package/dist/paths.js +16 -0
  53. package/dist/paths.js.map +1 -0
  54. package/dist/text/agent-cover.d.ts +43 -0
  55. package/dist/text/agent-cover.d.ts.map +1 -0
  56. package/dist/text/agent-cover.js +123 -0
  57. package/dist/text/agent-cover.js.map +1 -0
  58. package/dist/text/format-shell.d.ts +5 -0
  59. package/dist/text/format-shell.d.ts.map +1 -0
  60. package/dist/text/format-shell.js +53 -0
  61. package/dist/text/format-shell.js.map +1 -0
  62. package/dist/text/identity.d.ts +67 -0
  63. package/dist/text/identity.d.ts.map +1 -0
  64. package/dist/text/identity.js +433 -0
  65. package/dist/text/identity.js.map +1 -0
  66. package/dist/text/index.d.ts +14 -0
  67. package/dist/text/index.d.ts.map +1 -0
  68. package/dist/text/index.js +15 -0
  69. package/dist/text/index.js.map +1 -0
  70. package/dist/text/liveness.d.ts +62 -0
  71. package/dist/text/liveness.d.ts.map +1 -0
  72. package/dist/text/liveness.js +270 -0
  73. package/dist/text/liveness.js.map +1 -0
  74. package/dist/text/mcp-identity.d.ts +25 -0
  75. package/dist/text/mcp-identity.d.ts.map +1 -0
  76. package/dist/text/mcp-identity.js +133 -0
  77. package/dist/text/mcp-identity.js.map +1 -0
  78. package/dist/text/pretty-identity.d.ts +15 -0
  79. package/dist/text/pretty-identity.d.ts.map +1 -0
  80. package/dist/text/pretty-identity.js +112 -0
  81. package/dist/text/pretty-identity.js.map +1 -0
  82. package/dist/text/sugarcoat.d.ts +29 -0
  83. package/dist/text/sugarcoat.d.ts.map +1 -0
  84. package/dist/text/sugarcoat.js +148 -0
  85. package/dist/text/sugarcoat.js.map +1 -0
  86. package/dist/text/unwrap-program.d.ts +2 -0
  87. package/dist/text/unwrap-program.d.ts.map +1 -0
  88. package/dist/text/unwrap-program.js +137 -0
  89. package/dist/text/unwrap-program.js.map +1 -0
  90. package/dist/text/work-text.d.ts +72 -0
  91. package/dist/text/work-text.d.ts.map +1 -0
  92. package/dist/text/work-text.js +337 -0
  93. package/dist/text/work-text.js.map +1 -0
  94. package/dist/transport/unix.d.ts +19 -0
  95. package/dist/transport/unix.d.ts.map +1 -0
  96. package/dist/transport/unix.js +68 -0
  97. package/dist/transport/unix.js.map +1 -0
  98. package/package.json +79 -3
  99. package/src/client-agents-tree.ts +642 -0
  100. package/src/client-agents.ts +230 -0
  101. package/src/client.ts +686 -0
  102. package/src/index.ts +27 -0
  103. package/src/launch/continue-pick.ts +28 -0
  104. package/src/launch/index.ts +5 -0
  105. package/src/launch/model-flags.ts +273 -0
  106. package/src/launch/streams.ts +13 -0
  107. package/src/launch/term-continue.ts +31 -0
  108. package/src/launch/term-session-key.ts +70 -0
  109. package/src/observable-abort-signal.ts +66 -0
  110. package/src/open-external.ts +22 -0
  111. package/src/paths.ts +20 -0
  112. package/src/text/agent-cover.ts +136 -0
  113. package/src/text/format-shell.ts +52 -0
  114. package/src/text/identity.ts +473 -0
  115. package/src/text/index.ts +29 -0
  116. package/src/text/liveness.ts +322 -0
  117. package/src/text/mcp-identity.ts +148 -0
  118. package/src/text/pretty-identity.ts +120 -0
  119. package/src/text/sugarcoat.ts +165 -0
  120. package/src/text/unwrap-program.ts +133 -0
  121. package/src/text/work-text.ts +388 -0
  122. package/src/transport/unix.ts +84 -0
  123. package/README.md +0 -3
@@ -0,0 +1,337 @@
1
+ /**
2
+ * What a tool or scheme call says, as plain data: state, identity, receipt. No
3
+ * paint. `work-cells.ts` turns a `WorkCellFace` into layout nodes; the headless
4
+ * eval client prints the same face as text. Nothing here may import quickdraw —
5
+ * a helper that needs it belongs in `work-cells.ts`.
6
+ */
7
+ import { ApprovableJob, documentRoot, FileMutateToolJob, MCPToolJob, ProgrammaticJob, reactChunks, SessionRoot, SessionTurn, shellTailOf, ToolCallJob, } from "@inhuman.tools/harness-model";
8
+ import { agentExpandBlock } from "./agent-cover.js";
9
+ import { coverAskAnnotation, identityLine, isPathShapedName } from "./identity.js";
10
+ import { outcomeSnapOf, schemeCellState, toolCellState } from "./liveness.js";
11
+ import { prettyResult } from "./pretty-identity.js";
12
+ import { schemePaintReceipt } from "./sugarcoat.js";
13
+ export function receiptPlainText(receipt) {
14
+ if (receipt.kind === "none" || receipt.kind === "diff")
15
+ return "";
16
+ if (receipt.kind === "parts")
17
+ return receipt.parts.map((part) => part.text).join("\n");
18
+ return receipt.text;
19
+ }
20
+ function stringArg(args, key) {
21
+ const value = args?.[key];
22
+ return typeof value === "string" ? value : "";
23
+ }
24
+ /** Whole-file `read_file` of the same path on this turn — already on the tape when host prior did not sync. */
25
+ function priorFromTape(work, filePath, span) {
26
+ if (filePath === "")
27
+ return null;
28
+ const session = documentRoot(work);
29
+ if (!(session instanceof SessionRoot))
30
+ return null;
31
+ const turn = session.head;
32
+ if (!(turn instanceof SessionTurn))
33
+ return null;
34
+ for (const chunk of reactChunks(turn)) {
35
+ if (!(chunk instanceof ToolCallJob) || chunk.name !== "read_file" || chunk === work)
36
+ continue;
37
+ const args = chunk.args;
38
+ if (stringArg(args, "path") !== filePath)
39
+ continue;
40
+ if (args?.offset !== undefined || args?.limit !== undefined)
41
+ continue;
42
+ const text = resultText(chunk);
43
+ if (text !== "" && (span === "" || containsSpan(text, span)))
44
+ return text;
45
+ }
46
+ return null;
47
+ }
48
+ /**
49
+ * The prior stamped on the job: inline, or the reference to its blob. Field reads, not
50
+ * `instanceof` — duplicate class identity must not drop the file.
51
+ */
52
+ function stampedPrior(work) {
53
+ const host = work;
54
+ if (host.prior !== undefined)
55
+ return host.prior;
56
+ return typeof host.priorContent === "string" ? { kind: "inline", text: host.priorContent } : null;
57
+ }
58
+ /**
59
+ * Host prior text. A blob prior whose text the cache does not hold yet reads as no prior, so the
60
+ * face is the one a replica without the prior paints, and asks the cache for the text.
61
+ */
62
+ function priorOf(work, filePath, span, blobs) {
63
+ const stamped = stampedPrior(work);
64
+ let text = null;
65
+ if (stamped?.kind === "inline")
66
+ text = stamped.text;
67
+ else if (stamped?.kind === "blob") {
68
+ const { sha256 } = stamped.blob;
69
+ text = blobs?.peek(sha256) ?? null;
70
+ if (text === null)
71
+ blobs?.want(sha256);
72
+ }
73
+ return text ?? priorFromTape(work, filePath, span);
74
+ }
75
+ function containsSpan(file, span) {
76
+ if (span === "" || file.includes(span))
77
+ return true;
78
+ return file.replaceAll("\r\n", "\n").includes(span.replaceAll("\r\n", "\n"));
79
+ }
80
+ function spanLineStart(file, span) {
81
+ if (file == null || span === "")
82
+ return undefined;
83
+ const normalizedFile = file.replaceAll("\r\n", "\n");
84
+ const normalizedSpan = span.replaceAll("\r\n", "\n");
85
+ let idx = normalizedFile.indexOf(normalizedSpan);
86
+ if (idx === -1) {
87
+ const first = normalizedSpan.split("\n")[0] ?? "";
88
+ if (first === "" || first === normalizedSpan)
89
+ return undefined;
90
+ idx = normalizedFile.indexOf(first);
91
+ }
92
+ if (idx === -1)
93
+ return undefined;
94
+ let line = 1;
95
+ for (let i = 0; i < idx; i++)
96
+ if (normalizedFile[i] === "\n")
97
+ line++;
98
+ return line <= 1 ? undefined : line;
99
+ }
100
+ /** Literal insert. String.replace treats `$` in new_string as a substitution pattern. */
101
+ function replaceSpan(haystack, needle, replacement, all) {
102
+ if (all)
103
+ return haystack.split(needle).join(replacement);
104
+ const at = haystack.indexOf(needle);
105
+ return at === -1 ? haystack : haystack.slice(0, at) + replacement + haystack.slice(at + needle.length);
106
+ }
107
+ function editFileDiff(work, blobs) {
108
+ const args = work.args;
109
+ const old = stringArg(args, "old_string");
110
+ const next = stringArg(args, "new_string");
111
+ if (old === "" && next === "")
112
+ return { kind: "none" };
113
+ const filePath = stringArg(args, "path");
114
+ const replaceAll = args?.replace_all === true;
115
+ const prior = priorOf(work, filePath, old, blobs);
116
+ if (prior !== null && old !== "" && prior.includes(old)) {
117
+ return {
118
+ kind: "diff",
119
+ old: prior,
120
+ new: replaceSpan(prior, old, next, replaceAll),
121
+ path: filePath,
122
+ };
123
+ }
124
+ const stampedLine = work.priorLineStart;
125
+ const lineStart = spanLineStart(prior, old) ??
126
+ (typeof stampedLine === "number" && Number.isFinite(stampedLine) && stampedLine > 1 ? stampedLine : undefined);
127
+ return {
128
+ kind: "diff",
129
+ old,
130
+ new: next,
131
+ path: filePath,
132
+ ...(lineStart === undefined ? {} : { lineStart }),
133
+ };
134
+ }
135
+ /** Create = empty-old. Overwrite = stored prior text. Binary / unstamped exist is not a create Diff. */
136
+ function writeFileDiff(work, blobs) {
137
+ const args = work.args;
138
+ const next = stringArg(args, "content");
139
+ const filePath = stringArg(args, "path");
140
+ if (next === "")
141
+ return { kind: "none" };
142
+ const prior = priorOf(work, filePath, "", blobs);
143
+ if (prior !== null) {
144
+ return { kind: "diff", old: prior, new: next, path: filePath };
145
+ }
146
+ if (work instanceof FileMutateToolJob && work.existed === true)
147
+ return { kind: "none" };
148
+ return { kind: "diff", old: "", new: next, path: filePath };
149
+ }
150
+ function fileHintsOf(work) {
151
+ const hints = [];
152
+ for (const inner of work.toolCalls) {
153
+ if (inner.name !== "read_file")
154
+ continue;
155
+ const text = resultText(inner);
156
+ const path = stringArg(inner.args, "path");
157
+ if (text === "" || path === "")
158
+ continue;
159
+ hints.push({ path, text });
160
+ }
161
+ return hints;
162
+ }
163
+ function resultText(work) {
164
+ const snap = outcomeSnapOf(work);
165
+ if (snap === null)
166
+ return "";
167
+ if (typeof snap.text === "string" && snap.text !== "")
168
+ return snap.text;
169
+ if ("value" in snap) {
170
+ try {
171
+ return typeof snap.value === "string" ? snap.value : JSON.stringify(snap.value);
172
+ }
173
+ catch {
174
+ return String(snap.value);
175
+ }
176
+ }
177
+ return "";
178
+ }
179
+ function shellReceipt(work) {
180
+ const snap = outcomeSnapOf(work);
181
+ const value = snap?.value;
182
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
183
+ const rec = value;
184
+ const parts = [];
185
+ if (typeof rec.stdout === "string" && rec.stdout !== "")
186
+ parts.push(rec.stdout);
187
+ if (typeof rec.stderr === "string" && rec.stderr !== "")
188
+ parts.push(rec.stderr);
189
+ if (parts.length > 0)
190
+ return parts.join("\n");
191
+ }
192
+ return resultText(work);
193
+ }
194
+ /** `applyDenyReceipt` copies this into `outcomeJson.text`. The tape shows that copy once. */
195
+ function denialExplanation(work) {
196
+ const snap = outcomeSnapOf(work);
197
+ const vote = work.policyResult;
198
+ const denied = snap?.code === "policy_denied" ||
199
+ ((vote === "block" || vote === "deny") && snap?.ok !== true && work.humanApprove !== true);
200
+ if (!denied)
201
+ return null;
202
+ const policy = (work.policyMessage ?? "").trim();
203
+ const outcome = resultText(work);
204
+ const outcomeTrim = outcome.trim();
205
+ if (policy !== "" && (outcomeTrim === "" || outcomeTrim === policy))
206
+ return policy;
207
+ return outcomeTrim === "" ? "" : outcome;
208
+ }
209
+ function shellDenialLine(text) {
210
+ return { kind: "parts", parts: [{ kind: "text", text }] };
211
+ }
212
+ /** Suggestion Diff from args. Pin uses this even after `approved`, while tape live does not. */
213
+ export function mutateSuggestionReceipt(work, blobs) {
214
+ if (work.name === "edit_file")
215
+ return editFileDiff(work, blobs);
216
+ if (work.name === "write_file")
217
+ return writeFileDiff(work, blobs);
218
+ return { kind: "none" };
219
+ }
220
+ function receiptFace(work, state, blobs) {
221
+ if (state === "live") {
222
+ if (work instanceof ToolCallJob && work.name === "shell") {
223
+ const tail = shellTailOf(work);
224
+ if (tail !== null && tail.text !== "")
225
+ return { kind: "stream", text: tail.text };
226
+ }
227
+ return { kind: "none" };
228
+ }
229
+ if (state === "ask") {
230
+ if (work instanceof ToolCallJob) {
231
+ const suggestion = mutateSuggestionReceipt(work, blobs);
232
+ if (suggestion.kind !== "none")
233
+ return suggestion;
234
+ }
235
+ if (work instanceof ToolCallJob && work.name === "shell") {
236
+ const policy = work.policyMessage ?? "";
237
+ return policy === "" ? { kind: "none" } : { kind: "text", text: policy };
238
+ }
239
+ if (work instanceof MCPToolJob) {
240
+ return { kind: "none" };
241
+ }
242
+ return { kind: "none" };
243
+ }
244
+ if (work instanceof ProgrammaticJob) {
245
+ return schemePaintReceipt(outcomeSnapOf(work), fileHintsOf(work));
246
+ }
247
+ const explanation = denialExplanation(work);
248
+ if (explanation !== null) {
249
+ if (explanation === "")
250
+ return { kind: "none" };
251
+ return work.name === "shell" ? shellDenialLine(explanation) : { kind: "text", text: explanation };
252
+ }
253
+ if (work.name === "edit_file")
254
+ return editFileDiff(work, blobs);
255
+ if (work.name === "write_file") {
256
+ const diff = writeFileDiff(work, blobs);
257
+ if (diff.kind !== "none")
258
+ return diff;
259
+ const text = resultText(work);
260
+ return text === "" ? { kind: "none" } : { kind: "text", text };
261
+ }
262
+ if (work.name === "read_file") {
263
+ // The tape row is the path only. File text is not a receipt.
264
+ return { kind: "none" };
265
+ }
266
+ if (work.name === "shell") {
267
+ const sealed = shellReceipt(work);
268
+ return sealed === "" ? { kind: "none" } : { kind: "text", text: sealed };
269
+ }
270
+ const serialized = prettyResult(work, outcomeSnapOf(work));
271
+ if (serialized !== null && serialized !== "") {
272
+ return serialized.includes("**") || serialized.includes("`") || serialized.includes("![")
273
+ ? { kind: "markdown", text: serialized }
274
+ : { kind: "text", text: serialized };
275
+ }
276
+ const text = resultText(work);
277
+ return text === "" ? { kind: "none" } : { kind: "text", text };
278
+ }
279
+ function faceText(value) {
280
+ return typeof value === "string" ? value : "";
281
+ }
282
+ /** The worker's reply, not the prompt we sent. Failures stay the gutter. */
283
+ function agentResponseText(work) {
284
+ if (!(work instanceof ToolCallJob))
285
+ return "";
286
+ const snap = outcomeSnapOf(work);
287
+ if (snap === null || snap.ok !== true)
288
+ return "";
289
+ if ("value" in snap && snap.value != null) {
290
+ if (typeof snap.value === "string")
291
+ return snap.value.trim();
292
+ try {
293
+ return JSON.stringify(snap.value, null, 2);
294
+ }
295
+ catch {
296
+ return String(snap.value);
297
+ }
298
+ }
299
+ return typeof snap.text === "string" ? snap.text.trim() : "";
300
+ }
301
+ export function workCellFace(work, key, indent, collapsed = true, glance = "", kernel, blobs) {
302
+ const jobState = work instanceof ProgrammaticJob ? schemeCellState(work) : toolCellState(work);
303
+ const line = identityLine(work, kernel);
304
+ const comment = work instanceof ApprovableJob && work.approvalComment != null && work.approvalComment !== ""
305
+ ? work.approvalComment
306
+ : "";
307
+ const agent = line.agent === true;
308
+ const pretty = line.pretty === true && !agent;
309
+ const tape = typeof glance === "string" ? { status: glance } : glance;
310
+ return {
311
+ key,
312
+ // Live bag with an open inner paints sealed chrome, not a spinner.
313
+ state: work instanceof ProgrammaticJob &&
314
+ jobState === "live" &&
315
+ work.toolCalls.some((inner) => {
316
+ const innerState = toolCellState(inner);
317
+ return innerState === "live" || innerState === "ask";
318
+ })
319
+ ? "ok"
320
+ : jobState,
321
+ name: faceText(line.name),
322
+ object: agent ? faceText(tape.status).trim() : faceText(line.object),
323
+ status: [faceText(line.status), comment].filter((part) => part !== "").join(" "),
324
+ caption: faceText(line.caption),
325
+ pathShaped: !pretty && work instanceof ToolCallJob && isPathShapedName(faceText(work.name)),
326
+ split: !pretty && !agent && work instanceof MCPToolJob,
327
+ agent,
328
+ pretty,
329
+ prettyBlock: agent ? agentExpandBlock(faceText(line.block), faceText(tape.model)) : faceText(line.block),
330
+ response: agent ? agentResponseText(work) : "",
331
+ indent,
332
+ collapsed,
333
+ receipt: receiptFace(work, jobState, blobs),
334
+ rimNamed: coverAskAnnotation(work, { kernel }) !== undefined,
335
+ };
336
+ }
337
+ //# sourceMappingURL=work-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-text.js","sourceRoot":"","sources":["../../src/text/work-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { WebsocketProvider } from "y-websocket";
2
+ import type * as Y from "yjs";
3
+ /** HTTP upgrade refused this room (sessionId-only unknown is 404). */
4
+ export declare class RoomNotFound extends Error {
5
+ readonly status: number;
6
+ constructor(room: string, status: number);
7
+ }
8
+ export type OpenUnixRoomOptions = {
9
+ /** Default true. Restore / probe must be false so a 404 does not retry. */
10
+ readonly reconnect?: boolean;
11
+ /** Caps `waitForSync`. Unset + reconnect follows y-websocket (no cap). Unset + no reconnect is 8s. */
12
+ readonly syncTimeoutMs?: number;
13
+ };
14
+ /** One y-websocket room over `ws+unix://`. Caller owns the doc.
15
+ * Transient close reconnects (y-websocket default: 4400-4499 is permanent).
16
+ * Spawning the daemon is the caller's `ensure`, not this dial. */
17
+ export declare function openUnixRoom(socketPath: string, room: string, params: Record<string, string>, doc: Y.Doc, options?: OpenUnixRoomOptions): Promise<WebsocketProvider>;
18
+ export { detachProtocolAwareness } from "@inhuman.tools/harness-peer";
19
+ //# sourceMappingURL=unix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unix.d.ts","sourceRoot":"","sources":["../../src/transport/unix.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAE9B,sEAAsE;AACtE,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAKzC;AAcD,MAAM,MAAM,mBAAmB,GAAG;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,sGAAsG;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF;;kEAEkE;AAClE,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAoC5B;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { detachProtocolAwareness, destroyProvider, waitForSync } from "@inhuman.tools/harness-peer";
2
+ import { WebSocket } from "ws";
3
+ import { WebsocketProvider } from "y-websocket";
4
+ /** HTTP upgrade refused this room (sessionId-only unknown is 404). */
5
+ export class RoomNotFound extends Error {
6
+ status;
7
+ constructor(room, status) {
8
+ super(`${room}: not found`);
9
+ this.name = "RoomNotFound";
10
+ this.status = status;
11
+ }
12
+ }
13
+ function unixSocket(onHttpStatus) {
14
+ return function UnixWebSocket(url, protocols) {
15
+ const socket = new WebSocket(url, protocols);
16
+ socket.on("unexpected-response", (_req, res) => {
17
+ onHttpStatus(res.statusCode ?? 0);
18
+ res.resume();
19
+ socket.terminate();
20
+ });
21
+ return socket;
22
+ };
23
+ }
24
+ /** One y-websocket room over `ws+unix://`. Caller owns the doc.
25
+ * Transient close reconnects (y-websocket default: 4400-4499 is permanent).
26
+ * Spawning the daemon is the caller's `ensure`, not this dial. */
27
+ export async function openUnixRoom(socketPath, room, params, doc, options) {
28
+ let httpStatus = 0;
29
+ const reconnect = options?.reconnect !== false;
30
+ let rejectNotFound = () => undefined;
31
+ const notFound = new Promise((_resolve, reject) => {
32
+ rejectNotFound = reject;
33
+ });
34
+ const provider = new WebsocketProvider(`ws+unix://${socketPath}:`, room, doc, {
35
+ // @ts-expect-error Node `ws` is the unix dial; y-websocket types a DOM WebSocket
36
+ WebSocketPolyfill: unixSocket((status) => {
37
+ httpStatus = status;
38
+ if (status === 404)
39
+ rejectNotFound(new RoomNotFound(room, status));
40
+ }),
41
+ params,
42
+ disableBc: true,
43
+ shouldReconnect: reconnect ? undefined : () => false,
44
+ });
45
+ // disableBc skips broadcast-channel subscribe; disconnect() still runs
46
+ // disconnectBc, which encodes awareness against an empty Map and throws
47
+ // `Cannot read properties of undefined (reading 'clock')`.
48
+ provider.disconnectBc = () => undefined;
49
+ detachProtocolAwareness(provider);
50
+ if (provider.synced)
51
+ return provider;
52
+ try {
53
+ // A cold open replays a long append log once (then the image is compacted).
54
+ // 8s expired while that replay still held the daemon, before the socket opened.
55
+ const syncTimeoutMs = options?.syncTimeoutMs ?? (reconnect ? undefined : 60_000);
56
+ await Promise.race([waitForSync(provider, room, syncTimeoutMs), notFound]);
57
+ }
58
+ catch (error) {
59
+ destroyProvider(provider);
60
+ if (httpStatus === 404 || error instanceof RoomNotFound) {
61
+ throw error instanceof RoomNotFound ? error : new RoomNotFound(room, httpStatus);
62
+ }
63
+ throw error;
64
+ }
65
+ return provider;
66
+ }
67
+ export { detachProtocolAwareness } from "@inhuman.tools/harness-peer";
68
+ //# sourceMappingURL=unix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unix.js","sourceRoot":"","sources":["../../src/transport/unix.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,82 @@
1
1
  {
2
2
  "name": "@inhuman.tools/harness-sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Node client for the harness daemon: Client over the unix socket, daemon paths, launch helpers (model flags, terminal continue), and the plain-text projections of work cells shared by the TUI and the headless eval client.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./paths": {
15
+ "types": "./dist/paths.d.ts",
16
+ "import": "./dist/paths.js",
17
+ "default": "./dist/paths.js"
18
+ },
19
+ "./launch": {
20
+ "types": "./dist/launch/index.d.ts",
21
+ "import": "./dist/launch/index.js",
22
+ "default": "./dist/launch/index.js"
23
+ },
24
+ "./text": {
25
+ "types": "./dist/text/index.d.ts",
26
+ "import": "./dist/text/index.js",
27
+ "default": "./dist/text/index.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "src",
33
+ "!**/__tests__"
34
+ ],
35
+ "browserslist": [
36
+ "node >= 22"
37
+ ],
38
+ "dependencies": {
39
+ "@here.build/arrival": "^0.10.2",
40
+ "@here.build/arrival-serializer": "^0.10.2",
41
+ "@here.build/arrival-sugarcoat": "^0.10.0",
42
+ "@here.build/collections": "^0.9.0",
43
+ "@here.build/plexus": "^0.9.6",
44
+ "mobx": "6.16.1",
45
+ "sh-syntax": "^0.6.0",
46
+ "ws": "8.18.3",
47
+ "y-websocket": "3.1.0",
48
+ "yjs": "13.6.33",
49
+ "@inhuman.tools/harness-model": "^0.1.0",
50
+ "@inhuman.tools/plexus-expectations": "^0.1.0",
51
+ "@inhuman.tools/harness-peer": "^0.1.0",
52
+ "@inhuman.tools/harness-diagnostics": "^0.1.0",
53
+ "@inhuman.tools/pretty-mcp": "^0.1.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^24.0.0",
57
+ "@types/ws": "8.18.1",
58
+ "eslint": "9.39.2",
59
+ "lib0": "0.2.119",
60
+ "typescript": "6.0.2",
61
+ "vitest": "4.1.0",
62
+ "@-internal-/eslint-configs": "0.0.0",
63
+ "@inhuman.tools/harness-commons": "^0.1.0"
64
+ },
65
+ "license": "MIT",
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "git+https://github.com/here-build/inhuman-harness.git",
69
+ "directory": "packages/harness-sdk"
70
+ },
71
+ "author": "Merkle Bonsai",
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
75
+ "scripts": {
76
+ "build": "tsc -p tsconfig.build.json",
77
+ "lint": "eslint .",
78
+ "lint:fix": "eslint . --fix",
79
+ "typecheck": "tsc -p tsconfig.json --noEmit",
80
+ "test": "tsc -p tsconfig.json --noEmit && vitest run"
81
+ }
6
82
  }