@agent-native/core 0.227.0 → 0.228.0-nightly-20261111004142
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/dist/action.d.ts +6 -2
- package/dist/agent/engine/builder-engine.js +6 -1
- package/dist/agent/engine/tool-call-journal-seed.d.ts +2 -0
- package/dist/agent/engine/tool-call-journal-seed.js +14 -0
- package/dist/agent/harness/store.js +14 -0
- package/dist/agent/production-agent.js +257 -17
- package/dist/agent/reaped-run-thread.js +6 -0
- package/dist/agent/run-manager.js +6 -0
- package/dist/agent/tool-call-journal.d.ts +4 -0
- package/dist/agent/tool-call-journal.js +12 -0
- package/dist/agent/types.d.ts +7 -1
- package/dist/app-config/agent.d.ts +3 -0
- package/dist/app-config/agent.js +7 -0
- package/dist/app-config/schema.d.ts +3 -0
- package/dist/application-state/handlers.d.ts +3 -3
- package/dist/application-state/handlers.js +6 -1
- package/dist/application-state/index.d.ts +3 -2
- package/dist/application-state/index.js +3 -2
- package/dist/application-state/last-used-tab.d.ts +11 -0
- package/dist/application-state/last-used-tab.js +43 -0
- package/dist/application-state/script-helpers.d.ts +26 -0
- package/dist/application-state/script-helpers.js +83 -15
- package/dist/application-state/store.d.ts +8 -0
- package/dist/application-state/store.js +16 -0
- package/dist/cli/agent.js +7 -3
- package/dist/cli/code-agent-executor.d.ts +1 -0
- package/dist/cli/code-agent-executor.js +37 -2
- package/dist/cli/code.js +3 -1
- package/dist/client/agent-sidebar-state.d.ts +2 -0
- package/dist/client/browser-tab-use.d.ts +9 -0
- package/dist/client/browser-tab-use.js +112 -0
- package/dist/client/chat/runtime.js +3 -1
- package/dist/client/error-capture.js +33 -1
- package/dist/client/navigation/index.d.ts +1 -0
- package/dist/client/navigation/index.js +1 -0
- package/dist/client/resources/mcp-integration-logos.js +16 -0
- package/dist/client/review/use-review.d.ts +28 -0
- package/dist/client/review/use-review.js +41 -12
- package/dist/client/route-state.js +2 -0
- package/dist/client/sse-event-processor.d.ts +1 -0
- package/dist/client/sse-event-processor.js +7 -1
- package/dist/client/use-db-sync.d.ts +8 -1
- package/dist/client/use-db-sync.js +6 -5
- package/dist/coding-tools/run-code.js +12 -2
- package/dist/coding-tools/sandbox/executions-store.d.ts +1 -1
- package/dist/coding-tools/sandbox/executions-store.js +9 -3
- package/dist/collab/routes.d.ts +1 -1
- package/dist/data-programs/execute.js +1 -1
- package/dist/db/schema-snapshot.generated.js +17 -3
- package/dist/extensions/url-safety.d.ts +1 -3
- package/dist/extensions/url-safety.js +23 -23
- package/dist/file-upload/actions/upload-image.d.ts +5 -5
- package/dist/file-upload/index.d.ts +1 -1
- package/dist/file-upload/index.js +1 -1
- package/dist/file-upload/s3-client.d.ts +1 -0
- package/dist/file-upload/s3-client.js +70 -13
- package/dist/file-upload/s3.d.ts +9 -0
- package/dist/file-upload/s3.js +14 -1
- package/dist/framework-package-versions.json +8 -8
- package/dist/jobs/run-history.js +10 -3
- package/dist/jobs/scheduler.js +5 -36
- package/dist/localization/core-messages/supplemental/ar-SA.js +35 -0
- package/dist/localization/core-messages/supplemental/de-DE.js +35 -0
- package/dist/localization/core-messages/supplemental/en-US.js +35 -0
- package/dist/localization/core-messages/supplemental/es-ES.js +35 -0
- package/dist/localization/core-messages/supplemental/fr-FR.js +35 -0
- package/dist/localization/core-messages/supplemental/hi-IN.js +35 -0
- package/dist/localization/core-messages/supplemental/ja-JP.js +35 -0
- package/dist/localization/core-messages/supplemental/ko-KR.js +35 -0
- package/dist/localization/core-messages/supplemental/pt-BR.js +35 -0
- package/dist/localization/core-messages/supplemental/zh-CN.js +35 -0
- package/dist/localization/core-messages/supplemental/zh-TW.js +35 -0
- package/dist/localization/default-messages.d.ts +35 -0
- package/dist/localization/default-messages.js +35 -0
- package/dist/localization/mcp-settings-messages.d.ts +35 -0
- package/dist/mcp/actions/list-mcp-client-connections.d.ts +8 -0
- package/dist/mcp/actions/list-mcp-client-connections.js +39 -0
- package/dist/mcp/browser-tab-target.d.ts +16 -0
- package/dist/mcp/browser-tab-target.js +58 -0
- package/dist/mcp/build-server.d.ts +1 -0
- package/dist/mcp/build-server.js +38 -7
- package/dist/mcp/call-attribution.d.ts +4 -1
- package/dist/mcp/call-attribution.js +3 -1
- package/dist/mcp/client-connections.d.ts +6 -0
- package/dist/mcp/client-connections.js +91 -0
- package/dist/mcp/connect-route.js +12 -2
- package/dist/mcp/connect-store.d.ts +3 -0
- package/dist/mcp/connect-store.js +10 -1
- package/dist/mcp/direct-action-call.js +1 -0
- package/dist/mcp/oauth-store.d.ts +6 -0
- package/dist/mcp/oauth-store.js +23 -0
- package/dist/mcp/oauth-token.d.ts +1 -0
- package/dist/mcp/oauth-token.js +1 -0
- package/dist/mcp/server.js +9 -20
- package/dist/mcp-client/config.d.ts +2 -0
- package/dist/mcp-client/manager.js +23 -0
- package/dist/mcp-client/workspace-servers.js +42 -10
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/org/handlers.d.ts +1 -1
- package/dist/org/handlers.js +21 -17
- package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/provider-api/index.js +17 -36
- package/dist/review/actions/create-review-comment.d.ts +7 -0
- package/dist/review/actions/create-review-comment.js +29 -3
- package/dist/review/actions/delete-review-comment.js +2 -2
- package/dist/review/actions/list-review-comments.d.ts +3 -0
- package/dist/review/actions/list-review-comments.js +41 -17
- package/dist/review/actions/react-to-review-comment.js +2 -2
- package/dist/review/actions/reply-review-comment.d.ts +4 -0
- package/dist/review/actions/reply-review-comment.js +15 -6
- package/dist/review/actions/update-review-comment-anchor.d.ts +6 -0
- package/dist/review/actions/update-review-comment-anchor.js +39 -10
- package/dist/review/actions/update-review-comment.d.ts +3 -0
- package/dist/review/actions/update-review-comment.js +28 -3
- package/dist/review/errors.d.ts +33 -0
- package/dist/review/errors.js +51 -0
- package/dist/review/index.d.ts +5 -4
- package/dist/review/index.js +3 -2
- package/dist/review/registry.d.ts +51 -1
- package/dist/review/registry.js +117 -0
- package/dist/review/store.d.ts +59 -14
- package/dist/review/store.js +622 -101
- package/dist/review/suggestions/actions.js +65 -10
- package/dist/review/suggestions/actor-kind.d.ts +5 -0
- package/dist/review/suggestions/actor-kind.js +20 -0
- package/dist/review/suggestions/store.js +16 -2
- package/dist/review/suggestions/types.d.ts +13 -0
- package/dist/review/types.d.ts +89 -0
- package/dist/scripts/db/dev-query-proxy.d.ts +2 -0
- package/dist/scripts/db/dev-query-proxy.js +4 -1
- package/dist/scripts/db/query.js +3 -0
- package/dist/scripts/dev/shell.js +4 -0
- package/dist/scripts/dev-session.d.ts +31 -0
- package/dist/scripts/dev-session.js +58 -0
- package/dist/scripts/resources/list.js +53 -4
- package/dist/scripts/runner.js +22 -4
- package/dist/search/query.d.ts +11 -5
- package/dist/search/query.js +52 -15
- package/dist/search/tokenize.d.ts +1 -0
- package/dist/search/tokenize.js +3 -0
- package/dist/secrets/api-keys.d.ts +4 -0
- package/dist/secrets/api-keys.js +5 -0
- package/dist/secrets/register.d.ts +2 -0
- package/dist/secrets/routes.d.ts +2 -2
- package/dist/secrets/routes.js +85 -6
- package/dist/secrets/storage.d.ts +2 -0
- package/dist/secrets/storage.js +34 -9
- package/dist/secrets/substitution.d.ts +3 -2
- package/dist/secrets/substitution.js +56 -7
- package/dist/server/action-discovery.js +5 -0
- package/dist/server/action-routes.js +8 -6
- package/dist/server/agent-chat/prompt-resources.js +117 -79
- package/dist/server/agent-chat/script-entries.js +15 -8
- package/dist/server/agent-chat-plugin.js +9 -4
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-engine-ollama-models-route.d.ts +1 -1
- package/dist/server/agents-bundle.d.ts +3 -1
- package/dist/server/agents-bundle.js +4 -4
- package/dist/server/csrf.js +1 -0
- package/dist/server/dev-action-bridge.d.ts +2 -0
- package/dist/server/dev-action-bridge.js +34 -5
- package/dist/server/first-touch-route.d.ts +1 -1
- package/dist/server/http-response-telemetry.js +4 -0
- package/dist/server/loopback.js +3 -1
- package/dist/server/request-context.d.ts +26 -0
- package/dist/shared/app-state-routes.d.ts +7 -0
- package/dist/shared/app-state-routes.js +7 -0
- package/dist/shared/mcp-client-connections.d.ts +41 -0
- package/dist/shared/mcp-client-connections.js +18 -0
- package/dist/shared/mcp-connect-content.d.ts +18 -0
- package/dist/shared/mcp-connect-content.js +200 -172
- package/dist/shared/runtime-config.js +5 -1
- package/dist/templates/chat/.agents/skills/context-awareness/SKILL.md +13 -0
- package/dist/templates/default/.agents/skills/context-awareness/SKILL.md +13 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +13 -0
- package/dist/tracking/providers.d.ts +7 -0
- package/dist/tracking/providers.js +39 -17
- package/dist/triggers/condition-evaluator.d.ts +2 -0
- package/dist/triggers/condition-evaluator.js +93 -3
- package/dist/triggers/dispatcher.js +24 -6
- package/docs/AGENTS.md +16 -16
- package/docs/content/create-with-an-agent.mdx +10 -4
- package/docs/content/durable-resume.mdx +11 -2
- package/docs/content/toolkit-comments-review.mdx +54 -1
- package/package.json +5 -4
- package/src/templates/chat/.agents/skills/context-awareness/SKILL.md +13 -0
- package/src/templates/default/.agents/skills/context-awareness/SKILL.md +13 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +13 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { BROWSER_TAB_USED_APP_STATE_KEY } from "../shared/app-state-routes.js";
|
|
3
|
+
import { deleteClientAppState, setClientAppState, } from "./application-state.js";
|
|
4
|
+
import { getBrowserTabId } from "./browser-tab-id.js";
|
|
5
|
+
// While the tab keeps focus, moving around in it refreshes its record at most
|
|
6
|
+
// this often. Coming back to the tab from elsewhere always records it.
|
|
7
|
+
const ROUTE_CHANGE_RECORD_INTERVAL_MS = 60_000;
|
|
8
|
+
let mounts = 0;
|
|
9
|
+
let removeListeners;
|
|
10
|
+
let lastRecordedAt = 0;
|
|
11
|
+
// Whether focus has left the page (to another tab, window or app) since the
|
|
12
|
+
// last record. Focus moving into one of the page's own frames doesn't count.
|
|
13
|
+
let leftSinceRecorded = true;
|
|
14
|
+
function hasFocus() {
|
|
15
|
+
return (typeof document !== "undefined" &&
|
|
16
|
+
typeof document.hasFocus === "function" &&
|
|
17
|
+
document.hasFocus());
|
|
18
|
+
}
|
|
19
|
+
// A record that fails to save leaves the tab unfindable, and the MCP call
|
|
20
|
+
// then says no tab was used, so a failed write needs no handling here.
|
|
21
|
+
function record() {
|
|
22
|
+
lastRecordedAt = Date.now();
|
|
23
|
+
leftSinceRecorded = false;
|
|
24
|
+
void setClientAppState(BROWSER_TAB_USED_APP_STATE_KEY, { usedAt: lastRecordedAt }, { requestSource: getBrowserTabId() }).catch(() => { });
|
|
25
|
+
}
|
|
26
|
+
function recordIfReturned() {
|
|
27
|
+
if (leftSinceRecorded ||
|
|
28
|
+
Date.now() - lastRecordedAt >= ROUTE_CHANGE_RECORD_INTERVAL_MS) {
|
|
29
|
+
record();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// A lost delete leaves the record to expire after
|
|
33
|
+
// LAST_USED_BROWSER_TAB_MAX_AGE_MS.
|
|
34
|
+
function forget() {
|
|
35
|
+
leftSinceRecorded = true;
|
|
36
|
+
void deleteClientAppState(BROWSER_TAB_USED_APP_STATE_KEY, {
|
|
37
|
+
keepalive: true,
|
|
38
|
+
requestSource: getBrowserTabId(),
|
|
39
|
+
}).catch(() => { });
|
|
40
|
+
}
|
|
41
|
+
function listen() {
|
|
42
|
+
if (typeof window.addEventListener !== "function" ||
|
|
43
|
+
typeof document === "undefined" ||
|
|
44
|
+
typeof document.addEventListener !== "function") {
|
|
45
|
+
return () => { };
|
|
46
|
+
}
|
|
47
|
+
const onFocus = () => recordIfReturned();
|
|
48
|
+
const onBlur = () => {
|
|
49
|
+
// Focus moving into one of the page's frames blurs the window, but the
|
|
50
|
+
// page still has focus once it settles.
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
if (!hasFocus())
|
|
53
|
+
leftSinceRecorded = true;
|
|
54
|
+
}, 0);
|
|
55
|
+
};
|
|
56
|
+
const onVisibilityChange = () => {
|
|
57
|
+
if (document.visibilityState === "hidden")
|
|
58
|
+
leftSinceRecorded = true;
|
|
59
|
+
else if (hasFocus())
|
|
60
|
+
recordIfReturned();
|
|
61
|
+
};
|
|
62
|
+
const onPageShow = (event) => {
|
|
63
|
+
if (event.persisted && hasFocus())
|
|
64
|
+
record();
|
|
65
|
+
};
|
|
66
|
+
const onPageHide = () => forget();
|
|
67
|
+
window.addEventListener("focus", onFocus);
|
|
68
|
+
window.addEventListener("blur", onBlur);
|
|
69
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
70
|
+
window.addEventListener("pageshow", onPageShow);
|
|
71
|
+
window.addEventListener("pagehide", onPageHide);
|
|
72
|
+
return () => {
|
|
73
|
+
window.removeEventListener("focus", onFocus);
|
|
74
|
+
window.removeEventListener("blur", onBlur);
|
|
75
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
76
|
+
window.removeEventListener("pageshow", onPageShow);
|
|
77
|
+
window.removeEventListener("pagehide", onPageHide);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Records when someone uses this browser tab (it gains focus, or its route
|
|
82
|
+
* changes while focused) and forgets the tab when the page goes away. An MCP
|
|
83
|
+
* tool call comes from no tab, so the server points its tab-scoped app
|
|
84
|
+
* state (navigation, navigate commands, selection) at the tab of this app
|
|
85
|
+
* used last. `useAgentRouteState` calls it; an app with its own navigation
|
|
86
|
+
* sync calls it once with its current route.
|
|
87
|
+
*/
|
|
88
|
+
export function useBrowserTabUse(route, enabled = true) {
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (!enabled || typeof window === "undefined")
|
|
91
|
+
return;
|
|
92
|
+
mounts += 1;
|
|
93
|
+
if (mounts === 1) {
|
|
94
|
+
removeListeners = listen();
|
|
95
|
+
if (hasFocus())
|
|
96
|
+
record();
|
|
97
|
+
}
|
|
98
|
+
return () => {
|
|
99
|
+
mounts -= 1;
|
|
100
|
+
if (mounts === 0) {
|
|
101
|
+
removeListeners?.();
|
|
102
|
+
removeListeners = undefined;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}, [enabled]);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
if (!enabled || typeof window === "undefined")
|
|
108
|
+
return;
|
|
109
|
+
if (hasFocus())
|
|
110
|
+
recordIfReturned();
|
|
111
|
+
}, [enabled, route]);
|
|
112
|
+
}
|
|
@@ -6,7 +6,7 @@ import { agentEngineStatusUrlForChatApi, requireAgentEngineConfiguredForDispatch
|
|
|
6
6
|
import { getOrCreateAnalyticsSessionId } from "../analytics-session.js";
|
|
7
7
|
import { agentChatStreamingUrl, agentNativePath } from "../api-path.js";
|
|
8
8
|
import { CHAT_REQUEST_TOO_LARGE_MESSAGE } from "../error-format.js";
|
|
9
|
-
import { appendMissingFinalResponseWarning, clearAssistantDraftContent, findApprovalToolCallIndex, } from "../sse-event-processor.js";
|
|
9
|
+
import { appendMissingFinalResponseWarning, clearAssistantDraftContent, findApprovalToolCallIndex, hasFailedOrUnknownToolResult, } from "../sse-event-processor.js";
|
|
10
10
|
import { runOutcomeForCode } from "./run-outcome.js";
|
|
11
11
|
import { acceptedPromptForMetadata, DEFAULT_TURN_SURFACE, } from "./turn-submitted.js";
|
|
12
12
|
export const AGENT_NATIVE_RUN_RESUME_STATE_METADATA_KEY = "agentNativeRunResumeState";
|
|
@@ -3189,6 +3189,8 @@ function mapAgentNativeEvent(raw, input) {
|
|
|
3189
3189
|
return events;
|
|
3190
3190
|
}
|
|
3191
3191
|
const warning = userStoppedRun ||
|
|
3192
|
+
(ev.reason === "action_settled" &&
|
|
3193
|
+
!hasFailedOrUnknownToolResult(input.message.content)) ||
|
|
3192
3194
|
input.message.approvalPending ||
|
|
3193
3195
|
input.message.connectionPending
|
|
3194
3196
|
? null
|
|
@@ -397,8 +397,37 @@ function installNavigationBreadcrumbs(runtime) {
|
|
|
397
397
|
// navigation breadcrumbs are best-effort
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
|
+
const DOM_MUTATION_ERROR = /(?:Failed to execute '(?:removeChild|insertBefore)' on 'Node'|Node\.(?:removeChild|insertBefore):)/;
|
|
401
|
+
// A removeChild/insertBefore NotFoundError means something other than React
|
|
402
|
+
// moved a node. Browser translation is the usual suspect, so record whether
|
|
403
|
+
// the page shows its fingerprints. Attributes and booleans only, never text.
|
|
404
|
+
function domMutationDiagnostics(runtime, normalized) {
|
|
405
|
+
if (runtime.domMutationDiagnosticsReported ||
|
|
406
|
+
typeof document === "undefined" ||
|
|
407
|
+
normalized.type !== "NotFoundError" ||
|
|
408
|
+
!DOM_MUTATION_ERROR.test(normalized.message)) {
|
|
409
|
+
return undefined;
|
|
410
|
+
}
|
|
411
|
+
const root = document.documentElement;
|
|
412
|
+
if (!root)
|
|
413
|
+
return undefined;
|
|
414
|
+
return {
|
|
415
|
+
domMutationDiagnostics: {
|
|
416
|
+
htmlTranslate: root.getAttribute("translate"),
|
|
417
|
+
htmlLang: root.getAttribute("lang"),
|
|
418
|
+
translatedClass: root.classList.contains("translated-ltr") ||
|
|
419
|
+
root.classList.contains("translated-rtl"),
|
|
420
|
+
fontWrapperNodes: document.querySelector("body font") != null,
|
|
421
|
+
navigatorLanguage: typeof navigator === "undefined" ? null : navigator.language,
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
}
|
|
400
425
|
function buildEvent(runtime, normalized, options) {
|
|
401
426
|
const context = runtime.config.getSessionContext?.() ?? {};
|
|
427
|
+
const diagnostics = domMutationDiagnostics(runtime, normalized);
|
|
428
|
+
const extra = diagnostics || options.extra
|
|
429
|
+
? { ...options.extra, ...diagnostics }
|
|
430
|
+
: undefined;
|
|
402
431
|
const stack = normalized.stack
|
|
403
432
|
? truncate(redactSecrets(normalized.stack), MAX_STACK_LENGTH)
|
|
404
433
|
: undefined;
|
|
@@ -419,7 +448,7 @@ function buildEvent(runtime, normalized, options) {
|
|
|
419
448
|
...(context.anonymousId ? { anonymousId: context.anonymousId } : {}),
|
|
420
449
|
breadcrumbs: snapshotBreadcrumbs(runtime),
|
|
421
450
|
...(options.tags ? { tags: options.tags } : {}),
|
|
422
|
-
...(
|
|
451
|
+
...(extra ? { extra } : {}),
|
|
423
452
|
};
|
|
424
453
|
}
|
|
425
454
|
function dispatch(runtime, event, emitToReplay) {
|
|
@@ -448,6 +477,9 @@ function dispatch(runtime, event, emitToReplay) {
|
|
|
448
477
|
return;
|
|
449
478
|
try {
|
|
450
479
|
runtime.config.send(event);
|
|
480
|
+
if (event.extra?.domMutationDiagnostics) {
|
|
481
|
+
runtime.domMutationDiagnosticsReported = true;
|
|
482
|
+
}
|
|
451
483
|
}
|
|
452
484
|
catch {
|
|
453
485
|
// transport must never throw into the host app
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { agentNativePath, appApiPath, appBasePath, appPath, } from "../api-path.js";
|
|
2
2
|
export { useAgentRouteState, useSemanticNavigationState, type AgentRouteTarget, type AgentRouteLocation, type SemanticNavigationCommandEnvelope, type UseAgentRouteStateOptions, type UseAgentRouteStateResult, type UseSemanticNavigationStateOptions, type UseSemanticNavigationStateResult, type WorkspaceAppRouteTarget, } from "../route-state.js";
|
|
3
|
+
export { useBrowserTabUse } from "../browser-tab-use.js";
|
|
3
4
|
export { AGENT_NATIVE_WORKSPACE_APP_ROUTE_MESSAGE_TYPE, postAgentNativeWorkspaceAppRoute, type AgentNativeWorkspaceAppRouteMessage, } from "../workspace-app-navigation.js";
|
|
4
5
|
export { buildOpenRouteLink, buildOpenRoutePath, buildLegacyAgentSettingsRoute, buildResourceRoute, buildSettingsEntryRoute, buildSettingsRedirectRoute, buildSettingsRoute, buildStandardAppRoute, buildTeamRoute, createStandardOpenPathResolver, resolveLegacySettingsId, resolveSettingsSectionRedirect, SETTINGS_PAGE_IDS, STANDARD_APP_ROUTES, STANDARD_SETTINGS_TABS, type BuildResourceRouteOptions, type BuildSettingsRouteOptions, type CoreSettingsPageId, type SettingsRedirect, type BuildStandardAppRouteOptions, type NavigationLink, type NavigationTarget, type StandardAppRouteId, type StandardOpenPathResolverOptions, type StandardOpenPathRoute, type StandardSettingsTabId, } from "../../navigation/index.js";
|
|
5
6
|
export { getSettingsShortcutHint, isSettingsRoutePath, isSettingsShortcutEvent, OPEN_SETTINGS_PAGE_EVENT, openSettingsPage, SETTINGS_SHORTCUT_PAGE, settingsPagePath, useSettingsShortcut, type OpenSettingsPageDetail, } from "../use-settings-shortcut.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { agentNativePath, appApiPath, appBasePath, appPath, } from "../api-path.js";
|
|
2
2
|
export { useAgentRouteState, useSemanticNavigationState, } from "../route-state.js";
|
|
3
|
+
export { useBrowserTabUse } from "../browser-tab-use.js";
|
|
3
4
|
export { AGENT_NATIVE_WORKSPACE_APP_ROUTE_MESSAGE_TYPE, postAgentNativeWorkspaceAppRoute, } from "../workspace-app-navigation.js";
|
|
4
5
|
export { buildOpenRouteLink, buildOpenRoutePath, buildLegacyAgentSettingsRoute, buildResourceRoute, buildSettingsEntryRoute, buildSettingsRedirectRoute, buildSettingsRoute, buildStandardAppRoute, buildTeamRoute, createStandardOpenPathResolver, resolveLegacySettingsId, resolveSettingsSectionRedirect, SETTINGS_PAGE_IDS, STANDARD_APP_ROUTES, STANDARD_SETTINGS_TABS, } from "../../navigation/index.js";
|
|
5
6
|
export { getSettingsShortcutHint, isSettingsRoutePath, isSettingsShortcutEvent, OPEN_SETTINGS_PAGE_EVENT, openSettingsPage, SETTINGS_SHORTCUT_PAGE, settingsPagePath, useSettingsShortcut, } from "../use-settings-shortcut.js";
|
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
const LOGOS = {
|
|
2
|
+
claude: {
|
|
3
|
+
mime: "image/png",
|
|
4
|
+
data: "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",
|
|
5
|
+
},
|
|
6
|
+
cursor: {
|
|
7
|
+
mime: "image/png",
|
|
8
|
+
data: "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",
|
|
9
|
+
},
|
|
10
|
+
vscode: {
|
|
11
|
+
mime: "image/png",
|
|
12
|
+
data: "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",
|
|
13
|
+
},
|
|
14
|
+
grok: {
|
|
15
|
+
mime: "image/svg+xml",
|
|
16
|
+
data: "PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8zMDRfMTExKSI+Cjxmb3JlaWduT2JqZWN0IHg9Ii0yNCIgeT0iLTIyIiB3aWR0aD0iNTYwIiBoZWlnaHQ9IjU2MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImJhY2tkcm9wLWZpbHRlcjpibHVyKDE2cHgpO2NsaXAtcGF0aDp1cmwoI2JnYmx1cl8xXzMwNF8xMTFfY2xpcF9wYXRoKTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlIj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8zMDRfMTExKSIgZGF0YS1maWdtYS1iZy1ibHVyLXJhZGl1cz0iMzIiPgo8cGF0aCBkPSJNMCAyNTZDMCAxNjYuMzkyIDAgMTIxLjU4NyAxNy40MzkgODcuMzYxNUMzMi43Nzg3IDU3LjI1NTYgNTcuMjU1NiAzMi43Nzg3IDg3LjM2MTUgMTcuNDM5QzEyMS41ODcgMCAxNjYuMzkyIDAgMjU2IDBDMzQ1LjYwOCAwIDM5MC40MTMgMCA0MjQuNjM4IDE3LjQzOUM0NTQuNzQ0IDMyLjc3ODcgNDc5LjIyMSA1Ny4yNTU2IDQ5NC41NjEgODcuMzYxNUM1MTIgMTIxLjU4NyA1MTIgMTY2LjM5MiA1MTIgMjU2QzUxMiAzNDUuNjA4IDUxMiAzOTAuNDEzIDQ5NC41NjEgNDI0LjYzOEM0NzkuMjIxIDQ1NC43NDQgNDU0Ljc0NCA0NzkuMjIxIDQyNC42MzggNDk0LjU2MUMzOTAuNDEzIDUxMiAzNDUuNjA4IDUxMiAyNTYgNTEyQzE2Ni4zOTIgNTEyIDEyMS41ODcgNTEyIDg3LjM2MTUgNDk0LjU2MUM1Ny4yNTU2IDQ3OS4yMjEgMzIuNzc4NyA0NTQuNzQ0IDE3LjQzOSA0MjQuNjM4QzAgMzkwLjQxMyAwIDM0NS42MDggMCAyNTZaIiBmaWxsPSIjMDUwNTA1Ii8+CjxwYXRoIGQ9Ik0yNTYgMi41QzMwMC44NDUgMi41IDMzNC4zMjkgMi41MDIyOCAzNjAuODg0IDQuNjcxODhDMzg3LjQxIDYuODM5MTEgNDA2LjgwMiAxMS4xNTYgNDIzLjUwNCAxOS42NjZDNDUzLjEzOSAzNC43NjYxIDQ3Ny4yMzQgNTguODYwNyA0OTIuMzM0IDg4LjQ5NjFDNTAwLjg0NCAxMDUuMTk4IDUwNS4xNjEgMTI0LjU5IDUwNy4zMjggMTUxLjExNkM1MDkuNDk4IDE3Ny42NzEgNTA5LjUgMjExLjE1NSA1MDkuNSAyNTZDNTA5LjUgMzAwLjg0NSA1MDkuNDk4IDMzNC4zMjkgNTA3LjMyOCAzNjAuODg0QzUwNS4xNjEgMzg3LjQxIDUwMC44NDQgNDA2LjgwMiA0OTIuMzM0IDQyMy41MDRDNDc3LjIzNCA0NTMuMTM5IDQ1My4xMzkgNDc3LjIzNCA0MjMuNTA0IDQ5Mi4zMzRDNDA2LjgwMiA1MDAuODQ0IDM4Ny40MSA1MDUuMTYxIDM2MC44ODQgNTA3LjMyOEMzMzQuMzI5IDUwOS40OTggMzAwLjg0NSA1MDkuNSAyNTYgNTA5LjVDMjExLjE1NSA1MDkuNSAxNzcuNjcxIDUwOS40OTggMTUxLjExNiA1MDcuMzI4QzEyNC41OSA1MDUuMTYxIDEwNS4xOTggNTAwLjg0NCA4OC40OTYxIDQ5Mi4zMzRDNTguODYwNyA0NzcuMjM0IDM0Ljc2NjEgNDUzLjEzOSAxOS42NjYgNDIzLjUwNEMxMS4xNTYgNDA2LjgwMiA2LjgzOTExIDM4Ny40MSA0LjY3MTg4IDM2MC44ODRDMi41MDIyOCAzMzQuMzI5IDIuNSAzMDAuODQ1IDIuNSAyNTZDMi41IDIxMS4xNTUgMi41MDIyOCAxNzcuNjcxIDQuNjcxODggMTUxLjExNkM2LjgzOTExIDEyNC41OSAxMS4xNTYgMTA1LjE5OCAxOS42NjYgODguNDk2MUMzNC43NjYxIDU4Ljg2MDcgNTguODYwNyAzNC43NjYxIDg4LjQ5NjEgMTkuNjY2QzEwNS4xOTggMTEuMTU2IDEyNC41OSA2LjgzOTExIDE1MS4xMTYgNC42NzE4OEMxNzcuNjcxIDIuNTAyMjggMjExLjE1NSAyLjUgMjU2IDIuNVoiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjA1IiBzdHJva2Utd2lkdGg9IjUiLz4KPC9nPgo8L2c+CjxtYXNrIGlkPSJwYXRoLTMtaW5zaWRlLTFfMzA0XzExMSIgZmlsbD0id2hpdGUiPgo8cGF0aCBkPSJNMjEwLjQ4NCAzMTIuNzU5TDM0My40NjUgMjEwLjM4M0MzNDkuOTg0IDIwNS4zNjQgMzU5LjMwMiAyMDcuMzIyIDM2Mi40MDggMjE1LjExN0MzNzguNzU4IDI1Ni4yMzEgMzcxLjQ1NCAzMDUuNjQgMzM4LjkyNSAzMzkuNTYzQzMwNi4zOTcgMzczLjQ4NyAyNjEuMTM3IDM4MC45MjcgMjE5Ljc2OCAzNjMuOTgzTDE3NC41NzcgMzg1LjgwM0MyMzkuMzk0IDQzMi4wMDggMzE4LjEwNCA0MjAuNTgxIDM2Ny4yODkgMzY5LjI1MUM0MDYuMzAzIDMyOC41NjQgNDE4LjM4NiAyNzMuMTA0IDQwNy4wODggMjIzLjA5MUw0MDcuMTkgMjIzLjE5OEMzOTAuODA3IDE0OS43MjYgNDExLjIxOCAxMjAuMzU5IDQ1My4wMyA2MC4zMDcyQzQ1NC4wMiA1OC44ODMzIDQ1NS4wMSA1Ny40NTk1IDQ1NiA1Nkw0MDAuOTc4IDExMy4zODJWMTEzLjIwNEwyMTAuNDUgMzEyLjc5NCIvPgo8cGF0aCBkPSJNMTgzLjA0MiAzMzcuNjQxQzEzNi41MTkgMjkxLjI5NCAxNDQuNTQgMjE5LjU2NyAxODQuMjM2IDE3OC4yMDNDMjEzLjU5IDE0Ny41OSAyNjEuNjgzIDEzNS4wOTYgMzAzLjY2NiAxNTMuNDY0TDM0OC43NTUgMTMxLjc1QzM0MC42MzIgMTI1LjYyNyAzMzAuMjIxIDExOS4wNDIgMzE4LjI3NSAxMTQuNDE0QzI2NC4yNzcgOTEuMjQwNyAxOTkuNjMgMTAyLjc3NCAxNTUuNzM1IDE0OC41MTZDMTEzLjUxMyAxOTIuNTQ5IDEwMC4yMzYgMjYwLjI1NCAxMjMuMDM2IDMxOC4wMjdDMTQwLjA2OSAzNjEuMjA2IDExMi4xNDggMzkxLjc0OCA4NC4wMjI5IDQyMi41NzVDNzQuMDU2MSA0MzMuNTAzIDY0LjA1NTMgNDQ0LjQzMSA1NiA0NTZMMTgzLjAwNyAzMzcuNjc3Ii8+CjwvbWFzaz4KPHBhdGggZD0iTTIxMC40ODQgMzEyLjc1OUwzNDMuNDY1IDIxMC4zODNDMzQ5Ljk4NCAyMDUuMzY0IDM1OS4zMDIgMjA3LjMyMiAzNjIuNDA4IDIxNS4xMTdDMzc4Ljc1OCAyNTYuMjMxIDM3MS40NTQgMzA1LjY0IDMzOC45MjUgMzM5LjU2M0MzMDYuMzk3IDM3My40ODcgMjYxLjEzNyAzODAuOTI3IDIxOS43NjggMzYzLjk4M0wxNzQuNTc3IDM4NS44MDNDMjM5LjM5NCA0MzIuMDA4IDMxOC4xMDQgNDIwLjU4MSAzNjcuMjg5IDM2OS4yNTFDNDA2LjMwMyAzMjguNTY0IDQxOC4zODYgMjczLjEwNCA0MDcuMDg4IDIyMy4wOTFMNDA3LjE5IDIyMy4xOThDMzkwLjgwNyAxNDkuNzI2IDQxMS4yMTggMTIwLjM1OSA0NTMuMDMgNjAuMzA3MkM0NTQuMDIgNTguODgzMyA0NTUuMDEgNTcuNDU5NSA0NTYgNTZMNDAwLjk3OCAxMTMuMzgyVjExMy4yMDRMMjEwLjQ1IDMxMi43OTQiIGZpbGw9IiNGQ0ZDRkMiLz4KPHBhdGggZD0iTTE4My4wNDIgMzM3LjY0MUMxMzYuNTE5IDI5MS4yOTQgMTQ0LjU0IDIxOS41NjcgMTg0LjIzNiAxNzguMjAzQzIxMy41OSAxNDcuNTkgMjYxLjY4MyAxMzUuMDk2IDMwMy42NjYgMTUzLjQ2NEwzNDguNzU1IDEzMS43NUMzNDAuNjMyIDEyNS42MjcgMzMwLjIyMSAxMTkuMDQyIDMxOC4yNzUgMTE0LjQxNEMyNjQuMjc3IDkxLjI0MDcgMTk5LjYzIDEwMi43NzQgMTU1LjczNSAxNDguNTE2QzExMy41MTMgMTkyLjU0OSAxMDAuMjM2IDI2MC4yNTQgMTIzLjAzNiAzMTguMDI3QzE0MC4wNjkgMzYxLjIwNiAxMTIuMTQ4IDM5MS43NDggODQuMDIyOSA0MjIuNTc1Qzc0LjA1NjEgNDMzLjUwMyA2NC4wNTUzIDQ0NC40MzEgNTYgNDU2TDE4My4wMDcgMzM3LjY3NyIgZmlsbD0iI0ZDRkNGQyIvPgo8cGF0aCBkPSJNMzQzLjQ2NSAyMTAuMzgzTDM0NC4zOCAyMTEuNTcxTDM0NC4zOCAyMTEuNTcxTDM0My40NjUgMjEwLjM4M1pNMzYyLjQwOCAyMTUuMTE3TDM2My44MDIgMjE0LjU2M0wzNjMuODAyIDIxNC41NjJMMzYyLjQwOCAyMTUuMTE3Wk0yMTkuNzY4IDM2My45ODNMMjIwLjMzNyAzNjIuNTk0TDIxOS43MTggMzYyLjM0MUwyMTkuMTE2IDM2Mi42MzJMMjE5Ljc2OCAzNjMuOTgzWk0xNzQuNTc3IDM4NS44MDNMMTczLjkyNCAzODQuNDUzTDE3MS42NDMgMzg1LjU1NEwxNzMuNzA2IDM4Ny4wMjVMMTc0LjU3NyAzODUuODAzWk0zNjcuMjg5IDM2OS4yNTFMMzY2LjIwNyAzNjguMjEzTDM2Ni4yMDYgMzY4LjIxM0wzNjcuMjg5IDM2OS4yNTFaTTQwNy4wODggMjIzLjA5MUw0MDguMTcxIDIyMi4wNTNMNDA0LjQzNiAyMTguMTU3TDQwNS42MjUgMjIzLjQyMUw0MDcuMDg4IDIyMy4wOTFaTTQwNy4xOSAyMjMuMTk4TDQwNi4xMDggMjI0LjIzNkw0MDkuODIzIDIyOC4xMTFMNDA4LjY1NCAyMjIuODcxTDQwNy4xOSAyMjMuMTk4Wk00NTMuMDMgNjAuMzA3Mkw0NTQuMjYyIDYxLjE2NDNMNDU0LjI2MiA2MS4xNjM0TDQ1My4wMyA2MC4zMDcyWk00NTYgNTZMNDU3LjI0MSA1Ni44NDJMNDU0LjkxNyA1NC45NjE4TDQ1NiA1NlpNNDAwLjk3OCAxMTMuMzgySDM5OS40NzhWMTE3LjExM0w0MDIuMDYxIDExNC40Mkw0MDAuOTc4IDExMy4zODJaTTQwMC45NzggMTEzLjIwNEg0MDIuNDc4VjEwOS40NkwzOTkuODkzIDExMi4xNjhMNDAwLjk3OCAxMTMuMjA0Wk0xODQuMjM2IDE3OC4yMDNMMTg1LjMxOCAxNzkuMjQyTDE4NS4zMTkgMTc5LjI0MkwxODQuMjM2IDE3OC4yMDNaTTMwMy42NjYgMTUzLjQ2NEwzMDMuMDY1IDE1NC44MzhMMzAzLjY5NiAxNTUuMTE0TDMwNC4zMTcgMTU0LjgxNUwzMDMuNjY2IDE1My40NjRaTTM0OC43NTUgMTMxLjc1TDM0OS40MDYgMTMzLjEwMUwzNTEuNjI0IDEzMi4wMzNMMzQ5LjY1OCAxMzAuNTUyTDM0OC43NTUgMTMxLjc1Wk0zMTguMjc1IDExNC40MTRMMzE3LjY4MyAxMTUuNzkzTDMxNy43MDggMTE1LjgwM0wzMTcuNzMzIDExNS44MTNMMzE4LjI3NSAxMTQuNDE0Wk0xNTUuNzM1IDE0OC41MTZMMTU0LjY1MyAxNDcuNDc3TDE1NC42NTMgMTQ3LjQ3OEwxNTUuNzM1IDE0OC41MTZaTTEyMy4wMzYgMzE4LjAyN0wxMjQuNDMyIDMxNy40NzdMMTI0LjQzMiAzMTcuNDc3TDEyMy4wMzYgMzE4LjAyN1pNODQuMDIyOSA0MjIuNTc1TDgyLjkxNDggNDIxLjU2NEw4Mi45MTQ2IDQyMS41NjRMODQuMDIyOSA0MjIuNTc1Wk01NiA0NTZMNTQuNzY5IDQ1NS4xNDNMNTcuMDIyNSA0NTcuMDk4TDU2IDQ1NlpNMjEwLjQ4NCAzMTIuNzU5TDIxMS4zOTkgMzEzLjk0OEwzNDQuMzggMjExLjU3MUwzNDMuNDY1IDIxMC4zODNMMzQyLjU1IDIwOS4xOTRMMjA5LjU2OSAzMTEuNTdMMjEwLjQ4NCAzMTIuNzU5Wk0zNDMuNDY1IDIxMC4zODNMMzQ0LjM4IDIxMS41NzFDMzUwLjIwNCAyMDcuMDg3IDM1OC4zMiAyMDguOTA5IDM2MS4wMTUgMjE1LjY3MkwzNjIuNDA4IDIxNS4xMTdMMzYzLjgwMiAyMTQuNTYyQzM2MC4yODUgMjA1LjczNCAzNDkuNzY0IDIwMy42NCAzNDIuNTUgMjA5LjE5NEwzNDMuNDY1IDIxMC4zODNaTTM2Mi40MDggMjE1LjExN0wzNjEuMDE1IDIxNS42NzFDMzc3LjE2MyAyNTYuMjc5IDM2OS45MzYgMzA1LjA1NSAzMzcuODQyIDMzOC41MjVMMzM4LjkyNSAzMzkuNTYzTDM0MC4wMDggMzQwLjYwMUMzNzIuOTcyIDMwNi4yMjQgMzgwLjM1MyAyNTYuMTgzIDM2My44MDIgMjE0LjU2M0wzNjIuNDA4IDIxNS4xMTdaTTMzOC45MjUgMzM5LjU2M0wzMzcuODQyIDMzOC41MjVDMzA1Ljc2OSAzNzEuOTc0IDI2MS4xNzUgMzc5LjMyMSAyMjAuMzM3IDM2Mi41OTRMMjE5Ljc2OCAzNjMuOTgzTDIxOS4yIDM2NS4zNzFDMjYxLjA5OSAzODIuNTMyIDMwNy4wMjQgMzc1IDM0MC4wMDggMzQwLjYwMUwzMzguOTI1IDMzOS41NjNaTTIxOS43NjggMzYzLjk4M0wyMTkuMTE2IDM2Mi42MzJMMTczLjkyNCAzODQuNDUzTDE3NC41NzcgMzg1LjgwM0wxNzUuMjI5IDM4Ny4xNTRMMjIwLjQyIDM2NS4zMzNMMjE5Ljc2OCAzNjMuOTgzWk0xNzQuNTc3IDM4NS44MDNMMTczLjcwNiAzODcuMDI1QzIzOS4xNSA0MzMuNjc1IDMxOC42ODkgNDIyLjE0IDM2OC4zNzIgMzcwLjI4OUwzNjcuMjg5IDM2OS4yNTFMMzY2LjIwNiAzNjguMjEzQzMxNy41MiA0MTkuMDIzIDIzOS42MzkgNDMwLjM0IDE3NS40NDcgMzg0LjU4MkwxNzQuNTc3IDM4NS44MDNaTTM2Ny4yODkgMzY5LjI1MUwzNjguMzcyIDM3MC4yODlDNDA3Ljc2NCAzMjkuMjA4IDQxOS45NSAyNzMuMjIxIDQwOC41NTEgMjIyLjc2TDQwNy4wODggMjIzLjA5MUw0MDUuNjI1IDIyMy40MjFDNDE2LjgyMiAyNzIuOTg3IDQwNC44NDIgMzI3LjkyIDM2Ni4yMDcgMzY4LjIxM0wzNjcuMjg5IDM2OS4yNTFaTTQwNy4wODggMjIzLjA5MUw0MDYuMDA1IDIyNC4xMjlMNDA2LjEwOCAyMjQuMjM2TDQwNy4xOSAyMjMuMTk4TDQwOC4yNzMgMjIyLjE2TDQwOC4xNzEgMjIyLjA1M0w0MDcuMDg4IDIyMy4wOTFaTTQwNy4xOSAyMjMuMTk4TDQwOC42NTQgMjIyLjg3MUM0MDAuNTA1IDE4Ni4zMjUgNDAxLjUzOCAxNjAuOTEgNDA5LjcwNSAxMzcuMjA5QzQxNy45MDUgMTEzLjQxNCA0MzMuMzE5IDkxLjI0MjEgNDU0LjI2MiA2MS4xNjQzTDQ1My4wMyA2MC4zMDcyTDQ1MS43OTkgNTkuNDUwMUM0MzAuOTI5IDg5LjQyMzkgNDE1LjIzMiAxMTEuOTYxIDQwNi44NjkgMTM2LjIzMUMzOTguNDczIDE2MC41OTQgMzk3LjQ5MiAxODYuNTk5IDQwNS43MjYgMjIzLjUyNEw0MDcuMTkgMjIzLjE5OFpNNDUzLjAzIDYwLjMwNzJMNDU0LjI2MiA2MS4xNjM0QzQ1NS4yNTEgNTkuNzQwNiA0NTYuMjQ2IDU4LjMwOTcgNDU3LjI0MSA1Ni44NDJMNDU2IDU2TDQ1NC43NTkgNTUuMTU4QzQ1My43NzQgNTYuNjA5MiA0NTIuNzg5IDU4LjAyNjEgNDUxLjc5OSA1OS40NTFMNDUzLjAzIDYwLjMwNzJaTTQ1NiA1Nkw0NTQuOTE3IDU0Ljk2MThMMzk5Ljg5NiAxMTIuMzQ0TDQwMC45NzggMTEzLjM4Mkw0MDIuMDYxIDExNC40Mkw0NTcuMDgzIDU3LjAzODJMNDU2IDU2Wk00MDAuOTc4IDExMy4zODJINDAyLjQ3OFYxMTMuMjA0SDQwMC45NzhIMzk5LjQ3OFYxMTMuMzgySDQwMC45NzhaTTE4My4wNDIgMzM3LjY0MUwxODQuMSAzMzYuNTc4QzEzOC4yNTUgMjkwLjkwNyAxNDYuMDg3IDIyMC4xMjEgMTg1LjMxOCAxNzkuMjQyTDE4NC4yMzYgMTc4LjIwM0wxODMuMTU0IDE3Ny4xNjVDMTQyLjk5MyAyMTkuMDEyIDEzNC43ODIgMjkxLjY4MSAxODEuOTgzIDMzOC43MDRMMTgzLjA0MiAzMzcuNjQxWk0xODQuMjM2IDE3OC4yMDNMMTg1LjMxOSAxNzkuMjQyQzIxNC4yNzUgMTQ5LjA0NCAyNjEuNzA2IDEzNi43NDMgMzAzLjA2NSAxNTQuODM4TDMwMy42NjYgMTUzLjQ2NEwzMDQuMjY3IDE1Mi4wOUMyNjEuNjYgMTMzLjQ0OSAyMTIuOTA2IDE0Ni4xMzcgMTgzLjE1NCAxNzcuMTY1TDE4NC4yMzYgMTc4LjIwM1pNMzAzLjY2NiAxNTMuNDY0TDMwNC4zMTcgMTU0LjgxNUwzNDkuNDA2IDEzMy4xMDFMMzQ4Ljc1NSAxMzEuNzVMMzQ4LjEwNSAxMzAuMzk4TDMwMy4wMTUgMTUyLjExMkwzMDMuNjY2IDE1My40NjRaTTM0OC43NTUgMTMxLjc1TDM0OS42NTggMTMwLjU1MkMzNDEuNDYyIDEyNC4zNzQgMzMwLjkzIDExNy43MDggMzE4LjgxNyAxMTMuMDE1TDMxOC4yNzUgMTE0LjQxNEwzMTcuNzMzIDExNS44MTNDMzI5LjUxMyAxMjAuMzc2IDMzOS44MDIgMTI2Ljg4IDM0Ny44NTMgMTMyLjk0OEwzNDguNzU1IDEzMS43NVpNMzE4LjI3NSAxMTQuNDE0TDMxOC44NjcgMTEzLjAzNkMyNjQuMjk5IDg5LjYxNzggMTk4Ljk4NCAxMDEuMjgxIDE1NC42NTMgMTQ3LjQ3N0wxNTUuNzM1IDE0OC41MTZMMTU2LjgxOCAxNDkuNTU0QzIwMC4yNzYgMTA0LjI2NyAyNjQuMjU1IDkyLjg2MzYgMzE3LjY4MyAxMTUuNzkzTDMxOC4yNzUgMTE0LjQxNFpNMTU1LjczNSAxNDguNTE2TDE1NC42NTMgMTQ3LjQ3OEMxMTIuMDIgMTkxLjkzOSA5OC42Mjc5IDI2MC4yNjUgMTIxLjY0MSAzMTguNTc4TDEyMy4wMzYgMzE4LjAyN0wxMjQuNDMyIDMxNy40NzdDMTAxLjg0NCAyNjAuMjQyIDExNS4wMDYgMTkzLjE1OSAxNTYuODE4IDE0OS41NTRMMTU1LjczNSAxNDguNTE2Wk0xMjMuMDM2IDMxOC4wMjdMMTIxLjY0MSAzMTguNTc4QzEyOS45OCAzMzkuNzE3IDEyNy4zMjYgMzU3LjcwNCAxMTkuMTIgMzc0LjI2N0MxMTAuODY1IDM5MC45MjggOTcuMDEzNCA0MDYuMTExIDgyLjkxNDggNDIxLjU2NEw4NC4wMjI5IDQyMi41NzVMODUuMTMxIDQyMy41ODZDOTkuMTU3NiA0MDguMjEyIDExMy4zMjkgMzkyLjcxMSAxMjEuODA4IDM3NS41OTlDMTMwLjMzNSAzNTguMzg5IDEzMy4xMjUgMzM5LjUxNiAxMjQuNDMyIDMxNy40NzdMMTIzLjAzNiAzMTguMDI3Wk04NC4wMjI5IDQyMi41NzVMODIuOTE0NiA0MjEuNTY0QzcyLjk2MzMgNDMyLjQ3NSA2Mi44OTExIDQ0My40NzggNTQuNzY5IDQ1NS4xNDNMNTYgNDU2TDU3LjIzMSA0NTYuODU3QzY1LjIxOTUgNDQ1LjM4NCA3NS4xNDkgNDM0LjUzMSA4NS4xMzEyIDQyMy41ODZMODQuMDIyOSA0MjIuNTc1Wk01NiA0NTZMNTcuMDIyNSA0NTcuMDk4TDE4NC4wMyAzMzguNzc0TDE4My4wMDcgMzM3LjY3N0wxODEuOTg1IDMzNi41NzlMNTQuOTc3NSA0NTQuOTAyTDU2IDQ1NlpNNDAwLjk3OCAxMTMuMjA0TDM5OS44OTMgMTEyLjE2OEwyMDkuMzY1IDMxMS43NTlMMjEwLjQ1IDMxMi43OTRMMjExLjUzNSAzMTMuODNMNDAyLjA2MyAxMTQuMjRMNDAwLjk3OCAxMTMuMjA0WiIgZmlsbD0iI0ZDRkNGQyIgbWFzaz0idXJsKCNwYXRoLTMtaW5zaWRlLTFfMzA0XzExMSkiLz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8zMDRfMTExIiB4PSItMjQiIHk9Ii0yMiIgd2lkdGg9IjU2MCIgaGVpZ2h0PSI1NjAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU9mZnNldCBkeT0iMiIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMTYgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd18zMDRfMTExIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93XzMwNF8xMTEiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxjbGlwUGF0aCBpZD0iYmdibHVyXzFfMzA0XzExMV9jbGlwX3BhdGgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0IDIyKSI+PHBhdGggZD0iTTAgMjU2QzAgMTY2LjM5MiAwIDEyMS41ODcgMTcuNDM5IDg3LjM2MTVDMzIuNzc4NyA1Ny4yNTU2IDU3LjI1NTYgMzIuNzc4NyA4Ny4zNjE1IDE3LjQzOUMxMjEuNTg3IDAgMTY2LjM5MiAwIDI1NiAwQzM0NS42MDggMCAzOTAuNDEzIDAgNDI0LjYzOCAxNy40MzlDNDU0Ljc0NCAzMi43Nzg3IDQ3OS4yMjEgNTcuMjU1NiA0OTQuNTYxIDg3LjM2MTVDNTEyIDEyMS41ODcgNTEyIDE2Ni4zOTIgNTEyIDI1NkM1MTIgMzQ1LjYwOCA1MTIgMzkwLjQxMyA0OTQuNTYxIDQyNC42MzhDNDc5LjIyMSA0NTQuNzQ0IDQ1NC43NDQgNDc5LjIyMSA0MjQuNjM4IDQ5NC41NjFDMzkwLjQxMyA1MTIgMzQ1LjYwOCA1MTIgMjU2IDUxMkMxNjYuMzkyIDUxMiAxMjEuNTg3IDUxMiA4Ny4zNjE1IDQ5NC41NjFDNTcuMjU1NiA0NzkuMjIxIDMyLjc3ODcgNDU0Ljc0NCAxNy40MzkgNDI0LjYzOEMwIDM5MC40MTMgMCAzNDUuNjA4IDAgMjU2WiIvPgo8L2NsaXBQYXRoPjxjbGlwUGF0aCBpZD0iY2xpcDBfMzA0XzExMSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=",
|
|
17
|
+
},
|
|
2
18
|
context7: {
|
|
3
19
|
mime: "image/vnd.microsoft.icon",
|
|
4
20
|
data: "iVBORw0KGgoAAAANSUhEUgAAAEoAAABLCAYAAADXjBHUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaWlDQ1BEaXNwbGF5IFAzAAB4nHWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OHnlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYYilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXzryPO7RqFn4Er/QcXKWq8MSlPPgAABA5JREFUeAHtmzFME2EUgB+GQXCgGCSBpeiICRjERROKoYtG4kANC6kDasLCAgNLO+BcBxgYxIHiZhkgRJcahcgmJB1k1HaBBBLtomHTezXVu/+u9N3de03Q9yUM/cPlb7/+79279/9tap4bfwdKXZqtv2FQ6nIOFBIqioiKIqKiiKgoIiqKiIoioqKIqCgiKoqIiiKioog0Q0hil3th+cEU+GX78z5M5pZ8XZObmIX+7ij4JbGagcJhEcIQWhTS034J/FIKcE2kpTXQXHhdWDT0iKgoIqFDr3BYguK3Y0dIlKzXK7tbp16H/+OX7N4WbFm57TSS12Ou9xJkLpPQoson3+GRlZTzj9N/xqLWGy2f/IDFndfASbaO/NRIwpXDxl5mKl9kWFhCD7/lmc2sY+zZvSTErvRCo+jv7oF0POEYe/o2B4WDInDAlqMWrNVjhsWLxBREzl8AaXCO3MSMY2x9/yPM53PABWsyx7oIQ64KhmAqPgbS4BxmyM1urgAnrKIwaS58cOal6Vt3ob+rB6TALwPnsIMhx5GX7LCXB4s7bxyrCslY+UqK9EjCNVYv6QeBXRTeBbO77x1jmNQlVhWuJiwH7KAk7tWEiBScG1YiNUkODAE3nqtpj381ISKiCgclV/glB4eBmyGP8qNeQRoUEVEYfqWvR46xyPlW1roKuxbmnU5KEiL2rIePNiZ9jHmqzyowTUoCuamKmCivhHqty38vqRa4oihzciEmqlR2v+kgTbdaePWYzuSK8oLzcSYaoIEXhoaKamvhExVpkX+GtNPUPDf+E5S6aIeTiIoioqKIqCgiKooIywaoF1jneFXPXE/3yYGYa2z7y75YdS4mCh+AsWduBytnLlGpuHvHZfLVkiXqDLVZ/kXERLV5PK5whgX2vFxzClbrYqJ62jtcY1x7bEipfOSeM9IBUoiJikY6XWOYbLnw6ndFL3aCFGKivFoqXh8uKBuf3H15zn6XiYgoLA282rScOQrbzWbrtzJvRKb9IiLKqzcusde27rHbM3r1BkggImr65h3Ha876yc6qJd/c7bnfOwgSsIvCarzfaPxzHpawg+FnbuHjapY4RcMuytw+l1pNVXAL38x9KY+N0bCwisLt7UatpirVg2x2cEV5PQuGgU1U5YiP8U3iiTvJ1VQF737m6b7M6MNAJ4hrwSZqbWLGdXZyPr8GjQLnsocg7kwvJ/yff68FiyhcSfaQQ0nx5/OVsGgUONfvOf/eBTEEuY4chd6Fwbtc/kna93UYLvjB/IAHaoPc0QYX5kL/cuG/aLPoLxcaiIoiEroVXCwfB6qVpH65wDWXiW6pE9HQI6KiiKgoIiqKiIoioqKIqCgiKoqIiiKiooioKCIqiojVPWi6DUpdfgE8wFukKedIwQAAAABJRU5ErkJggg==",
|
|
@@ -7,11 +7,21 @@ export interface ListReviewCommentsParams {
|
|
|
7
7
|
includeResolved?: boolean;
|
|
8
8
|
includeDeleted?: boolean;
|
|
9
9
|
targetId?: string | null;
|
|
10
|
+
/** One surface's comments, or `null` for those on no surface. */
|
|
11
|
+
surfaceId?: string | null;
|
|
10
12
|
newestFirst?: boolean;
|
|
11
13
|
limit?: number;
|
|
14
|
+
/** The `nextCursor` from the previous page. */
|
|
15
|
+
cursor?: string;
|
|
12
16
|
}
|
|
13
17
|
export interface ListReviewCommentsResult {
|
|
14
18
|
comments: ReviewComment[];
|
|
19
|
+
/**
|
|
20
|
+
* Oldest first: the next page's cursor, to pass back as `cursor`, or null on
|
|
21
|
+
* the last page. A newest-first list isn't paged and leaves it out; its
|
|
22
|
+
* `summary` still counts every open thread.
|
|
23
|
+
*/
|
|
24
|
+
nextCursor?: string | null;
|
|
15
25
|
discussion: ReviewDiscussionState;
|
|
16
26
|
reviewStatus: ReviewStatusEntry | null;
|
|
17
27
|
summary: {
|
|
@@ -32,8 +42,11 @@ export interface CreateReviewCommentInput {
|
|
|
32
42
|
resourceType: string;
|
|
33
43
|
resourceId: string;
|
|
34
44
|
targetId?: string | null;
|
|
45
|
+
surfaceId?: string | null;
|
|
35
46
|
kind?: ReviewCommentKind;
|
|
36
47
|
anchor?: unknown;
|
|
48
|
+
anchorKind?: string | null;
|
|
49
|
+
anchorVersion?: number | null;
|
|
37
50
|
body: string;
|
|
38
51
|
authorName?: string | null;
|
|
39
52
|
resolutionTarget?: ReviewResolutionTarget | null;
|
|
@@ -120,7 +133,11 @@ export interface UpdateReviewCommentInput {
|
|
|
120
133
|
commentId: string;
|
|
121
134
|
body?: string;
|
|
122
135
|
anchor?: unknown;
|
|
136
|
+
anchorKind?: string | null;
|
|
137
|
+
anchorVersion?: number | null;
|
|
123
138
|
mentions?: ReviewMention[];
|
|
139
|
+
/** Refuse the edit if the comment changed since this revision. */
|
|
140
|
+
expectedRevision?: number;
|
|
124
141
|
}
|
|
125
142
|
export interface ConsumeReviewFeedbackInput {
|
|
126
143
|
resourceType: string;
|
|
@@ -236,6 +253,17 @@ export declare class ReviewOptimisticCache {
|
|
|
236
253
|
* its first comment, so the cache does the same.
|
|
237
254
|
*/
|
|
238
255
|
export declare function markCommentDeleted(comments: ReviewComment[], commentId: string): ReviewComment[];
|
|
256
|
+
/**
|
|
257
|
+
* Adds a new comment to a cached list. Oldest first, it lists last, so a page
|
|
258
|
+
* with more after it is left alone; the comment shows on the last page.
|
|
259
|
+
*/
|
|
260
|
+
export declare function addOptimisticComment(data: unknown, params: unknown, comment: ReviewComment): unknown;
|
|
261
|
+
/**
|
|
262
|
+
* Adds a reply to a cached list that holds its parent. Oldest first, a new
|
|
263
|
+
* reply lists after every comment there is, so like a new comment it goes
|
|
264
|
+
* only on the last page.
|
|
265
|
+
*/
|
|
266
|
+
export declare function addOptimisticReply(data: unknown, params: unknown, parentId: string, reply: (parent: ReviewComment) => ReviewComment): unknown;
|
|
239
267
|
export declare function insertOptimisticComment(comments: ReviewComment[], comment: ReviewComment, params: unknown): ReviewComment[];
|
|
240
268
|
export declare function replaceOptimisticSuggestion(suggestions: ResourceSuggestion[], optimisticId: string, result: ResourceSuggestion): ResourceSuggestion[];
|
|
241
269
|
export declare function reconcileSuggestionAmendment(suggestions: ResourceSuggestion[], saved: ResourceSuggestion): ResourceSuggestion[];
|
|
@@ -256,6 +256,9 @@ function matchesCommentQuery(params, comment) {
|
|
|
256
256
|
const query = params;
|
|
257
257
|
if (query.targetId !== undefined && query.targetId !== comment.targetId)
|
|
258
258
|
return false;
|
|
259
|
+
if (query.surfaceId !== undefined &&
|
|
260
|
+
query.surfaceId !== (comment.surfaceId ?? null))
|
|
261
|
+
return false;
|
|
259
262
|
if (comment.status === "resolved" && !query.includeResolved)
|
|
260
263
|
return false;
|
|
261
264
|
if (comment.status === "deleted" && !query.includeDeleted)
|
|
@@ -274,9 +277,16 @@ function optimisticComment(input, id, parent) {
|
|
|
274
277
|
parentCommentId: parent?.id ?? null,
|
|
275
278
|
targetId: parent?.targetId ??
|
|
276
279
|
("targetId" in input ? (input.targetId ?? null) : null),
|
|
280
|
+
surfaceId: parent?.surfaceId ??
|
|
281
|
+
("surfaceId" in input ? (input.surfaceId ?? null) : null),
|
|
277
282
|
kind: parent?.kind ?? ("kind" in input ? (input.kind ?? "comment") : "comment"),
|
|
278
283
|
status: "open",
|
|
279
284
|
anchor: parent?.anchor ?? ("anchor" in input ? (input.anchor ?? null) : null),
|
|
285
|
+
anchorKind: parent?.anchorKind ??
|
|
286
|
+
("anchorKind" in input ? (input.anchorKind ?? null) : null),
|
|
287
|
+
anchorVersion: parent?.anchorVersion ??
|
|
288
|
+
("anchorVersion" in input ? (input.anchorVersion ?? null) : null),
|
|
289
|
+
revision: 1,
|
|
280
290
|
body: input.body,
|
|
281
291
|
authorEmail: null,
|
|
282
292
|
authorName: input.authorName ?? null,
|
|
@@ -300,6 +310,35 @@ function optimisticComment(input, id, parent) {
|
|
|
300
310
|
function replaceComment(comments, previousId, replacement) {
|
|
301
311
|
return comments.map((comment) => comment.id === previousId ? replacement : comment);
|
|
302
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Adds a new comment to a cached list. Oldest first, it lists last, so a page
|
|
315
|
+
* with more after it is left alone; the comment shows on the last page.
|
|
316
|
+
*/
|
|
317
|
+
export function addOptimisticComment(data, params, comment) {
|
|
318
|
+
if (!matchesCommentQuery(params, comment))
|
|
319
|
+
return data;
|
|
320
|
+
if (isReviewCommentsResult(data) && data.nextCursor)
|
|
321
|
+
return data;
|
|
322
|
+
return updateComments(data, (comments) => insertOptimisticComment(comments, comment, params));
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Adds a reply to a cached list that holds its parent. Oldest first, a new
|
|
326
|
+
* reply lists after every comment there is, so like a new comment it goes
|
|
327
|
+
* only on the last page.
|
|
328
|
+
*/
|
|
329
|
+
export function addOptimisticReply(data, params, parentId, reply) {
|
|
330
|
+
if (isReviewCommentsResult(data) && data.nextCursor)
|
|
331
|
+
return data;
|
|
332
|
+
return updateComments(data, (comments) => {
|
|
333
|
+
const parent = comments.find((comment) => comment.id === parentId);
|
|
334
|
+
if (!parent)
|
|
335
|
+
return comments;
|
|
336
|
+
const next = reply(parent);
|
|
337
|
+
return matchesCommentQuery(params, next)
|
|
338
|
+
? insertOptimisticComment(comments, next, params)
|
|
339
|
+
: comments;
|
|
340
|
+
});
|
|
341
|
+
}
|
|
303
342
|
export function insertOptimisticComment(comments, comment, params) {
|
|
304
343
|
if (comments.some((item) => item.id === comment.id))
|
|
305
344
|
return comments;
|
|
@@ -430,9 +469,7 @@ export function useCreateReviewComment() {
|
|
|
430
469
|
return {
|
|
431
470
|
action: "list-review-comments",
|
|
432
471
|
resource: input,
|
|
433
|
-
transform: (data, params) =>
|
|
434
|
-
? updateComments(data, (comments) => insertOptimisticComment(comments, comment, params))
|
|
435
|
-
: data,
|
|
472
|
+
transform: (data, params) => addOptimisticComment(data, params, comment),
|
|
436
473
|
onSuccess: (result) => (data) => updateComments(data, (comments) => replaceComment(comments, id, result)),
|
|
437
474
|
};
|
|
438
475
|
});
|
|
@@ -443,15 +480,7 @@ export function useReplyReviewComment() {
|
|
|
443
480
|
return {
|
|
444
481
|
action: "list-review-comments",
|
|
445
482
|
resource: input,
|
|
446
|
-
transform: (data, params) =>
|
|
447
|
-
const parent = comments.find((comment) => comment.id === input.commentId);
|
|
448
|
-
if (!parent)
|
|
449
|
-
return comments;
|
|
450
|
-
const reply = optimisticComment(input, id, parent);
|
|
451
|
-
return matchesCommentQuery(params, reply)
|
|
452
|
-
? insertOptimisticComment(comments, reply, params)
|
|
453
|
-
: comments;
|
|
454
|
-
}),
|
|
483
|
+
transform: (data, params) => addOptimisticReply(data, params, input.commentId, (parent) => optimisticComment(input, id, parent)),
|
|
455
484
|
onSuccess: (result) => (data) => updateComments(data, (comments) => replaceComment(comments, id, result)),
|
|
456
485
|
};
|
|
457
486
|
});
|
|
@@ -4,6 +4,7 @@ import { useLocation, useNavigate, } from "react-router";
|
|
|
4
4
|
import { isWorkspaceAppPath } from "./api-path.js";
|
|
5
5
|
import { deleteClientAppState, readClientAppState, setClientAppState, } from "./application-state.js";
|
|
6
6
|
import { getBrowserTabId, isBrowserTabIdForCurrentDocument, } from "./browser-tab-id.js";
|
|
7
|
+
import { useBrowserTabUse } from "./browser-tab-use.js";
|
|
7
8
|
import { navigateWithAgentChatViewTransition, } from "./chat-view-transition.js";
|
|
8
9
|
import { postAgentNativeWorkspaceAppRoute } from "./workspace-app-navigation.js";
|
|
9
10
|
const SAFE_BROWSER_TAB_ID_RE = /^[A-Za-z0-9_-]{1,96}$/;
|
|
@@ -220,6 +221,7 @@ export function useAgentRouteState(options) {
|
|
|
220
221
|
return;
|
|
221
222
|
postAgentNativeWorkspaceAppRoute(`${location.pathname}${location.search}${location.hash}`);
|
|
222
223
|
}, [location.hash, location.pathname, location.search, options.enabled]);
|
|
224
|
+
useBrowserTabUse(`${location.pathname}${location.search}`, options.enabled !== false);
|
|
223
225
|
const navigationKeys = useMemo(() => {
|
|
224
226
|
const scopedKey = appStateKeyForBrowserTab(navigationKey, browserTabId);
|
|
225
227
|
const keys = [scopedKey];
|
|
@@ -327,6 +327,7 @@ export declare function isDurableProgressEvent(ev: SSEEvent, actionPreparationPr
|
|
|
327
327
|
* how a call looks when an older server omitted the id on `tool_start`.
|
|
328
328
|
*/
|
|
329
329
|
export declare function findApprovalToolCallIndex(content: readonly ContentPart[], toolName: string, toolCallId?: string, approvalInput?: unknown): number;
|
|
330
|
+
export declare function hasFailedOrUnknownToolResult(content: ContentPart[]): boolean;
|
|
330
331
|
export declare function appendMissingFinalResponseWarning(content: ContentPart[], completedToolNames?: Iterable<string>): {
|
|
331
332
|
message: string;
|
|
332
333
|
errorCode: string;
|
|
@@ -963,6 +963,10 @@ function hasCompletedUserFacingToolOutput(content) {
|
|
|
963
963
|
}
|
|
964
964
|
return hasCompletedTool && lastCompletedToolIsUserFacing;
|
|
965
965
|
}
|
|
966
|
+
export function hasFailedOrUnknownToolResult(content) {
|
|
967
|
+
return content.some((part) => part.type === "tool-call" &&
|
|
968
|
+
(part.isError === true || part.outcome === "unknown"));
|
|
969
|
+
}
|
|
966
970
|
export function appendMissingFinalResponseWarning(content, completedToolNames) {
|
|
967
971
|
if (content.some((part) => isToolCallActive(part)))
|
|
968
972
|
return null;
|
|
@@ -1846,7 +1850,9 @@ export function processEvent(ev, content, toolCallCounter, tabId, state, context
|
|
|
1846
1850
|
},
|
|
1847
1851
|
};
|
|
1848
1852
|
}
|
|
1849
|
-
const runWarning =
|
|
1853
|
+
const runWarning = ev.reason === "action_settled" && !hasFailedOrUnknownToolResult(content)
|
|
1854
|
+
? null
|
|
1855
|
+
: appendMissingFinalResponseWarning(content, state ? state.completedToolsAfterLastAssistantText : undefined);
|
|
1850
1856
|
if (runWarning) {
|
|
1851
1857
|
return {
|
|
1852
1858
|
action: "done",
|
|
@@ -53,9 +53,16 @@ export type SyncEvent = {
|
|
|
53
53
|
requestSource?: string;
|
|
54
54
|
[k: string]: unknown;
|
|
55
55
|
};
|
|
56
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* What a logged sync invalidation asked: a key prefix, a predicate the query
|
|
58
|
+
* itself must pass, both, or neither for every query. A reader with no query
|
|
59
|
+
* to ask the predicate of takes it as reaching every query.
|
|
60
|
+
*/
|
|
57
61
|
export type SyncInvalidationFilters = {
|
|
58
62
|
queryKey?: readonly unknown[];
|
|
63
|
+
predicate?: (query: {
|
|
64
|
+
queryKey: readonly unknown[];
|
|
65
|
+
}) => boolean;
|
|
59
66
|
};
|
|
60
67
|
/**
|
|
61
68
|
* The invalidations sync has asked of `queryClient` for changes after
|
|
@@ -247,13 +247,14 @@ function logSyncInvalidations(queryClient, events, filters) {
|
|
|
247
247
|
const after = local ? "local" : (cursorForEvents(events) ?? "local");
|
|
248
248
|
const log = syncInvalidationLog(queryClient);
|
|
249
249
|
for (const requested of filters) {
|
|
250
|
-
// A predicate decides by the query itself, so it is kept
|
|
251
|
-
//
|
|
250
|
+
// A predicate decides by the query itself, so it is kept for the reader
|
|
251
|
+
// to ask of the query it holds.
|
|
252
252
|
log.entries.push({
|
|
253
253
|
after,
|
|
254
|
-
filters:
|
|
255
|
-
? { queryKey: requested.queryKey }
|
|
256
|
-
: {},
|
|
254
|
+
filters: {
|
|
255
|
+
...(requested.queryKey ? { queryKey: requested.queryKey } : {}),
|
|
256
|
+
...(requested.predicate ? { predicate: requested.predicate } : {}),
|
|
257
|
+
},
|
|
257
258
|
});
|
|
258
259
|
}
|
|
259
260
|
while (log.entries.length > SYNC_INVALIDATION_LOG_LIMIT) {
|