@superblocksteam/library-shared 1.99.99-next.3 → 2.0.0-SNAPSHOT.295fc0b43e332060

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 (193) hide show
  1. package/dist/computed.d.ts +4 -2
  2. package/dist/computed.d.ts.map +1 -1
  3. package/dist/computed.js +1 -1
  4. package/dist/computed.js.map +1 -1
  5. package/dist/default-structure.d.ts +12 -0
  6. package/dist/default-structure.d.ts.map +1 -0
  7. package/dist/default-structure.js +36 -0
  8. package/dist/default-structure.js.map +1 -0
  9. package/dist/event-trigger-constants.d.ts +2 -0
  10. package/dist/event-trigger-constants.d.ts.map +1 -0
  11. package/dist/event-trigger-constants.js +2 -0
  12. package/dist/event-trigger-constants.js.map +1 -0
  13. package/dist/index.d.ts +18 -9
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +17 -9
  16. package/dist/index.js.map +1 -1
  17. package/dist/layout.d.ts +12 -1
  18. package/dist/layout.d.ts.map +1 -1
  19. package/dist/layout.js +11 -4
  20. package/dist/layout.js.map +1 -1
  21. package/dist/mobx-sync/apply-patch.d.ts.map +1 -1
  22. package/dist/mobx-sync/apply-patch.js +23 -4
  23. package/dist/mobx-sync/apply-patch.js.map +1 -1
  24. package/dist/mobx-sync/to-patch.d.ts.map +1 -1
  25. package/dist/mobx-sync/to-patch.js.map +1 -1
  26. package/dist/pages.d.ts +76 -6
  27. package/dist/pages.d.ts.map +1 -1
  28. package/dist/pages.js +54 -2
  29. package/dist/pages.js.map +1 -1
  30. package/dist/pegs/find-string-interpolation.d.ts +12 -0
  31. package/dist/pegs/find-string-interpolation.d.ts.map +1 -0
  32. package/dist/pegs/find-string-interpolation.js +1265 -0
  33. package/dist/pegs/find-string-interpolation.js.map +1 -0
  34. package/dist/props/helpers.d.ts +1 -9
  35. package/dist/props/helpers.d.ts.map +1 -1
  36. package/dist/props/helpers.js +5 -54
  37. package/dist/props/helpers.js.map +1 -1
  38. package/dist/props/prop-types.d.ts +24 -13
  39. package/dist/props/prop-types.d.ts.map +1 -1
  40. package/dist/props/prop-types.js.map +1 -1
  41. package/dist/props/properties-panel.d.ts +61 -26
  42. package/dist/props/properties-panel.d.ts.map +1 -1
  43. package/dist/props/properties-panel.js +2 -5
  44. package/dist/props/properties-panel.js.map +1 -1
  45. package/dist/props/tailwind-property-keys.d.ts +5 -0
  46. package/dist/props/tailwind-property-keys.d.ts.map +1 -0
  47. package/dist/props/tailwind-property-keys.js +234 -0
  48. package/dist/props/tailwind-property-keys.js.map +1 -0
  49. package/dist/restart-contract.d.ts +35 -0
  50. package/dist/restart-contract.d.ts.map +1 -0
  51. package/dist/restart-contract.js +49 -0
  52. package/dist/restart-contract.js.map +1 -0
  53. package/dist/scope.d.ts +2 -0
  54. package/dist/scope.d.ts.map +1 -1
  55. package/dist/scope.js +3 -0
  56. package/dist/scope.js.map +1 -1
  57. package/dist/testing/default-structure-scope/index.d.ts +8 -0
  58. package/dist/testing/default-structure-scope/index.d.ts.map +1 -0
  59. package/dist/testing/default-structure-scope/index.js +62 -0
  60. package/dist/testing/default-structure-scope/index.js.map +1 -0
  61. package/dist/testing/fake-editor-channel/fake-artifact.d.ts +41 -0
  62. package/dist/testing/fake-editor-channel/fake-artifact.d.ts.map +1 -0
  63. package/dist/testing/fake-editor-channel/fake-artifact.js +74 -0
  64. package/dist/testing/fake-editor-channel/fake-artifact.js.map +1 -0
  65. package/dist/testing/fake-editor-channel/index.d.ts +115 -0
  66. package/dist/testing/fake-editor-channel/index.d.ts.map +1 -0
  67. package/dist/testing/fake-editor-channel/index.js +292 -0
  68. package/dist/testing/fake-editor-channel/index.js.map +1 -0
  69. package/dist/testing/fake-editor-channel/type-pins.d.ts +13 -0
  70. package/dist/testing/fake-editor-channel/type-pins.d.ts.map +1 -0
  71. package/dist/testing/fake-editor-channel/type-pins.js +13 -0
  72. package/dist/testing/fake-editor-channel/type-pins.js.map +1 -0
  73. package/dist/types/ai.d.ts +1745 -0
  74. package/dist/types/ai.d.ts.map +1 -0
  75. package/dist/types/ai.js +445 -0
  76. package/dist/types/ai.js.map +1 -0
  77. package/dist/types/apis.d.ts +44 -1
  78. package/dist/types/apis.d.ts.map +1 -1
  79. package/dist/types/base-entity-manager.d.ts +15 -0
  80. package/dist/types/base-entity-manager.d.ts.map +1 -0
  81. package/dist/types/base-entity-manager.js +2 -0
  82. package/dist/types/base-entity-manager.js.map +1 -0
  83. package/dist/types/common.d.ts +4 -1
  84. package/dist/types/common.d.ts.map +1 -1
  85. package/dist/types/common.js +4 -1
  86. package/dist/types/common.js.map +1 -1
  87. package/dist/types/edit-operations.d.ts +26 -35
  88. package/dist/types/edit-operations.d.ts.map +1 -1
  89. package/dist/types/edit-operations.js +2 -0
  90. package/dist/types/edit-operations.js.map +1 -1
  91. package/dist/types/entities.d.ts +10 -29
  92. package/dist/types/entities.d.ts.map +1 -1
  93. package/dist/types/entities.js +0 -5
  94. package/dist/types/entities.js.map +1 -1
  95. package/dist/types/errors.d.ts +82 -1
  96. package/dist/types/errors.d.ts.map +1 -1
  97. package/dist/types/errors.js +18 -1
  98. package/dist/types/errors.js.map +1 -1
  99. package/dist/types/events.d.ts +218 -26
  100. package/dist/types/events.d.ts.map +1 -1
  101. package/dist/types/events.js +33 -5
  102. package/dist/types/events.js.map +1 -1
  103. package/dist/types/index.d.ts +19 -7
  104. package/dist/types/index.d.ts.map +1 -1
  105. package/dist/types/index.js +19 -7
  106. package/dist/types/index.js.map +1 -1
  107. package/dist/types/migration.d.ts +240 -0
  108. package/dist/types/migration.d.ts.map +1 -0
  109. package/dist/types/migration.js +50 -0
  110. package/dist/types/migration.js.map +1 -0
  111. package/dist/types/mobx-shared-state.d.ts +25 -1
  112. package/dist/types/mobx-shared-state.d.ts.map +1 -1
  113. package/dist/types/parent-messages.d.ts +44 -14
  114. package/dist/types/parent-messages.d.ts.map +1 -1
  115. package/dist/types/persisted-chat-message.d.ts +55 -0
  116. package/dist/types/persisted-chat-message.d.ts.map +1 -0
  117. package/dist/types/persisted-chat-message.js +757 -0
  118. package/dist/types/persisted-chat-message.js.map +1 -0
  119. package/dist/types/protected-packages.d.ts +54 -0
  120. package/dist/types/protected-packages.d.ts.map +1 -0
  121. package/dist/types/protected-packages.js +91 -0
  122. package/dist/types/protected-packages.js.map +1 -0
  123. package/dist/types/register-component.d.ts +128 -0
  124. package/dist/types/register-component.d.ts.map +1 -0
  125. package/dist/types/register-component.js +45 -0
  126. package/dist/types/register-component.js.map +1 -0
  127. package/dist/types/routing.d.ts +68 -0
  128. package/dist/types/routing.d.ts.map +1 -0
  129. package/dist/types/routing.js +2 -0
  130. package/dist/types/routing.js.map +1 -0
  131. package/dist/types/scope.d.ts +8 -6
  132. package/dist/types/scope.d.ts.map +1 -1
  133. package/dist/types/snapshot.d.ts +53 -0
  134. package/dist/types/snapshot.d.ts.map +1 -0
  135. package/dist/types/snapshot.js +2 -0
  136. package/dist/types/snapshot.js.map +1 -0
  137. package/dist/types/socket-method-names.d.ts +216 -0
  138. package/dist/types/socket-method-names.d.ts.map +1 -0
  139. package/dist/types/socket-method-names.js +165 -0
  140. package/dist/types/socket-method-names.js.map +1 -0
  141. package/dist/types/socket.d.ts +722 -48
  142. package/dist/types/socket.d.ts.map +1 -1
  143. package/dist/types/theme.d.ts +8 -7
  144. package/dist/types/theme.d.ts.map +1 -1
  145. package/dist/types/theme.js +5 -6
  146. package/dist/types/theme.js.map +1 -1
  147. package/dist/types/tool-permission-response.d.ts +5 -0
  148. package/dist/types/tool-permission-response.d.ts.map +1 -0
  149. package/dist/types/tool-permission-response.js +26 -0
  150. package/dist/types/tool-permission-response.js.map +1 -0
  151. package/dist/types/vite.d.ts +29 -0
  152. package/dist/types/vite.d.ts.map +1 -0
  153. package/dist/types/vite.js +6 -0
  154. package/dist/types/vite.js.map +1 -0
  155. package/dist/urls.d.ts +7 -0
  156. package/dist/urls.d.ts.map +1 -0
  157. package/dist/urls.js +6 -0
  158. package/dist/urls.js.map +1 -0
  159. package/dist/utils/binding-identifier.d.ts +1 -0
  160. package/dist/utils/binding-identifier.d.ts.map +1 -1
  161. package/dist/utils/binding-identifier.js +3 -0
  162. package/dist/utils/binding-identifier.js.map +1 -1
  163. package/dist/utils/blocks.d.ts +3 -0
  164. package/dist/utils/blocks.d.ts.map +1 -0
  165. package/dist/utils/blocks.js +70 -0
  166. package/dist/utils/blocks.js.map +1 -0
  167. package/dist/utils/computed-args.d.ts +11 -0
  168. package/dist/utils/computed-args.d.ts.map +1 -0
  169. package/dist/utils/computed-args.js +13 -0
  170. package/dist/utils/computed-args.js.map +1 -0
  171. package/dist/utils/dev-server-authorization.d.ts +4 -0
  172. package/dist/utils/dev-server-authorization.d.ts.map +1 -0
  173. package/dist/utils/dev-server-authorization.js +56 -0
  174. package/dist/utils/dev-server-authorization.js.map +1 -0
  175. package/dist/utils/dotted-paths.js +1 -1
  176. package/dist/utils/dotted-paths.js.map +1 -1
  177. package/dist/utils/properties.d.ts +12 -9
  178. package/dist/utils/properties.d.ts.map +1 -1
  179. package/dist/utils/properties.js +14 -6
  180. package/dist/utils/properties.js.map +1 -1
  181. package/dist/utils/routing.d.ts +5 -0
  182. package/dist/utils/routing.d.ts.map +1 -0
  183. package/dist/utils/routing.js +16 -0
  184. package/dist/utils/routing.js.map +1 -0
  185. package/dist/utils/strings.d.ts +12 -0
  186. package/dist/utils/strings.d.ts.map +1 -1
  187. package/dist/utils/strings.js +40 -1
  188. package/dist/utils/strings.js.map +1 -1
  189. package/package.json +53 -25
  190. package/dist/apis.d.ts +0 -2
  191. package/dist/apis.d.ts.map +0 -1
  192. package/dist/apis.js +0 -4
  193. package/dist/apis.js.map +0 -1
