@farmslot/protocol 0.75.0 → 0.77.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 (163) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/client-cache/cache.d.ts.map +1 -1
  3. package/dist/client-cache/cache.js +198 -21
  4. package/dist/client-cache/cache.js.map +1 -1
  5. package/dist/client-cache/command-method.d.ts +1 -1
  6. package/dist/client-cache/command-method.d.ts.map +1 -1
  7. package/dist/client-cache/command-method.js +3 -0
  8. package/dist/client-cache/command-method.js.map +1 -1
  9. package/dist/client-cache/index.d.ts +1 -1
  10. package/dist/client-cache/index.d.ts.map +1 -1
  11. package/dist/client-cache/index.js +1 -1
  12. package/dist/client-cache/index.js.map +1 -1
  13. package/dist/client-cache/prefetch.d.ts +13 -1
  14. package/dist/client-cache/prefetch.d.ts.map +1 -1
  15. package/dist/client-cache/prefetch.js +88 -26
  16. package/dist/client-cache/prefetch.js.map +1 -1
  17. package/dist/client-cache/read-stored.d.ts +5 -1
  18. package/dist/client-cache/read-stored.d.ts.map +1 -1
  19. package/dist/client-cache/read-stored.js +64 -1
  20. package/dist/client-cache/read-stored.js.map +1 -1
  21. package/dist/client-cache/registry.d.ts +29 -1
  22. package/dist/client-cache/registry.d.ts.map +1 -1
  23. package/dist/client-cache/registry.js +55 -4
  24. package/dist/client-cache/registry.js.map +1 -1
  25. package/dist/client-cache/store.d.ts +4 -0
  26. package/dist/client-cache/store.d.ts.map +1 -1
  27. package/dist/client-cache/store.js +9 -1
  28. package/dist/client-cache/store.js.map +1 -1
  29. package/dist/client-cache/transport.d.ts +3 -1
  30. package/dist/client-cache/transport.d.ts.map +1 -1
  31. package/dist/client-cache/transport.js +2 -1
  32. package/dist/client-cache/transport.js.map +1 -1
  33. package/dist/client-cache/types.d.ts +8 -1
  34. package/dist/client-cache/types.d.ts.map +1 -1
  35. package/dist/contracts/agents.d.ts +5 -2
  36. package/dist/contracts/agents.d.ts.map +1 -1
  37. package/dist/contracts/agents.js.map +1 -1
  38. package/dist/contracts/config.d.ts +3 -0
  39. package/dist/contracts/config.d.ts.map +1 -1
  40. package/dist/contracts/config.js +5 -1
  41. package/dist/contracts/config.js.map +1 -1
  42. package/dist/contracts/family.d.ts +55 -3
  43. package/dist/contracts/family.d.ts.map +1 -1
  44. package/dist/contracts/family.js.map +1 -1
  45. package/dist/contracts/review-workspace.d.ts +23 -1
  46. package/dist/contracts/review-workspace.d.ts.map +1 -1
  47. package/dist/contracts/review-workspace.js +3 -0
  48. package/dist/contracts/review-workspace.js.map +1 -1
  49. package/dist/contracts/reviews.d.ts +1 -0
  50. package/dist/contracts/reviews.d.ts.map +1 -1
  51. package/dist/contracts/reviews.js.map +1 -1
  52. package/dist/contracts/runs.d.ts +47 -5
  53. package/dist/contracts/runs.d.ts.map +1 -1
  54. package/dist/contracts/runs.js.map +1 -1
  55. package/dist/contracts/runtime-capabilities.d.ts +9 -0
  56. package/dist/contracts/runtime-capabilities.d.ts.map +1 -1
  57. package/dist/contracts/runtime-capabilities.js.map +1 -1
  58. package/dist/contracts/slot-recovery.d.ts +2 -2
  59. package/dist/contracts/slot-recovery.d.ts.map +1 -1
  60. package/dist/contracts/slot-recovery.js +5 -3
  61. package/dist/contracts/slot-recovery.js.map +1 -1
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +3 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/performance/client.d.ts +18 -0
  67. package/dist/performance/client.d.ts.map +1 -0
  68. package/dist/performance/client.js +66 -0
  69. package/dist/performance/client.js.map +1 -0
  70. package/dist/performance/histogram.d.ts +5 -0
  71. package/dist/performance/histogram.d.ts.map +1 -0
  72. package/dist/performance/histogram.js +38 -0
  73. package/dist/performance/histogram.js.map +1 -0
  74. package/dist/performance/index.d.ts +10 -0
  75. package/dist/performance/index.d.ts.map +1 -0
  76. package/dist/performance/index.js +10 -0
  77. package/dist/performance/index.js.map +1 -0
  78. package/dist/performance/paint.d.ts +3 -0
  79. package/dist/performance/paint.d.ts.map +1 -0
  80. package/dist/performance/paint.js +14 -0
  81. package/dist/performance/paint.js.map +1 -0
  82. package/dist/performance/prometheus.d.ts +3 -0
  83. package/dist/performance/prometheus.d.ts.map +1 -0
  84. package/dist/performance/prometheus.js +53 -0
  85. package/dist/performance/prometheus.js.map +1 -0
  86. package/dist/performance/ranking.d.ts +26 -0
  87. package/dist/performance/ranking.d.ts.map +1 -0
  88. package/dist/performance/ranking.js +92 -0
  89. package/dist/performance/ranking.js.map +1 -0
  90. package/dist/performance/recorder.d.ts +43 -0
  91. package/dist/performance/recorder.d.ts.map +1 -0
  92. package/dist/performance/recorder.js +352 -0
  93. package/dist/performance/recorder.js.map +1 -0
  94. package/dist/performance/types.d.ts +93 -0
  95. package/dist/performance/types.d.ts.map +1 -0
  96. package/dist/performance/types.js +40 -0
  97. package/dist/performance/types.js.map +1 -0
  98. package/dist/performance/validation.d.ts +3 -0
  99. package/dist/performance/validation.d.ts.map +1 -0
  100. package/dist/performance/validation.js +55 -0
  101. package/dist/performance/validation.js.map +1 -0
  102. package/dist/recipes/step-io.d.ts +2 -0
  103. package/dist/recipes/step-io.d.ts.map +1 -1
  104. package/dist/recipes/step-io.js.map +1 -1
  105. package/dist/rpc/auth.d.ts +1 -0
  106. package/dist/rpc/auth.d.ts.map +1 -1
  107. package/dist/rpc/auth.js.map +1 -1
  108. package/dist/rpc/fs.d.ts +2 -0
  109. package/dist/rpc/fs.d.ts.map +1 -1
  110. package/dist/rpc/fs.js +2 -0
  111. package/dist/rpc/fs.js.map +1 -1
  112. package/dist/rpc/index.d.ts +1 -0
  113. package/dist/rpc/index.d.ts.map +1 -1
  114. package/dist/rpc/index.js +1 -0
  115. package/dist/rpc/index.js.map +1 -1
  116. package/dist/rpc/native-session.d.ts +18 -0
  117. package/dist/rpc/native-session.d.ts.map +1 -1
  118. package/dist/rpc/native-session.js.map +1 -1
  119. package/dist/rpc/performance.d.ts +6 -0
  120. package/dist/rpc/performance.d.ts.map +1 -0
  121. package/dist/rpc/performance.js +2 -0
  122. package/dist/rpc/performance.js.map +1 -0
  123. package/dist/rpc/registry.d.ts +3 -0
  124. package/dist/rpc/registry.d.ts.map +1 -1
  125. package/dist/rpc/registry.js +3 -0
  126. package/dist/rpc/registry.js.map +1 -1
  127. package/dist/rpc/run.d.ts +4 -0
  128. package/dist/rpc/run.d.ts.map +1 -1
  129. package/dist/rpc/runtime-capabilities.d.ts +6 -0
  130. package/dist/rpc/runtime-capabilities.d.ts.map +1 -1
  131. package/dist/rpc/runtime-capabilities.js.map +1 -1
  132. package/dist/rpc/slot.d.ts +2 -0
  133. package/dist/rpc/slot.d.ts.map +1 -1
  134. package/dist/rpc/tmux.d.ts +9 -1
  135. package/dist/rpc/tmux.d.ts.map +1 -1
  136. package/dist/runs/list-trim.d.ts.map +1 -1
  137. package/dist/runs/list-trim.js +1 -19
  138. package/dist/runs/list-trim.js.map +1 -1
  139. package/dist/surfaces/command-center.js +1 -1
  140. package/dist/surfaces/command-center.js.map +1 -1
  141. package/dist/surfaces/run-view-state.d.ts +22 -0
  142. package/dist/surfaces/run-view-state.d.ts.map +1 -0
  143. package/dist/surfaces/run-view-state.js +26 -0
  144. package/dist/surfaces/run-view-state.js.map +1 -0
  145. package/dist/surfaces/view-links.d.ts +2 -1
  146. package/dist/surfaces/view-links.d.ts.map +1 -1
  147. package/dist/surfaces/view-links.js +161 -18
  148. package/dist/surfaces/view-links.js.map +1 -1
  149. package/dist/surfaces/view-state.d.ts +50 -0
  150. package/dist/surfaces/view-state.d.ts.map +1 -0
  151. package/dist/surfaces/view-state.js +181 -0
  152. package/dist/surfaces/view-state.js.map +1 -0
  153. package/dist/transport/gateway-recovery.d.ts +39 -0
  154. package/dist/transport/gateway-recovery.d.ts.map +1 -0
  155. package/dist/transport/gateway-recovery.js +134 -0
  156. package/dist/transport/gateway-recovery.js.map +1 -0
  157. package/dist/utf8-byte-length.d.ts +2 -0
  158. package/dist/utf8-byte-length.d.ts.map +1 -0
  159. package/dist/utf8-byte-length.js +22 -0
  160. package/dist/utf8-byte-length.js.map +1 -0
  161. package/dist/version.d.ts +1 -1
  162. package/dist/version.js +1 -1
  163. package/package.json +6 -1
