@k2b/cloud 0.32.0 → 0.34.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 (113) hide show
  1. package/package.json +5 -5
  2. package/src/_internal/app-presentation.ts +40 -11
  3. package/src/_internal/define-app.ts +18 -8
  4. package/src/_internal/page-responses.ts +5 -1
  5. package/src/_internal/registry.ts +10 -1
  6. package/src/_internal/widget-declarations.ts +16 -3
  7. package/src/_internal/widget-settings.ts +93 -0
  8. package/src/ai/capabilities.ts +8 -5
  9. package/src/ai/code-source-contracts.ts +17 -2
  10. package/src/ai/code-source-tools.ts +1 -0
  11. package/src/ai/default-tools.ts +4 -4
  12. package/src/ai/memories.ts +48 -1
  13. package/src/ai/memory-learning.ts +17 -6
  14. package/src/ai/memory-tool.ts +1 -0
  15. package/src/ai/migrate.ts +8 -0
  16. package/src/ai/provider.ts +4 -3
  17. package/src/ai/resource-refs.ts +35 -3
  18. package/src/ai/system-prompt.ts +3 -2
  19. package/src/api/index.ts +2 -0
  20. package/src/api/mcp.ts +48 -17
  21. package/src/api/pwa.ts +7 -2
  22. package/src/api/resource-links.ts +43 -0
  23. package/src/api/widgets.ts +163 -82
  24. package/src/browser/CloudResourceSearch.tsx +6 -6
  25. package/src/browser/command-shortcuts.ts +2 -11
  26. package/src/browser/navigation-search.ts +4 -1
  27. package/src/browser/resource-picker.tsx +1 -0
  28. package/src/browser/resource-search.ts +7 -2
  29. package/src/browser/widgets.ts +23 -5
  30. package/src/capabilities/testing.ts +13 -1
  31. package/src/cli/capabilities.ts +61 -17
  32. package/src/cli/index.ts +2 -0
  33. package/src/cli/resource-links.ts +13 -0
  34. package/src/contracts/app.ts +7 -1
  35. package/src/contracts/capabilities.ts +25 -5
  36. package/src/contracts/registry.ts +3 -1
  37. package/src/contracts/resource-href.ts +7 -0
  38. package/src/contracts/widgets.ts +80 -6
  39. package/src/desktop/index.ts +3 -2
  40. package/src/desktop/solid.tsx +7 -5
  41. package/src/server/widget-request.ts +34 -5
  42. package/src/services/app-approval.ts +4 -2
  43. package/src/services/approvals/index.ts +40 -11
  44. package/src/services/approvals/list.ts +1 -0
  45. package/src/services/approvals/migrate.ts +10 -0
  46. package/src/services/outbox.ts +13 -6
  47. package/src/services/pdf/markdown.ts +11 -7
  48. package/src/services/pwa-devices.ts +68 -15
  49. package/src/shared/ai-platform-prompt.ts +3 -2
  50. package/src/shared/app-presentation.ts +49 -1
  51. package/src/shared/index.ts +1 -0
  52. package/src/shared/markdown/callout-sanitizer.ts +37 -0
  53. package/src/shared/markdown/index.ts +8 -2
  54. package/src/shared/theme.ts +41 -20
  55. package/src/ssr/AnnouncementBanners.tsx +30 -0
  56. package/src/ssr/AppLaunchpadPanel.tsx +2 -2
  57. package/src/ssr/CloudShell.island.tsx +91 -0
  58. package/src/ssr/GlobalSearchTrigger.tsx +51 -0
  59. package/src/ssr/Layout.tsx +58 -99
  60. package/src/ssr/LayoutHeader.tsx +31 -77
  61. package/src/ssr/LayoutHelp.browser-harness.tsx +43 -0
  62. package/src/ssr/LayoutHelp.tsx +319 -238
  63. package/src/ssr/LayoutHelpTrigger.tsx +49 -0
  64. package/src/ssr/LayoutPreferences.tsx +31 -0
  65. package/src/ssr/LayoutRail.tsx +15 -69
  66. package/src/ssr/MinimalLayout.tsx +2 -3
  67. package/src/ssr/MinimalLayoutPreferences.island.tsx +6 -15
  68. package/src/ssr/MobileNavigation.tsx +13 -8
  69. package/src/ssr/MobileProfileActions.tsx +4 -6
  70. package/src/ssr/PageTrailRow.tsx +14 -0
  71. package/src/ssr/{ProfilePreferences.island.tsx → ProfilePreferences.tsx} +8 -5
  72. package/src/ssr/PwaLayout.tsx +0 -2
  73. package/src/ssr/PwaRuntime.island.tsx +1 -1
  74. package/src/ssr/ShellRuntime.island.tsx +166 -0
  75. package/src/ssr/ThemeCycleButton.tsx +46 -0
  76. package/src/ssr/TimezoneCookie.island.tsx +3 -19
  77. package/src/ssr/WorkspaceNavigationProvider.tsx +20 -1
  78. package/src/ssr/announcements-dialog.tsx +66 -0
  79. package/src/ssr/app-appearance.ts +6 -1
  80. package/src/ssr/{AppLaunchpad.island.tsx → app-launchpad.tsx} +42 -62
  81. package/src/ssr/busy-action.ts +19 -0
  82. package/src/ssr/islands/index.ts +9 -6
  83. package/src/ssr/launchpad-surface.tsx +15 -0
  84. package/src/ssr/layout-help-registry.tsx +60 -0
  85. package/src/ssr/layout-help-url.ts +39 -0
  86. package/src/ssr/mobile-navigation.browser-harness.tsx +20 -0
  87. package/src/ssr/platform-messages.ts +0 -8
  88. package/src/ssr/preference-controller.ts +62 -19
  89. package/src/ssr/profile-actions.ts +12 -5
  90. package/src/ssr/profile-preferences-messages.ts +10 -4
  91. package/src/ssr/rail-context.ts +8 -12
  92. package/src/ssr/rail-navigation.ts +3 -0
  93. package/src/ssr/shell-data.tsx +48 -0
  94. package/src/ssr/timezone-cookie.ts +22 -0
  95. package/src/ssr/workspace-navigation.ts +25 -2
  96. package/src/styles/effects.css +13 -3
  97. package/src/styles/global.css +43 -5
  98. package/src/styles/input.css +0 -8
  99. package/src/styles/tokens.css +0 -2
  100. package/src/styles/utilities-navigation.css +10 -0
  101. package/src/workflows/language/compiler.ts +1 -1
  102. package/src/ssr/AppWorkspaceController.island.tsx +0 -21
  103. package/src/ssr/BrowserPushRegistration.island.tsx +0 -12
  104. package/src/ssr/GlobalAnnouncements.island.tsx +0 -117
  105. package/src/ssr/GlobalSearchHelpDialog.tsx +0 -104
  106. package/src/ssr/GlobalSearchTrigger.island.tsx +0 -75
  107. package/src/ssr/LayoutHelpTrigger.island.tsx +0 -61
  108. package/src/ssr/LayoutPreferences.island.tsx +0 -21
  109. package/src/ssr/PageTrailRow.island.tsx +0 -20
  110. package/src/ssr/PageTrailRuntime.island.tsx +0 -26
  111. package/src/ssr/RegisteredHelpDocuments.island.tsx +0 -3
  112. /package/src/ssr/{LayoutBreadcrumbs.island.tsx → LayoutBreadcrumbs.tsx} +0 -0
  113. /package/src/ssr/{RailApps.island.tsx → RailApps.tsx} +0 -0
