@cosmicdrift/kumiko-samples 0.401.0 → 0.403.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 (37) hide show
  1. package/package.json +1 -1
  2. package/packages/bundled-features/package.json +1 -1
  3. package/packages/bundled-features/src/agent-tools/agent-manifest.ts +177 -42
  4. package/packages/bundled-features/src/agent-tools/changes.json +19 -0
  5. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +8 -15
  6. package/packages/bundled-features/src/agent-tools/types.ts +11 -10
  7. package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +2 -2
  8. package/packages/bundled-features/src/inbound-mail-foundation/changes.json +7 -0
  9. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +1 -0
  10. package/packages/bundled-features/src/inbound-mail-foundation/watch-lease.ts +3 -3
  11. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor-types.ts +5 -5
  12. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +5 -7
  13. package/packages/bundled-features/src/managed-pages/changes.json +6 -0
  14. package/packages/bundled-features/src/managed-pages/feature.ts +9 -1
  15. package/packages/bundled-features/src/managed-pages/render-page-body.ts +66 -12
  16. package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -2
  17. package/packages/bundled-features/src/managed-pages/web/lossy-markdown.ts +2 -19
  18. package/packages/bundled-features/src/managed-pages/web/markdown-to-document.ts +2 -2
  19. package/packages/bundled-features/src/managed-pages/web/page-body-section.tsx +0 -1
  20. package/packages/bundled-features/src/readiness/changes.json +6 -0
  21. package/packages/bundled-features/src/readiness/handlers/run-list.query.ts +2 -1
  22. package/packages/bundled-features/src/readiness/run-view.ts +4 -5
  23. package/packages/bundled-features/src/template-resolver/changes.json +12 -0
  24. package/packages/bundled-features/src/template-resolver/compile-document-body.ts +2 -2
  25. package/packages/bundled-features/src/template-resolver/document-sanitizer.ts +3 -2
  26. package/packages/bundled-features/src/template-resolver/index.ts +1 -0
  27. package/packages/bundled-features/src/template-resolver/web/document-schema.ts +18 -1
  28. package/packages/bundled-features/src/template-resolver/web/i18n.ts +2 -2
  29. package/packages/bundled-features/src/template-resolver/web/use-collection-entry-create.ts +5 -3
  30. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +41 -33
  31. package/packages/bundled-features/src/user-data-rights/boot-rules.ts +19 -0
  32. package/packages/bundled-features/src/user-data-rights/changes.json +12 -0
  33. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +20 -18
  34. package/samples/apps/use-all-bundled/src/app/collection-labels-feature.ts +3 -1
  35. package/samples/apps/use-all-bundled/src/run-config.ts +2 -0
  36. package/samples/recipes/dashboard-stats/README.md +5 -0
  37. package/samples/recipes/dashboard-stats/src/feature.ts +27 -0
@@ -315,6 +315,7 @@ export const APP_FEATURES = [
315
315
  // shells and the collection is unreachable in the UI.
316
316
  nav: {
317
317
  label: "templateResolver:nav.snippets",
318
+ entryLabel: "templateResolver:nav.snippet",
318
319
  workspaces: ["admin-shell:workspace:platform"],
319
320
  },
320
321
  // document + variableSchema so the smoke app renders the WYSIWYG with
@@ -334,6 +335,7 @@ export const APP_FEATURES = [
334
335
  access: { roles: ["TenantAdmin", "TenantMember", "SystemAdmin"] },
335
336
  nav: {
336
337
  label: "templateResolver:nav.signatures",
338
+ entryLabel: "templateResolver:nav.signature",
337
339
  workspaces: ["admin-shell:workspace:platform"],
338
340
  },
339
341
  contentFormat: "document",
@@ -28,6 +28,11 @@ query and the fields to read, the query does the counting.
28
28
  - **Fallback by reason**: `fallback: { forbidden, notFound }` renders a screen on
29
29
  403/404 of the gate query; other reasons get the default notice or an error
30
30
  banner with retry.
31
+ - **Named filter shared by tile and list**: the entity declares `namedFilters`,
32
+ the `ticket-queue` entityList lists the id in `namedFilters`, and the
33
+ `open-work` stat counts through the list's own query with `params.namedFilter`
34
+ and `navigate`. A click opens the queue filtered by the same rule, so tile and
35
+ list cannot drift.
31
36
 
32
37
  ## When to reach for it
33
38
 
@@ -21,10 +21,15 @@ export const ticketEntity = createEntity({
21
21
  title: createTextField({ personal: false, reason: "is_business_data", required: true }),
22
22
  status: createSelectField({ options: TICKET_STATUSES, default: "open", required: true }),
23
23
  },
24
+ // Defined once: the queue list and the dashboard tile both read it.
25
+ namedFilters: {
26
+ "open-work": { filters: () => [{ field: "status", op: "eq", value: "open" }] },
27
+ },
24
28
  });
25
29
 
26
30
  export const TICKET_STATS_QUERY = "tickets:query:ticket:stats";
27
31
  export const TICKET_CAPABILITIES_QUERY = "tickets:query:ticket:capabilities";
32
+ export const TICKET_LIST_QUERY = "tickets:query:ticket:list";
28
33
 
29
34
  const readerRoles = { roles: ["Admin", "User"] } as const;
30
35
 
@@ -109,6 +114,9 @@ export const ticketFeature = defineFeature("tickets", (r) => {
109
114
  "tickets.dashboard.open": { en: "Open" },
110
115
  "tickets.dashboard.closed": { en: "Closed" },
111
116
  "tickets.dashboard.total": { en: "All tickets" },
117
+ "tickets.dashboard.open-work": { en: "Open work" },
118
+ "tickets.filter.open-work": { en: "Open work" },
119
+ "screen:ticket-queue.title": { en: "Ticket queue" },
112
120
  },
113
121
  });
114
122
 
@@ -144,6 +152,16 @@ export const ticketFeature = defineFeature("tickets", (r) => {
144
152
  query: TICKET_STATS_QUERY,
145
153
  valueField: "total",
146
154
  },
155
+ // Counts through the list's own query with the same named filter, then links to that list.
156
+ {
157
+ kind: "stat",
158
+ id: "open-work",
159
+ label: "tickets.dashboard.open-work",
160
+ query: TICKET_LIST_QUERY,
161
+ valueField: "total",
162
+ params: { namedFilter: "open-work", limit: 1, totalCount: true },
163
+ navigate: { screen: "ticket-queue", namedFilter: "open-work" },
164
+ },
147
165
  ],
148
166
  access: readerRoles,
149
167
  });
@@ -152,6 +170,15 @@ export const ticketFeature = defineFeature("tickets", (r) => {
152
170
  // button, and a fallback chosen by reason.
153
171
  const gate = { query: TICKET_CAPABILITIES_QUERY, field: "canClose", eq: true } as const;
154
172
 
173
+ r.screen({
174
+ id: "ticket-queue",
175
+ type: "entityList",
176
+ entity: "ticket",
177
+ columns: ["title", "status"],
178
+ namedFilters: [{ id: "open-work", label: "tickets.filter.open-work" }],
179
+ access: readerRoles,
180
+ });
181
+
155
182
  // The list doubles as the fallback target: it has no visibleWhen of its own.
156
183
  r.screen({
157
184
  id: "ticket-list",