@jskit-ai/agent-docs 0.1.149 → 0.1.150
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/guide/agent/app-setup/existing-application-migration.md +8 -6
- package/guide/agent/app-setup/initial-scaffolding.md +9 -7
- package/guide/agent/app-setup/quickstart.md +9 -6
- package/guide/agent/framework/application-operations.md +91 -0
- package/guide/agent/framework/crud-operations.md +83 -0
- package/guide/agent/framework/material-3.md +112 -0
- package/guide/agent/framework/ui-operations.md +78 -0
- package/guide/agent/index.md +13 -3
- package/package.json +1 -1
- package/patterns/feature-package/example/booking-engine/package.json +1 -1
- package/patterns/minimal-foundation/example/AGENTS.md +8 -8
- package/patterns/minimal-foundation/example/package.json +4 -5
- package/patterns/shell-foundation/example/AGENTS.md +8 -8
- package/patterns/shell-foundation/example/package.json +5 -6
- package/patterns/shell-foundation/example/packages/main/package.json +1 -1
- package/reference/autogen/PATTERN_INDEX.md +61 -61
- package/skills/jskit/SKILL.md +8 -5
- package/skills/jskit/references/app-operations.md +12 -11
- package/skills/jskit/references/crud-operations.md +10 -6
- package/skills/jskit/references/existing-application-migration.md +9 -12
- package/skills/jskit/references/material-3.md +2 -0
- package/skills/jskit/references/pattern-index.md +61 -61
- package/skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md +105 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/.nvmrc +1 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +17 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/Procfile +2 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/app.json +14 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/bin/develop.js +71 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/bin/server.js +8 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/config/public.js +40 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/config/server.js +1 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/config/surfaceAccessPolicies.js +3 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/eslint.config.mjs +19 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/favicon.svg +7 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/gitignore +9 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/index.html +13 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/jsconfig.json +8 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +62 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/packages/main/package.json +42 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/packages/main/src/shared/index.js +10 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/packages/main/src/shared/schemas/index.js +22 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/playwright.config.mjs +31 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +45 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/surfaceRuntime.js +10 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/server.js +195 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/App.vue +13 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +85 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/pages/home/index.vue +48 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/pages/home.vue +13 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/views/NotFound.vue +13 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/client/smoke.vitest.js +7 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/e2e/base-shell.spec.ts +23 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/server/smoke.test.js +16 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/vite.config.mjs +80 -0
- package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +111 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/.nvmrc +1 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +17 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/Procfile +2 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/app.json +14 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/bin/develop.js +71 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/bin/server.js +8 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/config/public.js +40 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/config/server.js +1 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/config/surfaceAccessPolicies.js +3 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/eslint.config.mjs +19 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/favicon.svg +7 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/gitignore +9 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/index.html +13 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/jsconfig.json +8 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +64 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +56 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/index.js +9 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +18 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/shared/index.js +10 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/shared/schemas/index.js +22 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/playwright.config.mjs +31 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +45 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/surfaceRuntime.js +10 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/server.js +195 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/App.vue +11 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/ShellLayout.vue +12 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/MenuLinkItem.vue +30 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/SurfaceAwareMenuLinkItem.vue +42 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/TabLinkItem.vue +42 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/error.js +19 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +85 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/index.vue +116 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings/general/index.vue +40 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings/index.vue +7 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings.vue +109 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home.vue +20 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/placement.js +56 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/placementTopology.js +149 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/views/NotFound.vue +13 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/tests/client/smoke.vitest.js +7 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/tests/e2e/adaptive-shell.spec.ts +10 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/tests/e2e/base-shell.spec.ts +23 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/tests/server/smoke.test.js +16 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/vite.config.mjs +80 -0
- package/skills/jskit/references/patterns/assistant/assistant-surface/PATTERN.md +77 -0
- package/skills/jskit/references/patterns/assistant/assistant-surface/example/config/public.js +19 -0
- package/skills/jskit/references/patterns/assistant/assistant-surface/example/config/server.js +9 -0
- package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/pages/admin/assistant/index.vue +7 -0
- package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/pages/admin/settings/assistant/index.vue +7 -0
- package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/placement.js +38 -0
- package/skills/jskit/references/patterns/auth/auth-surface/PATTERN.md +90 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/login.vue +17 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/reset-password.vue +17 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/signout.vue +17 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/runtime/authGuardRuntime.js +7 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/runtime/authHttpClient.js +1 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/runtime/useSignOut.js +1 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/LoginView.vue +7 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/ResetPasswordView.vue +7 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/SignOutView.vue +7 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/tools/preview-identity +5 -0
- package/skills/jskit/references/patterns/auth/supabase-auth/PATTERN.md +67 -0
- package/skills/jskit/references/patterns/auth/supabase-auth/example/.env.example +4 -0
- package/skills/jskit/references/patterns/auth/supabase-auth/example/config/server.js +11 -0
- package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +7 -0
- package/skills/jskit/references/patterns/console/console-surface/PATTERN.md +58 -0
- package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console/index.vue +62 -0
- package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console/settings/index.vue +17 -0
- package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console/settings.vue +95 -0
- package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console.vue +20 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md +88 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookEditPage.vue +54 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookFormFields.vue +52 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookListPage.vue +54 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookNewPage.vue +45 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookViewPage.vue +50 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/formFields.js +31 -0
- package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/listExtensions.js +9 -0
- package/skills/jskit/references/patterns/crud/json-api-resource-package/PATTERN.md +160 -0
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/migrations/20260815000000_books.cjs +22 -0
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +41 -0
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/server/BooksFeature.js +13 -0
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/shared/bookResource.js +83 -0
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/shared/index.js +1 -0
- package/skills/jskit/references/patterns/crud/resource-contract/PATTERN.md +102 -0
- package/skills/jskit/references/patterns/crud/resource-contract/example/bookResource.js +87 -0
- package/skills/jskit/references/patterns/database/mysql-application/PATTERN.md +80 -0
- package/skills/jskit/references/patterns/database/mysql-application/example/.env.example +5 -0
- package/skills/jskit/references/patterns/database/mysql-application/example/.github/workflows/verify.yml +39 -0
- package/skills/jskit/references/patterns/database/mysql-application/example/knexfile.js +11 -0
- package/skills/jskit/references/patterns/database/mysql-application/example/package.json +13 -0
- package/skills/jskit/references/patterns/database/mysql-application/example/scripts/prepare-database.js +3 -0
- package/skills/jskit/references/patterns/database/postgres-application/PATTERN.md +80 -0
- package/skills/jskit/references/patterns/database/postgres-application/example/.env.example +5 -0
- package/skills/jskit/references/patterns/database/postgres-application/example/.github/workflows/verify.yml +38 -0
- package/skills/jskit/references/patterns/database/postgres-application/example/knexfile.js +11 -0
- package/skills/jskit/references/patterns/database/postgres-application/example/package.json +13 -0
- package/skills/jskit/references/patterns/database/postgres-application/example/scripts/prepare-database.js +3 -0
- package/skills/jskit/references/patterns/mobile/android-application/PATTERN.md +71 -0
- package/skills/jskit/references/patterns/mobile/android-application/example/capacitor.config.json +10 -0
- package/skills/jskit/references/patterns/realtime/realtime-application/PATTERN.md +69 -0
- package/skills/jskit/references/patterns/realtime/realtime-application/example/.env.example +1 -0
- package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +8 -0
- package/skills/jskit/references/patterns/realtime/realtime-application/example/src/placement.js +17 -0
- package/skills/jskit/references/patterns/server/feature-package/PATTERN.md +108 -0
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +48 -0
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/BookingEngineProvider.js +33 -0
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +26 -0
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/inputSchemas.js +19 -0
- package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +31 -0
- package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +36 -0
- package/skills/jskit/references/patterns/server/feature-package/example/variations/customKnexRepository.js +34 -0
- package/skills/jskit/references/patterns/server/feature-package/example/variations/orchestratorService.js +23 -0
- package/skills/jskit/references/patterns/shell/application-shell/PATTERN.md +66 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/expected-existing/src/App.vue +13 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/expected-existing/src/pages/home/index.vue +48 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/expected-existing/src/pages/home.vue +13 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/App.vue +11 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/components/ShellLayout.vue +13 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/MenuLinkItem.vue +30 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/SurfaceAwareMenuLinkItem.vue +42 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/TabLinkItem.vue +42 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/error.js +19 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/index.vue +106 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/settings/general/index.vue +40 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/settings/index.vue +7 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/settings.vue +109 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home.vue +20 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/placement.js +56 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/placementTopology.js +149 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/tests/e2e/adaptive-shell.spec.ts +10 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/PATTERN.md +76 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/packages/main/src/client/providers/MainClientProvider.js +14 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/components/SyncStatusElement.vue +16 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports/activity.vue +8 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports/index.vue +7 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports/overview.vue +8 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports.vue +33 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/placement.js +52 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/placementTopology.js +29 -0
- package/skills/jskit/references/patterns/users/account-settings/PATTERN.md +61 -0
- package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsNotificationsSection.vue +81 -0
- package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsPreferencesSection.vue +151 -0
- package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsProfileSection.vue +120 -0
- package/skills/jskit/references/patterns/users/account-settings/example/src/pages/account/index.vue +17 -0
- package/skills/jskit/references/patterns/users/user-administration-server/PATTERN.md +64 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +42 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/server/UsersFeature.js +13 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/shared/index.js +1 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/shared/userResource.js +69 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +43 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/server/UsersWorkspaceFeature.js +22 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/shared/index.js +1 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/shared/userResource.js +56 -0
- package/skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md +60 -0
- package/skills/jskit/references/patterns/workspaces/workspace-server/example/config/roles.js +27 -0
- package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/email/workspaceInviteEmail.js +23 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/PATTERN.md +63 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/packages/main/src/client/components/AccountPendingInvitesCue.vue +106 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/packages/main/src/client/components/AccountSettingsInvitesSection.vue +7 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/components/WorkspaceNotFoundCard.vue +53 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/composables/useWorkspaceNotFoundState.js +41 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/admin/members/index.vue +7 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/admin/workspace/settings/index.vue +23 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/admin/workspace/settings.vue +95 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/invite/[token].vue +7 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/admin/index.vue +85 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/admin/root.vue +20 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/app/index.vue +46 -0
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/app/root.vue +20 -0
- package/skills/jskit/references/ui-operations.md +5 -3
- package/templates/app/AGENTS.md +8 -8
package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings.vue
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import ShellOutlet from "@jskit-ai/shell-web/client/components/ShellOutlet";
|
|
3
|
+
import { RouterView } from "vue-router";
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<section class="settings-shell d-flex flex-column ga-4">
|
|
8
|
+
<header>
|
|
9
|
+
<p class="text-overline text-medium-emphasis mb-1">Settings</p>
|
|
10
|
+
<h1 class="settings-shell__title">Home settings</h1>
|
|
11
|
+
<p class="text-body-2 text-medium-emphasis mb-0">Configure shell behavior for this surface.</p>
|
|
12
|
+
</header>
|
|
13
|
+
|
|
14
|
+
<v-sheet rounded="lg" border class="settings-shell__panel">
|
|
15
|
+
<div class="settings-shell__body">
|
|
16
|
+
<nav class="settings-shell__nav" aria-label="Home settings sections">
|
|
17
|
+
<v-list nav density="compact" rounded="lg">
|
|
18
|
+
<ShellOutlet target="home-settings:primary-menu" />
|
|
19
|
+
</v-list>
|
|
20
|
+
</nav>
|
|
21
|
+
|
|
22
|
+
<main class="settings-shell__content">
|
|
23
|
+
<RouterView />
|
|
24
|
+
</main>
|
|
25
|
+
</div>
|
|
26
|
+
</v-sheet>
|
|
27
|
+
</section>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<style scoped>
|
|
31
|
+
.settings-shell {
|
|
32
|
+
--settings-title-size: 1.85rem;
|
|
33
|
+
--settings-panel-padding: 1rem;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.settings-shell__title {
|
|
37
|
+
font-size: var(--settings-title-size);
|
|
38
|
+
font-weight: 650;
|
|
39
|
+
letter-spacing: 0;
|
|
40
|
+
line-height: 1.15;
|
|
41
|
+
margin: 0 0 0.35rem;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.settings-shell__panel {
|
|
45
|
+
overflow: hidden;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.settings-shell__body {
|
|
49
|
+
display: grid;
|
|
50
|
+
gap: 1rem;
|
|
51
|
+
grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);
|
|
52
|
+
padding: var(--settings-panel-padding);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.settings-shell__content {
|
|
56
|
+
border-left: 1px solid rgba(var(--v-theme-on-surface), 0.18);
|
|
57
|
+
min-width: 0;
|
|
58
|
+
padding-left: 1rem;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.settings-shell__nav :deep(.v-list) {
|
|
62
|
+
padding: 0.35rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.settings-shell__nav :deep(.v-list-item) {
|
|
66
|
+
min-height: 48px;
|
|
67
|
+
padding-inline: 0.6rem 0.7rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.settings-shell__nav :deep(.v-list-item__prepend) {
|
|
71
|
+
margin-inline-end: 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.settings-shell__nav :deep(.v-list-item__spacer) {
|
|
75
|
+
min-width: 0.5rem;
|
|
76
|
+
width: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.settings-shell__nav :deep(.v-list-item-title) {
|
|
80
|
+
line-height: 1.2;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@media (max-width: 960px) {
|
|
84
|
+
.settings-shell {
|
|
85
|
+
--settings-title-size: 1.35rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.settings-shell__body {
|
|
89
|
+
grid-template-columns: 1fr;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.settings-shell__nav :deep(.v-list) {
|
|
93
|
+
display: flex;
|
|
94
|
+
gap: 0.25rem;
|
|
95
|
+
overflow-x: auto;
|
|
96
|
+
scrollbar-width: thin;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.settings-shell__nav :deep(.v-list-item) {
|
|
100
|
+
flex: 0 0 auto;
|
|
101
|
+
min-height: 48px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.settings-shell__content {
|
|
105
|
+
border-left: 0;
|
|
106
|
+
padding-left: 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<route lang="json">
|
|
2
|
+
{
|
|
3
|
+
"meta": {
|
|
4
|
+
"jskit": {
|
|
5
|
+
"surface": "home"
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
</route>
|
|
10
|
+
|
|
11
|
+
<script setup>
|
|
12
|
+
import ShellLayout from "@/components/ShellLayout.vue";
|
|
13
|
+
import { RouterView } from "vue-router";
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<ShellLayout title="" subtitle="">
|
|
18
|
+
<RouterView />
|
|
19
|
+
</ShellLayout>
|
|
20
|
+
</template>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createPlacementRegistry } from "@jskit-ai/shell-web/client/placement";
|
|
2
|
+
|
|
3
|
+
const registry = createPlacementRegistry();
|
|
4
|
+
const { addPlacement } = registry;
|
|
5
|
+
|
|
6
|
+
export { addPlacement };
|
|
7
|
+
|
|
8
|
+
// Keep the default export near the top so module installers can append addPlacement(...)
|
|
9
|
+
// blocks at the bottom of this file without changing the export section.
|
|
10
|
+
export default function getPlacements() {
|
|
11
|
+
return registry.build();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
addPlacement({
|
|
15
|
+
id: "shell-web.home.menu.home",
|
|
16
|
+
target: "shell.primary-nav",
|
|
17
|
+
kind: "link",
|
|
18
|
+
surfaces: ["home"],
|
|
19
|
+
order: 50,
|
|
20
|
+
props: {
|
|
21
|
+
label: "Home",
|
|
22
|
+
surface: "home",
|
|
23
|
+
scopedSuffix: "/",
|
|
24
|
+
unscopedSuffix: "/",
|
|
25
|
+
exact: true
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
addPlacement({
|
|
30
|
+
id: "shell-web.home.menu.settings",
|
|
31
|
+
target: "shell.primary-nav",
|
|
32
|
+
kind: "link",
|
|
33
|
+
surfaces: ["home"],
|
|
34
|
+
order: 100,
|
|
35
|
+
props: {
|
|
36
|
+
label: "Settings",
|
|
37
|
+
surface: "home",
|
|
38
|
+
scopedSuffix: "/settings",
|
|
39
|
+
unscopedSuffix: "/settings"
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
addPlacement({
|
|
44
|
+
id: "shell-web.home.settings.general",
|
|
45
|
+
target: "page.section-nav",
|
|
46
|
+
owner: "home-settings",
|
|
47
|
+
kind: "link",
|
|
48
|
+
surfaces: ["home"],
|
|
49
|
+
order: 100,
|
|
50
|
+
props: {
|
|
51
|
+
label: "General",
|
|
52
|
+
surface: "home",
|
|
53
|
+
scopedSuffix: "/settings/general",
|
|
54
|
+
unscopedSuffix: "/settings/general"
|
|
55
|
+
}
|
|
56
|
+
});
|
package/skills/jskit/references/patterns/app/shell-foundation/example/src/placementTopology.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const placements = [];
|
|
2
|
+
|
|
3
|
+
function addPlacementTopology(value = {}) {
|
|
4
|
+
placements.push(value);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export { addPlacementTopology };
|
|
8
|
+
export default { placements };
|
|
9
|
+
|
|
10
|
+
const menuLinkRenderers = Object.freeze({
|
|
11
|
+
link: "local.main.ui.surface-aware-menu-link-item"
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const bottomNavLinkRenderers = Object.freeze({
|
|
15
|
+
link: "local.main.ui.tab-link-item"
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
addPlacementTopology({
|
|
19
|
+
id: "shell.primary-nav",
|
|
20
|
+
description: "Primary top-level navigation for the current surface.",
|
|
21
|
+
surfaces: ["*"],
|
|
22
|
+
default: true,
|
|
23
|
+
variants: {
|
|
24
|
+
compact: {
|
|
25
|
+
outlet: "shell-layout:primary-bottom-nav",
|
|
26
|
+
renderers: bottomNavLinkRenderers
|
|
27
|
+
},
|
|
28
|
+
medium: {
|
|
29
|
+
outlet: "shell-layout:primary-menu",
|
|
30
|
+
renderers: menuLinkRenderers
|
|
31
|
+
},
|
|
32
|
+
expanded: {
|
|
33
|
+
outlet: "shell-layout:primary-menu",
|
|
34
|
+
renderers: menuLinkRenderers
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
addPlacementTopology({
|
|
40
|
+
id: "shell.secondary-nav",
|
|
41
|
+
description: "Secondary navigation for the current surface.",
|
|
42
|
+
surfaces: ["*"],
|
|
43
|
+
variants: {
|
|
44
|
+
compact: {
|
|
45
|
+
outlet: "shell-layout:secondary-menu",
|
|
46
|
+
renderers: menuLinkRenderers
|
|
47
|
+
},
|
|
48
|
+
medium: {
|
|
49
|
+
outlet: "shell-layout:secondary-menu",
|
|
50
|
+
renderers: menuLinkRenderers
|
|
51
|
+
},
|
|
52
|
+
expanded: {
|
|
53
|
+
outlet: "shell-layout:secondary-menu",
|
|
54
|
+
renderers: menuLinkRenderers
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
addPlacementTopology({
|
|
60
|
+
id: "shell.identity",
|
|
61
|
+
description: "Current surface identity and switcher controls.",
|
|
62
|
+
surfaces: ["*"],
|
|
63
|
+
variants: {
|
|
64
|
+
compact: {
|
|
65
|
+
outlet: "shell-layout:top-left"
|
|
66
|
+
},
|
|
67
|
+
medium: {
|
|
68
|
+
outlet: "shell-layout:top-left"
|
|
69
|
+
},
|
|
70
|
+
expanded: {
|
|
71
|
+
outlet: "shell-layout:top-left"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
addPlacementTopology({
|
|
77
|
+
id: "shell.status",
|
|
78
|
+
description: "Surface status, connection, and utility indicators.",
|
|
79
|
+
surfaces: ["*"],
|
|
80
|
+
variants: {
|
|
81
|
+
compact: {
|
|
82
|
+
outlet: "shell-layout:top-right"
|
|
83
|
+
},
|
|
84
|
+
medium: {
|
|
85
|
+
outlet: "shell-layout:top-right"
|
|
86
|
+
},
|
|
87
|
+
expanded: {
|
|
88
|
+
outlet: "shell-layout:top-right"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
addPlacementTopology({
|
|
94
|
+
id: "shell.global-actions",
|
|
95
|
+
description: "Global surface actions that should stay outside primary navigation.",
|
|
96
|
+
surfaces: ["*"],
|
|
97
|
+
variants: {
|
|
98
|
+
compact: {
|
|
99
|
+
outlet: "shell-layout:top-right",
|
|
100
|
+
renderers: menuLinkRenderers
|
|
101
|
+
},
|
|
102
|
+
medium: {
|
|
103
|
+
outlet: "shell-layout:top-right",
|
|
104
|
+
renderers: menuLinkRenderers
|
|
105
|
+
},
|
|
106
|
+
expanded: {
|
|
107
|
+
outlet: "shell-layout:top-right",
|
|
108
|
+
renderers: menuLinkRenderers
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
addPlacementTopology({
|
|
114
|
+
id: "page.supporting-content",
|
|
115
|
+
description: "Supporting page content that opens as a bottom sheet on compact layouts and a side panel on wider layouts.",
|
|
116
|
+
surfaces: ["*"],
|
|
117
|
+
variants: {
|
|
118
|
+
compact: {
|
|
119
|
+
outlet: "shell-layout:supporting-bottom-sheet"
|
|
120
|
+
},
|
|
121
|
+
medium: {
|
|
122
|
+
outlet: "shell-layout:supporting-side-panel"
|
|
123
|
+
},
|
|
124
|
+
expanded: {
|
|
125
|
+
outlet: "shell-layout:supporting-side-panel"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
addPlacementTopology({
|
|
131
|
+
id: "page.section-nav",
|
|
132
|
+
owner: "home-settings",
|
|
133
|
+
description: "Navigation between child pages in the home settings section.",
|
|
134
|
+
surfaces: ["home"],
|
|
135
|
+
variants: {
|
|
136
|
+
compact: {
|
|
137
|
+
outlet: "home-settings:primary-menu",
|
|
138
|
+
renderers: menuLinkRenderers
|
|
139
|
+
},
|
|
140
|
+
medium: {
|
|
141
|
+
outlet: "home-settings:primary-menu",
|
|
142
|
+
renderers: menuLinkRenderers
|
|
143
|
+
},
|
|
144
|
+
expanded: {
|
|
145
|
+
outlet: "home-settings:primary-menu",
|
|
146
|
+
renderers: menuLinkRenderers
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const title = "Not Found";
|
|
3
|
+
const message = "The page you requested does not exist.";
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<v-container class="fill-height d-flex align-center justify-center">
|
|
8
|
+
<v-card class="pa-6 text-center" max-width="560" rounded="lg">
|
|
9
|
+
<v-card-title class="text-h4">{{ title }}</v-card-title>
|
|
10
|
+
<v-card-text class="text-medium-emphasis">{{ message }}</v-card-text>
|
|
11
|
+
</v-card>
|
|
12
|
+
</v-container>
|
|
13
|
+
</template>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { expect, test } from "@playwright/test";
|
|
2
|
+
import { DEFAULT_VIEWPORTS, runAdaptiveShellSmokeCase } from "@jskit-ai/shell-web/test/adaptiveShellSmoke";
|
|
3
|
+
|
|
4
|
+
test.describe("adaptive shell smoke", () => {
|
|
5
|
+
for (const viewport of DEFAULT_VIEWPORTS) {
|
|
6
|
+
test(`${viewport.name} layout has reachable navigation and no horizontal overflow`, async ({ page }) => {
|
|
7
|
+
await runAdaptiveShellSmokeCase({ page, expect, viewport });
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
});
|
package/skills/jskit/references/patterns/app/shell-foundation/example/tests/e2e/base-shell.spec.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { expect, test } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
const VIEWPORTS = Object.freeze([
|
|
4
|
+
Object.freeze({ name: "compact", width: 390, height: 844 }),
|
|
5
|
+
Object.freeze({ name: "medium", width: 768, height: 1024 }),
|
|
6
|
+
Object.freeze({ name: "expanded", width: 1280, height: 900 })
|
|
7
|
+
]);
|
|
8
|
+
|
|
9
|
+
test.describe("application responsive smoke", () => {
|
|
10
|
+
for (const viewport of VIEWPORTS) {
|
|
11
|
+
test(`${viewport.name} home route renders without horizontal overflow`, async ({ page }) => {
|
|
12
|
+
await page.setViewportSize(viewport);
|
|
13
|
+
await page.goto("/home");
|
|
14
|
+
await expect(page.getByRole("heading", { name: "Ready" })).toBeVisible();
|
|
15
|
+
|
|
16
|
+
const dimensions = await page.evaluate(() => ({
|
|
17
|
+
clientWidth: document.documentElement.clientWidth,
|
|
18
|
+
scrollWidth: document.documentElement.scrollWidth
|
|
19
|
+
}));
|
|
20
|
+
expect(dimensions.scrollWidth).toBeLessThanOrEqual(dimensions.clientWidth + 1);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
package/skills/jskit/references/patterns/app/shell-foundation/example/tests/server/smoke.test.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { createServer } from "../../server.js";
|
|
4
|
+
|
|
5
|
+
test("GET /api/health returns built-in health response", async () => {
|
|
6
|
+
const app = await createServer();
|
|
7
|
+
const response = await app.inject({
|
|
8
|
+
method: "GET",
|
|
9
|
+
url: "/api/health"
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
assert.equal(response.statusCode, 200);
|
|
13
|
+
assert.equal(response.json().ok, true);
|
|
14
|
+
|
|
15
|
+
await app.close();
|
|
16
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { fileURLToPath, URL } from "node:url";
|
|
2
|
+
import { defineConfig } from "vite";
|
|
3
|
+
import vue from "@vitejs/plugin-vue";
|
|
4
|
+
import vuetify from "vite-plugin-vuetify";
|
|
5
|
+
import VueRouter from "vue-router/vite";
|
|
6
|
+
import { createJskitClientBootstrapPlugin } from "@jskit-ai/kernel/client/vite";
|
|
7
|
+
|
|
8
|
+
const configuredDevPort = Number.parseInt(String(process.env.VITE_DEV_PORT || "").trim(), 10);
|
|
9
|
+
const devPort = Number.isInteger(configuredDevPort) && configuredDevPort > 0 ? configuredDevPort : 5173;
|
|
10
|
+
const apiProxyTarget = String(process.env.VITE_API_PROXY_TARGET || "").trim() || "http://localhost:3000";
|
|
11
|
+
const clientEntry = (() => {
|
|
12
|
+
const normalized = String(process.env.VITE_CLIENT_ENTRY || "").trim();
|
|
13
|
+
if (!normalized) {
|
|
14
|
+
return "/src/main.js";
|
|
15
|
+
}
|
|
16
|
+
if (normalized.startsWith("/")) {
|
|
17
|
+
return normalized;
|
|
18
|
+
}
|
|
19
|
+
if (normalized.startsWith("src/")) {
|
|
20
|
+
return `/${normalized}`;
|
|
21
|
+
}
|
|
22
|
+
return `/src/${normalized}`;
|
|
23
|
+
})();
|
|
24
|
+
|
|
25
|
+
export default defineConfig({
|
|
26
|
+
resolve: {
|
|
27
|
+
alias: {
|
|
28
|
+
"@": fileURLToPath(new URL("./src", import.meta.url))
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
plugins: [
|
|
32
|
+
createJskitClientBootstrapPlugin({
|
|
33
|
+
proxyTarget: apiProxyTarget
|
|
34
|
+
}),
|
|
35
|
+
VueRouter({
|
|
36
|
+
routesFolder: "src/pages",
|
|
37
|
+
// Generated on the first Vite dev/build scan and intentionally gitignored.
|
|
38
|
+
dts: "src/typed-router.d.ts",
|
|
39
|
+
nestedChildren: false
|
|
40
|
+
}),
|
|
41
|
+
vue(),
|
|
42
|
+
vuetify({
|
|
43
|
+
autoImport: true
|
|
44
|
+
}),
|
|
45
|
+
{
|
|
46
|
+
name: "jskit-client-entry",
|
|
47
|
+
transformIndexHtml(source) {
|
|
48
|
+
return String(source || "")
|
|
49
|
+
.replace(/\/src\/%VITE_CLIENT_ENTRY%/g, clientEntry)
|
|
50
|
+
.replace(/\/src\/main\.js/g, clientEntry);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
test: {
|
|
55
|
+
include: ["tests/client/**/*.vitest.js"]
|
|
56
|
+
},
|
|
57
|
+
optimizeDeps: {
|
|
58
|
+
entries: [
|
|
59
|
+
"index.html",
|
|
60
|
+
"src/**/*.{js,ts,vue}"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
server: {
|
|
64
|
+
port: devPort,
|
|
65
|
+
warmup: {
|
|
66
|
+
clientFiles: [
|
|
67
|
+
"src/main.{js,ts}",
|
|
68
|
+
"src/router/**/*.{js,ts}",
|
|
69
|
+
"src/pages/**/*.{js,ts,vue}",
|
|
70
|
+
"src/components/**/*.{js,ts,vue}"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
proxy: {
|
|
74
|
+
"/api": {
|
|
75
|
+
target: apiProxyTarget,
|
|
76
|
+
changeOrigin: true
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: assistant/assistant-surface
|
|
3
|
+
title: Assistant surface and settings
|
|
4
|
+
summary: Configure an assistant runtime for one application surface and expose its chat and settings elements through ordinary pages and placements.
|
|
5
|
+
keywords: ai, assistant, chat, config, environment, page, placement, settings, surface
|
|
6
|
+
requires: @jskit-ai/assistant-runtime, @jskit-ai/shell-web
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Assistant surface and settings
|
|
10
|
+
|
|
11
|
+
## Use when
|
|
12
|
+
|
|
13
|
+
Use this pattern when an application should expose JSKIT's assistant runtime on
|
|
14
|
+
an enabled surface and provide a settings page for that assistant.
|
|
15
|
+
|
|
16
|
+
## Do not use when
|
|
17
|
+
|
|
18
|
+
Do not use this pattern for an application that only needs a single
|
|
19
|
+
server-to-model call, or when the product has no conversational surface. Do not
|
|
20
|
+
copy the assistant runtime's repositories or transport into application code.
|
|
21
|
+
|
|
22
|
+
## Product decisions
|
|
23
|
+
|
|
24
|
+
Choose the runtime surface, settings surface, global or workspace configuration
|
|
25
|
+
scope, page routes, placement roles, AI provider, model policy, and whether the
|
|
26
|
+
assistant begins disabled until credentials are supplied. Never put an API key
|
|
27
|
+
in source or a questionnaire transcript.
|
|
28
|
+
|
|
29
|
+
## Invariants
|
|
30
|
+
|
|
31
|
+
- Both configured surfaces exist and are enabled.
|
|
32
|
+
- Workspace configuration is used only when both surfaces require a workspace.
|
|
33
|
+
- Each runtime surface appears once in `assistantSurfaces` and
|
|
34
|
+
`assistantServer`.
|
|
35
|
+
- The server config contains an environment prefix, never a credential value.
|
|
36
|
+
- Runtime and settings pages use the public assistant elements.
|
|
37
|
+
- Environment values are supplied through the application's normal secret
|
|
38
|
+
environment boundary.
|
|
39
|
+
- No generator markers, setup receipts, or overwrite state remain.
|
|
40
|
+
|
|
41
|
+
## Framework APIs
|
|
42
|
+
|
|
43
|
+
Use `AssistantSurfaceClientElement` and `AssistantSettingsClientElement` from
|
|
44
|
+
`@jskit-ai/assistant-runtime/client`. Install the runtime package through the
|
|
45
|
+
normal package-capability path. Configure `assistantSurfaces` in public config
|
|
46
|
+
and `assistantServer` in server config.
|
|
47
|
+
|
|
48
|
+
## Example files
|
|
49
|
+
|
|
50
|
+
`example/` contains concrete public/server config, assistant and settings pages,
|
|
51
|
+
and semantic placements for an `admin` surface. Adapt the complete files to the
|
|
52
|
+
application's existing config and placement registries.
|
|
53
|
+
|
|
54
|
+
## Variation points
|
|
55
|
+
|
|
56
|
+
Change surface ids, settings location, config scope, environment prefix, routes,
|
|
57
|
+
labels, icons, and placement targets. A workspace-scoped application must retain
|
|
58
|
+
the current workspace in both routes and assistant requests through the runtime's
|
|
59
|
+
public workspace support.
|
|
60
|
+
|
|
61
|
+
## Verification
|
|
62
|
+
|
|
63
|
+
- load both pages through their normal navigation
|
|
64
|
+
- verify the configured surface and settings target agree
|
|
65
|
+
- verify missing credentials disable assistant calls without exposing secrets
|
|
66
|
+
- exercise one successful and one provider-error conversation
|
|
67
|
+
- verify global or cross-workspace isolation, whichever applies
|
|
68
|
+
- run migrations, server/client tests, and focused browser coverage
|
|
69
|
+
|
|
70
|
+
## Avoid
|
|
71
|
+
|
|
72
|
+
- API keys or provider secrets in source
|
|
73
|
+
- a second model client beside the assistant runtime
|
|
74
|
+
- implicit surface selection
|
|
75
|
+
- workspace scope on a non-workspace surface
|
|
76
|
+
- copied runtime repositories, actions, or routes
|
|
77
|
+
- generator commands, question metadata, receipts, or provenance
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const config = {
|
|
2
|
+
surfaceDefaultId: "admin",
|
|
3
|
+
surfaceDefinitions: {
|
|
4
|
+
admin: {
|
|
5
|
+
id: "admin",
|
|
6
|
+
enabled: true,
|
|
7
|
+
requiresAuth: true,
|
|
8
|
+
requiresWorkspace: false
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
assistantSurfaces: {
|
|
12
|
+
admin: {
|
|
13
|
+
settingsSurfaceId: "admin",
|
|
14
|
+
configScope: "global"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default config;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createPlacementRegistry } from "@jskit-ai/shell-web/client/placement";
|
|
2
|
+
|
|
3
|
+
const registry = createPlacementRegistry();
|
|
4
|
+
const { addPlacement } = registry;
|
|
5
|
+
|
|
6
|
+
addPlacement({
|
|
7
|
+
id: "assistant.admin.chat.link",
|
|
8
|
+
target: "shell.primary-nav",
|
|
9
|
+
kind: "link",
|
|
10
|
+
surfaces: ["admin"],
|
|
11
|
+
order: 140,
|
|
12
|
+
props: {
|
|
13
|
+
label: "Assistant",
|
|
14
|
+
icon: "mdi-creation-outline",
|
|
15
|
+
surface: "admin",
|
|
16
|
+
scopedSuffix: "/assistant",
|
|
17
|
+
unscopedSuffix: "/assistant"
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
addPlacement({
|
|
22
|
+
id: "assistant.admin.settings.link",
|
|
23
|
+
target: "page.section-nav",
|
|
24
|
+
owner: "admin-settings",
|
|
25
|
+
kind: "link",
|
|
26
|
+
surfaces: ["admin"],
|
|
27
|
+
order: 160,
|
|
28
|
+
props: {
|
|
29
|
+
label: "Assistant",
|
|
30
|
+
surface: "admin",
|
|
31
|
+
scopedSuffix: "/settings/assistant",
|
|
32
|
+
unscopedSuffix: "/settings/assistant"
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export default function getPlacements() {
|
|
37
|
+
return registry.build();
|
|
38
|
+
}
|