@inhuman.tools/harness-sdk 0.0.0-stage → 0.2.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,84 @@
1
+ import { IncomingMessage } from "node:http";
2
+
3
+ import { detachProtocolAwareness, destroyProvider, waitForSync } from "@inhuman.tools/harness-peer";
4
+ import { WebSocket } from "ws";
5
+ import { WebsocketProvider } from "y-websocket";
6
+ import type * as Y from "yjs";
7
+
8
+ /** HTTP upgrade refused this room (sessionId-only unknown is 404). */
9
+ export class RoomNotFound extends Error {
10
+ readonly status: number;
11
+ constructor(room: string, status: number) {
12
+ super(`${room}: not found`);
13
+ this.name = "RoomNotFound";
14
+ this.status = status;
15
+ }
16
+ }
17
+
18
+ function unixSocket(onHttpStatus: (status: number) => void) {
19
+ return function UnixWebSocket(url: string, protocols?: string | string[]) {
20
+ const socket = new WebSocket(url, protocols);
21
+ socket.on("unexpected-response", (_req: IncomingMessage, res: IncomingMessage) => {
22
+ onHttpStatus(res.statusCode ?? 0);
23
+ res.resume();
24
+ socket.terminate();
25
+ });
26
+ return socket;
27
+ };
28
+ }
29
+
30
+ export type OpenUnixRoomOptions = {
31
+ /** Default true. Restore / probe must be false so a 404 does not retry. */
32
+ readonly reconnect?: boolean;
33
+ /** Caps `waitForSync`. Unset + reconnect follows y-websocket (no cap). Unset + no reconnect is 8s. */
34
+ readonly syncTimeoutMs?: number;
35
+ };
36
+
37
+ /** One y-websocket room over `ws+unix://`. Caller owns the doc.
38
+ * Transient close reconnects (y-websocket default: 4400-4499 is permanent).
39
+ * Spawning the daemon is the caller's `ensure`, not this dial. */
40
+ export async function openUnixRoom(
41
+ socketPath: string,
42
+ room: string,
43
+ params: Record<string, string>,
44
+ doc: Y.Doc,
45
+ options?: OpenUnixRoomOptions,
46
+ ): Promise<WebsocketProvider> {
47
+ let httpStatus = 0;
48
+ const reconnect = options?.reconnect !== false;
49
+ let rejectNotFound: (error: Error) => void = () => undefined;
50
+ const notFound = new Promise<never>((_resolve, reject) => {
51
+ rejectNotFound = reject;
52
+ });
53
+ const provider = new WebsocketProvider(`ws+unix://${socketPath}:`, room, doc, {
54
+ // @ts-expect-error Node `ws` is the unix dial; y-websocket types a DOM WebSocket
55
+ WebSocketPolyfill: unixSocket((status) => {
56
+ httpStatus = status;
57
+ if (status === 404) rejectNotFound(new RoomNotFound(room, status));
58
+ }),
59
+ params,
60
+ disableBc: true,
61
+ shouldReconnect: reconnect ? undefined : () => false,
62
+ });
63
+ // disableBc skips broadcast-channel subscribe; disconnect() still runs
64
+ // disconnectBc, which encodes awareness against an empty Map and throws
65
+ // `Cannot read properties of undefined (reading 'clock')`.
66
+ provider.disconnectBc = () => undefined;
67
+ detachProtocolAwareness(provider);
68
+ if (provider.synced) return provider;
69
+ try {
70
+ // A cold open replays a long append log once (then the image is compacted).
71
+ // 8s expired while that replay still held the daemon, before the socket opened.
72
+ const syncTimeoutMs = options?.syncTimeoutMs ?? (reconnect ? undefined : 60_000);
73
+ await Promise.race([waitForSync(provider, room, syncTimeoutMs), notFound]);
74
+ } catch (error) {
75
+ destroyProvider(provider);
76
+ if (httpStatus === 404 || error instanceof RoomNotFound) {
77
+ throw error instanceof RoomNotFound ? error : new RoomNotFound(room, httpStatus);
78
+ }
79
+ throw error;
80
+ }
81
+ return provider;
82
+ }
83
+
84
+ export { detachProtocolAwareness } from "@inhuman.tools/harness-peer";
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.