@@ -0,0 +1,50 @@
1
+ /** Persistent display choices. Contexts declare fields; platform adapters own navigation. */
2
+ export type ViewStateHistory = 'push' | 'replace';
3
+ export interface ViewStateField<T> {
4
+ readonly key: string;
5
+ read(params: URLSearchParams): T;
6
+ write(params: URLSearchParams, value: T): void;
7
+ }
8
+ export interface ViewStateValues {
9
+ get<T>(field: ViewStateField<T>): T;
10
+ set<T>(field: ViewStateField<T>, value: NoInfer<T>): void;
11
+ }
12
+ export interface ViewStateAdapter {
13
+ read(): URLSearchParams;
14
+ write(params: URLSearchParams, history: ViewStateHistory): void;
15
+ subscribe(listener: () => void): () => void;
16
+ }
17
+ export interface ViewStateContext {
18
+ get<T>(field: ViewStateField<T>): T;
19
+ set<T>(field: ViewStateField<T>, value: NoInfer<T>, history?: ViewStateHistory): void;
20
+ update(edit: (values: ViewStateValues) => void, history?: ViewStateHistory): void;
21
+ snapshot(): string;
22
+ subscribe(listener: () => void): () => void;
23
+ }
24
+ export declare function viewStateParams(source: URLSearchParams, edit: (values: ViewStateValues) => void): URLSearchParams;
25
+ export declare function createViewStateContext(adapter: ViewStateAdapter): ViewStateContext;
26
+ export declare function viewTextField(key: string, defaultValue?: string): ViewStateField<string>;
27
+ export declare function viewChoiceField<T extends string>(key: string, defaultValue: T, choices: readonly T[]): ViewStateField<T>;
28
+ export declare function viewListField(key: string, defaultValue?: readonly string[], encoding?: 'repeat' | 'csv'): ViewStateField<readonly string[]>;
29
+ /** A compact collection contains only toggles that differ from their context's defaults. */
30
+ export declare function viewToggleField(key: string, id: string, defaultValue: boolean): ViewStateField<boolean>;
31
+ /** Router adapters use the same repeated-value representation as browser query strings. */
32
+ export declare function viewStateSearchParams(values: Readonly<Record<string, string | readonly string[] | undefined>>): URLSearchParams;
33
+ /** Undefined entries remove old route parameters when a configured default is restored. */
34
+ export declare function viewStateRoutePatch(before: URLSearchParams, next: URLSearchParams): Record<string, string | string[] | undefined>;
35
+ export declare function viewNullableTextField(key: string): ViewStateField<string | null>;
36
+ export declare function viewIntegerField(key: string, defaultValue?: number): ViewStateField<number>;
37
+ /** Explicit per-entry overrides, such as opened/closed folds whose default depends on data. */
38
+ export declare function viewToggleMapField(key: string): ViewStateField<Readonly<Record<string, boolean>>>;
39
+ /** A status-derived default may change; an explicit disclosure choice must survive it. */
40
+ export declare function viewToggleOverrideField(key: string, id: string, defaultValue: boolean): ViewStateField<boolean>;
41
+ /** Display parameters carried across sibling workspace tabs; no action or authority inputs. */
42
+ export declare const VIEW_STATE_PARAMETERS: ReadonlySet<string>;
43
+ export declare function selectedViewStateParams(params: Readonly<Record<string, string | readonly string[] | undefined>>): Record<string, string | string[]>;
44
+ /** An explicit new selection has its own index; reloading the same selection keeps it. */
45
+ export declare function viewScopedIntegerField(key: string, scopeKey: string, scope: string, defaultValue?: number): ViewStateField<number>;
46
+ /** Explicit destination selectors win; current display options survive narrowed selections. */
47
+ export declare function mergeViewStateParams<T extends object>(params: Readonly<Record<string, string | readonly string[] | undefined>>, destination: T): {
48
+ [x: string]: string | string[];
49
+ } & T;
50
+ //# sourceMappingURL=view-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-state.d.ts","sourceRoot":"","sources":["../../src/surfaces/view-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ export function viewStateParams(source, edit) {
2
+ const params = new URLSearchParams(source);
3
+ edit({
4
+ get: (field) => field.read(params),
5
+ set: (field, value) => field.write(params, value),
6
+ });
7
+ return params;
8
+ }
9
+ export function createViewStateContext(adapter) {
10
+ const update = (edit, history = 'push') => {
11
+ const before = adapter.read();
12
+ const next = viewStateParams(before, edit);
13
+ if (before.toString() !== next.toString())
14
+ adapter.write(next, history);
15
+ };
16
+ return {
17
+ get: (field) => field.read(adapter.read()),
18
+ set: (field, value, history) => update((values) => values.set(field, value), history),
19
+ update,
20
+ snapshot: () => adapter.read().toString(),
21
+ subscribe: (listener) => adapter.subscribe(listener),
22
+ };
23
+ }
24
+ export function viewTextField(key, defaultValue = '') {
25
+ return {
26
+ key,
27
+ read: (params) => params.get(key) ?? defaultValue,
28
+ write: (params, value) => {
29
+ if (value === defaultValue)
30
+ params.delete(key);
31
+ else
32
+ params.set(key, value);
33
+ },
34
+ };
35
+ }
36
+ export function viewChoiceField(key, defaultValue, choices) {
37
+ return {
38
+ ...viewTextField(key, defaultValue),
39
+ read: (params) => choices.find((choice) => choice === params.get(key)) ?? defaultValue,
40
+ };
41
+ }
42
+ export function viewListField(key, defaultValue = [], encoding = 'repeat') {
43
+ return {
44
+ key,
45
+ read: (params) => {
46
+ if (!params.has(key))
47
+ return [...defaultValue];
48
+ const values = params.getAll(key);
49
+ return (encoding === 'csv' ? values.flatMap((value) => value.split(',')) : values).filter((value) => value !== '');
50
+ },
51
+ write: (params, values) => {
52
+ params.delete(key);
53
+ if (values.length === defaultValue.length &&
54
+ values.every((value, i) => value === defaultValue[i]))
55
+ return;
56
+ if (!values.length)
57
+ params.set(key, '');
58
+ else if (encoding === 'csv')
59
+ params.set(key, values.join(','));
60
+ else
61
+ for (const value of values)
62
+ params.append(key, value);
63
+ },
64
+ };
65
+ }
66
+ /** A compact collection contains only toggles that differ from their context's defaults. */
67
+ export function viewToggleField(key, id, defaultValue) {
68
+ const entries = viewListField(key, [], 'csv');
69
+ const entryId = id.replaceAll('%', '%25').replaceAll(',', '%2C');
70
+ return {
71
+ key,
72
+ read: (params) => {
73
+ for (const value of entries.read(params).slice().reverse()) {
74
+ if (value === entryId)
75
+ return true;
76
+ if (value === `!${entryId}`)
77
+ return false;
78
+ }
79
+ return defaultValue;
80
+ },
81
+ write: (params, value) => {
82
+ const values = entries
83
+ .read(params)
84
+ .filter((entry) => entry !== entryId && entry !== `!${entryId}`);
85
+ if (value !== defaultValue)
86
+ values.push(value ? entryId : `!${entryId}`);
87
+ entries.write(params, [...new Set(values)].sort());
88
+ },
89
+ };
90
+ }
91
+ /** Router adapters use the same repeated-value representation as browser query strings. */
92
+ export function viewStateSearchParams(values) {
93
+ const params = new URLSearchParams();
94
+ for (const [key, value] of Object.entries(values)) {
95
+ if (typeof value === 'string')
96
+ params.append(key, value);
97
+ else
98
+ for (const item of value ?? [])
99
+ params.append(key, item);
100
+ }
101
+ return params;
102
+ }
103
+ /** Undefined entries remove old route parameters when a configured default is restored. */
104
+ export function viewStateRoutePatch(before, next) {
105
+ const patch = {};
106
+ for (const key of new Set([...before.keys(), ...next.keys()])) {
107
+ const values = next.getAll(key);
108
+ patch[key] = values.length > 1 ? values : values[0];
109
+ }
110
+ return patch;
111
+ }
112
+ export function viewNullableTextField(key) {
113
+ const text = viewTextField(key);
114
+ return {
115
+ key,
116
+ read: (params) => text.read(params) || null,
117
+ write: (params, value) => text.write(params, value ?? ''),
118
+ };
119
+ }
120
+ export function viewIntegerField(key, defaultValue = 0) {
121
+ const text = viewTextField(key, String(defaultValue));
122
+ return {
123
+ key,
124
+ read: (params) => {
125
+ const value = Number(text.read(params));
126
+ return Number.isSafeInteger(value) && value >= 0 ? value : defaultValue;
127
+ },
128
+ write: (params, value) => text.write(params, String(value)),
129
+ };
130
+ }
131
+ /** Explicit per-entry overrides, such as opened/closed folds whose default depends on data. */
132
+ export function viewToggleMapField(key) {
133
+ const list = viewListField(key, [], 'csv');
134
+ return {
135
+ key,
136
+ read: (params) => Object.fromEntries(list
137
+ .read(params)
138
+ .map((entry) => entry.startsWith('!')
139
+ ? [entry.slice(1).replaceAll('%2C', ',').replaceAll('%25', '%'), false]
140
+ : [entry.replaceAll('%2C', ',').replaceAll('%25', '%'), true])),
141
+ write: (params, values) => list.write(params, Object.entries(values)
142
+ .map(([id, value]) => value
143
+ ? id.replaceAll('%', '%25').replaceAll(',', '%2C')
144
+ : `!${id.replaceAll('%', '%25').replaceAll(',', '%2C')}`)
145
+ .sort()),
146
+ };
147
+ }
148
+ /** A status-derived default may change; an explicit disclosure choice must survive it. */
149
+ export function viewToggleOverrideField(key, id, defaultValue) {
150
+ const field = viewToggleMapField(key);
151
+ return {
152
+ key,
153
+ read: (params) => field.read(params)[id] ?? defaultValue,
154
+ write: (params, value) => field.write(params, { ...field.read(params), [id]: value }),
155
+ };
156
+ }
157
+ /** Display parameters carried across sibling workspace tabs; no action or authority inputs. */
158
+ export const VIEW_STATE_PARAMETERS = new Set('panels round step section runsTab flow lane sort q tag workers treeOpen branchFilesView branchFilesClosed changesView changesClosed problemSource commentFilter commentAuthor commentThread logFilter compareStep workerSession expandedSlot messages turnFiles rawClaims prReviews prMonitors folds terminalView reviewReport stage delivery diffMode devicePanes deviceLayout sidebarWidth diffFilter diffQuery diffPath mobileDiffMode claims evidenceFilter compareIndex mediaIndex mediaSource prFilter subtasks mediaGroups familyCompareIndex assessmentConsumer finetuneProject flowNode nativeFilesTab nativeDirectory nativeFile nativeFileView projects machines'.split(' '));
159
+ export function selectedViewStateParams(params) {
160
+ return Object.fromEntries(Object.entries(params).flatMap(([key, value]) => VIEW_STATE_PARAMETERS.has(key) && value !== undefined
161
+ ? [[key, typeof value === 'string' ? value : [...value]]]
162
+ : []));
163
+ }
164
+ /** An explicit new selection has its own index; reloading the same selection keeps it. */
165
+ export function viewScopedIntegerField(key, scopeKey, scope, defaultValue = 0) {
166
+ const index = viewIntegerField(key, defaultValue);
167
+ const owner = viewTextField(scopeKey);
168
+ return {
169
+ key,
170
+ read: (params) => (owner.read(params) === scope ? index.read(params) : defaultValue),
171
+ write: (params, value) => {
172
+ index.write(params, value);
173
+ owner.write(params, value === defaultValue ? '' : scope);
174
+ },
175
+ };
176
+ }
177
+ /** Explicit destination selectors win; current display options survive narrowed selections. */
178
+ export function mergeViewStateParams(params, destination) {
179
+ return { ...selectedViewStateParams(params), ...destination };
180
+ }
181
+ //# sourceMappingURL=view-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-state.js","sourceRoot":"","sources":["../../src/surfaces/view-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /** One retry/liveness policy; platforms supply sockets and lifecycle/network wake events. */
2
+ export type GatewayRecoveryState = 'connecting' | 'connected' | 'disconnected';
3
+ export interface GatewayRecoveryOptions {
4
+ enabled(): boolean;
5
+ connect(): void;
6
+ retire(): void;
7
+ canProbe(): boolean;
8
+ ping(): Promise<unknown>;
9
+ onResponse?(latencyMs: number, completedAt: number): void;
10
+ }
11
+ export declare const GATEWAY_HEARTBEAT_MS = 30000;
12
+ export declare const GATEWAY_CONNECT_DEADLINE_MS = 20000;
13
+ export declare const GATEWAY_PING_DEADLINE_MS = 5000;
14
+ /** Network and RPC timeouts never revoke a saved login or its cached observations. */
15
+ export declare function gatewayAuthenticationRefused(error: unknown): boolean;
16
+ export declare const GATEWAY_OFFLINE_LABEL = "Gateway offline \u00B7 Reconnecting\u2026";
17
+ export declare function gatewayOfflineLabel(state: string, enabled: boolean): string | undefined;
18
+ export declare class GatewayRecovery {
19
+ private readonly options;
20
+ private state?;
21
+ private timer?;
22
+ private delay;
23
+ private generation;
24
+ private probing;
25
+ private disposed;
26
+ private lastWake;
27
+ constructor(options: GatewayRecoveryOptions);
28
+ update(state: GatewayRecoveryState): void;
29
+ /** Focus/visibility/network events bypass the wait, sharing one attempt or ping. */
30
+ wake(): void;
31
+ reset(): void;
32
+ dispose(): void;
33
+ private enabled;
34
+ private probe;
35
+ private fail;
36
+ private schedule;
37
+ private cancel;
38
+ }
39
+ //# sourceMappingURL=gateway-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-recovery.d.ts","sourceRoot":"","sources":["../../src/transport/gateway-recovery.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAE/E,MAAM,WAAW,sBAAsB;IACrC,OAAO,IAAI,OAAO,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,IAAI,IAAI,CAAC;IACf,QAAQ,IAAI,OAAO,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,UAAU,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,sFAAsF;AACtF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQpE;AAED,eAAO,MAAM,qBAAqB,8CAAoC,CAAC;AAEvE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED,qBAAa,eAAe;IASd,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,KAAK,CAAC,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAa;gBAEA,OAAO,EAAE,sBAAsB;IAE5D,MAAM,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAoBzC,oFAAoF;IACpF,IAAI,IAAI,IAAI;IAYZ,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IA6Bb,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,MAAM;CAMf"}
@@ -0,0 +1,134 @@
1
+ import { hasAuthErrorCode } from '../person-session-client.js';
2
+ export const GATEWAY_HEARTBEAT_MS = 30_000;
3
+ export const GATEWAY_CONNECT_DEADLINE_MS = 20_000;
4
+ export const GATEWAY_PING_DEADLINE_MS = 5_000;
5
+ /** Network and RPC timeouts never revoke a saved login or its cached observations. */
6
+ export function gatewayAuthenticationRefused(error) {
7
+ return [
8
+ 'AUTH_REQUIRED',
9
+ 'AUTH_FAILED',
10
+ 'AUTH_FORBIDDEN',
11
+ 'AUTH_PERSON_SESSION_REQUIRED',
12
+ 'AUTH_SESSION_ENDED',
13
+ ].some((code) => hasAuthErrorCode(error, code));
14
+ }
15
+ export const GATEWAY_OFFLINE_LABEL = 'Gateway offline · Reconnecting…';
16
+ export function gatewayOfflineLabel(state, enabled) {
17
+ return enabled && state !== 'connected' ? GATEWAY_OFFLINE_LABEL : undefined;
18
+ }
19
+ export class GatewayRecovery {
20
+ constructor(options) {
21
+ this.options = options;
22
+ this.delay = 1000;
23
+ this.generation = 0;
24
+ this.probing = false;
25
+ this.disposed = false;
26
+ this.lastWake = -Infinity;
27
+ }
28
+ update(state) {
29
+ if (!this.enabled()) {
30
+ this.reset();
31
+ return;
32
+ }
33
+ if (state === this.state)
34
+ return;
35
+ this.cancel();
36
+ this.state = state;
37
+ if (state === 'connected') {
38
+ this.delay = 1000;
39
+ this.schedule(() => this.probe(), GATEWAY_HEARTBEAT_MS);
40
+ }
41
+ else if (state === 'connecting') {
42
+ this.schedule(() => this.fail(), GATEWAY_CONNECT_DEADLINE_MS);
43
+ }
44
+ else {
45
+ const delay = this.delay;
46
+ this.delay = Math.min(delay * 2, 30_000);
47
+ this.schedule(() => this.options.connect(), delay);
48
+ }
49
+ }
50
+ /** Focus/visibility/network events bypass the wait, sharing one attempt or ping. */
51
+ wake() {
52
+ if (!this.enabled() || this.state === 'connecting' || this.probing)
53
+ return;
54
+ if (Date.now() - this.lastWake < 1000)
55
+ return;
56
+ this.lastWake = Date.now();
57
+ if (this.state === 'connected')
58
+ this.probe();
59
+ else {
60
+ this.cancel();
61
+ this.state = undefined;
62
+ this.options.connect();
63
+ }
64
+ }
65
+ reset() {
66
+ this.cancel();
67
+ this.state = undefined;
68
+ this.delay = 1000;
69
+ this.lastWake = -Infinity;
70
+ }
71
+ dispose() {
72
+ this.disposed = true;
73
+ this.reset();
74
+ }
75
+ enabled() {
76
+ return !this.disposed && this.options.enabled();
77
+ }
78
+ probe() {
79
+ if (!this.enabled() || this.state !== 'connected' || this.probing)
80
+ return;
81
+ if (!this.options.canProbe()) {
82
+ this.schedule(() => this.probe(), GATEWAY_HEARTBEAT_MS);
83
+ return;
84
+ }
85
+ this.cancel();
86
+ this.probing = true;
87
+ const startedAt = Date.now();
88
+ this.lastWake = startedAt;
89
+ const generation = this.generation;
90
+ this.schedule(() => this.fail(), GATEWAY_PING_DEADLINE_MS);
91
+ void this.options.ping().then((reply) => {
92
+ if (generation !== this.generation || !this.enabled())
93
+ return;
94
+ if (!reply || typeof reply !== 'object' || Reflect.get(reply, 'ok') !== true) {
95
+ this.fail();
96
+ return;
97
+ }
98
+ this.probing = false;
99
+ this.schedule(() => this.probe(), GATEWAY_HEARTBEAT_MS);
100
+ this.options.onResponse?.(Date.now() - startedAt, Date.now());
101
+ }, () => {
102
+ if (generation === this.generation && this.enabled())
103
+ this.fail();
104
+ });
105
+ }
106
+ fail() {
107
+ if (!this.enabled())
108
+ return;
109
+ this.cancel();
110
+ this.state = undefined;
111
+ this.options.retire();
112
+ }
113
+ schedule(callback, delay) {
114
+ if (this.timer !== undefined)
115
+ clearTimeout(this.timer);
116
+ const generation = this.generation;
117
+ this.timer = setTimeout(() => {
118
+ this.timer = undefined;
119
+ if (generation === this.generation && this.enabled())
120
+ callback();
121
+ }, delay);
122
+ // Passive recovery must not keep a non-browser host alive by itself.
123
+ if (typeof this.timer === 'object' && 'unref' in this.timer)
124
+ this.timer.unref();
125
+ }
126
+ cancel() {
127
+ this.generation++;
128
+ this.probing = false;
129
+ if (this.timer !== undefined)
130
+ clearTimeout(this.timer);
131
+ this.timer = undefined;
132
+ }
133
+ }
134
+ //# sourceMappingURL=gateway-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-recovery.js","sourceRoot":"","sources":["../../src/transport/gateway-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function utf8ByteLength(value: string): number;
2
+ //# sourceMappingURL=utf8-byte-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8-byte-length.d.ts","sourceRoot":"","sources":["../src/utf8-byte-length.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBpD"}
@@ -0,0 +1,22 @@
1
+ export function utf8ByteLength(value) {
2
+ let bytes = 0;
3
+ for (let i = 0; i < value.length; i++) {
4
+ const code = value.charCodeAt(i);
5
+ if (code < 0x80)
6
+ bytes++;
7
+ else if (code < 0x800)
8
+ bytes += 2;
9
+ else if (code >= 0xd800 &&
10
+ code <= 0xdbff &&
11
+ i + 1 < value.length &&
12
+ value.charCodeAt(i + 1) >= 0xdc00 &&
13
+ value.charCodeAt(i + 1) <= 0xdfff) {
14
+ bytes += 4;
15
+ i++;
16
+ }
17
+ else
18
+ bytes += 3;
19
+ }
20
+ return bytes;
21
+ }
22
+ //# sourceMappingURL=utf8-byte-length.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8-byte-length.js","sourceRoot":"","sources":["../src/utf8-byte-length.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,IAAI;YAAE,KAAK,EAAE,CAAC;aACpB,IAAI,IAAI,GAAG,KAAK;YAAE,KAAK,IAAI,CAAC,CAAC;aAC7B,IACH,IAAI,IAAI,MAAM;YACd,IAAI,IAAI,MAAM;YACd,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM;YACpB,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;YACjC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EACjC,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,CAAC,EAAE,CAAC;QACN,CAAC;;YAAM,KAAK,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PROTOCOL_VERSION = "0.75.0";
1
+ export declare const PROTOCOL_VERSION = "0.77.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -3,5 +3,5 @@
3
3
  // fleet can be upgraded deliberately; optional method/event fields remain
4
4
  // backward-compatible unless a caller requires a new node capability.
5
5
  // Format: semver-ish, increment when methods/events/frame format changes.
6
- export const PROTOCOL_VERSION = '0.75.0';
6
+ export const PROTOCOL_VERSION = '0.77.0';
7
7
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farmslot/protocol",
3
- "version": "0.75.0",
3
+ "version": "0.77.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -391,6 +391,11 @@
391
391
  "./review-approval-policy.cjs": {
392
392
  "types": "./scripts/review-approval-policy.d.cts",
393
393
  "default": "./scripts/review-approval-policy.cjs"
394
+ },
395
+ "./performance": {
396
+ "types": "./dist/performance/index.d.ts",
397
+ "import": "./dist/performance/index.js",
398
+ "default": "./dist/performance/index.js"
394
399
  }
395
400
  },
396
401
  "scripts": {