@@ -0,0 +1,115 @@
1
+ import type { ISocketClient, RequestContextBase } from "@superblocksteam/shared";
2
+ import { EDITOR_CLIENT_METHOD_NAMES, SERVER_EDITOR_METHOD_NAMES } from "../../types/socket-method-names.js";
3
+ import type { EditorClientMethods, ServerMethods } from "../../types/socket.js";
4
+ export { EDITOR_CLIENT_METHOD_NAMES, SERVER_EDITOR_METHOD_NAMES };
5
+ export { FakeArtifact, type FakeArtifactState } from "./fake-artifact.js";
6
+ type FakeHandler<Method> = Method extends (params: infer Params) => Promise<infer Result> ? (params: Params, context: RequestContextBase, peer: ISocketClient<ServerMethods>, next: () => Promise<Result>) => Result | Promise<Result> : never;
7
+ export type FakeEditorClientHandlers = Partial<{
8
+ [Method in keyof EditorClientMethods]: readonly FakeHandler<EditorClientMethods[Method]>[];
9
+ }>;
10
+ export type FakeServerEditorHandlers = Partial<{
11
+ [Method in keyof ServerMethods["editor"]]: ServerMethods["editor"][Method];
12
+ }>;
13
+ export interface FakeEditorChannelRequest {
14
+ direction: "editor-to-server" | "server-to-editor";
15
+ generation: number;
16
+ method: keyof EditorClientMethods | keyof ServerMethods["editor"];
17
+ params: unknown;
18
+ transportSeq: number;
19
+ }
20
+ export interface FakeEditorChannelPeer extends ISocketClient<EditorClientMethods> {
21
+ readonly connectionGeneration: number;
22
+ readonly isConnected: boolean;
23
+ invalidateConnection(generation: number): void;
24
+ whenConnected(timeoutMs: number): Promise<boolean>;
25
+ whenConnectedAfter(generation: number, timeoutMs: number): Promise<boolean>;
26
+ }
27
+ /**
28
+ * In-memory editor Channel Adapter for contract and surface tests.
29
+ *
30
+ * Calls from an editor into `ServerMethods.editor` are recorded by `call`.
31
+ * Calls from the server into `EditorClientMethods` are initiated through
32
+ * `push` and delivered to the handlers bound for the current connection.
33
+ * Editor handlers are connection-scoped: `dropConnection` clears them, so a
34
+ * `reconnect` without replacement handlers starts the new generation with
35
+ * none bound. Within a live connection, `bindEditorHandlers` merges across
36
+ * distinct methods but is last-write-wins per method key: re-binding a
37
+ * method replaces its whole handler chain rather than appending to it. The
38
+ * handlers passed to `reconnect` replace the entire bound set.
39
+ *
40
+ * Error behavior mirrors the real transport (`ISocket`) for the codes this
41
+ * fake models: 2, 5, and 10. Unknown method names reject with a plain
42
+ * `{ code: 2, message }` object and `next()` past the last handler rejects
43
+ * with a plain `{ code: 5, message, stack }` object; like the real remote
44
+ * error path, neither is an Error instance. Calls on a dropped connection
45
+ * reject with an actual `SocketErrorException` (code 10), matching the real
46
+ * local closed-socket path. Codes 4, 6, 7, 8, and 9 are not modeled; in
47
+ * particular, an in-flight push during a real mid-connection drop rejects
48
+ * with code 8, which this fake cannot produce because `dropConnection` does
49
+ * not reject in-flight work.
50
+ *
51
+ * A peer's `close`/`closeAndRejectPendingRequests` is terminal: it resolves
52
+ * pending connection waiters `false` immediately (matching StablePeer), while
53
+ * `dropConnection` is transient and leaves them pending for `reconnect`.
54
+ * StablePeer's disconnected-call queueing and replay (dispatch/flush) is not
55
+ * modeled: calls on a dropped connection reject rather than queue.
56
+ *
57
+ * By default (`strict: true`) a valid method with no handler bound also
58
+ * rejects with code 2, matching production; pass `strict: false` to resolve
59
+ * `undefined` instead for recording-only tests. In strict mode a
60
+ * valid-but-unhandled request IS recorded in `requests` before rejecting,
61
+ * while an unknown method name is NOT recorded.
62
+ */
63
+ export declare class FakeEditorChannel {
64
+ readonly call: ISocketClient<ServerMethods>["call"];
65
+ readonly editorPeer: FakeEditorChannelPeer;
66
+ readonly push: ISocketClient<EditorClientMethods>["call"];
67
+ readonly requests: FakeEditorChannelRequest[];
68
+ private connected;
69
+ private editorHandlers;
70
+ private generation;
71
+ private nextTransportSeq;
72
+ private readonly serverHandlers;
73
+ private readonly strict;
74
+ private readonly waiters;
75
+ constructor(options?: {
76
+ editorHandlers?: FakeEditorClientHandlers;
77
+ serverHandlers?: FakeServerEditorHandlers;
78
+ /**
79
+ * When true (the default), a valid method with no handler bound rejects
80
+ * with a plain `{ code: 2, message }` object like the real transport.
81
+ * Pass false to resolve `undefined` instead for recording-only tests.
82
+ */
83
+ strict?: boolean;
84
+ });
85
+ get connectionGeneration(): number;
86
+ get isConnected(): boolean;
87
+ bindEditorHandlers(handlers: FakeEditorClientHandlers): void;
88
+ dropConnection(): void;
89
+ /**
90
+ * Terminal close, as invoked through a peer's `close` or
91
+ * `closeAndRejectPendingRequests`. On top of `dropConnection`, settles
92
+ * every pending connection waiter with `false` immediately (matching
93
+ * StablePeer's rejectPendingConnectionState); `dropConnection` alone
94
+ * leaves waiters pending so a later `reconnect` can resolve them `true`.
95
+ */
96
+ private closeConnection;
97
+ reconnect(handlers?: FakeEditorClientHandlers): void;
98
+ invalidateConnection(generation: number): void;
99
+ /**
100
+ * The editor-path correlation ID (the per-turn `requestId` string inside
101
+ * editor-to-server payloads) of the most recent editor call that carried
102
+ * one. Distinct from `transportSeq`, the fake's per-message counter, and
103
+ * from A2A task ids, which belong to the gateway path.
104
+ */
105
+ lastEditorPathCorrelationId(): string | undefined;
106
+ whenConnected(timeoutMs: number): Promise<boolean>;
107
+ whenConnectedAfter(generation: number, timeoutMs: number): Promise<boolean>;
108
+ private record;
109
+ private receiveEditorCall;
110
+ private pushToEditor;
111
+ private callingPeer;
112
+ private assertConnected;
113
+ private waitForConnection;
114
+ }
115
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/fake-editor-channel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,292 @@
1
+ import { SocketErrorException } from "@superblocksteam/shared";
2
+ import { EDITOR_CLIENT_METHOD_NAMES, SERVER_EDITOR_METHOD_NAMES, editorClientMethodSet, serverEditorMethodSet, } from "../../types/socket-method-names.js";
3
+ // Re-exported for existing importers of the testing subpath; the canonical,
4
+ // production-consumable home is `../../types/socket-method-names.js`
5
+ // (`@superblocksteam/library-shared/types/socket-method-names`).
6
+ export { EDITOR_CLIENT_METHOD_NAMES, SERVER_EDITOR_METHOD_NAMES };
7
+ export { FakeArtifact } from "./fake-artifact.js";
8
+ /**
9
+ * The remote-error shape the real transport delivers for an unknown method:
10
+ * `ISocket.handleMessage` builds `{ code: 2, message }` directly (no stack)
11
+ * and `respondError` JSON-serializes it, so the caller's promise rejects with
12
+ * a parsed plain object, never an Error instance.
13
+ */
14
+ const unknownMethodError = (message) => ({
15
+ code: 2,
16
+ message,
17
+ });
18
+ /**
19
+ * Strict-mode rejection for a valid method with no handler bound. Same plain
20
+ * `{ code: 2, message }` shape and code as the real transport's unknown-method
21
+ * rejection, but the message names the missing binding so a failure points at
22
+ * the absent stub instead of a nonexistent typo in the method name.
23
+ */
24
+ const strictUnboundError = (method) => ({
25
+ code: 2,
26
+ message: `no handler bound for ${method} (strict mode - bind a handler or construct with strict: false)`,
27
+ });
28
+ /**
29
+ * The remote-error shape the real transport delivers when a handler chain
30
+ * throws: `ISocket.handleMessage` catches the `SocketErrorException` and
31
+ * serializes `{ code, message, stack }`, so the caller's promise rejects with
32
+ * a parsed plain object carrying a stack string, never an Error instance.
33
+ */
34
+ const remoteHandlerError = (code, message) => {
35
+ const exception = new SocketErrorException(code, message);
36
+ return {
37
+ code: exception.code,
38
+ message: exception.message,
39
+ stack: exception.stack,
40
+ };
41
+ };
42
+ /**
43
+ * In-memory editor Channel Adapter for contract and surface tests.
44
+ *
45
+ * Calls from an editor into `ServerMethods.editor` are recorded by `call`.
46
+ * Calls from the server into `EditorClientMethods` are initiated through
47
+ * `push` and delivered to the handlers bound for the current connection.
48
+ * Editor handlers are connection-scoped: `dropConnection` clears them, so a
49
+ * `reconnect` without replacement handlers starts the new generation with
50
+ * none bound. Within a live connection, `bindEditorHandlers` merges across
51
+ * distinct methods but is last-write-wins per method key: re-binding a
52
+ * method replaces its whole handler chain rather than appending to it. The
53
+ * handlers passed to `reconnect` replace the entire bound set.
54
+ *
55
+ * Error behavior mirrors the real transport (`ISocket`) for the codes this
56
+ * fake models: 2, 5, and 10. Unknown method names reject with a plain
57
+ * `{ code: 2, message }` object and `next()` past the last handler rejects
58
+ * with a plain `{ code: 5, message, stack }` object; like the real remote
59
+ * error path, neither is an Error instance. Calls on a dropped connection
60
+ * reject with an actual `SocketErrorException` (code 10), matching the real
61
+ * local closed-socket path. Codes 4, 6, 7, 8, and 9 are not modeled; in
62
+ * particular, an in-flight push during a real mid-connection drop rejects
63
+ * with code 8, which this fake cannot produce because `dropConnection` does
64
+ * not reject in-flight work.
65
+ *
66
+ * A peer's `close`/`closeAndRejectPendingRequests` is terminal: it resolves
67
+ * pending connection waiters `false` immediately (matching StablePeer), while
68
+ * `dropConnection` is transient and leaves them pending for `reconnect`.
69
+ * StablePeer's disconnected-call queueing and replay (dispatch/flush) is not
70
+ * modeled: calls on a dropped connection reject rather than queue.
71
+ *
72
+ * By default (`strict: true`) a valid method with no handler bound also
73
+ * rejects with code 2, matching production; pass `strict: false` to resolve
74
+ * `undefined` instead for recording-only tests. In strict mode a
75
+ * valid-but-unhandled request IS recorded in `requests` before rejecting,
76
+ * while an unknown method name is NOT recorded.
77
+ */
78
+ export class FakeEditorChannel {
79
+ call;
80
+ editorPeer;
81
+ push;
82
+ requests = [];
83
+ connected = true;
84
+ editorHandlers = {};
85
+ generation = 1;
86
+ nextTransportSeq = 1;
87
+ serverHandlers;
88
+ strict;
89
+ waiters = new Set();
90
+ constructor(options = {}) {
91
+ this.serverHandlers = options.serverHandlers ?? {};
92
+ this.strict = options.strict ?? true;
93
+ this.bindEditorHandlers(options.editorHandlers ?? {});
94
+ const editorCalls = Object.fromEntries(SERVER_EDITOR_METHOD_NAMES.map((method) => [
95
+ method,
96
+ (params) => this.receiveEditorCall(method, params),
97
+ ]));
98
+ this.call = { editor: editorCalls };
99
+ this.push = Object.fromEntries(EDITOR_CLIENT_METHOD_NAMES.map((method) => [
100
+ method,
101
+ (params) => this.pushToEditor(method, params),
102
+ ]));
103
+ const getConnectionGeneration = () => this.connectionGeneration;
104
+ const getIsConnected = () => this.isConnected;
105
+ this.editorPeer = {
106
+ get connectionGeneration() {
107
+ return getConnectionGeneration();
108
+ },
109
+ get isConnected() {
110
+ return getIsConnected();
111
+ },
112
+ call: this.push,
113
+ close: () => this.closeConnection(),
114
+ closeAndRejectPendingRequests: () => this.closeConnection(),
115
+ invalidateConnection: (generation) => this.invalidateConnection(generation),
116
+ requestWithTracing: (method, params) => this.pushToEditor(method, params),
117
+ whenConnected: (timeoutMs) => this.whenConnected(timeoutMs),
118
+ whenConnectedAfter: (generation, timeoutMs) => this.whenConnectedAfter(generation, timeoutMs),
119
+ };
120
+ }
121
+ get connectionGeneration() {
122
+ return this.generation;
123
+ }
124
+ get isConnected() {
125
+ return this.connected;
126
+ }
127
+ bindEditorHandlers(handlers) {
128
+ this.editorHandlers = { ...this.editorHandlers, ...handlers };
129
+ }
130
+ dropConnection() {
131
+ this.connected = false;
132
+ this.editorHandlers = {};
133
+ }
134
+ /**
135
+ * Terminal close, as invoked through a peer's `close` or
136
+ * `closeAndRejectPendingRequests`. On top of `dropConnection`, settles
137
+ * every pending connection waiter with `false` immediately (matching
138
+ * StablePeer's rejectPendingConnectionState); `dropConnection` alone
139
+ * leaves waiters pending so a later `reconnect` can resolve them `true`.
140
+ */
141
+ closeConnection() {
142
+ this.dropConnection();
143
+ for (const waiter of this.waiters) {
144
+ clearTimeout(waiter.timer);
145
+ waiter.resolve(false);
146
+ }
147
+ this.waiters.clear();
148
+ }
149
+ reconnect(handlers) {
150
+ if (handlers) {
151
+ this.editorHandlers = handlers;
152
+ }
153
+ this.connected = true;
154
+ this.generation += 1;
155
+ for (const waiter of this.waiters) {
156
+ if (this.generation > waiter.afterGeneration) {
157
+ clearTimeout(waiter.timer);
158
+ waiter.resolve(true);
159
+ this.waiters.delete(waiter);
160
+ }
161
+ }
162
+ }
163
+ invalidateConnection(generation) {
164
+ if (generation === this.generation) {
165
+ this.dropConnection();
166
+ }
167
+ }
168
+ /**
169
+ * The editor-path correlation ID (the per-turn `requestId` string inside
170
+ * editor-to-server payloads) of the most recent editor call that carried
171
+ * one. Distinct from `transportSeq`, the fake's per-message counter, and
172
+ * from A2A task ids, which belong to the gateway path.
173
+ */
174
+ lastEditorPathCorrelationId() {
175
+ for (let index = this.requests.length - 1; index >= 0; index -= 1) {
176
+ const request = this.requests[index];
177
+ if (request?.direction !== "editor-to-server") {
178
+ continue;
179
+ }
180
+ const params = request.params;
181
+ if (params && typeof params === "object" && "requestId" in params) {
182
+ const requestId = params.requestId;
183
+ if (typeof requestId === "string") {
184
+ return requestId;
185
+ }
186
+ }
187
+ }
188
+ return undefined;
189
+ }
190
+ whenConnected(timeoutMs) {
191
+ if (this.connected) {
192
+ return Promise.resolve(true);
193
+ }
194
+ return this.waitForConnection(this.generation - 1, timeoutMs);
195
+ }
196
+ whenConnectedAfter(generation, timeoutMs) {
197
+ if (this.connected && this.generation > generation) {
198
+ return Promise.resolve(true);
199
+ }
200
+ return this.waitForConnection(generation, timeoutMs);
201
+ }
202
+ record(direction, method, params) {
203
+ const transportSeq = this.nextTransportSeq;
204
+ this.nextTransportSeq += 1;
205
+ this.requests.push({
206
+ direction,
207
+ generation: this.generation,
208
+ method,
209
+ params,
210
+ transportSeq,
211
+ });
212
+ return { method: String(method), requestId: transportSeq };
213
+ }
214
+ async receiveEditorCall(method, params) {
215
+ this.assertConnected();
216
+ // Object.hasOwn, not `in`: the `in` operator walks the prototype chain,
217
+ // so an Object.prototype name like "hasOwnProperty" would pass the guard.
218
+ if (!Object.hasOwn(serverEditorMethodSet, method)) {
219
+ return Promise.reject(unknownMethodError(`unknown method editor.${String(method)}`));
220
+ }
221
+ this.record("editor-to-server", method, params);
222
+ const handler = Object.hasOwn(this.serverHandlers, method)
223
+ ? this.serverHandlers[method]
224
+ : undefined;
225
+ if (!handler) {
226
+ if (this.strict) {
227
+ return Promise.reject(strictUnboundError(`editor.${String(method)}`));
228
+ }
229
+ return undefined;
230
+ }
231
+ return handler(params);
232
+ }
233
+ async pushToEditor(method, params) {
234
+ this.assertConnected();
235
+ // Object.hasOwn, not `in`: the `in` operator walks the prototype chain,
236
+ // so an Object.prototype name like "hasOwnProperty" would pass the guard.
237
+ if (!Object.hasOwn(editorClientMethodSet, method)) {
238
+ return Promise.reject(unknownMethodError(`unknown method ${String(method)}`));
239
+ }
240
+ const context = this.record("server-to-editor", method, params);
241
+ const handlers = Object.hasOwn(this.editorHandlers, method)
242
+ ? this.editorHandlers[method]
243
+ : undefined;
244
+ if (!handlers?.length) {
245
+ if (this.strict) {
246
+ return Promise.reject(strictUnboundError(String(method)));
247
+ }
248
+ return undefined;
249
+ }
250
+ const invoke = (index) => {
251
+ const handler = handlers[index];
252
+ if (!handler) {
253
+ return Promise.reject(remoteHandlerError(5, "cannot call past the last handler in the chain"));
254
+ }
255
+ return Promise.resolve(handler(params, context, this.callingPeer(), () => invoke(index + 1)));
256
+ };
257
+ return invoke(0);
258
+ }
259
+ callingPeer() {
260
+ return {
261
+ call: this.call,
262
+ close: () => this.closeConnection(),
263
+ closeAndRejectPendingRequests: () => this.closeConnection(),
264
+ requestWithTracing: (method, params) => {
265
+ const editorPrefix = "editor.";
266
+ const editorMethod = method.startsWith(editorPrefix)
267
+ ? method.slice(editorPrefix.length)
268
+ : method;
269
+ return this.receiveEditorCall(editorMethod, params);
270
+ },
271
+ };
272
+ }
273
+ assertConnected() {
274
+ if (!this.connected) {
275
+ throw new SocketErrorException(10, "[internal] Connection closed");
276
+ }
277
+ }
278
+ waitForConnection(afterGeneration, timeoutMs) {
279
+ return new Promise((resolve) => {
280
+ const waiter = {
281
+ afterGeneration,
282
+ resolve,
283
+ timer: setTimeout(() => {
284
+ this.waiters.delete(waiter);
285
+ resolve(false);
286
+ }, timeoutMs),
287
+ };
288
+ this.waiters.add(waiter);
289
+ });
290
+ }
291
+ }
292
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/fake-editor-channel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { MethodSchema } from "@superblocksteam/shared";
2
+ import type { IsVoidMethodResult } from "../../types/socket-method-names.js";
3
+ import type { FakeEditorClientHandlers } from "./index.js";
4
+ type BoundHandler<Method extends keyof FakeEditorClientHandlers> = NonNullable<FakeEditorClientHandlers[Method]>[number];
5
+ export declare const aiPushMessageHandlerPin: BoundHandler<"aiPushMessage">;
6
+ export declare const aiCaptureScreenshotHandlerPin: BoundHandler<"aiCaptureScreenshot">;
7
+ type ClassifiedMethodResult<Method extends MethodSchema<never, unknown>> = IsVoidMethodResult<Awaited<ReturnType<Method>>>;
8
+ export declare const anyResultClassifiesNonVoidPin: ClassifiedMethodResult<MethodSchema<void, any>>;
9
+ export declare const neverResultClassifiesNonVoidPin: ClassifiedMethodResult<MethodSchema<void, never>>;
10
+ export declare const voidResultClassifiesVoidPin: ClassifiedMethodResult<MethodSchema<void, void>>;
11
+ export declare const unionWithVoidClassifiesNonVoidPin: ClassifiedMethodResult<MethodSchema<void, string | void>>;
12
+ export {};
13
+ //# sourceMappingURL=type-pins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-pins.d.ts","sourceRoot":"","sources":["../../../src/testing/fake-editor-channel/type-pins.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,KAAK,YAAY,CAAC,MAAM,SAAS,MAAM,wBAAwB,IAAI,WAAW,CAC5E,wBAAwB,CAAC,MAAM,CAAC,CACjC,CAAC,MAAM,CAAC,CAAC;AAIV,eAAO,MAAM,uBAAuB,EAAE,YAAY,CAChD,eAAe,CACC,CAAC;AAEnB,eAAO,MAAM,6BAA6B,EAAE,YAAY,CACtD,qBAAqB,CACH,CAAC;AAOrB,KAAK,sBAAsB,CAAC,MAAM,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,IACrE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAGlD,eAAO,MAAM,6BAA6B,EAAE,sBAAsB,CAChE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAChB,CAAC;AAGV,eAAO,MAAM,+BAA+B,EAAE,sBAAsB,CAClE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAClB,CAAC;AAGV,eAAO,MAAM,2BAA2B,EAAE,sBAAsB,CAC9D,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAClB,CAAC;AAGT,eAAO,MAAM,iCAAiC,EAAE,sBAAsB,CACpE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAC1B,CAAC"}
@@ -0,0 +1,13 @@
1
+ // Each assignment errors if the FakeHandler conditional resolves to never,
2
+ // because no function is assignable to never.
3
+ export const aiPushMessageHandlerPin = async () => { };
4
+ export const aiCaptureScreenshotHandlerPin = async () => ({});
5
+ // An `any` result must classify non-void.
6
+ export const anyResultClassifiesNonVoidPin = false;
7
+ // A `never` result must classify non-void.
8
+ export const neverResultClassifiesNonVoidPin = false;
9
+ // A genuine void result stays void.
10
+ export const voidResultClassifiesVoidPin = true;
11
+ // A union containing void still promises a real result, so non-void.
12
+ export const unionWithVoidClassifiesNonVoidPin = false;
13
+ //# sourceMappingURL=type-pins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-pins.js","sourceRoot":"","sources":["../../../src/testing/fake-editor-channel/type-pins.ts"],"names":[],"mappings":"AAYA,2EAA2E;AAC3E,8CAA8C;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAEhC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;AAEnB,MAAM,CAAC,MAAM,6BAA6B,GAEtC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAUrB,0CAA0C;AAC1C,MAAM,CAAC,MAAM,6BAA6B,GAEtC,KAAK,CAAC;AAEV,2CAA2C;AAC3C,MAAM,CAAC,MAAM,+BAA+B,GAExC,KAAK,CAAC;AAEV,oCAAoC;AACpC,MAAM,CAAC,MAAM,2BAA2B,GAEpC,IAAI,CAAC;AAET,qEAAqE;AACrE,MAAM,CAAC,MAAM,iCAAiC,GAE1C,KAAK,CAAC"}