@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.
Files changed (237) hide show
  1. package/README.md +8 -0
  2. package/package.json +11 -4
  3. package/src/_internal/app-favicon.ts +4 -2
  4. package/src/_internal/capabilities.ts +72 -48
  5. package/src/_internal/capability-reviews.ts +81 -0
  6. package/src/_internal/capability-schemas.ts +29 -0
  7. package/src/_internal/capability-sentences.ts +217 -1
  8. package/src/_internal/capability-streams.ts +7 -0
  9. package/src/_internal/define-app.ts +49 -18
  10. package/src/_internal/font-preloads.ts +2 -1
  11. package/src/_internal/heartbeat.ts +203 -14
  12. package/src/_internal/registry.ts +28 -1
  13. package/src/_internal/runtime-watcher.ts +6 -0
  14. package/src/_internal/setup-lock.ts +103 -0
  15. package/src/_internal/static-assets.ts +52 -3
  16. package/src/_internal/status-preserving-ssr.ts +2 -0
  17. package/src/access/PermissionEditor.tsx +2 -2
  18. package/src/account/EntitySearch.tsx +1 -1
  19. package/src/ai/action-review.ts +101 -0
  20. package/src/ai/background-review.ts +72 -0
  21. package/src/ai/capabilities.ts +29 -11
  22. package/src/ai/capability-execution.ts +76 -43
  23. package/src/ai/capability-result.ts +95 -0
  24. package/src/ai/chat/action-card.ts +464 -0
  25. package/src/ai/chat/action-messages.ts +129 -0
  26. package/src/ai/chat/action-question.browser-harness.tsx +245 -0
  27. package/src/ai/chat/action-question.fixtures.ts +733 -0
  28. package/src/ai/chat/action-question.tsx +680 -0
  29. package/src/ai/chat/action-text.ts +288 -0
  30. package/src/ai/chat/blocks.tsx +19 -25
  31. package/src/ai/chat/message-actions.tsx +6 -0
  32. package/src/ai/chat/tool-action-words.ts +31 -0
  33. package/src/ai/chat/tool-action.tsx +456 -0
  34. package/src/ai/chat/turn-view.tsx +10 -160
  35. package/src/ai/chat/view-block.tsx +15 -5
  36. package/src/ai/chat-task-contracts.ts +4 -1
  37. package/src/ai/chat-task-reasons-migrate.ts +7 -0
  38. package/src/ai/chat-task-reasons.ts +1 -1
  39. package/src/ai/chat-tasks.ts +55 -25
  40. package/src/ai/client/controller.ts +59 -0
  41. package/src/ai/default-tools.ts +9 -1
  42. package/src/ai/executor.ts +198 -39
  43. package/src/ai/firecrawl-tools.ts +15 -2
  44. package/src/ai/index.ts +3 -0
  45. package/src/ai/migrate.ts +26 -2
  46. package/src/ai/open-questions.ts +172 -0
  47. package/src/ai/projects-routes.ts +3 -0
  48. package/src/ai/protocol.ts +14 -2
  49. package/src/ai/question-text.ts +8 -0
  50. package/src/ai/recent-resources.ts +240 -0
  51. package/src/ai/recent-sent-refs.ts +38 -0
  52. package/src/ai/routes.ts +195 -5
  53. package/src/ai/runtime.ts +1 -0
  54. package/src/ai/skills-routes.ts +3 -0
  55. package/src/ai/skills.ts +10 -1
  56. package/src/ai/store.ts +245 -24
  57. package/src/ai/testing.ts +36 -0
  58. package/src/ai/tool-audit.ts +8 -0
  59. package/src/ai/tool-sentences.ts +152 -34
  60. package/src/ai/tool-wording.ts +36 -8
  61. package/src/ai/tools.ts +8 -3
  62. package/src/ai/types.ts +43 -4
  63. package/src/api/accounts-entities.ts +2 -1
  64. package/src/api/admin-ai-projects.ts +2 -0
  65. package/src/api/admin-ai-skills.ts +2 -0
  66. package/src/api/admin-ai-usage.ts +2 -0
  67. package/src/api/admin-geoip.ts +80 -0
  68. package/src/api/admin-identity.ts +3 -0
  69. package/src/api/admin-lifecycle.ts +3 -0
  70. package/src/api/admin-outgoing-mail.ts +2 -0
  71. package/src/api/app-approval-actions.ts +31 -7
  72. package/src/api/app-approval.ts +46 -5
  73. package/src/api/approvals-loader.ts +23 -1
  74. package/src/api/approvals.ts +2 -0
  75. package/src/api/auth/schemas.ts +3 -0
  76. package/src/api/auth.ts +67 -12
  77. package/src/api/capabilities.ts +44 -11
  78. package/src/api/capability-streams.ts +12 -0
  79. package/src/api/help.ts +4 -28
  80. package/src/api/index.ts +6 -1
  81. package/src/api/lasting-access-messages.ts +17 -0
  82. package/src/api/mcp.ts +30 -3
  83. package/src/api/me-panel-consent.ts +71 -0
  84. package/src/api/me.ts +159 -36
  85. package/src/api/search.ts +3 -1
  86. package/src/api/sync-ops.ts +2 -0
  87. package/src/api/widgets.ts +3 -0
  88. package/src/approvals/Approvals.tsx +166 -262
  89. package/src/approvals/approval-card.ts +68 -0
  90. package/src/approvals/messages.ts +12 -24
  91. package/src/browser/CloudResourceSearch.browser-harness.tsx +10 -2
  92. package/src/browser/app-approval.ts +54 -5
  93. package/src/browser/commands.ts +22 -6
  94. package/src/browser/composer-catalog.ts +45 -3
  95. package/src/browser/composer-insert.ts +10 -0
  96. package/src/browser/composer-open-messages.ts +17 -0
  97. package/src/browser/composer-open.ts +110 -0
  98. package/src/browser/discoverable-command.ts +6 -0
  99. package/src/browser/hints.ts +6 -0
  100. package/src/browser/live-connection.ts +26 -2
  101. package/src/browser/navigation-apps.ts +7 -0
  102. package/src/browser/panel-context-bridge.ts +30 -0
  103. package/src/browser/panel-context-receiver.ts +53 -0
  104. package/src/browser/panel-menu.tsx +56 -0
  105. package/src/browser/panel-messages.ts +11 -0
  106. package/src/browser/panel-shortcuts.ts +31 -0
  107. package/src/browser/panel-slot.ts +412 -10
  108. package/src/browser/panel.ts +37 -0
  109. package/src/browser/search-commands.ts +6 -3
  110. package/src/capabilities/client.ts +8 -2
  111. package/src/capabilities/reviews.ts +205 -0
  112. package/src/capabilities/server.ts +10 -3
  113. package/src/capabilities/testing.ts +47 -0
  114. package/src/capabilities/types.ts +2 -2
  115. package/src/cli/account.ts +13 -3
  116. package/src/cli/admin/geoip.ts +115 -0
  117. package/src/cli/admin/index.ts +3 -0
  118. package/src/contracts/app-approval.ts +123 -16
  119. package/src/contracts/approvals.ts +2 -2
  120. package/src/contracts/capabilities.ts +410 -18
  121. package/src/contracts/geoip.ts +42 -0
  122. package/src/contracts/index.ts +3 -0
  123. package/src/contracts/panel-context-plain.ts +99 -0
  124. package/src/contracts/panel-context.ts +93 -0
  125. package/src/contracts/seen-hints.ts +35 -0
  126. package/src/contracts/shared.ts +3 -0
  127. package/src/server/client-ip.ts +5 -0
  128. package/src/server/help-payload.ts +38 -0
  129. package/src/server/middleware/auth.ts +13 -1
  130. package/src/server/middleware/middleware.ts +9 -0
  131. package/src/server/middleware/no-transform.ts +19 -0
  132. package/src/server/middleware/rate-limit.ts +4 -6
  133. package/src/server/request-context/address.ts +45 -0
  134. package/src/server/request-context/geoip.ts +380 -0
  135. package/src/server/request-context/index.ts +33 -0
  136. package/src/server/request-context/user-agent.ts +95 -0
  137. package/src/services/accounts/app.ts +23 -3
  138. package/src/services/accounts/users.ts +12 -1
  139. package/src/services/app-approval.ts +382 -59
  140. package/src/services/approvals/device.ts +49 -31
  141. package/src/services/approvals/index.ts +7 -5
  142. package/src/services/approvals/list.ts +27 -6
  143. package/src/services/approvals/question.ts +68 -0
  144. package/src/services/audit/index.ts +1 -0
  145. package/src/services/auth-flows/ipa.ts +39 -2
  146. package/src/services/auth-flows/notification-sender.ts +3 -0
  147. package/src/services/auth-flows/password-reset.ts +32 -6
  148. package/src/services/geoip/index.ts +164 -0
  149. package/src/services/geoip/store.ts +30 -0
  150. package/src/services/geoip/upload.ts +150 -0
  151. package/src/services/identity/routes.ts +5 -1
  152. package/src/services/index.ts +13 -0
  153. package/src/services/known-browsers.ts +312 -0
  154. package/src/services/login-address-store.ts +51 -0
  155. package/src/services/login-context.ts +118 -0
  156. package/src/services/mandates/index.ts +3 -0
  157. package/src/services/mandates/policy.ts +15 -3
  158. package/src/services/notifications/email-frame.ts +1 -1
  159. package/src/services/oauth-tokens.ts +16 -2
  160. package/src/services/panel-context-consent.ts +58 -0
  161. package/src/services/pdf/markdown.ts +160 -2
  162. package/src/services/service-account-credentials.ts +21 -0
  163. package/src/services/session/index.ts +296 -41
  164. package/src/services/session/recent.ts +13 -0
  165. package/src/services/webauthn.ts +12 -0
  166. package/src/shared/email-html.ts +2 -0
  167. package/src/shared/help.ts +3 -0
  168. package/src/shared-text/cursor.ts +22 -0
  169. package/src/shared-text/documents.ts +142 -0
  170. package/src/shared-text/events.ts +43 -0
  171. package/src/shared-text/index.ts +12 -0
  172. package/src/shared-text/log.ts +48 -0
  173. package/src/shared-text/text-diff.ts +23 -0
  174. package/src/shared-text/types.ts +41 -0
  175. package/src/ssr/AdminLayout.tsx +2 -0
  176. package/src/ssr/AppLaunchpadPanel.tsx +2 -2
  177. package/src/ssr/CloudShell.island.tsx +10 -2
  178. package/src/ssr/HelpPanelArticle.island.tsx +308 -0
  179. package/src/ssr/HelpPanelBack.island.tsx +32 -0
  180. package/src/ssr/HelpPanelMenu.island.tsx +133 -0
  181. package/src/ssr/HelpPanelSearch.island.tsx +123 -0
  182. package/src/ssr/HelpPanelShortcuts.island.tsx +22 -0
  183. package/src/ssr/HelpPanelView.island.tsx +27 -0
  184. package/src/ssr/Layout.tsx +25 -2
  185. package/src/ssr/LayoutHelp.browser-harness.tsx +2 -0
  186. package/src/ssr/LayoutHelp.tsx +222 -419
  187. package/src/ssr/LayoutHelpPanel.browser-harness.tsx +135 -0
  188. package/src/ssr/LayoutHelpPanel.server.browser-harness.tsx +131 -0
  189. package/src/ssr/LayoutHelpPanel.server.tsx +115 -0
  190. package/src/ssr/LayoutHelpTrigger.tsx +27 -2
  191. package/src/ssr/MobileNavigation.tsx +2 -2
  192. package/src/ssr/PanelLayout.tsx +9 -1
  193. package/src/ssr/PanelRuntime.island.tsx +7 -0
  194. package/src/ssr/PanelSlot.tsx +53 -3
  195. package/src/ssr/ShellRuntime.island.tsx +11 -2
  196. package/src/ssr/__snapshots__/LayoutHelp.ssr.render.test.tsx.snap +29 -0
  197. package/src/ssr/app-color.ts +14 -9
  198. package/src/ssr/app-navigation.ts +16 -3
  199. package/src/ssr/compact-shell.browser-harness.ts +30 -22
  200. package/src/ssr/dialog-app-colors.browser-harness.tsx +43 -0
  201. package/src/ssr/help-messages.ts +4 -0
  202. package/src/ssr/help.ts +21 -0
  203. package/src/ssr/hints.ts +25 -0
  204. package/src/ssr/index.ts +3 -0
  205. package/src/ssr/layout-context.ts +2 -0
  206. package/src/ssr/layout-help-article.server.ts +50 -0
  207. package/src/ssr/layout-help-panel-controls.tsx +43 -0
  208. package/src/ssr/layout-help-panel-document.ts +67 -0
  209. package/src/ssr/layout-help-panel-lifecycle.ts +32 -0
  210. package/src/ssr/layout-help-panel-menu.tsx +113 -0
  211. package/src/ssr/layout-help-panel-modules.ts +7 -0
  212. package/src/ssr/layout-help-panel-reader.tsx +159 -0
  213. package/src/ssr/layout-help-panel-search.tsx +69 -0
  214. package/src/ssr/layout-help-panel-shortcuts.ts +7 -0
  215. package/src/ssr/layout-help-panel-state.ts +141 -0
  216. package/src/ssr/layout-help-panel-types.ts +19 -0
  217. package/src/ssr/layout-help-start.ts +33 -7
  218. package/src/ssr/layout-help-views.tsx +484 -0
  219. package/src/ssr/panel-consent.ts +29 -0
  220. package/src/ssr/panel-context.ts +10 -0
  221. package/src/ssr/panel-idle.ts +9 -0
  222. package/src/ssr/panel-slot.browser-harness.tsx +53 -4
  223. package/src/ssr/platform-messages.ts +18 -0
  224. package/src/ssr/shell-data.tsx +2 -1
  225. package/src/styles/approvals.css +6 -0
  226. package/src/styles/effects.css +213 -9
  227. package/src/styles/file-chooser.css +2 -1
  228. package/src/styles/global.css +49 -12
  229. package/src/styles/panel.css +47 -4
  230. package/src/styles/resource-search.css +6 -2
  231. package/src/styles/tokens.css +17 -11
  232. package/src/styles/utilities-buttons.css +3 -2
  233. package/src/styles/utilities-data.css +2 -1
  234. package/src/styles/utilities-feedback.css +2 -2
  235. package/src/styles/utilities-layout.css +3 -13
  236. package/src/styles/utilities-markdown-editor.css +6 -6
  237. 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
+ }