@k2b/cloud 0.39.0 → 0.41.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/README.md +8 -0
- package/package.json +11 -4
- package/src/_internal/app-favicon.ts +4 -2
- package/src/_internal/capabilities.ts +72 -48
- package/src/_internal/capability-reviews.ts +81 -0
- package/src/_internal/capability-schemas.ts +29 -0
- package/src/_internal/capability-sentences.ts +217 -1
- package/src/_internal/capability-streams.ts +7 -0
- package/src/_internal/define-app.ts +49 -18
- package/src/_internal/font-preloads.ts +2 -1
- package/src/_internal/heartbeat.ts +203 -14
- package/src/_internal/registry.ts +28 -1
- package/src/_internal/runtime-watcher.ts +6 -0
- package/src/_internal/setup-lock.ts +103 -0
- package/src/_internal/static-assets.ts +52 -3
- package/src/_internal/status-preserving-ssr.ts +2 -0
- package/src/access/PermissionEditor.tsx +2 -2
- package/src/account/EntitySearch.tsx +1 -1
- package/src/ai/action-review.ts +101 -0
- package/src/ai/background-review.ts +72 -0
- package/src/ai/capabilities.ts +29 -11
- package/src/ai/capability-execution.ts +76 -43
- package/src/ai/capability-result.ts +95 -0
- package/src/ai/chat/action-card.ts +464 -0
- package/src/ai/chat/action-messages.ts +129 -0
- package/src/ai/chat/action-question.browser-harness.tsx +245 -0
- package/src/ai/chat/action-question.fixtures.ts +733 -0
- package/src/ai/chat/action-question.tsx +680 -0
- package/src/ai/chat/action-text.ts +288 -0
- package/src/ai/chat/blocks.tsx +19 -25
- package/src/ai/chat/message-actions.tsx +6 -0
- package/src/ai/chat/tool-action-words.ts +31 -0
- package/src/ai/chat/tool-action.tsx +456 -0
- package/src/ai/chat/turn-view.tsx +10 -160
- package/src/ai/chat/view-block.tsx +15 -5
- package/src/ai/chat-task-contracts.ts +4 -1
- package/src/ai/chat-task-reasons-migrate.ts +7 -0
- package/src/ai/chat-task-reasons.ts +1 -1
- package/src/ai/chat-tasks.ts +55 -25
- package/src/ai/client/controller.ts +59 -0
- package/src/ai/default-tools.ts +9 -1
- package/src/ai/executor.ts +198 -39
- package/src/ai/firecrawl-tools.ts +15 -2
- package/src/ai/index.ts +3 -0
- package/src/ai/migrate.ts +26 -2
- package/src/ai/open-questions.ts +172 -0
- package/src/ai/projects-routes.ts +3 -0
- package/src/ai/protocol.ts +14 -2
- package/src/ai/question-text.ts +8 -0
- package/src/ai/recent-resources.ts +240 -0
- package/src/ai/recent-sent-refs.ts +38 -0
- package/src/ai/routes.ts +195 -5
- package/src/ai/runtime.ts +1 -0
- package/src/ai/skills-routes.ts +3 -0
- package/src/ai/skills.ts +10 -1
- package/src/ai/store.ts +245 -24
- package/src/ai/testing.ts +36 -0
- package/src/ai/tool-audit.ts +8 -0
- package/src/ai/tool-sentences.ts +152 -34
- package/src/ai/tool-wording.ts +36 -8
- package/src/ai/tools.ts +8 -3
- package/src/ai/types.ts +43 -4
- package/src/api/accounts-entities.ts +2 -1
- package/src/api/admin-ai-projects.ts +2 -0
- package/src/api/admin-ai-skills.ts +2 -0
- package/src/api/admin-ai-usage.ts +2 -0
- package/src/api/admin-geoip.ts +80 -0
- package/src/api/admin-identity.ts +3 -0
- package/src/api/admin-lifecycle.ts +3 -0
- package/src/api/admin-outgoing-mail.ts +2 -0
- package/src/api/app-approval-actions.ts +31 -7
- package/src/api/app-approval.ts +46 -5
- package/src/api/approvals-loader.ts +23 -1
- package/src/api/approvals.ts +2 -0
- package/src/api/auth/schemas.ts +3 -0
- package/src/api/auth.ts +67 -12
- package/src/api/capabilities.ts +44 -11
- package/src/api/capability-streams.ts +12 -0
- package/src/api/help.ts +4 -28
- package/src/api/index.ts +6 -1
- package/src/api/lasting-access-messages.ts +17 -0
- package/src/api/mcp.ts +30 -3
- package/src/api/me-panel-consent.ts +71 -0
- package/src/api/me.ts +159 -36
- package/src/api/search.ts +3 -1
- package/src/api/sync-ops.ts +2 -0
- package/src/api/widgets.ts +3 -0
- package/src/approvals/Approvals.tsx +166 -262
- package/src/approvals/approval-card.ts +68 -0
- package/src/approvals/messages.ts +12 -24
- package/src/browser/CloudResourceSearch.browser-harness.tsx +10 -2
- package/src/browser/app-approval.ts +54 -5
- package/src/browser/commands.ts +22 -6
- package/src/browser/composer-catalog.ts +45 -3
- package/src/browser/composer-insert.ts +10 -0
- package/src/browser/composer-open-messages.ts +17 -0
- package/src/browser/composer-open.ts +110 -0
- package/src/browser/discoverable-command.ts +6 -0
- package/src/browser/hints.ts +6 -0
- package/src/browser/live-connection.ts +26 -2
- package/src/browser/navigation-apps.ts +7 -0
- package/src/browser/panel-context-bridge.ts +30 -0
- package/src/browser/panel-context-receiver.ts +53 -0
- package/src/browser/panel-menu.tsx +56 -0
- package/src/browser/panel-messages.ts +11 -0
- package/src/browser/panel-shortcuts.ts +31 -0
- package/src/browser/panel-slot.ts +412 -10
- package/src/browser/panel.ts +37 -0
- package/src/browser/search-commands.ts +6 -3
- package/src/capabilities/client.ts +8 -2
- package/src/capabilities/reviews.ts +205 -0
- package/src/capabilities/server.ts +10 -3
- package/src/capabilities/testing.ts +47 -0
- package/src/capabilities/types.ts +2 -2
- package/src/cli/account.ts +13 -3
- package/src/cli/admin/geoip.ts +115 -0
- package/src/cli/admin/index.ts +3 -0
- package/src/contracts/app-approval.ts +123 -16
- package/src/contracts/approvals.ts +2 -2
- package/src/contracts/capabilities.ts +410 -18
- package/src/contracts/geoip.ts +42 -0
- package/src/contracts/index.ts +3 -0
- package/src/contracts/panel-context-plain.ts +99 -0
- package/src/contracts/panel-context.ts +93 -0
- package/src/contracts/seen-hints.ts +35 -0
- package/src/contracts/shared.ts +3 -0
- package/src/server/client-ip.ts +5 -0
- package/src/server/help-payload.ts +38 -0
- package/src/server/middleware/auth.ts +13 -1
- package/src/server/middleware/middleware.ts +9 -0
- package/src/server/middleware/no-transform.ts +19 -0
- package/src/server/middleware/rate-limit.ts +4 -6
- package/src/server/request-context/address.ts +45 -0
- package/src/server/request-context/geoip.ts +380 -0
- package/src/server/request-context/index.ts +33 -0
- package/src/server/request-context/user-agent.ts +95 -0
- package/src/services/accounts/app.ts +23 -3
- package/src/services/accounts/users.ts +12 -1
- package/src/services/app-approval.ts +382 -59
- package/src/services/approvals/device.ts +49 -31
- package/src/services/approvals/index.ts +7 -5
- package/src/services/approvals/list.ts +27 -6
- package/src/services/approvals/question.ts +68 -0
- package/src/services/audit/index.ts +1 -0
- package/src/services/auth-flows/ipa.ts +39 -2
- package/src/services/auth-flows/notification-sender.ts +3 -0
- package/src/services/auth-flows/password-reset.ts +32 -6
- package/src/services/geoip/index.ts +164 -0
- package/src/services/geoip/store.ts +30 -0
- package/src/services/geoip/upload.ts +150 -0
- package/src/services/identity/routes.ts +5 -1
- package/src/services/index.ts +13 -0
- package/src/services/known-browsers.ts +312 -0
- package/src/services/login-address-store.ts +51 -0
- package/src/services/login-context.ts +118 -0
- package/src/services/mandates/index.ts +3 -0
- package/src/services/mandates/policy.ts +15 -3
- package/src/services/notifications/email-frame.ts +1 -1
- package/src/services/oauth-tokens.ts +16 -2
- package/src/services/panel-context-consent.ts +58 -0
- package/src/services/pdf/markdown.ts +160 -2
- package/src/services/service-account-credentials.ts +21 -0
- package/src/services/session/index.ts +296 -41
- package/src/services/session/recent.ts +13 -0
- package/src/services/webauthn.ts +12 -0
- package/src/shared/email-html.ts +2 -0
- package/src/shared/help.ts +3 -0
- package/src/shared-text/cursor.ts +22 -0
- package/src/shared-text/documents.ts +142 -0
- package/src/shared-text/events.ts +43 -0
- package/src/shared-text/index.ts +12 -0
- package/src/shared-text/log.ts +48 -0
- package/src/shared-text/text-diff.ts +23 -0
- package/src/shared-text/types.ts +41 -0
- package/src/ssr/AdminLayout.tsx +2 -0
- package/src/ssr/AppLaunchpadPanel.tsx +2 -2
- package/src/ssr/CloudShell.island.tsx +10 -2
- package/src/ssr/HelpPanelArticle.island.tsx +308 -0
- package/src/ssr/HelpPanelBack.island.tsx +32 -0
- package/src/ssr/HelpPanelMenu.island.tsx +133 -0
- package/src/ssr/HelpPanelSearch.island.tsx +123 -0
- package/src/ssr/HelpPanelShortcuts.island.tsx +22 -0
- package/src/ssr/HelpPanelView.island.tsx +27 -0
- package/src/ssr/Layout.tsx +25 -2
- package/src/ssr/LayoutHelp.browser-harness.tsx +2 -0
- package/src/ssr/LayoutHelp.tsx +222 -419
- package/src/ssr/LayoutHelpPanel.browser-harness.tsx +135 -0
- package/src/ssr/LayoutHelpPanel.server.browser-harness.tsx +131 -0
- package/src/ssr/LayoutHelpPanel.server.tsx +115 -0
- package/src/ssr/LayoutHelpTrigger.tsx +27 -2
- package/src/ssr/MobileNavigation.tsx +2 -2
- package/src/ssr/PanelLayout.tsx +9 -1
- package/src/ssr/PanelRuntime.island.tsx +7 -0
- package/src/ssr/PanelSlot.tsx +53 -3
- package/src/ssr/ShellRuntime.island.tsx +11 -2
- package/src/ssr/__snapshots__/LayoutHelp.ssr.render.test.tsx.snap +29 -0
- package/src/ssr/app-color.ts +14 -9
- package/src/ssr/app-navigation.ts +16 -3
- package/src/ssr/compact-shell.browser-harness.ts +30 -22
- package/src/ssr/dialog-app-colors.browser-harness.tsx +43 -0
- package/src/ssr/help-messages.ts +4 -0
- package/src/ssr/help.ts +21 -0
- package/src/ssr/hints.ts +25 -0
- package/src/ssr/index.ts +3 -0
- package/src/ssr/layout-context.ts +2 -0
- package/src/ssr/layout-help-article.server.ts +50 -0
- package/src/ssr/layout-help-panel-controls.tsx +43 -0
- package/src/ssr/layout-help-panel-document.ts +67 -0
- package/src/ssr/layout-help-panel-lifecycle.ts +32 -0
- package/src/ssr/layout-help-panel-menu.tsx +113 -0
- package/src/ssr/layout-help-panel-modules.ts +7 -0
- package/src/ssr/layout-help-panel-reader.tsx +159 -0
- package/src/ssr/layout-help-panel-search.tsx +69 -0
- package/src/ssr/layout-help-panel-shortcuts.ts +7 -0
- package/src/ssr/layout-help-panel-state.ts +141 -0
- package/src/ssr/layout-help-panel-types.ts +19 -0
- package/src/ssr/layout-help-start.ts +33 -7
- package/src/ssr/layout-help-views.tsx +484 -0
- package/src/ssr/panel-consent.ts +29 -0
- package/src/ssr/panel-context.ts +10 -0
- package/src/ssr/panel-idle.ts +9 -0
- package/src/ssr/panel-slot.browser-harness.tsx +53 -4
- package/src/ssr/platform-messages.ts +18 -0
- package/src/ssr/shell-data.tsx +2 -1
- package/src/styles/approvals.css +6 -0
- package/src/styles/effects.css +213 -9
- package/src/styles/file-chooser.css +2 -1
- package/src/styles/global.css +49 -12
- package/src/styles/panel.css +47 -4
- package/src/styles/resource-search.css +6 -2
- package/src/styles/tokens.css +17 -11
- package/src/styles/utilities-buttons.css +3 -2
- package/src/styles/utilities-data.css +2 -1
- package/src/styles/utilities-feedback.css +2 -2
- package/src/styles/utilities-layout.css +3 -13
- package/src/styles/utilities-markdown-editor.css +6 -6
- package/src/styles/utilities-navigation.css +17 -22
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { isPanelContextMessage } from "../contracts/panel-context-plain";
|
|
2
|
+
import {
|
|
3
|
+
PANEL_CONTEXT_CHANGED,
|
|
4
|
+
PANEL_CONTEXT_ELEMENT,
|
|
5
|
+
PANEL_SHORTCUTS_CHANGED,
|
|
6
|
+
PANEL_SHORTCUTS_ELEMENT,
|
|
7
|
+
readProviderContext,
|
|
8
|
+
} from "./panel-context-bridge";
|
|
9
|
+
|
|
10
|
+
/** Installed only by an embedded PanelRuntime; the public page publisher never imports validation. */
|
|
11
|
+
export function installPanelContextReceiver(): () => void {
|
|
12
|
+
let element = document.getElementById(PANEL_CONTEXT_ELEMENT);
|
|
13
|
+
if (!element) {
|
|
14
|
+
element = document.createElement("script");
|
|
15
|
+
element.id = PANEL_CONTEXT_ELEMENT;
|
|
16
|
+
element.setAttribute("type", "application/json");
|
|
17
|
+
element.textContent = "null";
|
|
18
|
+
document.body.append(element);
|
|
19
|
+
}
|
|
20
|
+
let shortcutsElement = document.getElementById(PANEL_SHORTCUTS_ELEMENT);
|
|
21
|
+
if (!shortcutsElement) {
|
|
22
|
+
shortcutsElement = document.createElement("script");
|
|
23
|
+
shortcutsElement.id = PANEL_SHORTCUTS_ELEMENT;
|
|
24
|
+
shortcutsElement.setAttribute("type", "application/json");
|
|
25
|
+
shortcutsElement.textContent = "[]";
|
|
26
|
+
document.body.append(shortcutsElement);
|
|
27
|
+
}
|
|
28
|
+
const first = readProviderContext();
|
|
29
|
+
let pageId = first?.pageId;
|
|
30
|
+
let seq = first?.seq ?? 0;
|
|
31
|
+
const receive = (event: MessageEvent<unknown>) => {
|
|
32
|
+
if (event.source !== window.parent || event.origin !== location.origin || !isPanelContextMessage(event.data)) return;
|
|
33
|
+
const context = event.data.context;
|
|
34
|
+
if (context) {
|
|
35
|
+
if ((pageId !== undefined && context.pageId !== pageId) || context.seq < seq) return;
|
|
36
|
+
pageId = context.pageId;
|
|
37
|
+
seq = context.seq;
|
|
38
|
+
}
|
|
39
|
+
// Null revokes the current context without forgetting document identity or ordering.
|
|
40
|
+
const contextJson = JSON.stringify(context);
|
|
41
|
+
const contextChanged = element.textContent !== contextJson;
|
|
42
|
+
element.textContent = contextJson;
|
|
43
|
+
const shortcuts = JSON.stringify(context ? (event.data.shortcuts ?? []) : []);
|
|
44
|
+
const shortcutsChanged = shortcutsElement.textContent !== shortcuts;
|
|
45
|
+
shortcutsElement.textContent = shortcuts;
|
|
46
|
+
// Remember accepted snapshots, including empty ones, across Help remounts.
|
|
47
|
+
shortcutsElement.setAttribute("data-received", "");
|
|
48
|
+
if (shortcutsChanged) window.dispatchEvent(new Event(PANEL_SHORTCUTS_CHANGED));
|
|
49
|
+
if (contextChanged || !shortcutsChanged) window.dispatchEvent(new Event(PANEL_CONTEXT_CHANGED));
|
|
50
|
+
};
|
|
51
|
+
window.addEventListener("message", receive);
|
|
52
|
+
return () => window.removeEventListener("message", receive);
|
|
53
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Dropdown } from "@k2b/ui";
|
|
2
|
+
import { createSignal, onCleanup, onMount } from "solid-js";
|
|
3
|
+
import { platformMessages } from "../ssr/platform-messages";
|
|
4
|
+
import type { PanelState } from "./panel-context-bridge";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The slot head's ⋯ menu for providers that need consent. The lazy slot controller mounts it over the server's
|
|
8
|
+
* placeholder button, so it costs no island and can never change an answer before the controller listens. Only
|
|
9
|
+
* document events cross the menu/controller boundary.
|
|
10
|
+
*/
|
|
11
|
+
export default function PanelMenu(props: { initial: PanelState; locale: string }) {
|
|
12
|
+
const t = () => platformMessages.resolve([props.locale]).t;
|
|
13
|
+
const [state, setState] = createSignal(props.initial);
|
|
14
|
+
const [open, setOpen] = createSignal(false);
|
|
15
|
+
onMount(() => {
|
|
16
|
+
const changed = (event: CustomEvent<PanelState>) => {
|
|
17
|
+
// A closed slot, another provider or one without consent leaves no reason for the menu to stay expanded.
|
|
18
|
+
if (!event.detail.open || event.detail.provider !== state().provider || !event.detail.consent) setOpen(false);
|
|
19
|
+
setState(event.detail);
|
|
20
|
+
};
|
|
21
|
+
window.addEventListener("cloud.panel.state", changed);
|
|
22
|
+
onCleanup(() => window.removeEventListener("cloud.panel.state", changed));
|
|
23
|
+
});
|
|
24
|
+
return (
|
|
25
|
+
<Dropdown.Root
|
|
26
|
+
open={open()}
|
|
27
|
+
onOpenChange={setOpen}
|
|
28
|
+
label={t().panelMenu}
|
|
29
|
+
position="bottom-left"
|
|
30
|
+
items={[
|
|
31
|
+
{
|
|
32
|
+
sectionLabel: t().panelFrom({ app: state().appName }),
|
|
33
|
+
items: [
|
|
34
|
+
{
|
|
35
|
+
label: t().panelShareContext,
|
|
36
|
+
choice: "checkbox",
|
|
37
|
+
// A getter: the menu keeps its rows, so a plain value would show the answer from when it opened.
|
|
38
|
+
checked: () => state().allowed,
|
|
39
|
+
disabled: state().saving,
|
|
40
|
+
action: () =>
|
|
41
|
+
window.dispatchEvent(
|
|
42
|
+
new CustomEvent("cloud.panel.consent", {
|
|
43
|
+
detail: { provider: state().provider, allowed: !state().allowed },
|
|
44
|
+
}),
|
|
45
|
+
),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
]}
|
|
50
|
+
>
|
|
51
|
+
<Dropdown.Trigger iconOnly label={t().panelMenu} disabled={!state().consent}>
|
|
52
|
+
<i class="ti ti-dots" aria-hidden="true" />
|
|
53
|
+
</Dropdown.Trigger>
|
|
54
|
+
</Dropdown.Root>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -14,6 +14,17 @@ export function isPanelReadyMessage(value: unknown, provider: string): value is
|
|
|
14
14
|
);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
export function isPanelSearchMessage(value: unknown): value is { type: "cloud.panel.search"; v: 1 } {
|
|
18
|
+
return (
|
|
19
|
+
isRecord(value) &&
|
|
20
|
+
Reflect.ownKeys(value).length === 2 &&
|
|
21
|
+
Object.hasOwn(value, "type") &&
|
|
22
|
+
Object.hasOwn(value, "v") &&
|
|
23
|
+
value.type === "cloud.panel.search" &&
|
|
24
|
+
value.v === 1
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
17
28
|
export function isPanelCloseMessage(value: unknown): value is { type: "cloud.panel.close"; v?: 1 } {
|
|
18
29
|
return (
|
|
19
30
|
isRecord(value) &&
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isPanelContextMessage } from "../contracts/panel-context-plain";
|
|
2
|
+
import type { HelpShortcut } from "../ssr/layout-help-start";
|
|
3
|
+
import { PANEL_SHORTCUTS_CHANGED, PANEL_SHORTCUTS_ELEMENT, readProviderContext } from "./panel-context-bridge";
|
|
4
|
+
|
|
5
|
+
/** Only platform Help code imports this module; third-party providers never receive a list. */
|
|
6
|
+
export function readPanelShortcuts(): HelpShortcut[] {
|
|
7
|
+
if (typeof document === "undefined") return [];
|
|
8
|
+
try {
|
|
9
|
+
const shortcuts: unknown = JSON.parse(document.getElementById(PANEL_SHORTCUTS_ELEMENT)?.textContent ?? "[]");
|
|
10
|
+
const message = {
|
|
11
|
+
type: "cloud.panel.context",
|
|
12
|
+
v: 1,
|
|
13
|
+
context: readProviderContext(),
|
|
14
|
+
shortcuts,
|
|
15
|
+
};
|
|
16
|
+
return isPanelContextMessage(message) ? (message.shortcuts ?? []) : [];
|
|
17
|
+
} catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function panelShortcutsReceived(): boolean {
|
|
23
|
+
if (typeof document === "undefined") return false;
|
|
24
|
+
return document.getElementById(PANEL_SHORTCUTS_ELEMENT)?.hasAttribute("data-received") ?? false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function onPanelShortcutsChange(cb: (shortcuts: HelpShortcut[]) => void): () => void {
|
|
28
|
+
const changed = () => cb(readPanelShortcuts());
|
|
29
|
+
window.addEventListener(PANEL_SHORTCUTS_CHANGED, changed);
|
|
30
|
+
return () => window.removeEventListener(PANEL_SHORTCUTS_CHANGED, changed);
|
|
31
|
+
}
|