@@ -1,75 +0,0 @@
1
- import { IconButton, Tooltip, useLocale } from "@k2b/ui";
2
- import { createEffect, onCleanup, onMount } from "solid-js";
3
- import { registerContextAwareCommand } from "../browser/command-bridge";
4
- import { attachCommandShortcuts } from "../browser/command-shortcuts";
5
- import type { NavigationSearchItem } from "../browser/navigation-search";
6
- import { importOnDemand } from "../browser/reload";
7
- import { openGlobalSearch } from "../browser/search";
8
- import { registerGlobalSearchHost } from "../browser/search-bridge";
9
- import { createGlobalSearchHost } from "./global-search-host";
10
- import { platformMessages } from "./platform-messages";
11
-
12
- type GlobalSearchTriggerProps = {
13
- variant: "header" | "rail" | "host";
14
- class?: string;
15
- registerCommand?: boolean;
16
- searchLinks?: NavigationSearchItem[];
17
- searchResources?: boolean;
18
- };
19
-
20
- /** Opens the spotlight-style global search dialog from nav/header trigger points. */
21
- export default function GlobalSearchTrigger(props: GlobalSearchTriggerProps) {
22
- const locale = useLocale();
23
- const t = () => platformMessages.resolve([locale()]).t;
24
-
25
- if (props.registerCommand) {
26
- const host = createGlobalSearchHost(() => props.searchLinks ?? [], props.searchResources);
27
- onMount(() => {
28
- onCleanup(registerGlobalSearchHost(host.open, host.dispose));
29
- });
30
- // Commands, their schemas and the capability client load on the first shortcut, not with every page.
31
- onMount(() =>
32
- onCleanup(
33
- attachCommandShortcuts(
34
- (command) =>
35
- void importOnDemand(() => import("../browser/commands")).then((commands) => commands?.runContextAwareCommand(command)),
36
- ),
37
- ),
38
- );
39
- createEffect(() =>
40
- onCleanup(
41
- registerContextAwareCommand({
42
- id: "cloud.search",
43
- title: t().openGlobalSearch,
44
- description: t().globalSearchDescription,
45
- icon: "ti ti-search",
46
- shortcut: "mod+k",
47
- action: { search: {} },
48
- }),
49
- ),
50
- );
51
- }
52
-
53
- if (props.variant === "host") return null;
54
-
55
- if (props.variant === "rail")
56
- return (
57
- <Tooltip.Trigger
58
- type="button"
59
- class={`rail-item text-blue-500 hover:bg-blue-500/10 hover:text-blue-600 dark:text-blue-400 dark:hover:bg-blue-500/15 dark:hover:text-blue-300 ${props.class ?? ""}`}
60
- onClick={() => openGlobalSearch()}
61
- aria-label={t().openGlobalSearch}
62
- placement="right"
63
- delay={0}
64
- content={t().searchShortcut}
65
- >
66
- <i class="ti ti-search text-base" />
67
- </Tooltip.Trigger>
68
- );
69
-
70
- return (
71
- <IconButton class={props.class} onClick={() => openGlobalSearch()} label={t().openGlobalSearch} title={t().searchShortcut}>
72
- <i class="ti ti-search text-base" />
73
- </IconButton>
74
- );
75
- }
@@ -1,61 +0,0 @@
1
- import { IconButton, Tooltip, useLocale } from "@k2b/ui";
2
- import { createEffect, onCleanup } from "solid-js";
3
- import { registerContextAwareCommand } from "../browser/command-bridge";
4
- import type { GlobalSearchHelpApp } from "./GlobalSearchHelpDialog";
5
- import { openLayoutHelpDialog } from "./LayoutHelp";
6
- import { platformMessages } from "./platform-messages";
7
-
8
- type LayoutHelpTriggerProps = {
9
- variant: "header" | "rail";
10
- class?: string;
11
- registerCommand?: boolean;
12
- searchHelpApps?: GlobalSearchHelpApp[];
13
- accent?: string;
14
- };
15
-
16
- /** Opens end-user help from either the desktop rail or the compact header. */
17
- export default function LayoutHelpTrigger(props: LayoutHelpTriggerProps) {
18
- const locale = useLocale();
19
- const t = () => platformMessages.resolve([locale()]).t;
20
- const searchHelpApps = props.searchHelpApps ?? [];
21
-
22
- const openHelp = () => {
23
- openLayoutHelpDialog(searchHelpApps, props.accent);
24
- };
25
-
26
- if (props.registerCommand) {
27
- createEffect(() =>
28
- onCleanup(
29
- registerContextAwareCommand({
30
- id: "cloud.help",
31
- title: t().openShortcutHelp,
32
- description: t().shortcutHelpDescription,
33
- icon: "ti ti-help-circle",
34
- shortcut: "shift+/",
35
- action: openHelp,
36
- }),
37
- ),
38
- );
39
- }
40
-
41
- if (props.variant === "rail")
42
- return (
43
- <Tooltip.Trigger
44
- type="button"
45
- class={`rail-item text-blue-500 hover:bg-blue-500/10 hover:text-blue-600 dark:text-blue-400 dark:hover:bg-blue-500/15 dark:hover:text-blue-300 ${props.class ?? ""}`}
46
- onClick={openHelp}
47
- aria-label={t().openHelp}
48
- placement="right"
49
- delay={0}
50
- content={t().helpShortcut}
51
- >
52
- <i class="ti ti-help-circle text-base" />
53
- </Tooltip.Trigger>
54
- );
55
-
56
- return (
57
- <IconButton class={props.class} onClick={openHelp} label={t().openHelp} title={t().helpShortcut}>
58
- <i class="ti ti-help-circle text-base" />
59
- </IconButton>
60
- );
61
- }
@@ -1,21 +0,0 @@
1
- import { Dropdown, type DropdownPosition, useLocale } from "@k2b/ui";
2
- import type { CloudTheme } from "../shared/theme";
3
- import { createPreferenceController } from "./preference-controller";
4
-
5
- type LayoutPreferencesProps = {
6
- initialTheme: CloudTheme;
7
- position: DropdownPosition;
8
- };
9
-
10
- export default function LayoutPreferences(props: LayoutPreferencesProps) {
11
- const locale = useLocale();
12
- const preferences = createPreferenceController(props.initialTheme, locale);
13
-
14
- return (
15
- <Dropdown.Root items={preferences.items()} label={preferences.messages().preferencesMenuLabel} position={props.position} width="14rem">
16
- <Dropdown.Trigger iconOnly label={preferences.messages().preferencesMenuLabel} size="sm" variant="secondary">
17
- <i class="ti ti-adjustments-horizontal" aria-hidden="true" />
18
- </Dropdown.Trigger>
19
- </Dropdown.Root>
20
- );
21
- }
@@ -1,20 +0,0 @@
1
- import { PageTitle, usePageTrail } from "@k2b/ui";
2
- import { Show } from "solid-js";
3
-
4
- /**
5
- * The shell's own place for the way up, above pages without a workspace. It
6
- * shows only on a page with a page above it, and steps back when the page
7
- * renders a workspace (whose head shows it) or its own `PageTrail`.
8
- */
9
- export default function PageTrailRow() {
10
- const trail = usePageTrail();
11
- const deep = () => {
12
- const current = trail();
13
- return current?.ancestors.length ? current : undefined;
14
- };
15
- return (
16
- <div class="layout-page-head" data-trail={deep() ? "up" : undefined}>
17
- <Show when={deep()}>{(current) => <PageTitle trail={current()} as="p" fallback />}</Show>
18
- </div>
19
- );
20
- }
@@ -1,26 +0,0 @@
1
- import { followPageTrail, installPageTitleController, useLocale } from "@k2b/ui";
2
- import { onCleanup, onMount } from "solid-js";
3
- import { installPageTrailRuntime } from "./page-trail-runtime";
4
- import { platformMessages } from "./platform-messages";
5
-
6
- /**
7
- * One owner per document for the way up: it collapses every page title path
8
- * to its space, keeps server-rendered workspace heads current after
9
- * `layout.update()`, runs the per-tab memory behind up links, and offers
10
- * "One level up" (Alt+↑) while the page has a page above it.
11
- */
12
- export default function PageTrailRuntime() {
13
- const locale = useLocale();
14
- onMount(() => {
15
- const t = platformMessages.resolve([locale()]).t;
16
- const disposeTitles = installPageTitleController(document);
17
- const disposeFollow = followPageTrail(document);
18
- const disposeRuntime = installPageTrailRuntime((page) => ({ title: t.pageUp({ page }), description: t.pageUpDescription }));
19
- onCleanup(() => {
20
- disposeTitles();
21
- disposeFollow();
22
- disposeRuntime();
23
- });
24
- });
25
- return null;
26
- }
@@ -1,3 +0,0 @@
1
- import { LayoutHelpDocuments } from "./LayoutHelp";
2
-
3
- export default LayoutHelpDocuments;
File without changes