@farmslot/protocol 0.73.2 → 0.74.1
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.
- package/CHANGELOG.md +22 -8
- package/README.md +9 -0
- package/dist/client-cache/cache.d.ts +4 -0
- package/dist/client-cache/cache.d.ts.map +1 -0
- package/dist/client-cache/cache.js +1102 -0
- package/dist/client-cache/cache.js.map +1 -0
- package/dist/client-cache/collector-admission.d.ts +29 -0
- package/dist/client-cache/collector-admission.d.ts.map +1 -0
- package/dist/client-cache/collector-admission.js +183 -0
- package/dist/client-cache/collector-admission.js.map +1 -0
- package/dist/client-cache/command-method.d.ts +5 -0
- package/dist/client-cache/command-method.d.ts.map +1 -0
- package/dist/client-cache/command-method.js +2 -0
- package/dist/client-cache/command-method.js.map +1 -0
- package/dist/client-cache/conformance.d.ts +36 -0
- package/dist/client-cache/conformance.d.ts.map +1 -0
- package/dist/client-cache/conformance.js +578 -0
- package/dist/client-cache/conformance.js.map +1 -0
- package/dist/client-cache/content.d.ts +29 -0
- package/dist/client-cache/content.d.ts.map +1 -0
- package/dist/client-cache/content.js +101 -0
- package/dist/client-cache/content.js.map +1 -0
- package/dist/client-cache/d07-domains.d.ts +17 -0
- package/dist/client-cache/d07-domains.d.ts.map +1 -0
- package/dist/client-cache/d07-domains.js +111 -0
- package/dist/client-cache/d07-domains.js.map +1 -0
- package/dist/client-cache/diff-apply.d.ts +29 -0
- package/dist/client-cache/diff-apply.d.ts.map +1 -0
- package/dist/client-cache/diff-apply.js +206 -0
- package/dist/client-cache/diff-apply.js.map +1 -0
- package/dist/client-cache/index.d.ts +14 -10
- package/dist/client-cache/index.d.ts.map +1 -1
- package/dist/client-cache/index.js +14 -1
- package/dist/client-cache/index.js.map +1 -1
- package/dist/client-cache/keys.d.ts +126 -0
- package/dist/client-cache/keys.d.ts.map +1 -0
- package/dist/client-cache/keys.js +25 -0
- package/dist/client-cache/keys.js.map +1 -0
- package/dist/client-cache/native-history.d.ts +64 -0
- package/dist/client-cache/native-history.d.ts.map +1 -0
- package/dist/client-cache/native-history.js +285 -0
- package/dist/client-cache/native-history.js.map +1 -0
- package/dist/client-cache/prefetch.d.ts +50 -0
- package/dist/client-cache/prefetch.d.ts.map +1 -0
- package/dist/client-cache/prefetch.js +507 -0
- package/dist/client-cache/prefetch.js.map +1 -0
- package/dist/client-cache/registry.d.ts +1365 -0
- package/dist/client-cache/registry.d.ts.map +1 -0
- package/dist/client-cache/registry.js +1038 -0
- package/dist/client-cache/registry.js.map +1 -0
- package/dist/client-cache/run-list-versions.d.ts +70 -0
- package/dist/client-cache/run-list-versions.d.ts.map +1 -0
- package/dist/client-cache/run-list-versions.js +309 -0
- package/dist/client-cache/run-list-versions.js.map +1 -0
- package/dist/client-cache/store.d.ts +128 -0
- package/dist/client-cache/store.d.ts.map +1 -0
- package/dist/client-cache/store.js +190 -0
- package/dist/client-cache/store.js.map +1 -0
- package/dist/client-cache/transport.d.ts +27 -0
- package/dist/client-cache/transport.d.ts.map +1 -0
- package/dist/client-cache/transport.js +56 -0
- package/dist/client-cache/transport.js.map +1 -0
- package/dist/client-cache/types.d.ts +116 -0
- package/dist/client-cache/types.d.ts.map +1 -0
- package/dist/client-cache/types.js +2 -0
- package/dist/client-cache/types.js.map +1 -0
- package/dist/client-cache/upstream-retention.d.ts +6 -0
- package/dist/client-cache/upstream-retention.d.ts.map +1 -0
- package/dist/client-cache/upstream-retention.js +28 -0
- package/dist/client-cache/upstream-retention.js.map +1 -0
- package/dist/client-cache/workspace-retention.d.ts +7 -0
- package/dist/client-cache/workspace-retention.d.ts.map +1 -0
- package/dist/client-cache/workspace-retention.js +46 -0
- package/dist/client-cache/workspace-retention.js.map +1 -0
- package/dist/contracts/acceptance-registration.d.ts +0 -6
- package/dist/contracts/acceptance-registration.d.ts.map +1 -1
- package/dist/contracts/provider-accounts.d.ts +31 -0
- package/dist/contracts/provider-accounts.d.ts.map +1 -1
- package/dist/contracts/provider-accounts.js +209 -1
- package/dist/contracts/provider-accounts.js.map +1 -1
- package/dist/contracts/run-bundles.d.ts.map +1 -1
- package/dist/contracts/run-bundles.js +2 -0
- package/dist/contracts/run-bundles.js.map +1 -1
- package/dist/contracts/runs.d.ts +5 -20
- package/dist/contracts/runs.d.ts.map +1 -1
- package/dist/contracts/runs.js +5 -21
- package/dist/contracts/runs.js.map +1 -1
- package/dist/contracts/worker-terminal.d.ts +0 -3
- package/dist/contracts/worker-terminal.d.ts.map +1 -1
- package/dist/contracts/worker-terminal.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/person-session-client.d.ts +4 -1
- package/dist/person-session-client.d.ts.map +1 -1
- package/dist/person-session-client.js.map +1 -1
- package/dist/rpc/auth.d.ts +17 -0
- package/dist/rpc/auth.d.ts.map +1 -1
- package/dist/rpc/auth.js.map +1 -1
- package/dist/rpc/config.d.ts +2 -0
- package/dist/rpc/config.d.ts.map +1 -1
- package/dist/rpc/config.js.map +1 -1
- package/dist/rpc/fs.d.ts +110 -4
- package/dist/rpc/fs.d.ts.map +1 -1
- package/dist/rpc/fs.js +7 -1
- package/dist/rpc/fs.js.map +1 -1
- package/dist/rpc/gateway.d.ts +3 -0
- package/dist/rpc/gateway.d.ts.map +1 -1
- package/dist/rpc/git.d.ts +42 -0
- package/dist/rpc/git.d.ts.map +1 -1
- package/dist/rpc/index.d.ts +1 -0
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +1 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/native-session.d.ts +2 -0
- package/dist/rpc/native-session.d.ts.map +1 -1
- package/dist/rpc/native-session.js.map +1 -1
- package/dist/rpc/nodes.d.ts +2 -0
- package/dist/rpc/nodes.d.ts.map +1 -1
- package/dist/rpc/nodes.js.map +1 -1
- package/dist/rpc/pr-observations.d.ts +22 -0
- package/dist/rpc/pr-observations.d.ts.map +1 -0
- package/dist/rpc/pr-observations.js +104 -0
- package/dist/rpc/pr-observations.js.map +1 -0
- package/dist/rpc/pr.d.ts +9 -0
- package/dist/rpc/pr.d.ts.map +1 -1
- package/dist/rpc/pr.js +1 -1
- package/dist/rpc/pr.js.map +1 -1
- package/dist/rpc/principal.d.ts +2 -0
- package/dist/rpc/principal.d.ts.map +1 -1
- package/dist/rpc/registry.d.ts +1 -0
- package/dist/rpc/registry.d.ts.map +1 -1
- package/dist/rpc/registry.js +2 -0
- package/dist/rpc/registry.js.map +1 -1
- package/dist/rpc/resource-observers.d.ts +32 -0
- package/dist/rpc/resource-observers.d.ts.map +1 -0
- package/dist/rpc/resource-observers.js +2 -0
- package/dist/rpc/resource-observers.js.map +1 -0
- package/dist/rpc/run.d.ts +23 -0
- package/dist/rpc/run.d.ts.map +1 -1
- package/dist/rpc/run.js.map +1 -1
- package/dist/rpc/runner-models.d.ts +15 -0
- package/dist/rpc/runner-models.d.ts.map +1 -1
- package/dist/rpc/runner-models.js +91 -0
- package/dist/rpc/runner-models.js.map +1 -1
- package/dist/runs/review-diff-identity.d.ts +15 -0
- package/dist/runs/review-diff-identity.d.ts.map +1 -0
- package/dist/runs/review-diff-identity.js +47 -0
- package/dist/runs/review-diff-identity.js.map +1 -0
- package/dist/runs/run-list-filter.d.ts +33 -0
- package/dist/runs/run-list-filter.d.ts.map +1 -0
- package/dist/runs/run-list-filter.js +116 -0
- package/dist/runs/run-list-filter.js.map +1 -0
- package/dist/runs/run-list-observation.d.ts +5 -0
- package/dist/runs/run-list-observation.d.ts.map +1 -0
- package/dist/runs/run-list-observation.js +36 -0
- package/dist/runs/run-list-observation.js.map +1 -0
- package/dist/runs/run-list-view.d.ts +6 -2
- package/dist/runs/run-list-view.d.ts.map +1 -1
- package/dist/runs/run-list-view.js +10 -4
- package/dist/runs/run-list-view.js.map +1 -1
- package/dist/slots/cancelled-run-slot.d.ts +2 -1
- package/dist/slots/cancelled-run-slot.d.ts.map +1 -1
- package/dist/sources/client.d.ts +10 -1
- package/dist/sources/client.d.ts.map +1 -1
- package/dist/sources/client.js +23 -4
- package/dist/sources/client.js.map +1 -1
- package/dist/sources/controller.d.ts +13 -14
- package/dist/sources/controller.d.ts.map +1 -1
- package/dist/sources/controller.js +87 -82
- package/dist/sources/controller.js.map +1 -1
- package/dist/sources/status-view.d.ts +2 -0
- package/dist/sources/status-view.d.ts.map +1 -1
- package/dist/sources/status-view.js +13 -0
- package/dist/sources/status-view.js.map +1 -1
- package/dist/transport/events.d.ts +1 -4
- package/dist/transport/events.d.ts.map +1 -1
- package/dist/transport/events.js +1 -0
- package/dist/transport/events.js.map +1 -1
- package/dist/transport/frames.d.ts +6 -0
- package/dist/transport/frames.d.ts.map +1 -1
- package/dist/transport/frames.js.map +1 -1
- package/dist/transport/observations.d.ts +24 -0
- package/dist/transport/observations.d.ts.map +1 -0
- package/dist/transport/observations.js +2 -0
- package/dist/transport/observations.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/sources/changes.d.ts +0 -37
- package/dist/sources/changes.d.ts.map +0 -1
- package/dist/sources/changes.js +0 -79
- package/dist/sources/changes.js.map +0 -1
|
@@ -0,0 +1,1038 @@
|
|
|
1
|
+
import { providerAccountsDependencies, providerAccountsObservationParams, providerAccountsStoredData, } from '../contracts/provider-accounts.js';
|
|
2
|
+
import { prForSlotObservationParams, prForSlotStoredData, prReviewCommentsObservationParams, prReviewCommentsStoredData, prStatusObservationParams, prStatusStoredData, } from '../rpc/pr-observations.js';
|
|
3
|
+
import { Methods } from '../rpc/registry.js';
|
|
4
|
+
import { runnerModelCatalogObservationParams, runnerModelCatalogResourceKey, runnerModelCatalogStoredData, runnerVisibleModelsObservationParams, runnerVisibleModelsStoredData, } from '../rpc/runner-models.js';
|
|
5
|
+
import { analyticsParams, assessmentDependencies, assessmentHistoryParams, copilotRuntimeKey, domainParams, idParams, observerEvidenceParams, prAutomationDependencies, sessionContextParams, triageParams, } from './d07-domains.js';
|
|
6
|
+
import { canonicalResourceJson } from './keys.js';
|
|
7
|
+
import { nativeHistoryParams, nativeObservationDependencies } from './native-history.js';
|
|
8
|
+
const mb = 1024 * 1024;
|
|
9
|
+
export const UPSTREAM_QUERY_MAX_BYTES = 2 * mb;
|
|
10
|
+
function requiredId(params, field) {
|
|
11
|
+
const value = params && typeof params === 'object' ? Reflect.get(params, field) : undefined;
|
|
12
|
+
if (typeof value !== 'string' || !value)
|
|
13
|
+
throw new Error(`Resource query requires ${field}`);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function planningObservationParams(params) {
|
|
17
|
+
if (params == null)
|
|
18
|
+
return {};
|
|
19
|
+
if (typeof params !== 'object' || Array.isArray(params))
|
|
20
|
+
throw new Error('Planning observations require an object');
|
|
21
|
+
const { forceRefresh, ...observation } = params;
|
|
22
|
+
if (forceRefresh !== undefined && forceRefresh !== false)
|
|
23
|
+
throw new Error('Planning observations cannot forceRefresh');
|
|
24
|
+
return observation;
|
|
25
|
+
}
|
|
26
|
+
function roadmapListObservationParams(params) {
|
|
27
|
+
const observation = planningObservationParams(params);
|
|
28
|
+
if (observation.search !== undefined && observation.search !== '')
|
|
29
|
+
throw new Error('Roadmap searches are not persisted observations');
|
|
30
|
+
delete observation.search;
|
|
31
|
+
return observation;
|
|
32
|
+
}
|
|
33
|
+
function configurationParams(params, allowed, required = []) {
|
|
34
|
+
const input = params ?? {};
|
|
35
|
+
if (typeof input !== 'object' || Array.isArray(input))
|
|
36
|
+
throw new Error('Configuration observations require an object');
|
|
37
|
+
const value = Object.fromEntries(Object.entries(input).filter(([, item]) => item !== undefined));
|
|
38
|
+
if (Object.keys(value).some((key) => !allowed.includes(key)))
|
|
39
|
+
throw new Error('Configuration observations do not accept commands, paths or credentials');
|
|
40
|
+
for (const key of required)
|
|
41
|
+
requiredId(value, key);
|
|
42
|
+
for (const [key, item] of Object.entries(value)) {
|
|
43
|
+
if (key === 'unfiltered') {
|
|
44
|
+
if (typeof item !== 'boolean')
|
|
45
|
+
throw new Error('unfiltered must be a boolean');
|
|
46
|
+
}
|
|
47
|
+
else if (typeof item !== 'string' ||
|
|
48
|
+
!item ||
|
|
49
|
+
/[/\\]/.test(item) ||
|
|
50
|
+
item === '.' ||
|
|
51
|
+
item === '..') {
|
|
52
|
+
throw new Error(`Invalid configuration selector: ${key}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function configurationDependencies(params) {
|
|
58
|
+
const project = params && typeof params === 'object' ? Reflect.get(params, 'project') : undefined;
|
|
59
|
+
// Legacy unmarked reads are stamped too; never admit an unchecked path into a key.
|
|
60
|
+
if (project !== undefined)
|
|
61
|
+
configurationParams({ project }, ['project'], ['project']);
|
|
62
|
+
return [
|
|
63
|
+
{ family: 'configuration', scope: 'farm' },
|
|
64
|
+
...(typeof project === 'string'
|
|
65
|
+
? [{ family: 'configuration', scope: 'farm', project }]
|
|
66
|
+
: []),
|
|
67
|
+
// Source-bound project/template packs become readable through their owning source boundary.
|
|
68
|
+
{ family: 'sources', scope: 'farm' },
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
const configurationDefinition = {
|
|
72
|
+
persisted: false,
|
|
73
|
+
maxBytes: 2 * mb,
|
|
74
|
+
live: true,
|
|
75
|
+
requiresObservedRead: true,
|
|
76
|
+
normalizeParams: (params) => configurationParams(params, []),
|
|
77
|
+
dependencies: configurationDependencies,
|
|
78
|
+
};
|
|
79
|
+
function workerInventoryParams(params) {
|
|
80
|
+
if (params == null)
|
|
81
|
+
return { includeDisconnected: true };
|
|
82
|
+
if (typeof params !== 'object' || Array.isArray(params))
|
|
83
|
+
throw new Error('Worker inventory observations require an object');
|
|
84
|
+
const source = params;
|
|
85
|
+
if (Object.keys(source).some((key) => !['machine', 'machines', 'includeDisconnected'].includes(key)))
|
|
86
|
+
throw new Error('Worker inventory observations accept only machine filters');
|
|
87
|
+
if (source.includeDisconnected !== undefined && typeof source.includeDisconnected !== 'boolean')
|
|
88
|
+
throw new Error('includeDisconnected must be a boolean');
|
|
89
|
+
if (source.machine !== undefined &&
|
|
90
|
+
(typeof source.machine !== 'string' || !source.machine.trim()))
|
|
91
|
+
throw new Error('machine must be a nonempty string');
|
|
92
|
+
if (source.machines !== undefined &&
|
|
93
|
+
(!Array.isArray(source.machines) ||
|
|
94
|
+
source.machines.some((machine) => typeof machine !== 'string' || !machine.trim())))
|
|
95
|
+
throw new Error('machines must contain nonempty strings');
|
|
96
|
+
const machines = [
|
|
97
|
+
...new Set([
|
|
98
|
+
...(source.machine === undefined ? [] : [source.machine]),
|
|
99
|
+
...(source.machines ?? []),
|
|
100
|
+
]),
|
|
101
|
+
].sort();
|
|
102
|
+
return {
|
|
103
|
+
includeDisconnected: source.includeDisconnected ?? true,
|
|
104
|
+
...(machines.length ? { machines } : {}),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function workspaceParams(params) {
|
|
108
|
+
if (!params || typeof params !== 'object' || Array.isArray(params))
|
|
109
|
+
throw new Error('Workspace query requires parameters');
|
|
110
|
+
const value = params;
|
|
111
|
+
const allowed = [
|
|
112
|
+
'slotId',
|
|
113
|
+
'runId',
|
|
114
|
+
'path',
|
|
115
|
+
'depth',
|
|
116
|
+
'includeIgnored',
|
|
117
|
+
'base',
|
|
118
|
+
'head',
|
|
119
|
+
'target',
|
|
120
|
+
'includeUntracked',
|
|
121
|
+
'oldPath',
|
|
122
|
+
'ref',
|
|
123
|
+
'sessionId',
|
|
124
|
+
'executionNodeId',
|
|
125
|
+
'worker',
|
|
126
|
+
];
|
|
127
|
+
if (Object.keys(value).some((key) => !allowed.includes(key)))
|
|
128
|
+
throw new Error('Workspace observations do not accept commands or owner keys');
|
|
129
|
+
if (value.slotId) {
|
|
130
|
+
requiredId(value, 'slotId');
|
|
131
|
+
if (value.sessionId !== undefined ||
|
|
132
|
+
value.executionNodeId !== undefined ||
|
|
133
|
+
value.worker !== undefined)
|
|
134
|
+
throw new Error('Slot workspace cannot carry native selectors');
|
|
135
|
+
if (value.runId !== undefined)
|
|
136
|
+
requiredId(value, 'runId');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
requiredId(value, 'sessionId');
|
|
140
|
+
if (value.runId !== undefined)
|
|
141
|
+
throw new Error('Native run identity belongs in its exact worker pin');
|
|
142
|
+
if (value.executionNodeId !== undefined)
|
|
143
|
+
requiredId(value, 'executionNodeId');
|
|
144
|
+
if (value.executionNodeId === '*')
|
|
145
|
+
throw new Error('Native workspace requires an exact node');
|
|
146
|
+
if (value.worker !== undefined) {
|
|
147
|
+
const worker = value.worker;
|
|
148
|
+
const fields = ['runId', 'contextId', 'generation', 'leaseId'];
|
|
149
|
+
if (!worker ||
|
|
150
|
+
typeof worker !== 'object' ||
|
|
151
|
+
Array.isArray(worker) ||
|
|
152
|
+
Object.keys(worker).some((key) => !fields.includes(key)))
|
|
153
|
+
throw new Error('Invalid pinned workspace worker');
|
|
154
|
+
for (const field of fields)
|
|
155
|
+
requiredId(worker, field);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (value.path !== undefined &&
|
|
159
|
+
(typeof value.path !== 'string' ||
|
|
160
|
+
value.path.startsWith('/') ||
|
|
161
|
+
value.path.replace(/\\/g, '/').split('/').includes('..')))
|
|
162
|
+
throw new Error('Workspace path must stay relative');
|
|
163
|
+
if (value.includeUntracked !== undefined && typeof value.includeUntracked !== 'boolean')
|
|
164
|
+
throw new Error('includeUntracked must be a boolean');
|
|
165
|
+
if (value.includeUntracked && value.target !== 'worktree')
|
|
166
|
+
throw new Error('includeUntracked requires a worktree diff');
|
|
167
|
+
return {
|
|
168
|
+
...value,
|
|
169
|
+
// Absent and false read the same diff, so they share one identity.
|
|
170
|
+
includeUntracked: value.includeUntracked || undefined,
|
|
171
|
+
...(value.sessionId ? { executionNodeId: value.executionNodeId ?? 'local' } : {}),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function workspaceDependencies(params, nativeReaderId) {
|
|
175
|
+
const value = workspaceParams(params);
|
|
176
|
+
if (value.slotId)
|
|
177
|
+
return [
|
|
178
|
+
{
|
|
179
|
+
family: 'workspace',
|
|
180
|
+
slotId: String(value.slotId),
|
|
181
|
+
...(value.runId ? { runId: String(value.runId) } : {}),
|
|
182
|
+
},
|
|
183
|
+
{ family: 'slot', slotId: String(value.slotId) },
|
|
184
|
+
...(value.runId ? [{ family: 'run', runId: String(value.runId) }] : []),
|
|
185
|
+
];
|
|
186
|
+
if (!nativeReaderId)
|
|
187
|
+
throw new Error('Native workspace query requires authenticated reader identity');
|
|
188
|
+
return [
|
|
189
|
+
{
|
|
190
|
+
family: 'workspace',
|
|
191
|
+
ownerId: nativeReaderId,
|
|
192
|
+
nodeId: String(value.executionNodeId),
|
|
193
|
+
sessionId: String(value.sessionId),
|
|
194
|
+
...(value.worker ? { contextId: canonicalResourceJson(value.worker) } : {}),
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
function workspaceRetentionGroups(params) {
|
|
199
|
+
const value = workspaceParams(params);
|
|
200
|
+
return value.slotId
|
|
201
|
+
? [`slot:${value.slotId}`, ...(value.runId ? [`run:${value.runId}`] : [])]
|
|
202
|
+
: [
|
|
203
|
+
`native:${value.executionNodeId}:${value.sessionId}:${canonicalResourceJson(value.worker ?? null)}`,
|
|
204
|
+
];
|
|
205
|
+
}
|
|
206
|
+
const workspaceDefinition = {
|
|
207
|
+
live: true,
|
|
208
|
+
requiresObservedRead: true,
|
|
209
|
+
requiresWorkspaceRead: true,
|
|
210
|
+
persisted: true,
|
|
211
|
+
maxBytes: 1 * mb,
|
|
212
|
+
retention: { maxEntries: 200, maxBytes: 2 * 1024 * mb, cohort: 'workspace' },
|
|
213
|
+
retentionGroups: workspaceRetentionGroups,
|
|
214
|
+
normalizeParams: workspaceParams,
|
|
215
|
+
dependencies: workspaceDependencies,
|
|
216
|
+
};
|
|
217
|
+
const domainDefinition = {
|
|
218
|
+
persisted: false,
|
|
219
|
+
maxBytes: 2 * mb,
|
|
220
|
+
live: true,
|
|
221
|
+
requiresObservedRead: true,
|
|
222
|
+
normalizeParams: (params) => domainParams(params, []),
|
|
223
|
+
dependencies: prAutomationDependencies,
|
|
224
|
+
};
|
|
225
|
+
const assessmentDefinition = {
|
|
226
|
+
...domainDefinition,
|
|
227
|
+
dependencies: assessmentDependencies,
|
|
228
|
+
};
|
|
229
|
+
function prListObservationParams(params) {
|
|
230
|
+
if (params == null)
|
|
231
|
+
return {};
|
|
232
|
+
if (typeof params !== 'object' || Array.isArray(params))
|
|
233
|
+
throw new Error('PR list observations require an object');
|
|
234
|
+
const record = params;
|
|
235
|
+
if (Object.keys(record).some((key) => !['project', 'force'].includes(key)) ||
|
|
236
|
+
(record.force !== undefined && record.force !== false))
|
|
237
|
+
throw new Error('PR list observations cannot force a check or supply unregistered selectors');
|
|
238
|
+
const project = record.project;
|
|
239
|
+
if (project === undefined)
|
|
240
|
+
return {};
|
|
241
|
+
if (typeof project !== 'string' ||
|
|
242
|
+
!project ||
|
|
243
|
+
project.trim() !== project ||
|
|
244
|
+
project.length > 256 ||
|
|
245
|
+
/[/\\]/.test(project) ||
|
|
246
|
+
project === '.' ||
|
|
247
|
+
project === '..')
|
|
248
|
+
throw new Error('PR list observations require a valid project identifier');
|
|
249
|
+
return { project };
|
|
250
|
+
}
|
|
251
|
+
function upstreamRefreshObservationParams(params) {
|
|
252
|
+
if (params == null)
|
|
253
|
+
return {};
|
|
254
|
+
if (typeof params !== 'object' ||
|
|
255
|
+
Array.isArray(params) ||
|
|
256
|
+
Object.keys(params).some((key) => key !== 'refresh') ||
|
|
257
|
+
(Reflect.get(params, 'refresh') !== undefined && Reflect.get(params, 'refresh') !== false))
|
|
258
|
+
throw new Error('Upstream observations cannot force a remote check');
|
|
259
|
+
return {};
|
|
260
|
+
}
|
|
261
|
+
function githubAccountsStoredData(data) {
|
|
262
|
+
const status = data;
|
|
263
|
+
return {
|
|
264
|
+
accounts: status.accounts.map(({ host, login, active }) => ({ host, login, active })),
|
|
265
|
+
checkedAt: status.checkedAt,
|
|
266
|
+
error: status.error,
|
|
267
|
+
observation: upstreamSourceObservation(status),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const STORED_UPDATE_ERROR = 'The gateway could not check its source for updates.';
|
|
271
|
+
const STORED_UPDATE_OBSERVATION_ERROR = 'The last gateway update check did not complete.';
|
|
272
|
+
const STORED_OPERATION_MESSAGE = {
|
|
273
|
+
running: 'Gateway update in progress.',
|
|
274
|
+
complete: 'Gateway update finished.',
|
|
275
|
+
error: 'Gateway update did not complete.',
|
|
276
|
+
};
|
|
277
|
+
/** Durable update facts only: Git/process diagnostics, paths and PIDs stay in the live reply. */
|
|
278
|
+
function gatewayStatusStoredData(data) {
|
|
279
|
+
const status = data;
|
|
280
|
+
const { update, observation } = status;
|
|
281
|
+
const operation = update.operation;
|
|
282
|
+
return {
|
|
283
|
+
version: status.version,
|
|
284
|
+
update: {
|
|
285
|
+
...(update.canUpdate === undefined ? {} : { canUpdate: update.canUpdate }),
|
|
286
|
+
updateAvailable: update.updateAvailable,
|
|
287
|
+
commitsBehind: update.commitsBehind,
|
|
288
|
+
commitsAhead: update.commitsAhead,
|
|
289
|
+
branch: update.branch,
|
|
290
|
+
localSha: update.localSha,
|
|
291
|
+
remoteSha: update.remoteSha,
|
|
292
|
+
lastChecked: update.lastChecked,
|
|
293
|
+
updateCommand: update.updateCommand,
|
|
294
|
+
error: update.error ? STORED_UPDATE_ERROR : null,
|
|
295
|
+
...(operation
|
|
296
|
+
? {
|
|
297
|
+
operation: {
|
|
298
|
+
id: operation.id,
|
|
299
|
+
phase: operation.phase,
|
|
300
|
+
message: STORED_OPERATION_MESSAGE[operation.phase],
|
|
301
|
+
updatedAt: operation.updatedAt,
|
|
302
|
+
localSha: operation.localSha,
|
|
303
|
+
targetSha: operation.targetSha,
|
|
304
|
+
...(operation.desktopRebuildRequired === undefined
|
|
305
|
+
? {}
|
|
306
|
+
: { desktopRebuildRequired: operation.desktopRebuildRequired }),
|
|
307
|
+
...(operation.gatewayRestartRequired === undefined
|
|
308
|
+
? {}
|
|
309
|
+
: { gatewayRestartRequired: operation.gatewayRestartRequired }),
|
|
310
|
+
},
|
|
311
|
+
}
|
|
312
|
+
: {}),
|
|
313
|
+
},
|
|
314
|
+
releaseNotes: status.releaseNotes,
|
|
315
|
+
capabilities: status.capabilities,
|
|
316
|
+
...(observation
|
|
317
|
+
? {
|
|
318
|
+
observation: {
|
|
319
|
+
status: observation.status,
|
|
320
|
+
...(observation.observedAt === undefined ? {} : { observedAt: observation.observedAt }),
|
|
321
|
+
...(observation.error
|
|
322
|
+
? {
|
|
323
|
+
error: { code: observation.error.code, message: STORED_UPDATE_OBSERVATION_ERROR },
|
|
324
|
+
}
|
|
325
|
+
: {}),
|
|
326
|
+
},
|
|
327
|
+
}
|
|
328
|
+
: {}),
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
/** A local slot answer (no PR lookup applies) is explicit, not a missing upstream observation. */
|
|
332
|
+
function prForSlotSourceObservation(data) {
|
|
333
|
+
return data && typeof data === 'object' && Reflect.get(data, 'source') === 'local'
|
|
334
|
+
? null
|
|
335
|
+
: upstreamSourceObservation(data);
|
|
336
|
+
}
|
|
337
|
+
/** Only a runner with no catalog source answers without an observation; collected sources never do. */
|
|
338
|
+
function runnerModelCatalogSourceObservation(data) {
|
|
339
|
+
const observation = upstreamSourceObservation(data);
|
|
340
|
+
if (observation !== undefined || !data || typeof data !== 'object')
|
|
341
|
+
return observation;
|
|
342
|
+
return Reflect.get(data, 'status') === 'unsupported' &&
|
|
343
|
+
Reflect.get(data, 'source') === 'unsupported'
|
|
344
|
+
? null
|
|
345
|
+
: undefined;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Legacy reads are stamped too: identity fields are picked so `force` never names another
|
|
349
|
+
* observation, and an identity the observation refuses reads without its upstream key.
|
|
350
|
+
*/
|
|
351
|
+
function prDetailDependencies(method, identity, local) {
|
|
352
|
+
let normalized;
|
|
353
|
+
try {
|
|
354
|
+
normalized = identity();
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
return local;
|
|
358
|
+
}
|
|
359
|
+
return [
|
|
360
|
+
{
|
|
361
|
+
family: 'upstream',
|
|
362
|
+
integration: 'github',
|
|
363
|
+
queryId: `${method}:${canonicalResourceJson(normalized)}`,
|
|
364
|
+
},
|
|
365
|
+
...local,
|
|
366
|
+
];
|
|
367
|
+
}
|
|
368
|
+
function paramField(params, field) {
|
|
369
|
+
return params && typeof params === 'object' ? Reflect.get(params, field) : undefined;
|
|
370
|
+
}
|
|
371
|
+
const prDetailDefinition = {
|
|
372
|
+
persisted: true,
|
|
373
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
374
|
+
retention: {
|
|
375
|
+
maxEntries: Number.MAX_SAFE_INTEGER,
|
|
376
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
377
|
+
cohort: 'upstream',
|
|
378
|
+
},
|
|
379
|
+
timeoutMs: 30_000,
|
|
380
|
+
live: true,
|
|
381
|
+
collector: 'github',
|
|
382
|
+
sourceObservation: upstreamSourceObservation,
|
|
383
|
+
};
|
|
384
|
+
export function upstreamSourceObservation(data) {
|
|
385
|
+
const observation = data && typeof data === 'object' ? Reflect.get(data, 'observation') : undefined;
|
|
386
|
+
if (observation === undefined)
|
|
387
|
+
return undefined;
|
|
388
|
+
if (!observation ||
|
|
389
|
+
typeof observation !== 'object' ||
|
|
390
|
+
!['ready', 'stale', 'error'].includes(observation.status) ||
|
|
391
|
+
(observation.observedAt !== undefined &&
|
|
392
|
+
(!Number.isFinite(observation.observedAt) || observation.observedAt <= 0)) ||
|
|
393
|
+
(observation.status === 'ready' && observation.observedAt === undefined) ||
|
|
394
|
+
(observation.status === 'ready' && observation.error !== undefined) ||
|
|
395
|
+
(observation.error !== undefined &&
|
|
396
|
+
(!observation.error ||
|
|
397
|
+
typeof observation.error.code !== 'string' ||
|
|
398
|
+
typeof observation.error.message !== 'string')))
|
|
399
|
+
throw new Error('The gateway supplied an invalid upstream observation');
|
|
400
|
+
return {
|
|
401
|
+
status: observation.status,
|
|
402
|
+
...(observation.observedAt === undefined ? {} : { observedAt: observation.observedAt }),
|
|
403
|
+
...(observation.error
|
|
404
|
+
? { error: { code: observation.error.code, message: observation.error.message } }
|
|
405
|
+
: {}),
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/** Closed to runtime registration. Each migration changes its owning definition here. */
|
|
409
|
+
export const RESOURCE_QUERY_DEFINITIONS = {
|
|
410
|
+
[Methods.GATEWAY_STATUS]: {
|
|
411
|
+
persisted: true,
|
|
412
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
413
|
+
retention: {
|
|
414
|
+
maxEntries: Number.MAX_SAFE_INTEGER,
|
|
415
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
416
|
+
cohort: 'upstream',
|
|
417
|
+
},
|
|
418
|
+
timeoutMs: 60_000,
|
|
419
|
+
live: true,
|
|
420
|
+
collector: 'gateway-update',
|
|
421
|
+
sourceObservation: upstreamSourceObservation,
|
|
422
|
+
persistedData: gatewayStatusStoredData,
|
|
423
|
+
normalizeParams: upstreamRefreshObservationParams,
|
|
424
|
+
dependencies: () => [{ family: 'gateway-update', scope: 'gateway' }],
|
|
425
|
+
},
|
|
426
|
+
[Methods.CONFIG_GITHUB_ACCOUNTS]: {
|
|
427
|
+
persisted: true,
|
|
428
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
429
|
+
retention: {
|
|
430
|
+
maxEntries: Number.MAX_SAFE_INTEGER,
|
|
431
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
432
|
+
cohort: 'upstream',
|
|
433
|
+
},
|
|
434
|
+
timeoutMs: 30_000,
|
|
435
|
+
live: true,
|
|
436
|
+
collector: 'github',
|
|
437
|
+
sourceObservation: upstreamSourceObservation,
|
|
438
|
+
persistedData: githubAccountsStoredData,
|
|
439
|
+
normalizeParams: upstreamRefreshObservationParams,
|
|
440
|
+
dependencies: () => [
|
|
441
|
+
{
|
|
442
|
+
family: 'upstream',
|
|
443
|
+
integration: 'github',
|
|
444
|
+
queryId: `${Methods.CONFIG_GITHUB_ACCOUNTS}:{}`,
|
|
445
|
+
},
|
|
446
|
+
],
|
|
447
|
+
},
|
|
448
|
+
[Methods.PR_LIST]: {
|
|
449
|
+
persisted: true,
|
|
450
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
451
|
+
retention: {
|
|
452
|
+
maxEntries: Number.MAX_SAFE_INTEGER,
|
|
453
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
454
|
+
cohort: 'upstream',
|
|
455
|
+
},
|
|
456
|
+
timeoutMs: 30_000,
|
|
457
|
+
live: true,
|
|
458
|
+
collector: 'github',
|
|
459
|
+
sourceObservation: upstreamSourceObservation,
|
|
460
|
+
normalizeParams: prListObservationParams,
|
|
461
|
+
dependencies: (params) => {
|
|
462
|
+
const project = params && typeof params === 'object' ? Reflect.get(params, 'project') : undefined;
|
|
463
|
+
const normalized = prListObservationParams(project === undefined ? {} : { project });
|
|
464
|
+
return [
|
|
465
|
+
{
|
|
466
|
+
family: 'upstream',
|
|
467
|
+
integration: 'github',
|
|
468
|
+
queryId: `${Methods.PR_LIST}:${canonicalResourceJson(normalized)}`,
|
|
469
|
+
},
|
|
470
|
+
{ family: 'runs', scope: 'farm' },
|
|
471
|
+
{ family: 'slots', scope: 'farm' },
|
|
472
|
+
{ family: 'workers', scope: 'farm' },
|
|
473
|
+
{ family: 'configuration', scope: 'farm' },
|
|
474
|
+
{ family: 'sources', scope: 'farm' },
|
|
475
|
+
];
|
|
476
|
+
},
|
|
477
|
+
},
|
|
478
|
+
// PR detail observations; `force` stays an explicit read of the same observation.
|
|
479
|
+
[Methods.PR_STATUS]: {
|
|
480
|
+
...prDetailDefinition,
|
|
481
|
+
persistedData: prStatusStoredData,
|
|
482
|
+
normalizeParams: prStatusObservationParams,
|
|
483
|
+
dependencies: (params) => prDetailDependencies(Methods.PR_STATUS, () => prStatusObservationParams({
|
|
484
|
+
pr: paramField(params, 'pr'),
|
|
485
|
+
project: paramField(params, 'project'),
|
|
486
|
+
}), [
|
|
487
|
+
{ family: 'runs', scope: 'farm' },
|
|
488
|
+
{ family: 'configuration', scope: 'farm' },
|
|
489
|
+
{ family: 'sources', scope: 'farm' },
|
|
490
|
+
]),
|
|
491
|
+
},
|
|
492
|
+
[Methods.PR_FOR_SLOT]: {
|
|
493
|
+
...prDetailDefinition,
|
|
494
|
+
sourceObservation: prForSlotSourceObservation,
|
|
495
|
+
persistedData: prForSlotStoredData,
|
|
496
|
+
normalizeParams: prForSlotObservationParams,
|
|
497
|
+
dependencies: (params) => prDetailDependencies(Methods.PR_FOR_SLOT, () => prForSlotObservationParams({ slotId: paramField(params, 'slotId') }), [
|
|
498
|
+
{ family: 'slots', scope: 'farm' },
|
|
499
|
+
{ family: 'configuration', scope: 'farm' },
|
|
500
|
+
{ family: 'sources', scope: 'farm' },
|
|
501
|
+
]),
|
|
502
|
+
},
|
|
503
|
+
[Methods.PR_REVIEW_COMMENTS]: {
|
|
504
|
+
...prDetailDefinition,
|
|
505
|
+
persistedData: prReviewCommentsStoredData,
|
|
506
|
+
normalizeParams: prReviewCommentsObservationParams,
|
|
507
|
+
dependencies: (params) => prDetailDependencies(Methods.PR_REVIEW_COMMENTS, () => prReviewCommentsObservationParams({
|
|
508
|
+
pr: paramField(params, 'pr'),
|
|
509
|
+
repo: paramField(params, 'repo'),
|
|
510
|
+
}), []),
|
|
511
|
+
},
|
|
512
|
+
[Methods.RUNNER_MODEL_CATALOG]: {
|
|
513
|
+
persisted: true,
|
|
514
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
515
|
+
retention: {
|
|
516
|
+
maxEntries: Number.MAX_SAFE_INTEGER,
|
|
517
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
518
|
+
cohort: 'upstream',
|
|
519
|
+
},
|
|
520
|
+
timeoutMs: 30_000,
|
|
521
|
+
live: true,
|
|
522
|
+
collector: 'providers',
|
|
523
|
+
sourceObservation: runnerModelCatalogSourceObservation,
|
|
524
|
+
persistedData: runnerModelCatalogStoredData,
|
|
525
|
+
normalizeParams: runnerModelCatalogObservationParams,
|
|
526
|
+
dependencies: (params) => [runnerModelCatalogResourceKey(params)],
|
|
527
|
+
},
|
|
528
|
+
// Per-machine runner seats; forceRefresh stays an imperative read.
|
|
529
|
+
[Methods.PROVIDER_ACCOUNTS_SNAPSHOT]: {
|
|
530
|
+
persisted: true,
|
|
531
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
532
|
+
retention: {
|
|
533
|
+
maxEntries: Number.MAX_SAFE_INTEGER,
|
|
534
|
+
maxBytes: UPSTREAM_QUERY_MAX_BYTES,
|
|
535
|
+
cohort: 'upstream',
|
|
536
|
+
},
|
|
537
|
+
timeoutMs: 45_000,
|
|
538
|
+
live: true,
|
|
539
|
+
collector: 'providers',
|
|
540
|
+
sourceObservation: upstreamSourceObservation,
|
|
541
|
+
persistedData: providerAccountsStoredData,
|
|
542
|
+
normalizeParams: providerAccountsObservationParams,
|
|
543
|
+
dependencies: providerAccountsDependencies,
|
|
544
|
+
},
|
|
545
|
+
// Principal-scoped preferences share the reader's owner profile key; SET stays imperative.
|
|
546
|
+
[Methods.RUNNER_VISIBLE_MODELS_GET]: {
|
|
547
|
+
persisted: true,
|
|
548
|
+
maxBytes: 1 * mb,
|
|
549
|
+
retention: { maxEntries: 16, maxBytes: 1 * mb },
|
|
550
|
+
live: true,
|
|
551
|
+
requiresObservedRead: true,
|
|
552
|
+
persistedData: runnerVisibleModelsStoredData,
|
|
553
|
+
normalizeParams: runnerVisibleModelsObservationParams,
|
|
554
|
+
dependencies: (_params, readerId) => {
|
|
555
|
+
if (!readerId)
|
|
556
|
+
throw new Error('Visible model preferences require the authenticated reader');
|
|
557
|
+
return [{ family: 'profiles', scope: 'owner', ownerId: readerId }];
|
|
558
|
+
},
|
|
559
|
+
},
|
|
560
|
+
// D07 observations. Their imperative siblings are deliberately absent.
|
|
561
|
+
[Methods.PR_WATCH_LIST]: domainDefinition,
|
|
562
|
+
[Methods.PR_WATCH_GET]: {
|
|
563
|
+
...domainDefinition,
|
|
564
|
+
normalizeParams: (params) => idParams(params, ['id']),
|
|
565
|
+
},
|
|
566
|
+
[Methods.PR_RULES_LIST]: domainDefinition,
|
|
567
|
+
[Methods.PR_REVIEW_REQUEST_GET]: {
|
|
568
|
+
...domainDefinition,
|
|
569
|
+
normalizeParams: (params) => idParams(params, ['id']),
|
|
570
|
+
},
|
|
571
|
+
[Methods.PR_PUSH_LIST]: domainDefinition,
|
|
572
|
+
[Methods.ASSESSMENT_LIST]: {
|
|
573
|
+
...assessmentDefinition,
|
|
574
|
+
normalizeParams: assessmentHistoryParams,
|
|
575
|
+
},
|
|
576
|
+
[Methods.ASSESSMENT_GET]: {
|
|
577
|
+
...assessmentDefinition,
|
|
578
|
+
normalizeParams: (params) => idParams(params, ['id']),
|
|
579
|
+
},
|
|
580
|
+
[Methods.ASSESSMENT_SUMMARY]: assessmentDefinition,
|
|
581
|
+
[Methods.ASSESSMENT_REPORT]: {
|
|
582
|
+
...assessmentDefinition,
|
|
583
|
+
// The no-id variant creates an artifact and must remain an explicit command.
|
|
584
|
+
normalizeParams: (params) => idParams(params, ['id']),
|
|
585
|
+
},
|
|
586
|
+
[Methods.ASSESSMENT_STATUS]: {
|
|
587
|
+
...assessmentDefinition,
|
|
588
|
+
dependencies: () => [...assessmentDependencies(), { family: 'configuration', scope: 'farm' }],
|
|
589
|
+
},
|
|
590
|
+
[Methods.DECISION_ADVICE_GET]: {
|
|
591
|
+
...assessmentDefinition,
|
|
592
|
+
normalizeParams: (params) => idParams(params, ['runId', 'decisionId']),
|
|
593
|
+
dependencies: (params) => [
|
|
594
|
+
...assessmentDependencies(),
|
|
595
|
+
{ family: 'run', runId: String(idParams(params, ['runId', 'decisionId']).runId) },
|
|
596
|
+
{ family: 'decisions', scope: 'farm' },
|
|
597
|
+
{ family: 'configuration', scope: 'farm' },
|
|
598
|
+
],
|
|
599
|
+
},
|
|
600
|
+
[Methods.FAILURE_TRIAGE_GET]: {
|
|
601
|
+
...assessmentDefinition,
|
|
602
|
+
normalizeParams: triageParams,
|
|
603
|
+
dependencies: (params) => [
|
|
604
|
+
...assessmentDependencies(),
|
|
605
|
+
{ family: 'run', runId: String(triageParams(params).runId) },
|
|
606
|
+
{ family: 'artifacts', runId: String(triageParams(params).runId) },
|
|
607
|
+
{ family: 'configuration', scope: 'farm' },
|
|
608
|
+
],
|
|
609
|
+
},
|
|
610
|
+
[Methods.ANALYTICS_QUERY]: {
|
|
611
|
+
...domainDefinition,
|
|
612
|
+
normalizeParams: analyticsParams,
|
|
613
|
+
// Dimensions/scannedRuns cover the whole corpus even on a project-filtered read.
|
|
614
|
+
dependencies: () => [{ family: 'analytics', scope: 'farm' }],
|
|
615
|
+
},
|
|
616
|
+
[Methods.COPILOT_STATUS]: {
|
|
617
|
+
...domainDefinition,
|
|
618
|
+
timeoutMs: 10_000,
|
|
619
|
+
dependencies: () => [
|
|
620
|
+
copilotRuntimeKey,
|
|
621
|
+
{ family: 'runs', scope: 'farm' },
|
|
622
|
+
{ family: 'slots', scope: 'farm' },
|
|
623
|
+
{ family: 'workers', scope: 'farm' },
|
|
624
|
+
{ family: 'configuration', scope: 'farm' },
|
|
625
|
+
{ family: 'sources', scope: 'farm' },
|
|
626
|
+
],
|
|
627
|
+
},
|
|
628
|
+
[Methods.CHAT_CONTEXT]: {
|
|
629
|
+
...domainDefinition,
|
|
630
|
+
dependencies: () => [
|
|
631
|
+
copilotRuntimeKey,
|
|
632
|
+
{ family: 'runs', scope: 'farm' },
|
|
633
|
+
{ family: 'slots', scope: 'farm' },
|
|
634
|
+
{ family: 'decisions', scope: 'farm' },
|
|
635
|
+
{ family: 'planning', collection: 'dispatch-queue' },
|
|
636
|
+
],
|
|
637
|
+
},
|
|
638
|
+
[Methods.CHAT_OBSERVER_EVIDENCE]: {
|
|
639
|
+
...domainDefinition,
|
|
640
|
+
normalizeParams: observerEvidenceParams,
|
|
641
|
+
dependencies: () => [copilotRuntimeKey],
|
|
642
|
+
},
|
|
643
|
+
[Methods.CHAT_SESSION_CONTEXT]: {
|
|
644
|
+
...domainDefinition,
|
|
645
|
+
normalizeParams: sessionContextParams,
|
|
646
|
+
dependencies: (params) => [
|
|
647
|
+
copilotRuntimeKey,
|
|
648
|
+
{ ...copilotRuntimeKey, sessionId: String(sessionContextParams(params).sessionId) },
|
|
649
|
+
],
|
|
650
|
+
},
|
|
651
|
+
[Methods.CONFIG_PROJECTS]: {
|
|
652
|
+
...configurationDefinition,
|
|
653
|
+
persisted: true,
|
|
654
|
+
retention: { maxEntries: 1, maxBytes: 2 * mb },
|
|
655
|
+
},
|
|
656
|
+
[Methods.CONFIG_POOLS]: configurationDefinition,
|
|
657
|
+
[Methods.CONFIG_POOL]: {
|
|
658
|
+
...configurationDefinition,
|
|
659
|
+
normalizeParams: (params) => configurationParams(params, ['machine'], ['machine']),
|
|
660
|
+
},
|
|
661
|
+
[Methods.CONFIG_POOL_RAW]: {
|
|
662
|
+
...configurationDefinition,
|
|
663
|
+
normalizeParams: (params) => configurationParams(params, ['machine'], ['machine']),
|
|
664
|
+
},
|
|
665
|
+
[Methods.CONFIG_PROJECT]: {
|
|
666
|
+
...configurationDefinition,
|
|
667
|
+
normalizeParams: (params) => configurationParams(params, ['project'], ['project']),
|
|
668
|
+
},
|
|
669
|
+
[Methods.CONFIG_TEMPLATES]: {
|
|
670
|
+
...configurationDefinition,
|
|
671
|
+
normalizeParams: (params) => configurationParams(params, ['project'], ['project']),
|
|
672
|
+
},
|
|
673
|
+
[Methods.CONFIG_TEMPLATE_OPTIONS]: {
|
|
674
|
+
...configurationDefinition,
|
|
675
|
+
normalizeParams: (params) => {
|
|
676
|
+
const value = configurationParams(params, [
|
|
677
|
+
'project',
|
|
678
|
+
'flowType',
|
|
679
|
+
'platform',
|
|
680
|
+
'runMode',
|
|
681
|
+
'domain',
|
|
682
|
+
'executionTemplateId',
|
|
683
|
+
'unfiltered',
|
|
684
|
+
], ['project']);
|
|
685
|
+
if (value.unfiltered !== true)
|
|
686
|
+
requiredId(value, 'flowType');
|
|
687
|
+
return value;
|
|
688
|
+
},
|
|
689
|
+
},
|
|
690
|
+
[Methods.CONFIG_TEMPLATE_PREVIEW]: {
|
|
691
|
+
...configurationDefinition,
|
|
692
|
+
normalizeParams: (params) => configurationParams(params, [
|
|
693
|
+
'project',
|
|
694
|
+
'flowType',
|
|
695
|
+
'executionTemplateId',
|
|
696
|
+
'executionTemplateSourceId',
|
|
697
|
+
'executionTemplateSha256',
|
|
698
|
+
], ['project', 'flowType']),
|
|
699
|
+
},
|
|
700
|
+
[Methods.LLM_CONFIG_GET]: configurationDefinition,
|
|
701
|
+
[Methods.LLM_AUTH_LIST]: configurationDefinition,
|
|
702
|
+
[Methods.LLM_TIERS]: configurationDefinition,
|
|
703
|
+
[Methods.NATIVE_SESSION_READ]: {
|
|
704
|
+
persisted: true,
|
|
705
|
+
maxBytes: 20 * mb,
|
|
706
|
+
retention: { maxEntries: 10, maxBytes: 20 * mb },
|
|
707
|
+
live: true,
|
|
708
|
+
requiresObservedRead: true,
|
|
709
|
+
normalizeParams: nativeHistoryParams,
|
|
710
|
+
dependencies: (params, nativeReaderId) => nativeObservationDependencies(Methods.NATIVE_SESSION_READ, params, nativeReaderId ?? ''),
|
|
711
|
+
},
|
|
712
|
+
[Methods.NATIVE_SESSION_LIST]: {
|
|
713
|
+
persisted: true,
|
|
714
|
+
maxBytes: 2 * mb,
|
|
715
|
+
retention: { maxEntries: 1, maxBytes: 2 * mb },
|
|
716
|
+
live: true,
|
|
717
|
+
requiresObservedRead: true,
|
|
718
|
+
dependencies: (params, nativeReaderId) => nativeObservationDependencies(Methods.NATIVE_SESSION_LIST, params, nativeReaderId ?? ''),
|
|
719
|
+
},
|
|
720
|
+
[Methods.NATIVE_SESSION_CATALOG]: {
|
|
721
|
+
persisted: false,
|
|
722
|
+
maxBytes: 2 * mb,
|
|
723
|
+
retention: { maxEntries: 1, maxBytes: 2 * mb },
|
|
724
|
+
live: true,
|
|
725
|
+
requiresObservedRead: true,
|
|
726
|
+
dependencies: (params, nativeReaderId) => nativeObservationDependencies(Methods.NATIVE_SESSION_CATALOG, params, nativeReaderId ?? ''),
|
|
727
|
+
},
|
|
728
|
+
[Methods.NATIVE_PROFILE_LIST]: {
|
|
729
|
+
persisted: true,
|
|
730
|
+
maxBytes: 2 * mb,
|
|
731
|
+
retention: { maxEntries: 10, maxBytes: 2 * mb },
|
|
732
|
+
live: true,
|
|
733
|
+
requiresObservedRead: true,
|
|
734
|
+
dependencies: (params, nativeReaderId) => nativeObservationDependencies(Methods.NATIVE_PROFILE_LIST, params, nativeReaderId ?? ''),
|
|
735
|
+
},
|
|
736
|
+
[Methods.NATIVE_PROFILE_STATUS]: {
|
|
737
|
+
persisted: false,
|
|
738
|
+
maxBytes: 2 * mb,
|
|
739
|
+
retention: { maxEntries: 10, maxBytes: 2 * mb },
|
|
740
|
+
live: true,
|
|
741
|
+
requiresObservedRead: true,
|
|
742
|
+
dependencies: (params, nativeReaderId) => nativeObservationDependencies(Methods.NATIVE_PROFILE_STATUS, params, nativeReaderId ?? ''),
|
|
743
|
+
},
|
|
744
|
+
[Methods.FS_LIST]: workspaceDefinition,
|
|
745
|
+
[Methods.FS_READ]: workspaceDefinition,
|
|
746
|
+
[Methods.GIT_STATUS]: workspaceDefinition,
|
|
747
|
+
[Methods.GIT_DIFF]: { ...workspaceDefinition, maxBytes: 5 * mb },
|
|
748
|
+
[Methods.GIT_SHOW]: workspaceDefinition,
|
|
749
|
+
[Methods.GIT_BRANCH_DIFF]: workspaceDefinition,
|
|
750
|
+
[Methods.NATIVE_SESSION_WORKSPACE_LIST]: workspaceDefinition,
|
|
751
|
+
[Methods.NATIVE_SESSION_WORKSPACE_READ]: workspaceDefinition,
|
|
752
|
+
[Methods.NATIVE_SESSION_WORKSPACE_CHANGES]: workspaceDefinition,
|
|
753
|
+
[Methods.NATIVE_SESSION_WORKSPACE_DIFF]: { ...workspaceDefinition, maxBytes: 5 * mb },
|
|
754
|
+
[Methods.TMUX_WORKER_LIST]: {
|
|
755
|
+
requiresObservedRead: true,
|
|
756
|
+
persisted: false,
|
|
757
|
+
maxBytes: 2 * mb,
|
|
758
|
+
timeoutMs: 10_000,
|
|
759
|
+
live: true,
|
|
760
|
+
normalizeParams: workerInventoryParams,
|
|
761
|
+
dependencies: (params) => {
|
|
762
|
+
const machines = (workerInventoryParams(params).machines ?? []);
|
|
763
|
+
return [
|
|
764
|
+
{ family: 'workers', scope: 'farm' },
|
|
765
|
+
...machines.map((nodeId) => ({ family: 'workers', nodeId })),
|
|
766
|
+
];
|
|
767
|
+
},
|
|
768
|
+
},
|
|
769
|
+
[Methods.DISPATCH_QUEUE_LIST]: {
|
|
770
|
+
persisted: true,
|
|
771
|
+
maxBytes: 2 * mb,
|
|
772
|
+
retention: { maxEntries: 1, maxBytes: 2 * mb },
|
|
773
|
+
live: true,
|
|
774
|
+
normalizeParams: planningObservationParams,
|
|
775
|
+
dependencies: () => [{ family: 'planning', collection: 'dispatch-queue' }],
|
|
776
|
+
},
|
|
777
|
+
[Methods.WORK_GRAPH_LIST]: {
|
|
778
|
+
persisted: true,
|
|
779
|
+
maxBytes: 2 * mb,
|
|
780
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 2 * mb },
|
|
781
|
+
live: true,
|
|
782
|
+
normalizeParams: planningObservationParams,
|
|
783
|
+
dependencies: () => [{ family: 'planning', collection: 'work-graphs' }],
|
|
784
|
+
},
|
|
785
|
+
[Methods.WORK_GRAPH_GET]: {
|
|
786
|
+
persisted: false,
|
|
787
|
+
maxBytes: 2 * mb,
|
|
788
|
+
live: true,
|
|
789
|
+
normalizeParams: planningObservationParams,
|
|
790
|
+
dependencies: (params) => [
|
|
791
|
+
{
|
|
792
|
+
family: 'planning',
|
|
793
|
+
collection: 'work-graphs',
|
|
794
|
+
itemId: requiredId(params, 'graphId'),
|
|
795
|
+
},
|
|
796
|
+
],
|
|
797
|
+
},
|
|
798
|
+
[Methods.BACKLOG_LIST]: {
|
|
799
|
+
persisted: true,
|
|
800
|
+
maxBytes: 2 * mb,
|
|
801
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 2 * mb },
|
|
802
|
+
live: true,
|
|
803
|
+
normalizeParams: planningObservationParams,
|
|
804
|
+
dependencies: () => [{ family: 'planning', collection: 'backlog' }],
|
|
805
|
+
},
|
|
806
|
+
[Methods.ROADMAP_LIST]: {
|
|
807
|
+
persisted: true,
|
|
808
|
+
maxBytes: 2 * mb,
|
|
809
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 2 * mb },
|
|
810
|
+
live: true,
|
|
811
|
+
normalizeParams: roadmapListObservationParams,
|
|
812
|
+
dependencies: () => [
|
|
813
|
+
{ family: 'planning', collection: 'roadmap' },
|
|
814
|
+
{ family: 'planning', collection: 'backlog' },
|
|
815
|
+
{ family: 'runs', scope: 'farm' },
|
|
816
|
+
],
|
|
817
|
+
},
|
|
818
|
+
[Methods.ROADMAP_GET]: {
|
|
819
|
+
persisted: false,
|
|
820
|
+
maxBytes: 2 * mb,
|
|
821
|
+
live: true,
|
|
822
|
+
normalizeParams: planningObservationParams,
|
|
823
|
+
dependencies: (params) => [
|
|
824
|
+
{ family: 'planning', collection: 'roadmap' },
|
|
825
|
+
{ family: 'planning', collection: 'roadmap', itemId: requiredId(params, 'itemId') },
|
|
826
|
+
{ family: 'planning', collection: 'backlog' },
|
|
827
|
+
{ family: 'planning', collection: 'work-graphs' },
|
|
828
|
+
{ family: 'runs', scope: 'farm' },
|
|
829
|
+
],
|
|
830
|
+
},
|
|
831
|
+
[Methods.SOURCES_STATUS]: {
|
|
832
|
+
persisted: true,
|
|
833
|
+
maxBytes: 2 * mb,
|
|
834
|
+
timeoutMs: 120_000,
|
|
835
|
+
live: true,
|
|
836
|
+
dependencies: () => [{ family: 'sources', scope: 'farm' }],
|
|
837
|
+
},
|
|
838
|
+
[Methods.RUN_LIST]: {
|
|
839
|
+
persisted: true,
|
|
840
|
+
maxBytes: 20 * mb,
|
|
841
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 20 * mb },
|
|
842
|
+
live: true,
|
|
843
|
+
dependencies: () => [{ family: 'runs', scope: 'farm' }],
|
|
844
|
+
},
|
|
845
|
+
[Methods.RUN_GET]: {
|
|
846
|
+
persisted: true,
|
|
847
|
+
maxBytes: 20 * mb,
|
|
848
|
+
retention: { maxEntries: 50, maxBytes: 20 * mb },
|
|
849
|
+
live: true,
|
|
850
|
+
dependencies: (params) => [
|
|
851
|
+
{ family: 'run', runId: requiredId(params, 'runId') },
|
|
852
|
+
// Review-round budgets include other runs of the same PR.
|
|
853
|
+
{ family: 'runs', scope: 'farm' },
|
|
854
|
+
],
|
|
855
|
+
},
|
|
856
|
+
[Methods.DECISION_LIST]: {
|
|
857
|
+
persisted: true,
|
|
858
|
+
maxBytes: 10 * mb,
|
|
859
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 10 * mb },
|
|
860
|
+
live: true,
|
|
861
|
+
dependencies: () => [{ family: 'decisions', scope: 'farm' }],
|
|
862
|
+
},
|
|
863
|
+
[Methods.FAMILY_OBSERVABILITY_GET]: {
|
|
864
|
+
persisted: false,
|
|
865
|
+
maxBytes: 2 * mb,
|
|
866
|
+
live: true,
|
|
867
|
+
dependencies: (params) => [
|
|
868
|
+
{ family: 'family', familyId: requiredId(params, 'familyId') },
|
|
869
|
+
// Retrospectives re-derive consumption from feedback and monitor observations.
|
|
870
|
+
{ family: 'decisions', scope: 'farm' },
|
|
871
|
+
],
|
|
872
|
+
},
|
|
873
|
+
[Methods.RUN_RECIPE_RUNS_FOR_RUN]: {
|
|
874
|
+
persisted: false,
|
|
875
|
+
maxBytes: 2 * mb,
|
|
876
|
+
timeoutMs: 60_000,
|
|
877
|
+
live: true,
|
|
878
|
+
dependencies: (params) => [
|
|
879
|
+
{ family: 'run', runId: requiredId(params, 'runId') },
|
|
880
|
+
{ family: 'artifacts', runId: requiredId(params, 'runId') },
|
|
881
|
+
],
|
|
882
|
+
},
|
|
883
|
+
[Methods.RUN_SLOT_HISTORY]: {
|
|
884
|
+
persisted: false,
|
|
885
|
+
maxBytes: 2 * mb,
|
|
886
|
+
live: true,
|
|
887
|
+
dependencies: () => [
|
|
888
|
+
{ family: 'runs', scope: 'farm' },
|
|
889
|
+
{ family: 'slots', scope: 'farm' },
|
|
890
|
+
],
|
|
891
|
+
},
|
|
892
|
+
[Methods.RUN_FOR_SLOT]: {
|
|
893
|
+
persisted: false,
|
|
894
|
+
maxBytes: 20 * mb,
|
|
895
|
+
live: true,
|
|
896
|
+
dependencies: (params) => [
|
|
897
|
+
{ family: 'runs', scope: 'farm' },
|
|
898
|
+
{ family: 'slot', slotId: requiredId(params, 'slotId') },
|
|
899
|
+
],
|
|
900
|
+
},
|
|
901
|
+
[Methods.RUN_RECIPE_RUNS_FOR_SLOT]: {
|
|
902
|
+
persisted: false,
|
|
903
|
+
maxBytes: 2 * mb,
|
|
904
|
+
timeoutMs: 60_000,
|
|
905
|
+
live: true,
|
|
906
|
+
dependencies: (params) => [
|
|
907
|
+
{ family: 'runs', scope: 'farm' },
|
|
908
|
+
{ family: 'slot', slotId: requiredId(params, 'slotId') },
|
|
909
|
+
],
|
|
910
|
+
},
|
|
911
|
+
[Methods.RUN_TAGS_LIST]: {
|
|
912
|
+
persisted: false,
|
|
913
|
+
maxBytes: 2 * mb,
|
|
914
|
+
live: true,
|
|
915
|
+
dependencies: () => [{ family: 'runs', scope: 'farm' }],
|
|
916
|
+
},
|
|
917
|
+
[Methods.FLEET_STATUS]: {
|
|
918
|
+
requiresObservedRead: true,
|
|
919
|
+
persisted: true,
|
|
920
|
+
maxBytes: 2 * mb,
|
|
921
|
+
retention: { maxEntries: 1, maxBytes: 2 * mb },
|
|
922
|
+
live: true,
|
|
923
|
+
normalizeParams: (params) => {
|
|
924
|
+
if (params == null)
|
|
925
|
+
return {};
|
|
926
|
+
if (typeof params !== 'object' ||
|
|
927
|
+
Array.isArray(params) ||
|
|
928
|
+
Object.keys(params).some((key) => key !== 'forceRefresh') ||
|
|
929
|
+
(Reflect.get(params, 'forceRefresh') !== undefined &&
|
|
930
|
+
Reflect.get(params, 'forceRefresh') !== false))
|
|
931
|
+
throw new Error('Fleet observations cannot forceRefresh; use fleet.refresh outside the cache');
|
|
932
|
+
return {};
|
|
933
|
+
},
|
|
934
|
+
dependencies: () => [{ family: 'slots', scope: 'farm' }],
|
|
935
|
+
},
|
|
936
|
+
[Methods.NODES_LIST]: {
|
|
937
|
+
persisted: true,
|
|
938
|
+
maxBytes: 2 * mb,
|
|
939
|
+
retention: { maxEntries: 1, maxBytes: 2 * mb },
|
|
940
|
+
timeoutMs: 10_000,
|
|
941
|
+
live: true,
|
|
942
|
+
dependencies: () => [{ family: 'node', scope: 'farm' }],
|
|
943
|
+
},
|
|
944
|
+
[Methods.RUNTIME_CAPABILITY_LIST]: {
|
|
945
|
+
persisted: true,
|
|
946
|
+
maxBytes: 2 * mb,
|
|
947
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 2 * mb },
|
|
948
|
+
live: true,
|
|
949
|
+
dependencies: () => [{ family: 'capabilities' }, { family: 'sources', scope: 'farm' }],
|
|
950
|
+
},
|
|
951
|
+
[Methods.RUNTIME_CAPABILITY_STATUS]: {
|
|
952
|
+
persisted: true,
|
|
953
|
+
maxBytes: 2 * mb,
|
|
954
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 2 * mb },
|
|
955
|
+
live: true,
|
|
956
|
+
dependencies: () => [{ family: 'capabilities' }, { family: 'sources', scope: 'farm' }],
|
|
957
|
+
},
|
|
958
|
+
[Methods.TASK_PROGRESS]: {
|
|
959
|
+
requiresObservedRead: true,
|
|
960
|
+
persisted: true,
|
|
961
|
+
maxBytes: 2 * mb,
|
|
962
|
+
retention: { maxEntries: Number.MAX_SAFE_INTEGER, maxBytes: 2 * mb },
|
|
963
|
+
live: true,
|
|
964
|
+
dependencies: (params) => {
|
|
965
|
+
const runId = params && typeof params === 'object' ? Reflect.get(params, 'runId') : undefined;
|
|
966
|
+
if (typeof runId === 'string' && runId)
|
|
967
|
+
return [
|
|
968
|
+
{ family: 'progress', runId },
|
|
969
|
+
{ family: 'run', runId },
|
|
970
|
+
{ family: 'artifacts', runId },
|
|
971
|
+
];
|
|
972
|
+
return [{ family: 'slot', slotId: requiredId(params, 'slotId') }];
|
|
973
|
+
},
|
|
974
|
+
},
|
|
975
|
+
};
|
|
976
|
+
/** Advertise only collectors whose owning read and notification contract are enabled. */
|
|
977
|
+
export function resourceCollectorReadMethods() {
|
|
978
|
+
return Object.entries(RESOURCE_QUERY_DEFINITIONS)
|
|
979
|
+
.filter(([, definition]) => {
|
|
980
|
+
const query = definition;
|
|
981
|
+
return query.live && query.collector !== undefined;
|
|
982
|
+
})
|
|
983
|
+
.map(([method]) => method);
|
|
984
|
+
}
|
|
985
|
+
/** Collector selectors use exactly the same closed normalization as client query identities. */
|
|
986
|
+
export function resourceCollectorQuery(method, params = {}) {
|
|
987
|
+
if (typeof method !== 'string' || !Object.hasOwn(RESOURCE_QUERY_DEFINITIONS, method))
|
|
988
|
+
throw new Error('Provide a registered collector read');
|
|
989
|
+
const definition = RESOURCE_QUERY_DEFINITIONS[method];
|
|
990
|
+
if (!definition.collector)
|
|
991
|
+
throw new Error('Provide a registered collector read');
|
|
992
|
+
const query = resourceQuery(method, params);
|
|
993
|
+
return { id: query.id, method: method, params: query.params };
|
|
994
|
+
}
|
|
995
|
+
export function resourceReadTimeout(method) {
|
|
996
|
+
const definition = RESOURCE_QUERY_DEFINITIONS[method];
|
|
997
|
+
return definition.timeoutMs;
|
|
998
|
+
}
|
|
999
|
+
/** Experimental, portable query factory; mutations and streams are never registered here. */
|
|
1000
|
+
export function resourceQuery(method, params = {}, nativeReaderId) {
|
|
1001
|
+
const definition = RESOURCE_QUERY_DEFINITIONS[method];
|
|
1002
|
+
if (!definition)
|
|
1003
|
+
throw new Error(`Unregistered resource read: ${method}`);
|
|
1004
|
+
const canonical = canonicalResourceJson(definition.normalizeParams ? definition.normalizeParams(params) : (params ?? {}));
|
|
1005
|
+
const normalized = JSON.parse(canonical);
|
|
1006
|
+
return {
|
|
1007
|
+
id: `${method}:${canonical}`,
|
|
1008
|
+
method,
|
|
1009
|
+
params: normalized,
|
|
1010
|
+
dependencies: definition.dependencies(normalized, nativeReaderId),
|
|
1011
|
+
persisted: definition.persisted,
|
|
1012
|
+
maxBytes: definition.maxBytes,
|
|
1013
|
+
...(definition.retention
|
|
1014
|
+
? {
|
|
1015
|
+
retention: {
|
|
1016
|
+
...definition.retention,
|
|
1017
|
+
...(definition.retentionGroups
|
|
1018
|
+
? { groups: definition.retentionGroups(normalized) }
|
|
1019
|
+
: {}),
|
|
1020
|
+
},
|
|
1021
|
+
}
|
|
1022
|
+
: {}),
|
|
1023
|
+
live: definition.live,
|
|
1024
|
+
...(definition.collector ? { collector: definition.collector } : {}),
|
|
1025
|
+
...(definition.sourceObservation ? { sourceObservation: definition.sourceObservation } : {}),
|
|
1026
|
+
...(definition.persistedData ? { persistedData: definition.persistedData } : {}),
|
|
1027
|
+
...(definition.requiresWorkspaceRead ? { requiresWorkspaceRead: true } : {}),
|
|
1028
|
+
...(definition.requiresObservedRead ? { requiresObservedRead: true } : {}),
|
|
1029
|
+
};
|
|
1030
|
+
}
|
|
1031
|
+
/** The server stamps only migrated reads, before entering their existing handlers. */
|
|
1032
|
+
export function resourceDependenciesForRead(method, params, nativeReaderId) {
|
|
1033
|
+
if (!Object.hasOwn(RESOURCE_QUERY_DEFINITIONS, method))
|
|
1034
|
+
return undefined;
|
|
1035
|
+
const definition = RESOURCE_QUERY_DEFINITIONS[method];
|
|
1036
|
+
return definition.live ? definition.dependencies(params, nativeReaderId) : undefined;
|
|
1037
|
+
}
|
|
1038
|
+
//# sourceMappingURL=registry.js.map
|