@farmslot/protocol 0.71.1 → 0.72.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.
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,8 @@ All notable changes to `@farmslot/protocol` are tracked here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
- Share one navigation-only current-view link model across Companion and Command Center, with explicit HTTPS deployment bindings and unavailable reasons.
|
|
8
|
+
|
|
7
9
|
- Expose current CI-watch progress and total deadlines so clients use the monitor’s configured windows.
|
|
8
10
|
|
|
9
11
|
- Expose checklist timing in task progress and per-step worker durations in monthly analytics.
|
|
@@ -16,6 +18,10 @@ All notable changes to `@farmslot/protocol` are tracked here.
|
|
|
16
18
|
|
|
17
19
|
- Active-development baseline; add user-facing changes here before release or package publication.
|
|
18
20
|
|
|
21
|
+
## 0.72.0 - 2026-10-25
|
|
22
|
+
|
|
23
|
+
- Share one navigation-only current-view link model across Companion and Command Center, with explicit HTTPS deployment bindings and unavailable reasons.
|
|
24
|
+
|
|
19
25
|
## 0.71.1 - 2026-10-26
|
|
20
26
|
|
|
21
27
|
- Retain reviewer launch policy and distinguish farm-caused fallback settlements so recovery preserves the review budget.
|
|
@@ -1,5 +1,68 @@
|
|
|
1
|
+
import type { TmuxWorkerRef } from '../rpc/tmux.js';
|
|
1
2
|
export declare const VIEW_QUERY_PARAMETERS: ReadonlySet<string>;
|
|
2
3
|
export declare function validViewRoute(route: unknown): route is string;
|
|
3
4
|
export declare function viewLinkFromRoute(route: unknown): string | null;
|
|
4
5
|
export declare function viewRouteFromLink(value: unknown): string | null;
|
|
6
|
+
export interface CompanionViewLocation {
|
|
7
|
+
pathname: string;
|
|
8
|
+
params: Readonly<Record<string, string | readonly string[] | undefined>>;
|
|
9
|
+
projects?: readonly string[];
|
|
10
|
+
machines?: readonly string[];
|
|
11
|
+
runFilters?: SharedRunViewSelection;
|
|
12
|
+
runsTab?: 'active' | 'all';
|
|
13
|
+
artifactSelection?: SharedRunArtifactSelection;
|
|
14
|
+
unavailableMessage?: string;
|
|
15
|
+
workerSelection?: TmuxWorkerRef;
|
|
16
|
+
}
|
|
17
|
+
export interface SharedRunArtifactOwner {
|
|
18
|
+
runId: string;
|
|
19
|
+
slotId?: string;
|
|
20
|
+
recipeRunId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface SharedRunArtifactSelection extends SharedRunArtifactOwner {
|
|
23
|
+
path: string;
|
|
24
|
+
criterionId?: string;
|
|
25
|
+
traceIndex?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface SharedRunViewSelection {
|
|
28
|
+
flow: string;
|
|
29
|
+
lane: string;
|
|
30
|
+
sort: string;
|
|
31
|
+
search: string;
|
|
32
|
+
tag: string;
|
|
33
|
+
}
|
|
34
|
+
export type SharedViewLocation = {
|
|
35
|
+
companion: CompanionViewLocation;
|
|
36
|
+
} | {
|
|
37
|
+
route: string;
|
|
38
|
+
} | {
|
|
39
|
+
url: string;
|
|
40
|
+
};
|
|
41
|
+
export type SharedViewLink = {
|
|
42
|
+
status: 'available';
|
|
43
|
+
url: string;
|
|
44
|
+
route: string;
|
|
45
|
+
} | {
|
|
46
|
+
status: 'unavailable';
|
|
47
|
+
reason: 'web-url-unset' | 'invalid-web-url' | 'unsupported-view' | 'invalid-view';
|
|
48
|
+
message: string;
|
|
49
|
+
};
|
|
50
|
+
export declare function commandCenterUrlError(value: string): string | null;
|
|
51
|
+
/** One mapping for Companion generation and Command Center receipt. */
|
|
52
|
+
export declare function resolveSharedViewLink(location: SharedViewLocation, commandCenterUrl?: string): SharedViewLink;
|
|
53
|
+
export interface SharedViewDeployment {
|
|
54
|
+
commandCenterUrl?: string;
|
|
55
|
+
gatewayUrls: readonly string[];
|
|
56
|
+
}
|
|
57
|
+
export type SharedViewReceipt = {
|
|
58
|
+
status: 'ordinary';
|
|
59
|
+
} | {
|
|
60
|
+
status: 'accepted';
|
|
61
|
+
route: string;
|
|
62
|
+
} | {
|
|
63
|
+
status: 'refused';
|
|
64
|
+
message: string;
|
|
65
|
+
};
|
|
66
|
+
/** The marker is consumed before a marked route may read from a gateway. */
|
|
67
|
+
export declare function receiveSharedViewLink(url: string, gatewayUrl: string, deployment: SharedViewDeployment): SharedViewReceipt;
|
|
5
68
|
//# sourceMappingURL=view-links.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-links.d.ts","sourceRoot":"","sources":["../../src/surfaces/view-links.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view-links.d.ts","sourceRoot":"","sources":["../../src/surfaces/view-links.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAiCpD,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAUrD,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAyB9D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC3B,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,SAAS,EAAE,qBAAqB,CAAA;CAAE,GACpC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpB,MAAM,MAAM,cAAc,GACtB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAClF,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAMN,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BlE;AAuMD,uEAAuE;AACvE,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,CAAC,EAAE,MAAM,GACxB,cAAc,CAuFhB;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,oBAAoB,GAC/B,iBAAiB,CA2BnB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BACKLOG_STATUSES } from '../contracts/backlog.js';
|
|
1
2
|
// Full-view links preserve navigation state without exposing the app's private
|
|
2
3
|
// loopback origin or accepting connection credentials from an external link.
|
|
3
4
|
const routes = new Set([
|
|
@@ -33,7 +34,7 @@ export const VIEW_QUERY_PARAMETERS = new Set(('a b activity artifact artifactAc
|
|
|
33
34
|
'layout lightboxIndex lightboxRecipeRunId machines modal mode model node panel parentRunId pr prDraft prEditor prHistory prHost project projects ' +
|
|
34
35
|
'prPane prScope prSection prSort prTab prTarget publicationReviews q refresh qaInputs qaProfileId repo reviewMachine ' +
|
|
35
36
|
'reviewValidationDepth run runner runsTab slot sort start_ref startRef state status step suggestion tab tag ticket tokens trajectory transport ' +
|
|
36
|
-
'validationDepth variant view window worker group promote runnerPicker slotSelector spec workGraphProject wgSort wgDirection').split(' '));
|
|
37
|
+
'validationDepth variant view window worker group promote runnerPicker slotSelector spec workGraphProject wgSort wgDirection sharedView sessionId executionNodeId').split(' '));
|
|
37
38
|
export function validViewRoute(route) {
|
|
38
39
|
if (typeof route !== 'string' ||
|
|
39
40
|
route.length > 4096 ||
|
|
@@ -59,7 +60,7 @@ export function validViewRoute(route) {
|
|
|
59
60
|
return true;
|
|
60
61
|
}
|
|
61
62
|
export function viewLinkFromRoute(route) {
|
|
62
|
-
return validViewRoute(route) ? `farmslot://view/${route}` : null;
|
|
63
|
+
return validViewRoute(route) ? `farmslot://view/${withoutSharedViewMarker(route)}` : null;
|
|
63
64
|
}
|
|
64
65
|
export function viewRouteFromLink(value) {
|
|
65
66
|
if (typeof value !== 'string' || !value.startsWith('farmslot://view/'))
|
|
@@ -67,4 +68,351 @@ export function viewRouteFromLink(value) {
|
|
|
67
68
|
const route = value.slice('farmslot://view/'.length);
|
|
68
69
|
return validViewRoute(route) ? route : null;
|
|
69
70
|
}
|
|
71
|
+
const noWebUrl = 'Web link unavailable: set the Command Center URL';
|
|
72
|
+
const privateSelectors = new Set(['draft', 'draftMode', 'connect', 'token', 'password', 'code']);
|
|
73
|
+
const viewId = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/;
|
|
74
|
+
export function commandCenterUrlError(value) {
|
|
75
|
+
try {
|
|
76
|
+
const url = new URL(value);
|
|
77
|
+
const host = url.hostname
|
|
78
|
+
.replace(/^\[|\]$/g, '')
|
|
79
|
+
.replace(/\.$/, '')
|
|
80
|
+
.toLowerCase();
|
|
81
|
+
if (url.protocol !== 'https:' ||
|
|
82
|
+
url.username ||
|
|
83
|
+
url.password ||
|
|
84
|
+
url.search ||
|
|
85
|
+
url.hash ||
|
|
86
|
+
host === 'localhost' ||
|
|
87
|
+
host.endsWith('.localhost') ||
|
|
88
|
+
host === '0.0.0.0' ||
|
|
89
|
+
host.startsWith('127.') ||
|
|
90
|
+
host === '::' ||
|
|
91
|
+
host === '::1' ||
|
|
92
|
+
/^::ffff:7f[0-9a-f]{2}:/.test(host))
|
|
93
|
+
return 'Use a reachable HTTPS Command Center URL without credentials, query or fragment.';
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return 'Enter an absolute HTTPS Command Center URL.';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function unavailable(message, reason = 'unsupported-view') {
|
|
101
|
+
return { status: 'unavailable', reason, message };
|
|
102
|
+
}
|
|
103
|
+
function withoutSharedViewMarker(route) {
|
|
104
|
+
const [path, query = ''] = route.split('?');
|
|
105
|
+
const params = new URLSearchParams(query);
|
|
106
|
+
if (!params.has('sharedView'))
|
|
107
|
+
return route;
|
|
108
|
+
params.delete('sharedView');
|
|
109
|
+
return `${path}${params.toString() ? `?${params}` : ''}`;
|
|
110
|
+
}
|
|
111
|
+
function companionViewRoute(location) {
|
|
112
|
+
const path = location.pathname.replace(/^\/\(tabs\)/, '') || '/';
|
|
113
|
+
const one = (key) => {
|
|
114
|
+
const value = location.params[key];
|
|
115
|
+
return typeof value === 'string' ? value : value?.length === 1 ? (value[0] ?? '') : '';
|
|
116
|
+
};
|
|
117
|
+
const route = (name, values = {}) => {
|
|
118
|
+
const params = new URLSearchParams();
|
|
119
|
+
if (name !== 'native') {
|
|
120
|
+
if (location.projects !== undefined)
|
|
121
|
+
params.set('projects', location.projects.join(','));
|
|
122
|
+
if (location.machines !== undefined)
|
|
123
|
+
params.set('machines', location.machines.join(','));
|
|
124
|
+
}
|
|
125
|
+
for (const [key, value] of Object.entries(values))
|
|
126
|
+
if (value)
|
|
127
|
+
params.set(key, value);
|
|
128
|
+
return `#${name}${params.toString() ? `?${params}` : ''}`;
|
|
129
|
+
};
|
|
130
|
+
const entity = (expression, name, param) => {
|
|
131
|
+
const match = expression.exec(path);
|
|
132
|
+
const id = match?.[1]?.startsWith('[') ? one(param) : match?.[1];
|
|
133
|
+
return id && viewId.test(id) ? `${name}/${id}` : null;
|
|
134
|
+
};
|
|
135
|
+
if (path === '/terminal/worker') {
|
|
136
|
+
const worker = location.workerSelection;
|
|
137
|
+
if (!worker?.nodeId || !worker.session || !worker.target)
|
|
138
|
+
return null;
|
|
139
|
+
return route('terminal', {
|
|
140
|
+
worker: JSON.stringify({
|
|
141
|
+
nodeId: worker.nodeId,
|
|
142
|
+
session: worker.session,
|
|
143
|
+
target: worker.target,
|
|
144
|
+
...(worker.window ? { window: worker.window } : {}),
|
|
145
|
+
...(worker.windowName ? { windowName: worker.windowName } : {}),
|
|
146
|
+
...(worker.pane ? { pane: worker.pane } : {}),
|
|
147
|
+
...(worker.paneId ? { paneId: worker.paneId } : {}),
|
|
148
|
+
}),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (location.artifactSelection) {
|
|
152
|
+
const { runId, slotId, recipeRunId, path: artifact, criterionId, traceIndex, } = location.artifactSelection;
|
|
153
|
+
if (!viewId.test(runId) ||
|
|
154
|
+
!artifact ||
|
|
155
|
+
artifact.startsWith('/') ||
|
|
156
|
+
/[\\\u0000-\u001f]/.test(artifact) ||
|
|
157
|
+
/^[a-z][a-z0-9+.-]*:/i.test(artifact) ||
|
|
158
|
+
artifact.split('/').includes('..'))
|
|
159
|
+
return null;
|
|
160
|
+
if (recipeRunId) {
|
|
161
|
+
if (criterionId || traceIndex !== undefined)
|
|
162
|
+
return null;
|
|
163
|
+
if (!slotId ||
|
|
164
|
+
!viewId.test(slotId) ||
|
|
165
|
+
!/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,255}$/.test(recipeRunId))
|
|
166
|
+
return null;
|
|
167
|
+
return route(`slot/${slotId}`, {
|
|
168
|
+
runId,
|
|
169
|
+
recipeRun: recipeRunId,
|
|
170
|
+
recipeArtifact: artifact,
|
|
171
|
+
recipeViewer: '1',
|
|
172
|
+
reviewDrawer: 'recipe',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (traceIndex !== undefined && (!Number.isSafeInteger(traceIndex) || traceIndex < 0))
|
|
176
|
+
return null;
|
|
177
|
+
return route(`run/${runId}`, {
|
|
178
|
+
panel: 'evidence',
|
|
179
|
+
tab: 'evidence',
|
|
180
|
+
artifactRun: runId,
|
|
181
|
+
artifact,
|
|
182
|
+
artifactAc: criterionId ?? '',
|
|
183
|
+
artifactTrace: traceIndex?.toString() ?? '',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const run = entity(/^\/run\/([^/]+)$/, 'run', 'id');
|
|
187
|
+
if (run)
|
|
188
|
+
return route(run);
|
|
189
|
+
const workspaceRun = entity(/^\/workspace\/run\/([^/]+)\/(timeline|evidence|files|diff|gate)$/, 'run', 'runId');
|
|
190
|
+
if (workspaceRun) {
|
|
191
|
+
const tab = path.slice(path.lastIndexOf('/') + 1);
|
|
192
|
+
// These views have a dedicated selected artifact/decision on the web.
|
|
193
|
+
if (tab === 'files' || tab === 'diff')
|
|
194
|
+
return null;
|
|
195
|
+
if (tab === 'gate')
|
|
196
|
+
return one('decisionId') ? route('decisions', { gate: one('decisionId') }) : null;
|
|
197
|
+
return route(workspaceRun, {
|
|
198
|
+
panel: tab,
|
|
199
|
+
tab: tab === 'evidence' ? 'evidence' : '',
|
|
200
|
+
recipeRun: one('recipeRun'),
|
|
201
|
+
artifact: one('artifact'),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const family = entity(/^\/family\/([^/]+)$/, 'family', 'familyId');
|
|
205
|
+
if (family) {
|
|
206
|
+
const evidence = one('evidence');
|
|
207
|
+
if (evidence && !['all', 'before', 'after', 'setup', 'videos'].includes(evidence))
|
|
208
|
+
return null;
|
|
209
|
+
return route(family, { run: one('runId'), evidence: evidence === 'all' ? '' : evidence });
|
|
210
|
+
}
|
|
211
|
+
const slot = entity(/^\/slot\/([^/]+)$/, 'slot', 'id') ??
|
|
212
|
+
entity(/^\/workspace\/slot\/([^/]+)\/slot$/, 'slot', 'slotId');
|
|
213
|
+
if (slot)
|
|
214
|
+
return location.params.runId ? null : route(slot);
|
|
215
|
+
const terminal = entity(/^\/terminal\/([^/]+)$/, 'terminal', 'slotId') ??
|
|
216
|
+
entity(/^\/workspace\/slot\/([^/]+)\/terminal$/, 'terminal', 'slotId');
|
|
217
|
+
if (terminal && terminal !== 'terminal/worker') {
|
|
218
|
+
if (location.params.runId || one('contextId'))
|
|
219
|
+
return null;
|
|
220
|
+
return route(terminal);
|
|
221
|
+
}
|
|
222
|
+
const runTerminal = entity(/^\/run-terminal\/([^/]+)$/, 'run', 'runId');
|
|
223
|
+
if (runTerminal)
|
|
224
|
+
return null;
|
|
225
|
+
const decision = entity(/^\/(?:decision|gate-review)\/([^/]+)$/, 'decision', 'id');
|
|
226
|
+
if (decision)
|
|
227
|
+
return route('decisions', { gate: decision.slice('decision/'.length) });
|
|
228
|
+
const backlog = entity(/^\/backlog\/([^/]+)$/, 'backlog', 'id');
|
|
229
|
+
if (backlog && backlog !== 'backlog/create')
|
|
230
|
+
return route('backlog', { item: backlog.slice('backlog/'.length) });
|
|
231
|
+
const backlogEdit = entity(/^\/backlog\/edit\/([^/]+)$/, 'backlog', 'id');
|
|
232
|
+
if (backlogEdit)
|
|
233
|
+
return route('backlog', { item: backlogEdit.slice('backlog/'.length), mode: 'edit' });
|
|
234
|
+
if (path === '/backlog/create')
|
|
235
|
+
return route('backlog', { create: '1' });
|
|
236
|
+
const roadmap = entity(/^\/roadmap\/([^/]+)$/, 'roadmap', 'id');
|
|
237
|
+
if (roadmap)
|
|
238
|
+
return route('roadmap', { item: roadmap.slice('roadmap/'.length) });
|
|
239
|
+
if (path === '/native') {
|
|
240
|
+
const sessionId = one('sessionId');
|
|
241
|
+
const executionNodeId = one('executionNodeId');
|
|
242
|
+
return sessionId && executionNodeId && viewId.test(sessionId) && viewId.test(executionNodeId)
|
|
243
|
+
? route('native', { sessionId, executionNodeId })
|
|
244
|
+
: null;
|
|
245
|
+
}
|
|
246
|
+
if (path === '/runs') {
|
|
247
|
+
const selection = location.runFilters;
|
|
248
|
+
return route('runs', {
|
|
249
|
+
runsTab: location.runsTab ?? '',
|
|
250
|
+
flow: selection?.flow ?? '',
|
|
251
|
+
lane: selection?.lane ?? '',
|
|
252
|
+
sort: selection?.sort === 'newest' ? '' : (selection?.sort ?? ''),
|
|
253
|
+
q: selection?.search ?? '',
|
|
254
|
+
tag: selection?.tag ?? '',
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
if (path === '/backlog')
|
|
258
|
+
return route('backlog', {
|
|
259
|
+
backlogStatus: BACKLOG_STATUSES.filter((status) => status !== 'done' && status !== 'archived').join(','),
|
|
260
|
+
sort: 'status',
|
|
261
|
+
direction: 'asc',
|
|
262
|
+
});
|
|
263
|
+
if (path === '/prs') {
|
|
264
|
+
if (one('nativeFilter') && one('nativeFilter') !== 'all')
|
|
265
|
+
return null;
|
|
266
|
+
return route('prs', {
|
|
267
|
+
pr: one('pr'),
|
|
268
|
+
repo: one('repo'),
|
|
269
|
+
prSort: one('prSort') || 'group',
|
|
270
|
+
prScope: 'all',
|
|
271
|
+
prHistory: '1',
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
if (path === '/roadmap' &&
|
|
275
|
+
((one('nativeStage') && one('nativeStage') !== 'all') ||
|
|
276
|
+
(one('nativeDelivery') && one('nativeDelivery') !== 'all') ||
|
|
277
|
+
one('nativeSearch') ||
|
|
278
|
+
one('nativeDelivered') === '1'))
|
|
279
|
+
return null;
|
|
280
|
+
const collections = {
|
|
281
|
+
'/fleet': 'fleet',
|
|
282
|
+
'/inbox': 'decisions',
|
|
283
|
+
'/roadmap': 'roadmap',
|
|
284
|
+
};
|
|
285
|
+
return collections[path] ? route(collections[path]) : null;
|
|
286
|
+
}
|
|
287
|
+
/** One mapping for Companion generation and Command Center receipt. */
|
|
288
|
+
export function resolveSharedViewLink(location, commandCenterUrl) {
|
|
289
|
+
if (!commandCenterUrl?.trim())
|
|
290
|
+
return unavailable(noWebUrl, 'web-url-unset');
|
|
291
|
+
const error = commandCenterUrlError(commandCenterUrl.trim());
|
|
292
|
+
if (error)
|
|
293
|
+
return unavailable(`Web link unavailable: ${error}`, 'invalid-web-url');
|
|
294
|
+
const base = new URL(commandCenterUrl.trim());
|
|
295
|
+
let candidate;
|
|
296
|
+
if ('companion' in location) {
|
|
297
|
+
if (location.companion.unavailableMessage)
|
|
298
|
+
return unavailable(location.companion.unavailableMessage);
|
|
299
|
+
if (location.companion.pathname === '/native') {
|
|
300
|
+
if (location.companion.params.workerManaged === '1')
|
|
301
|
+
return unavailable('Web link unavailable: task conversations have no exact web route yet.');
|
|
302
|
+
if (location.companion.params.sessionObserved !== '1')
|
|
303
|
+
return unavailable('Web link unavailable: select a loaded conversation.');
|
|
304
|
+
}
|
|
305
|
+
candidate = companionViewRoute(location.companion);
|
|
306
|
+
}
|
|
307
|
+
else if ('route' in location)
|
|
308
|
+
candidate = location.route;
|
|
309
|
+
else {
|
|
310
|
+
try {
|
|
311
|
+
const incoming = new URL(location.url);
|
|
312
|
+
if (incoming.origin !== base.origin ||
|
|
313
|
+
incoming.pathname !== base.pathname ||
|
|
314
|
+
incoming.search ||
|
|
315
|
+
incoming.username ||
|
|
316
|
+
incoming.password)
|
|
317
|
+
return unavailable('Web link unavailable: this view belongs to another deployment.', 'invalid-view');
|
|
318
|
+
candidate = incoming.hash;
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return unavailable('Web link unavailable: invalid view URL.', 'invalid-view');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (!candidate) {
|
|
325
|
+
const path = 'companion' in location ? location.companion.pathname : '';
|
|
326
|
+
const pinnedSlot = 'companion' in location &&
|
|
327
|
+
/^(?:\/slot\/[^/]+|\/workspace\/slot\/[^/]+\/slot)$/.test(path) &&
|
|
328
|
+
location.companion.params.runId;
|
|
329
|
+
const pinnedTerminal = 'companion' in location &&
|
|
330
|
+
/^(?:\/terminal\/[^/]+|\/workspace\/slot\/[^/]+\/terminal)$/.test(path) &&
|
|
331
|
+
location.companion.params.runId;
|
|
332
|
+
const view = pinnedSlot
|
|
333
|
+
? 'this pinned slot view'
|
|
334
|
+
: pinnedTerminal
|
|
335
|
+
? 'this pinned slot terminal'
|
|
336
|
+
: path.startsWith('/run-terminal/')
|
|
337
|
+
? 'this run terminal'
|
|
338
|
+
: path.includes('diff')
|
|
339
|
+
? 'this diff selection'
|
|
340
|
+
: path.includes('/files') || path.includes('/artifacts')
|
|
341
|
+
? 'this files view'
|
|
342
|
+
: path === '/terminal/worker'
|
|
343
|
+
? 'this worker terminal'
|
|
344
|
+
: path === '/settings' || path === '/connection'
|
|
345
|
+
? 'these device connection settings'
|
|
346
|
+
: path === '/prs'
|
|
347
|
+
? 'this PR filter'
|
|
348
|
+
: path === '/roadmap'
|
|
349
|
+
? 'this roadmap filter'
|
|
350
|
+
: path === '/copilot'
|
|
351
|
+
? 'this Co-Pilot screen'
|
|
352
|
+
: path === '/pr-automation'
|
|
353
|
+
? 'this PR automation screen'
|
|
354
|
+
: path === '/unmapped-overlay'
|
|
355
|
+
? 'this dialog'
|
|
356
|
+
: 'this screen';
|
|
357
|
+
return unavailable(`Web link unavailable: ${view} has no exact Command Center view.`);
|
|
358
|
+
}
|
|
359
|
+
if (!validViewRoute(candidate))
|
|
360
|
+
return unavailable('Web link unavailable: invalid view selection.', 'invalid-view');
|
|
361
|
+
const [path, query = ''] = candidate.split('?');
|
|
362
|
+
const params = new URLSearchParams(query);
|
|
363
|
+
const seen = new Set();
|
|
364
|
+
for (const [key] of params) {
|
|
365
|
+
if (privateSelectors.has(key) || seen.has(key))
|
|
366
|
+
return unavailable('Web link unavailable: this selection cannot be shared.', 'invalid-view');
|
|
367
|
+
seen.add(key);
|
|
368
|
+
}
|
|
369
|
+
const route = withoutSharedViewMarker(candidate);
|
|
370
|
+
params.set('sharedView', '1');
|
|
371
|
+
base.hash = `${path}${params.toString() ? `?${params}` : ''}`;
|
|
372
|
+
return { status: 'available', route, url: base.href };
|
|
373
|
+
}
|
|
374
|
+
/** The marker is consumed before a marked route may read from a gateway. */
|
|
375
|
+
export function receiveSharedViewLink(url, gatewayUrl, deployment) {
|
|
376
|
+
let incoming;
|
|
377
|
+
try {
|
|
378
|
+
incoming = new URL(url);
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
return { status: 'refused', message: 'Web link unavailable: invalid view URL.' };
|
|
382
|
+
}
|
|
383
|
+
const selectors = new URLSearchParams(incoming.hash.split('?')[1] ?? '');
|
|
384
|
+
if (!selectors.has('sharedView'))
|
|
385
|
+
return { status: 'ordinary' };
|
|
386
|
+
if (selectors.getAll('sharedView').length !== 1 || selectors.get('sharedView') !== '1')
|
|
387
|
+
return { status: 'refused', message: 'Web link unavailable: invalid shared view.' };
|
|
388
|
+
const selected = normalizeSharedGatewayUrl(gatewayUrl);
|
|
389
|
+
const configured = deployment.gatewayUrls.map(normalizeSharedGatewayUrl);
|
|
390
|
+
if (!selected ||
|
|
391
|
+
!configured.length ||
|
|
392
|
+
configured.some((value) => !value) ||
|
|
393
|
+
!configured.includes(selected))
|
|
394
|
+
return {
|
|
395
|
+
status: 'refused',
|
|
396
|
+
message: 'Web link unavailable: the selected gateway does not match this deployment.',
|
|
397
|
+
};
|
|
398
|
+
const resolved = resolveSharedViewLink({ url }, deployment.commandCenterUrl);
|
|
399
|
+
return resolved.status === 'available'
|
|
400
|
+
? { status: 'accepted', route: resolved.route }
|
|
401
|
+
: { status: 'refused', message: resolved.message };
|
|
402
|
+
}
|
|
403
|
+
function normalizeSharedGatewayUrl(value) {
|
|
404
|
+
try {
|
|
405
|
+
const url = new URL(value);
|
|
406
|
+
if (!['ws:', 'wss:'].includes(url.protocol) ||
|
|
407
|
+
url.username ||
|
|
408
|
+
url.password ||
|
|
409
|
+
url.search ||
|
|
410
|
+
url.hash)
|
|
411
|
+
return null;
|
|
412
|
+
return `${url.origin}${url.pathname.replace(/\/$/, '')}`;
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
70
418
|
//# sourceMappingURL=view-links.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-links.js","sourceRoot":"","sources":["../../src/surfaces/view-links.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;IACrB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,SAAS;IACT,UAAU;IACV,SAAS;IACT,SAAS;IACT,aAAa;IACb,KAAK;IACL,WAAW;IACX,MAAM;IACN,cAAc;IACd,OAAO;IACP,UAAU;IACV,cAAc;IACd,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,YAAY;CACb,CAAC,CAAC;AACH,MAAM,MAAM,GACV,uFAAuF,CAAC;AAC1F,2DAA2D;AAC3D,2EAA2E;AAC3E,oEAAoE;AACpE,MAAM,MAAM,GACV,uFAAuF,CAAC;AAC1F,0EAA0E;AAC1E,MAAM,CAAC,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAC/D,CACE,yQAAyQ;IACzQ,8LAA8L;IAC9L,oIAAoI;IACpI,kJAAkJ;IAClJ,sHAAsH;IACtH,gJAAgJ;IAChJ,6HAA6H,CAC9H,CAAC,KAAK,CAAC,GAAG,CAAC,CACb,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,GAAG,IAAI;QACnB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACtB,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAEjC,OAAO,KAAK,CAAC;IACf,MAAM,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,IACE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,UAAU,CAAC,MAAM,GAAG,CAAC;QACrB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAE5B,OAAO,KAAK,CAAC;IACf,IAAI,CAAC;QACH,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,mEAAmE;IAChG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,+CAA+C;IACjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC"}
|
|
1
|
+
{"version":3,"file":"view-links.js","sourceRoot":"","sources":["../../src/surfaces/view-links.ts"],"names":[],"mappings":"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"}
|