@happyvertical/smrt-agents 0.51.3 → 0.51.4

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/AGENTS.md CHANGED
@@ -250,6 +250,7 @@ const tool = createInvokeAgentTool({
250
250
  | `src/agent.ts` | Base Agent class — lifecycle, dispatch, interests, config, opt-in learning trait, multi-instance identity |
251
251
  | `src/execute-as-principal.ts` | `executeAsPrincipal` / `PrincipalRun` — run agent work as a persona's bound user (#1888) |
252
252
  | `src/report-data-surface.ts` | Principal-bound report discovery, query, lifecycle, drilldown, and export tools (#2462) |
253
+ | `src/smrt-collection-data-surface.ts` | `createSmrtCollectionDataSurfaceDefinition()` — generic registry-driven `SmrtObject` collection to `DataSurfaceDefinition` adapter, with field-policy redaction (schema overrides included), class-aware tenant scope, DNF filter/scope lowering, deny-all short-circuit, query-bound opaque cursors, and offset/cursor paging; callers must keep `maxPageLimit` <= the collection's own row-limit cap (#2905, follow-up #2912) |
253
254
  | `src/delegation.ts` | `DelegationEnvelope` — immutable principal + bounded delegation depth (#1892) |
254
255
  | `src/invoke-agent.ts` | `invoke-agent` tool, worker executor, completion-dispatch convention, transports (#1892) |
255
256
  | `src/playbook-preflight.ts` | `playbooks.preflight` PrincipalTool — advisory per-step verdicts, never a grant (#2590) |
package/README.md CHANGED
@@ -139,6 +139,13 @@ such as `MessagingSettingsService`.
139
139
  | `AgentWithInterestsOptions` | Agent options with interests |
140
140
  | `createReportDataSurfaceTools` | Principal-bound report discovery, query, lifecycle, drilldown, and export tools |
141
141
  | `ReportDataSurfaceToolsOptions` | Server-owned report catalog and application-host seams |
142
+ | `createSmrtCollectionDataSurfaceDefinition` | Generic registry-driven `SmrtObject` collection → `DataSurfaceDefinition` adapter, with field-policy redaction and offset/cursor paging |
143
+ | `buildDataQuerySchemaForClass` | Memoized `DataQuerySchema` derived from `ObjectRegistry` field metadata for an arbitrary registered class |
144
+ | `executeSmrtCollectionQuery` | Bounded `DataQueryRequest` execution against any `list`/`count`/`facets`-shaped collection |
145
+ | `CreateSmrtCollectionDataSurfaceOptions` | Options for `createSmrtCollectionDataSurfaceDefinition` |
146
+ | `SmrtCollectionQueryCollection` | Structural collection interface the generic adapter executes against |
147
+ | `SmrtCollectionQueryScope` | Trusted, server-derived scope conditions for the generic adapter |
148
+ | `SmrtCollectionDataSurfaceAction` | Declarative row/bulk action catalog entry surfaced via `metadata.actionCatalog` |
142
149
 
143
150
  ### Report Data-Surface Tools
144
151
 
@@ -156,6 +163,51 @@ lock-skipped materializations). Advertised actions are filtered by the live
156
163
  principal's tool allow-list and effective permissions; action hosts still
157
164
  reauthorize before mutation.
158
165
 
166
+ ### Generic SmrtObject Collection Data-Surface
167
+
168
+ `createSmrtCollectionDataSurfaceDefinition()` builds a `DataSurfaceDefinition`
169
+ for an arbitrary registered `SmrtObject` collection (events, ad zones,
170
+ schedules, social accounts, meetings, tasks, …), not just `Content`:
171
+
172
+ ```typescript
173
+ const definition = await createSmrtCollectionDataSurfaceDefinition({
174
+ qualifiedName: '@myapp/events:Event',
175
+ collectionName: 'events', // permission-catalog collection
176
+ collection: async ({ principal }) => getEventsCollection(principal.tenantId),
177
+ scope: ({ principal }) => ({ tenantId: principal.tenantId }),
178
+ actions: [{ id: 'cancel', label: 'Cancel', requiresConfirmation: true }],
179
+ });
180
+ ```
181
+
182
+ The schema is derived from `ObjectRegistry.getAllFields()`: `sensitive` and
183
+ `readPermission`-gated fields, transient/non-column-backed fields, the
184
+ class's configured tenant field (from `@TenantScoped()`; unscoped classes get
185
+ no tenant field exclusion or scoping at all), and internal `_`-prefixed
186
+ fields are never declared — the same field-policy boundary
187
+ `@happyvertical/smrt-content`'s ContentList adapter enforces. A host-supplied
188
+ `schema` override is intersected with this same registry-derived exclusion
189
+ set, so it can only narrow, never widen, what is advertised. Execution ANDs
190
+ the tenant read scope and the application `scope` into every branch of the
191
+ caller's filter (`all`/`any`/`not`/condition, lowered to bounded
192
+ disjunctive-normal-form `where` conditions), supports both offset and
193
+ opaque-cursor paging, and never hydrates the full collection. An explicit,
194
+ normalized-empty application `scope` denies all rows and short-circuits
195
+ without calling the collection.
196
+
197
+ Cursors are opaque and bound to the exact query: they encode `{ binding,
198
+ offset }`, where `binding` fingerprints the normalized request (filter, sort,
199
+ projection) plus the merged tenant/application scope, so a cursor from a
200
+ different query, filter, sort, or tenant is rejected rather than silently
201
+ misapplied. `facets` support defaults from the collection's shape
202
+ (`typeof collection.facets === 'function'` for a static collection; `true`
203
+ for a resolver-backed one, which must set `facets: false` if its resolved
204
+ collection lacks `facets()`). Because `SmrtCollectionQueryCollection` is
205
+ structural, the adapter cannot read a host collection's own row-limit cap —
206
+ set `maxPageLimit` at or below that cap, or a clamped page is detected and
207
+ reported via a result warning rather than corrected. See
208
+ `src/smrt-collection-data-surface.ts` for the full contract and
209
+ `docs/data-surface-conformance.md` for the integration checklist.
210
+
159
211
  ### Server Export (`@happyvertical/smrt-agents/server`)
160
212
 
161
213
  `createDataSurfaceActionAdapter()` provides server-only preview and confirmed
@@ -193,6 +245,16 @@ persisted envelope field and is never added to the job payload. Worker delivery
193
245
  before mutation. The original `job.run()` callback remains available for
194
246
  in-process queue adapters.
195
247
 
248
+ `createDataSurfaceActionRouteHandlers()` wires a SvelteKit (or any Web
249
+ `Request`/`Response`) route to the adapter: it resolves the principal per
250
+ request, parses the body, and maps every refusal reason to an HTTP status.
251
+ `resolveBulkExplicitIds()` expands a browser-supplied anchor row id into a
252
+ full bulk selection server-side (e.g. "every reference photo for this
253
+ performer") so one idempotency key covers the whole set. See
254
+ [`docs/data-surface-sveltekit-wiring.md`](../../docs/data-surface-sveltekit-wiring.md)
255
+ for the full route → principal → action → queue wiring guide, including the
256
+ refusal-to-status table.
257
+
196
258
  ### UI Export (`@happyvertical/smrt-agents/ui`)
197
259
 
198
260
  | Export | Description |
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export { AGENT_SCHEDULE_SLUG_BACKFILL, AGENT_SCHEDULE_TABLE, AgentScheduleSlugBa
15
15
  export { type CreatePlaybookPreflightToolOptions, createPlaybookPreflightTool, filterPlaybooksByPreflight, PLAYBOOK_PREFLIGHT_FUNCTION_NAME, PLAYBOOK_PREFLIGHT_TOOL_SLUG, playbookStepCollection, playbookStepToolSlug, } from './playbook-preflight.js';
16
16
  export { createReportDataSurfaceDefinition, createReportDataSurfaceTools, REPORT_DRILLDOWN_FUNCTION_NAME, REPORT_DRILLDOWN_TOOL_SLUG, REPORT_EXPORT_FUNCTION_NAME, REPORT_EXPORT_TOOL_SLUG, REPORT_QUERY_FUNCTION_NAME, REPORT_QUERY_TOOL_SLUG, REPORT_REFRESH_FUNCTION_NAME, REPORT_REFRESH_TOOL_SLUG, type ReportDataSurfaceAuditEntry, ReportDataSurfaceConfigurationError, type ReportDataSurfaceDefinition, type ReportDataSurfaceExportHost, type ReportDataSurfaceRefreshHost, type ReportDataSurfaceToolsOptions, type ReportDataSurfaceVisibleAck, type ReportDataSurfaceVisibleCommand, ReportDataSurfaceVisibleError, type ReportDataSurfaceVisibleHost, } from './report-data-surface.js';
17
17
  export { AgentSchedule, AgentScheduleCollection, type ScheduleStatus, } from './schedule.js';
18
+ export { assertSmrtCollectionQuerySchema, buildDataQuerySchemaForClass, type CreateSmrtCollectionDataSurfaceOptions, clearSmrtCollectionQuerySchemaCache, createSmrtCollectionDataSurfaceDefinition, executeSmrtCollectionQuery, type SmrtCollectionDataSurfaceAction, type SmrtCollectionQueryCollection, type SmrtCollectionQueryScope, } from './smrt-collection-data-surface.js';
18
19
  export type { SummaryArticleImage, SummaryArticleOptions, SummaryArticleResult, } from './summary-article.js';
19
20
  export { type ResolvedAgentAvailability, TenantAgent, TenantAgentCollection, type TenantAgentStatus, } from './tenant-agent.js';
20
21
  export type { AgentStatusType } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}