@lssm/example.content-generation 0.0.0-canary-20251217063201 → 0.0.0-canary-20251217073102

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 (51) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +56 -51
  2. package/CHANGELOG.md +5 -4
  3. package/dist/docs/content-generation.docblock.js +27 -14
  4. package/dist/docs/index.js +1 -1
  5. package/dist/example.js +38 -1
  6. package/dist/generate.js +52 -1
  7. package/dist/index.js +5 -1
  8. package/dist/libs/content-gen/dist/generators/blog.js +68 -1
  9. package/dist/libs/content-gen/dist/generators/email.js +96 -9
  10. package/dist/libs/content-gen/dist/generators/landing-page.js +76 -2
  11. package/dist/libs/content-gen/dist/generators/social.js +73 -1
  12. package/dist/libs/content-gen/dist/seo/optimizer.js +48 -1
  13. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
  14. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
  15. package/dist/libs/contracts/dist/docs/index.js +29 -1
  16. package/dist/libs/contracts/dist/docs/presentations.js +71 -1
  17. package/dist/libs/contracts/dist/docs/registry.js +44 -1
  18. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
  19. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
  20. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
  21. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
  22. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
  23. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
  24. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
  25. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
  26. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
  27. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
  28. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
  29. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
  30. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
  31. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
  32. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
  33. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
  34. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
  35. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
  36. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
  37. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
  38. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
  39. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
  40. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
  41. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
  42. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
  43. package/dist/libs/logger/dist/context.node.js +78 -1
  44. package/dist/libs/logger/dist/elysia-plugin.js +3 -1
  45. package/dist/libs/logger/dist/formatters.js +163 -9
  46. package/dist/libs/logger/dist/index.js +7 -1
  47. package/dist/libs/logger/dist/logger.node.js +189 -1
  48. package/dist/libs/logger/dist/timer.js +126 -1
  49. package/dist/libs/logger/dist/tracer.node.js +115 -1
  50. package/dist/libs/logger/dist/types.js +13 -1
  51. package/package.json +7 -6
@@ -1 +1,29 @@
1
- import{a as e,i as t,o as n}from"./presentations.js";import{a as r,i,n as a}from"./registry.js";import"./PUBLISHING.docblock.js";import"./accessibility_wcag_compliance_specs.docblock.js";import"./tech/PHASE_1_QUICKSTART.docblock.js";import"./tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js";import"./tech/PHASE_3_AUTO_EVOLUTION.docblock.js";import"./tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js";import"./tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js";import"./tech/lifecycle-stage-system.docblock.js";import"./tech/presentation-runtime.docblock.js";import"./tech/auth/better-auth-nextjs.docblock.js";import"./tech/schema/README.docblock.js";import"./tech/templates/runtime.docblock.js";import"./tech/workflows/overview.docblock.js";import"./tech/mcp-endpoints.docblock.js";import"./tech/vscode-extension.docblock.js";import"./tech/telemetry-ingest.docblock.js";import"./tech/contracts/openapi-export.docblock.js";import"./tech/studio/workspaces.docblock.js";import"./tech/studio/sandbox-unlogged.docblock.js";import"./tech/studio/workspace-ops.docblock.js";import"./tech/studio/project-routing.docblock.js";import"./tech/studio/platform-admin-panel.docblock.js";import"./tech/studio/learning-events.docblock.js";import"./tech/studio/learning-journeys.docblock.js";import"./tech/studio/project-access-teams.docblock.js";import"./tech/studio/team-invitations.docblock.js";import"./tech/llm/llm-integration.docblock.js";
1
+ import { docBlockToPresentationSpec, docBlockToPresentationV2, docBlocksToPresentationRoutes } from "./presentations.js";
2
+ import { DocRegistry, defaultDocRegistry, registerDocBlocks } from "./registry.js";
3
+ import "./PUBLISHING.docblock.js";
4
+ import "./accessibility_wcag_compliance_specs.docblock.js";
5
+ import "./tech/PHASE_1_QUICKSTART.docblock.js";
6
+ import "./tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js";
7
+ import "./tech/PHASE_3_AUTO_EVOLUTION.docblock.js";
8
+ import "./tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js";
9
+ import "./tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js";
10
+ import "./tech/lifecycle-stage-system.docblock.js";
11
+ import "./tech/presentation-runtime.docblock.js";
12
+ import "./tech/auth/better-auth-nextjs.docblock.js";
13
+ import "./tech/schema/README.docblock.js";
14
+ import "./tech/templates/runtime.docblock.js";
15
+ import "./tech/workflows/overview.docblock.js";
16
+ import "./tech/mcp-endpoints.docblock.js";
17
+ import "./tech/vscode-extension.docblock.js";
18
+ import "./tech/telemetry-ingest.docblock.js";
19
+ import "./tech/contracts/openapi-export.docblock.js";
20
+ import "./tech/studio/workspaces.docblock.js";
21
+ import "./tech/studio/sandbox-unlogged.docblock.js";
22
+ import "./tech/studio/workspace-ops.docblock.js";
23
+ import "./tech/studio/project-routing.docblock.js";
24
+ import "./tech/studio/platform-admin-panel.docblock.js";
25
+ import "./tech/studio/learning-events.docblock.js";
26
+ import "./tech/studio/learning-journeys.docblock.js";
27
+ import "./tech/studio/project-access-teams.docblock.js";
28
+ import "./tech/studio/team-invitations.docblock.js";
29
+ import "./tech/llm/llm-integration.docblock.js";
@@ -1 +1,71 @@
1
- const e=[`markdown`,`application/json`,`application/xml`,`react`];function t(e){if(!e.length)return`/`;let t=e.startsWith(`/`)?e:`/${e}`;return t===`/`?`/`:t.replace(/\/+$/,``)}function n(e,n){if(e.route)return t(e.route);let r=n??`/docs`,i=e.id.replace(/^docs\.?/,``).replace(/\./g,`/`).replace(/\/+/g,`/`);return t(i.startsWith(`/`)?i:`${r}/${i}`)}function r(e,t){return t?`${t}.${e.id}`:e.id}function i(t,n){let i=n?.defaultTargets??e,a=t.version??n?.defaultVersion??1,o=t.stability??n?.defaultStability??`stable`;return{meta:{name:r(t,n?.namespace),version:a,description:t.summary??t.title,tags:t.tags,owners:t.owners,domain:t.domain,stability:o},policy:t.visibility&&t.visibility!==`public`?{flags:[t.visibility]}:void 0,source:{type:`blocknotejs`,docJson:t.body},targets:i}}function a(e,t){let n=e.version??t?.defaultVersion??1,i=e.stability??t?.defaultStability??`stable`;return{meta:{name:r(e,t?.namespace),version:n,stability:i,tags:e.tags,owners:e.owners,description:e.summary??e.title},content:{kind:`markdown`,content:e.body}}}function o(e,t){return e.map(e=>({block:e,route:n(e,t?.routePrefix),descriptor:i(e,t)}))}export{a,i,o};
1
+ //#region ../../libs/contracts/dist/docs/presentations.js
2
+ const DEFAULT_TARGETS = [
3
+ "markdown",
4
+ "application/json",
5
+ "application/xml",
6
+ "react"
7
+ ];
8
+ function normalizeRoute(route) {
9
+ if (!route.length) return "/";
10
+ const withLeading = route.startsWith("/") ? route : `/${route}`;
11
+ return withLeading === "/" ? "/" : withLeading.replace(/\/+$/, "");
12
+ }
13
+ function deriveRoute(block, routePrefix) {
14
+ if (block.route) return normalizeRoute(block.route);
15
+ const prefix = routePrefix ?? "/docs";
16
+ const slug = block.id.replace(/^docs\.?/, "").replace(/\./g, "/").replace(/\/+/g, "/");
17
+ return normalizeRoute(slug.startsWith("/") ? slug : `${prefix}/${slug}`);
18
+ }
19
+ function buildName(block, namespace) {
20
+ return namespace ? `${namespace}.${block.id}` : block.id;
21
+ }
22
+ function docBlockToPresentationV2(block, options) {
23
+ const targets = options?.defaultTargets ?? DEFAULT_TARGETS;
24
+ const version = block.version ?? options?.defaultVersion ?? 1;
25
+ const stability = block.stability ?? options?.defaultStability ?? "stable";
26
+ return {
27
+ meta: {
28
+ name: buildName(block, options?.namespace),
29
+ version,
30
+ description: block.summary ?? block.title,
31
+ tags: block.tags,
32
+ owners: block.owners,
33
+ domain: block.domain,
34
+ stability
35
+ },
36
+ policy: block.visibility && block.visibility !== "public" ? { flags: [block.visibility] } : void 0,
37
+ source: {
38
+ type: "blocknotejs",
39
+ docJson: block.body
40
+ },
41
+ targets
42
+ };
43
+ }
44
+ function docBlockToPresentationSpec(block, options) {
45
+ const version = block.version ?? options?.defaultVersion ?? 1;
46
+ const stability = block.stability ?? options?.defaultStability ?? "stable";
47
+ return {
48
+ meta: {
49
+ name: buildName(block, options?.namespace),
50
+ version,
51
+ stability,
52
+ tags: block.tags,
53
+ owners: block.owners,
54
+ description: block.summary ?? block.title
55
+ },
56
+ content: {
57
+ kind: "markdown",
58
+ content: block.body
59
+ }
60
+ };
61
+ }
62
+ function docBlocksToPresentationRoutes(blocks, options) {
63
+ return blocks.map((block) => ({
64
+ block,
65
+ route: deriveRoute(block, options?.routePrefix),
66
+ descriptor: docBlockToPresentationV2(block, options)
67
+ }));
68
+ }
69
+
70
+ //#endregion
71
+ export { docBlockToPresentationSpec, docBlockToPresentationV2, docBlocksToPresentationRoutes };
@@ -1 +1,44 @@
1
- import{a as e,o as t}from"./presentations.js";var n=class{routes=new Map;constructor(e=[],t){e.forEach(e=>this.register(e,t))}register(e,n){let[r]=t([e],n);return r&&this.routes.set(e.id,r),this}list(){return[...this.routes.values()]}get(e){return this.routes.get(e)}toRouteTuples(){return this.list().map(({route:e,descriptor:t})=>[e,t])}toPresentationSpecs(t){return this.list().map(({block:n})=>e(n,t))}};const r=[`id`,`title`,`body`,`kind`,`visibility`,`route`],i=new n;function a(e){for(let t of e){for(let e of r)if(!t[e])throw Error(`DocBlock ${t.id??`<missing id>`} missing field ${String(e)}`);i.register(t)}}export{a,i,n};
1
+ import { docBlockToPresentationSpec, docBlocksToPresentationRoutes } from "./presentations.js";
2
+
3
+ //#region ../../libs/contracts/dist/docs/registry.js
4
+ var DocRegistry = class {
5
+ routes = /* @__PURE__ */ new Map();
6
+ constructor(blocks = [], options) {
7
+ blocks.forEach((block) => this.register(block, options));
8
+ }
9
+ register(block, options) {
10
+ const [route] = docBlocksToPresentationRoutes([block], options);
11
+ if (route) this.routes.set(block.id, route);
12
+ return this;
13
+ }
14
+ list() {
15
+ return [...this.routes.values()];
16
+ }
17
+ get(id) {
18
+ return this.routes.get(id);
19
+ }
20
+ toRouteTuples() {
21
+ return this.list().map(({ route, descriptor }) => [route, descriptor]);
22
+ }
23
+ toPresentationSpecs(options) {
24
+ return this.list().map(({ block }) => docBlockToPresentationSpec(block, options));
25
+ }
26
+ };
27
+ const requiredFields = [
28
+ "id",
29
+ "title",
30
+ "body",
31
+ "kind",
32
+ "visibility",
33
+ "route"
34
+ ];
35
+ const defaultDocRegistry = new DocRegistry();
36
+ function registerDocBlocks(blocks) {
37
+ for (const block of blocks) {
38
+ for (const field of requiredFields) if (!block[field]) throw new Error(`DocBlock ${block.id ?? "<missing id>"} missing field ${String(field)}`);
39
+ defaultDocRegistry.register(block);
40
+ }
41
+ }
42
+
43
+ //#endregion
44
+ export { DocRegistry, defaultDocRegistry, registerDocBlocks };
@@ -1,383 +1,16 @@
1
- import{a as e}from"../registry.js";e([{id:`docs.tech.PHASE_1_QUICKSTART`,title:`Phase 1: API Reference Index`,summary:`Quick reference for all new Phase 1 APIs.`,kind:`reference`,visibility:`public`,route:`/docs/tech/PHASE_1_QUICKSTART`,tags:[`tech`,`PHASE_1_QUICKSTART`],body:`# Phase 1: API Reference Index
2
-
3
- Quick reference for all new Phase 1 APIs.
4
-
5
- ---
6
-
7
- ## @lssm/lib.multi-tenancy
8
-
9
- ### RLS
10
- \`\`\`typescript
11
- import { createRlsMiddleware, type TenantIdProvider } from '@lssm/lib.multi-tenancy/rls';
12
- \`\`\`
13
-
14
- ### Provisioning
15
- \`\`\`typescript
16
- import {
17
- TenantProvisioningService,
18
- type CreateTenantInput,
19
- type TenantProvisioningConfig
20
- } from '@lssm/lib.multi-tenancy/provisioning';
21
- \`\`\`
22
-
23
- ### Isolation
24
- \`\`\`typescript
25
- import { IsolationValidator } from '@lssm/lib.multi-tenancy/isolation';
26
- \`\`\`
27
-
28
- ---
29
-
30
- ## @lssm/lib.observability
31
-
32
- ### Tracing
33
- \`\`\`typescript
34
- import {
35
- getTracer,
36
- traceAsync,
37
- traceSync,
38
- createTracingMiddleware
39
- } from '@lssm/lib.observability/tracing';
40
- \`\`\`
41
-
42
- ### Metrics
43
- \`\`\`typescript
44
- import {
45
- getMeter,
46
- createCounter,
47
- createUpDownCounter,
48
- createHistogram,
49
- standardMetrics
50
- } from '@lssm/lib.observability/metrics';
51
- \`\`\`
52
-
53
- ### Logging
54
- \`\`\`typescript
55
- import {
56
- Logger,
57
- logger,
58
- type LogLevel,
59
- type LogEntry
60
- } from '@lssm/lib.observability/logging';
61
- \`\`\`
62
-
63
- ---
64
-
65
- ## @lssm/lib.resilience
66
-
67
- ### Circuit Breaker
68
- \`\`\`typescript
69
- import {
70
- CircuitBreaker,
71
- type CircuitState,
72
- type CircuitBreakerConfig
73
- } from '@lssm/lib.resilience/circuit-breaker';
74
- \`\`\`
75
-
76
- ### Retry
77
- \`\`\`typescript
78
- import { retry } from '@lssm/lib.resilience/retry';
79
- \`\`\`
80
-
81
- ### Timeout
82
- \`\`\`typescript
83
- import { timeout } from '@lssm/lib.resilience/timeout';
84
- \`\`\`
85
-
86
- ### Fallback
87
- \`\`\`typescript
88
- import { fallback } from '@lssm/lib.resilience/fallback';
89
- \`\`\`
90
-
91
- ---
92
-
93
- ## Enhanced: @lssm/lib.contracts
94
-
95
- ### DataViews
96
- \`\`\`typescript
97
- import { DataViewQueryGenerator } from '@lssm/lib.contracts/data-views/query-generator';
98
- import { DataViewRuntime } from '@lssm/lib.contracts/data-views/runtime';
99
- \`\`\`
100
-
101
- ### Workflows
102
- \`\`\`typescript
103
- import { SLAMonitor, type SLABreachEvent } from '@lssm/lib.contracts/workflow/sla-monitor';
104
- import { PrismaStateStore } from '@lssm/lib.contracts/workflow/adapters/db-adapter';
105
- \`\`\`
106
-
107
- ---
108
-
109
- ## Enhanced: @lssm/lib.design-system
110
-
111
- ### DataView Components
112
- \`\`\`typescript
113
- import { DataViewRenderer } from '@lssm/lib.design-system/components/data-view/DataViewRenderer';
114
- // Also available: DataViewList, DataViewTable, DataViewDetail
115
- \`\`\`
116
-
117
- ---
118
-
119
- ## Usage Examples
120
-
121
- ### Complete Workflow with All Features
122
-
123
- \`\`\`typescript
124
- import { WorkflowRunner } from '@lssm/lib.contracts/workflow/runner';
125
- import { PrismaStateStore } from '@lssm/lib.contracts/workflow/adapters/db-adapter';
126
- import { SLAMonitor } from '@lssm/lib.contracts/workflow/sla-monitor';
127
- import { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';
128
- import { traceAsync } from '@lssm/lib.observability/tracing';
129
-
130
- const runner = new WorkflowRunner({
131
- registry,
132
- stateStore: new PrismaStateStore(db),
133
- opExecutor: async (op, input, ctx) => {
134
- return traceAsync(\`op.\${op.name}\`, async (span) => {
135
- span.setAttribute('operation', op.name);
136
- const breaker = getCircuitBreaker(op.name);
137
- return breaker.execute(() => executeOperation(op, input, ctx));
138
- });
139
- },
140
- eventEmitter: (event, payload) => {
141
- if (event.startsWith('workflow.')) {
142
- logger.info(event, payload);
143
- }
144
- },
145
- });
146
-
147
- const monitor = new SLAMonitor((event, payload) => {
148
- logger.warn('SLA_BREACH', payload);
149
- alertOps(payload);
150
- });
151
-
152
- // Start workflow
153
- const workflowId = await runner.start('payment.flow', 1);
154
-
155
- // Monitor SLA
156
- const state = await runner.getState(workflowId);
157
- const spec = registry.get('payment.flow', 1);
158
- monitor.check(state, spec!);
159
- \`\`\`
160
-
161
- ### Complete DataView with Observability
162
-
163
- \`\`\`typescript
164
- import { DataViewRenderer } from '@lssm/lib.design-system';
165
- import { DataViewQueryGenerator } from '@lssm/lib.contracts/data-views/query-generator';
166
- import { traceAsync } from '@lssm/lib.observability/tracing';
167
- import { MyDataView } from './specs/users.data-view';
168
-
169
- export function UserListPage() {
170
- const [page, setPage] = useState(1);
171
- const [users, setUsers] = useState([]);
172
-
173
- const loadUsers = async () => {
174
- return traceAsync('load_users', async (span) => {
175
- const generator = new DataViewQueryGenerator(MyDataView);
176
- const query = generator.generate({ pagination: { page, pageSize: 20 } });
177
-
178
- span.setAttribute('page', page);
179
- const result = await api.execute(query);
180
- setUsers(result.data);
181
- });
182
- };
183
-
184
- return (
185
- <DataViewRenderer
186
- spec={MyDataView}
187
- items={users}
188
- pagination={{ page, pageSize: 20, total: users.length }}
189
- onPageChange={setPage}
190
- />
191
- );
192
- }
193
- \`\`\`
194
-
195
- ### Complete Multi-Tenant Setup
196
-
197
- \`\`\`typescript
198
- // 1. RLS Middleware
199
- import { createRlsMiddleware } from '@lssm/lib.multi-tenancy/rls';
200
- db.$use(createRlsMiddleware(() => req.tenantId));
201
-
202
- // 2. Tenant Provisioning
203
- import { TenantProvisioningService } from '@lssm/lib.multi-tenancy/provisioning';
204
- const service = new TenantProvisioningService({ db });
205
-
206
- // 3. Create new tenant
207
- await service.provision({
208
- id: 'acme',
209
- name: 'Acme Corp',
210
- slug: 'acme',
211
- ownerEmail: 'admin@acme.com',
212
- });
213
-
214
- // 4. Validate isolation in tests
215
- import { IsolationValidator } from '@lssm/lib.multi-tenancy/isolation';
216
-
217
- test('queries are isolated', () => {
218
- const isValid = IsolationValidator.validateQuery(
219
- 'User',
220
- 'findMany',
221
- { where: { tenantId: 'acme' } },
222
- 'acme'
223
- );
224
- expect(isValid).toBe(true);
225
- });
226
- \`\`\`
227
-
228
- ---
229
-
230
- ## Testing
231
-
232
- ### Test Circuit Breakers
233
-
234
- \`\`\`typescript
235
- import { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';
236
-
237
- test('circuit opens after threshold', async () => {
238
- const breaker = new CircuitBreaker({
239
- failureThreshold: 3,
240
- resetTimeoutMs: 5000,
241
- });
242
-
243
- // Trigger failures
244
- for (let i = 0; i < 3; i++) {
245
- await expect(
246
- breaker.execute(() => Promise.reject('error'))
247
- ).rejects.toThrow();
248
- }
249
-
250
- // Circuit should be open
251
- await expect(
252
- breaker.execute(() => Promise.resolve('ok'))
253
- ).rejects.toThrow('CircuitBreaker is OPEN');
254
- });
255
- \`\`\`
256
-
257
- ### Test Workflow Retry
258
-
259
- \`\`\`typescript
260
- test('workflow retries on failure', async () => {
261
- let attempts = 0;
262
- const opExecutor = async () => {
263
- attempts++;
264
- if (attempts < 3) throw new Error('fail');
265
- return 'success';
266
- };
267
-
268
- const runner = new WorkflowRunner({ /* ... */ opExecutor });
269
- await runner.executeStep(workflowId);
270
-
271
- expect(attempts).toBe(3);
272
- });
273
- \`\`\`
274
-
275
- ---
276
-
277
- ## Common Patterns
278
-
279
- ### Pattern: Resilient External Call
280
-
281
- \`\`\`typescript
282
- import { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';
283
- import { retry } from '@lssm/lib.resilience/retry';
284
- import { timeout } from '@lssm/lib.resilience/timeout';
285
- import { traceAsync } from '@lssm/lib.observability/tracing';
286
-
287
- const breaker = new CircuitBreaker({ failureThreshold: 5, resetTimeoutMs: 30000 });
288
-
289
- export async function callExternalAPI(input: any) {
290
- return traceAsync('external_api_call', async (span) => {
291
- span.setAttribute('service', 'stripe');
292
-
293
- return breaker.execute(() =>
294
- retry(
295
- () => timeout(() => stripe.api.call(input), 5000),
296
- 3,
297
- 1000,
298
- true
299
- )
300
- );
301
- });
302
- }
303
- \`\`\`
304
-
305
- **Benefits**: Circuit breaker + retry + timeout + tracing in one place.
306
-
307
- ---
308
-
309
- ### Pattern: Tenant-Aware Operation
310
-
311
- \`\`\`typescript
312
- import { traceAsync } from '@lssm/lib.observability/tracing';
313
-
314
- export async function listUsers(tenantId: string) {
315
- return traceAsync('list_users', async (span) => {
316
- span.setAttribute('tenant_id', tenantId);
317
-
318
- // RLS middleware will inject WHERE tenantId = ?
319
- return db.user.findMany();
320
- });
321
- }
322
- \`\`\`
323
-
324
- ---
325
-
326
- ### Pattern: Monitored Workflow
327
-
328
- \`\`\`typescript
329
- import { WorkflowRunner } from '@lssm/lib.contracts/workflow/runner';
330
- import { SLAMonitor } from '@lssm/lib.contracts/workflow/sla-monitor';
331
- import { logger } from '@lssm/lib.observability/logging';
332
-
333
- const monitor = new SLAMonitor((event, payload) => {
334
- logger.warn('workflow.sla_breach', payload);
335
- });
336
-
337
- // In workflow poller
338
- const state = await runner.getState(workflowId);
339
- const spec = registry.get(state.workflowName, state.workflowVersion);
340
- if (spec) {
341
- monitor.check(state, spec);
342
- }
343
- \`\`\`
344
-
345
- ---
346
-
347
- ## Next Steps
348
-
349
- 1. **Implement one quick win** (30 minutes)
350
- 2. **Add tests for new functionality** (1 hour)
351
- 3. **Deploy to staging and verify observability** (1 hour)
352
- 4. **Roll out to production** (monitor closely)
353
- 5. **Read full documentation** at https://contractspec.lssm.tech/docs
354
-
355
- ---
356
-
357
- **Questions?** See \`/docs/guides/phase-1-migration\` or reach out via https://contractspec.lssm.tech/contact
358
-
359
-
360
-
361
-
362
-
363
-
364
-
365
-
366
-
367
-
368
-
369
-
370
-
371
-
372
-
373
-
374
-
375
-
376
-
377
-
378
-
379
-
380
-
381
-
382
-
383
- `}]);
1
+ import { registerDocBlocks } from "../registry.js";
2
+
3
+ //#region ../../libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js
4
+ const tech_PHASE_1_QUICKSTART_DocBlocks = [{
5
+ id: "docs.tech.PHASE_1_QUICKSTART",
6
+ title: "Phase 1: API Reference Index",
7
+ summary: "Quick reference for all new Phase 1 APIs.",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/tech/PHASE_1_QUICKSTART",
11
+ tags: ["tech", "PHASE_1_QUICKSTART"],
12
+ body: "# Phase 1: API Reference Index\n\nQuick reference for all new Phase 1 APIs.\n\n---\n\n## @lssm/lib.multi-tenancy\n\n### RLS\n```typescript\nimport { createRlsMiddleware, type TenantIdProvider } from '@lssm/lib.multi-tenancy/rls';\n```\n\n### Provisioning\n```typescript\nimport { \n TenantProvisioningService,\n type CreateTenantInput,\n type TenantProvisioningConfig \n} from '@lssm/lib.multi-tenancy/provisioning';\n```\n\n### Isolation\n```typescript\nimport { IsolationValidator } from '@lssm/lib.multi-tenancy/isolation';\n```\n\n---\n\n## @lssm/lib.observability\n\n### Tracing\n```typescript\nimport { \n getTracer,\n traceAsync,\n traceSync,\n createTracingMiddleware \n} from '@lssm/lib.observability/tracing';\n```\n\n### Metrics\n```typescript\nimport {\n getMeter,\n createCounter,\n createUpDownCounter,\n createHistogram,\n standardMetrics\n} from '@lssm/lib.observability/metrics';\n```\n\n### Logging\n```typescript\nimport {\n Logger,\n logger,\n type LogLevel,\n type LogEntry\n} from '@lssm/lib.observability/logging';\n```\n\n---\n\n## @lssm/lib.resilience\n\n### Circuit Breaker\n```typescript\nimport {\n CircuitBreaker,\n type CircuitState,\n type CircuitBreakerConfig\n} from '@lssm/lib.resilience/circuit-breaker';\n```\n\n### Retry\n```typescript\nimport { retry } from '@lssm/lib.resilience/retry';\n```\n\n### Timeout\n```typescript\nimport { timeout } from '@lssm/lib.resilience/timeout';\n```\n\n### Fallback\n```typescript\nimport { fallback } from '@lssm/lib.resilience/fallback';\n```\n\n---\n\n## Enhanced: @lssm/lib.contracts\n\n### DataViews\n```typescript\nimport { DataViewQueryGenerator } from '@lssm/lib.contracts/data-views/query-generator';\nimport { DataViewRuntime } from '@lssm/lib.contracts/data-views/runtime';\n```\n\n### Workflows\n```typescript\nimport { SLAMonitor, type SLABreachEvent } from '@lssm/lib.contracts/workflow/sla-monitor';\nimport { PrismaStateStore } from '@lssm/lib.contracts/workflow/adapters/db-adapter';\n```\n\n---\n\n## Enhanced: @lssm/lib.design-system\n\n### DataView Components\n```typescript\nimport { DataViewRenderer } from '@lssm/lib.design-system/components/data-view/DataViewRenderer';\n// Also available: DataViewList, DataViewTable, DataViewDetail\n```\n\n---\n\n## Usage Examples\n\n### Complete Workflow with All Features\n\n```typescript\nimport { WorkflowRunner } from '@lssm/lib.contracts/workflow/runner';\nimport { PrismaStateStore } from '@lssm/lib.contracts/workflow/adapters/db-adapter';\nimport { SLAMonitor } from '@lssm/lib.contracts/workflow/sla-monitor';\nimport { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';\nimport { traceAsync } from '@lssm/lib.observability/tracing';\n\nconst runner = new WorkflowRunner({\n registry,\n stateStore: new PrismaStateStore(db),\n opExecutor: async (op, input, ctx) => {\n return traceAsync(`op.${op.name}`, async (span) => {\n span.setAttribute('operation', op.name);\n const breaker = getCircuitBreaker(op.name);\n return breaker.execute(() => executeOperation(op, input, ctx));\n });\n },\n eventEmitter: (event, payload) => {\n if (event.startsWith('workflow.')) {\n logger.info(event, payload);\n }\n },\n});\n\nconst monitor = new SLAMonitor((event, payload) => {\n logger.warn('SLA_BREACH', payload);\n alertOps(payload);\n});\n\n// Start workflow\nconst workflowId = await runner.start('payment.flow', 1);\n\n// Monitor SLA\nconst state = await runner.getState(workflowId);\nconst spec = registry.get('payment.flow', 1);\nmonitor.check(state, spec!);\n```\n\n### Complete DataView with Observability\n\n```typescript\nimport { DataViewRenderer } from '@lssm/lib.design-system';\nimport { DataViewQueryGenerator } from '@lssm/lib.contracts/data-views/query-generator';\nimport { traceAsync } from '@lssm/lib.observability/tracing';\nimport { MyDataView } from './specs/users.data-view';\n\nexport function UserListPage() {\n const [page, setPage] = useState(1);\n const [users, setUsers] = useState([]);\n\n const loadUsers = async () => {\n return traceAsync('load_users', async (span) => {\n const generator = new DataViewQueryGenerator(MyDataView);\n const query = generator.generate({ pagination: { page, pageSize: 20 } });\n \n span.setAttribute('page', page);\n const result = await api.execute(query);\n setUsers(result.data);\n });\n };\n\n return (\n <DataViewRenderer\n spec={MyDataView}\n items={users}\n pagination={{ page, pageSize: 20, total: users.length }}\n onPageChange={setPage}\n />\n );\n}\n```\n\n### Complete Multi-Tenant Setup\n\n```typescript\n// 1. RLS Middleware\nimport { createRlsMiddleware } from '@lssm/lib.multi-tenancy/rls';\ndb.$use(createRlsMiddleware(() => req.tenantId));\n\n// 2. Tenant Provisioning\nimport { TenantProvisioningService } from '@lssm/lib.multi-tenancy/provisioning';\nconst service = new TenantProvisioningService({ db });\n\n// 3. Create new tenant\nawait service.provision({\n id: 'acme',\n name: 'Acme Corp',\n slug: 'acme',\n ownerEmail: 'admin@acme.com',\n});\n\n// 4. Validate isolation in tests\nimport { IsolationValidator } from '@lssm/lib.multi-tenancy/isolation';\n\ntest('queries are isolated', () => {\n const isValid = IsolationValidator.validateQuery(\n 'User',\n 'findMany',\n { where: { tenantId: 'acme' } },\n 'acme'\n );\n expect(isValid).toBe(true);\n});\n```\n\n---\n\n## Testing\n\n### Test Circuit Breakers\n\n```typescript\nimport { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';\n\ntest('circuit opens after threshold', async () => {\n const breaker = new CircuitBreaker({\n failureThreshold: 3,\n resetTimeoutMs: 5000,\n });\n\n // Trigger failures\n for (let i = 0; i < 3; i++) {\n await expect(\n breaker.execute(() => Promise.reject('error'))\n ).rejects.toThrow();\n }\n\n // Circuit should be open\n await expect(\n breaker.execute(() => Promise.resolve('ok'))\n ).rejects.toThrow('CircuitBreaker is OPEN');\n});\n```\n\n### Test Workflow Retry\n\n```typescript\ntest('workflow retries on failure', async () => {\n let attempts = 0;\n const opExecutor = async () => {\n attempts++;\n if (attempts < 3) throw new Error('fail');\n return 'success';\n };\n\n const runner = new WorkflowRunner({ /* ... */ opExecutor });\n await runner.executeStep(workflowId);\n \n expect(attempts).toBe(3);\n});\n```\n\n---\n\n## Common Patterns\n\n### Pattern: Resilient External Call\n\n```typescript\nimport { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';\nimport { retry } from '@lssm/lib.resilience/retry';\nimport { timeout } from '@lssm/lib.resilience/timeout';\nimport { traceAsync } from '@lssm/lib.observability/tracing';\n\nconst breaker = new CircuitBreaker({ failureThreshold: 5, resetTimeoutMs: 30000 });\n\nexport async function callExternalAPI(input: any) {\n return traceAsync('external_api_call', async (span) => {\n span.setAttribute('service', 'stripe');\n \n return breaker.execute(() =>\n retry(\n () => timeout(() => stripe.api.call(input), 5000),\n 3,\n 1000,\n true\n )\n );\n });\n}\n```\n\n**Benefits**: Circuit breaker + retry + timeout + tracing in one place.\n\n---\n\n### Pattern: Tenant-Aware Operation\n\n```typescript\nimport { traceAsync } from '@lssm/lib.observability/tracing';\n\nexport async function listUsers(tenantId: string) {\n return traceAsync('list_users', async (span) => {\n span.setAttribute('tenant_id', tenantId);\n \n // RLS middleware will inject WHERE tenantId = ?\n return db.user.findMany();\n });\n}\n```\n\n---\n\n### Pattern: Monitored Workflow\n\n```typescript\nimport { WorkflowRunner } from '@lssm/lib.contracts/workflow/runner';\nimport { SLAMonitor } from '@lssm/lib.contracts/workflow/sla-monitor';\nimport { logger } from '@lssm/lib.observability/logging';\n\nconst monitor = new SLAMonitor((event, payload) => {\n logger.warn('workflow.sla_breach', payload);\n});\n\n// In workflow poller\nconst state = await runner.getState(workflowId);\nconst spec = registry.get(state.workflowName, state.workflowVersion);\nif (spec) {\n monitor.check(state, spec);\n}\n```\n\n---\n\n## Next Steps\n\n1. **Implement one quick win** (30 minutes)\n2. **Add tests for new functionality** (1 hour)\n3. **Deploy to staging and verify observability** (1 hour)\n4. **Roll out to production** (monitor closely)\n5. **Read full documentation** at https://contractspec.lssm.tech/docs\n\n---\n\n**Questions?** See `/docs/guides/phase-1-migration` or reach out via https://contractspec.lssm.tech/contact\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
13
+ }];
14
+ registerDocBlocks(tech_PHASE_1_QUICKSTART_DocBlocks);
15
+
16
+ //#endregion
@@ -1,68 +1,16 @@
1
- import{a as e}from"../registry.js";e([{id:`docs.tech.PHASE_2_AI_NATIVE_OPERATIONS`,title:`Phase 2: AI-Native Operations`,summary:`_Last updated: 2025-11-20_`,kind:`reference`,visibility:`public`,route:`/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS`,tags:[`tech`,`PHASE_2_AI_NATIVE_OPERATIONS`],body:`# Phase 2: AI-Native Operations
2
-
3
- _Last updated: 2025-11-20_
4
-
5
- Phase 2 turns ContractSpec into an AI-first operations stack. The new libraries below are the building blocks used by support bots, growth agents, and human-in-the-loop flows.
6
-
7
- ## Libraries
8
-
9
- ### @lssm/lib.ai-agent
10
-
11
- - **Spec + Registry**: \`defineAgent\`, \`AgentRegistry\` keep agent definitions type-safe.
12
- - **Runner**: \`AgentRunner\` drives LLM conversations, tool calls, retries, escalation, and telemetry hooks.
13
- - **Tools**: \`ToolExecutor\` standardizes schema validation + timeouts.
14
- - **Memory**: \`InMemoryAgentMemory\` + interfaces for plugging persistent stores.
15
- - **Approvals**: new \`ApprovalWorkflow\` + \`InMemoryApprovalStore\` capture low-confidence decisions and surface them to reviewers.
16
-
17
- ### @lssm/lib.support-bot
18
-
19
- Composable support automation primitives:
20
-
21
- - \`TicketClassifier\` → heuristics + optional LLM validation for category, priority, sentiment.
22
- - \`TicketResolver\` → RAG pipeline backed by knowledge spaces.
23
- - \`AutoResponder\` → tone-aware drafts with citations.
24
- - \`SupportFeedbackLoop\` → tracks resolution rates.
25
- - \`createSupportTools\` → ready-made tool definitions for AgentRunner.
26
-
27
- ### @lssm/lib.content-gen
28
-
29
- Content generators that consume a \`ContentBrief\` and output production-ready assets:
30
-
31
- - \`BlogGenerator\`, \`LandingPageGenerator\`, \`EmailCampaignGenerator\`, \`SocialPostGenerator\`.
32
- - \`SeoOptimizer\` builds metadata + schema markup.
33
-
34
- ### @lssm/lib.analytics
35
-
36
- Queryless analytics helpers:
37
-
38
- - \`FunnelAnalyzer\` – conversion/drop-off per step.
39
- - \`CohortTracker\` – retention + LTV per cohort.
40
- - \`ChurnPredictor\` – recency/frequency/error scoring.
41
- - \`GrowthHypothesisGenerator\` – surfaces experiment ideas from metric trends.
42
-
43
- ### @lssm/lib.growth
44
-
45
- A/B testing toolkit:
46
-
47
- - \`ExperimentRegistry\` + \`ExperimentRunner\` – deterministic bucketing.
48
- - \`ExperimentTracker\` – persist exposures + metrics.
49
- - \`StatsEngine\` – Welch’s t-test + improvement calculations.
50
-
51
- ### Human-in-the-loop UI
52
-
53
- \`@lssm/lib.design-system\` now exposes:
54
-
55
- - \`ApprovalQueue\` – list + act on pending approvals.
56
- - \`AgentMonitor\` – live view of agent sessions with confidence + status.
57
-
58
- ## Examples
59
-
60
- - \`examples/ai-support-bot/setup.ts\` shows ticket classification → resolution → response draft.
61
- - \`examples/content-generation/generate.ts\` produces blog, landing, email, social, SEO output from one brief.
62
-
63
- ## Next Steps
64
-
65
- 1. Wire these libraries into vertical apps (H-Circle, ArtisanOS, etc.).
66
- 2. Add background workers that consume the new analytics/growth trackers.
67
- 3. Expand web-landing to highlight these Phase 2 capabilities (see separate TODO).
68
- `}]);
1
+ import { registerDocBlocks } from "../registry.js";
2
+
3
+ //#region ../../libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js
4
+ const tech_PHASE_2_AI_NATIVE_OPERATIONS_DocBlocks = [{
5
+ id: "docs.tech.PHASE_2_AI_NATIVE_OPERATIONS",
6
+ title: "Phase 2: AI-Native Operations",
7
+ summary: "_Last updated: 2025-11-20_",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS",
11
+ tags: ["tech", "PHASE_2_AI_NATIVE_OPERATIONS"],
12
+ body: "# Phase 2: AI-Native Operations\n\n_Last updated: 2025-11-20_\n\nPhase 2 turns ContractSpec into an AI-first operations stack. The new libraries below are the building blocks used by support bots, growth agents, and human-in-the-loop flows.\n\n## Libraries\n\n### @lssm/lib.ai-agent\n\n- **Spec + Registry**: `defineAgent`, `AgentRegistry` keep agent definitions type-safe.\n- **Runner**: `AgentRunner` drives LLM conversations, tool calls, retries, escalation, and telemetry hooks.\n- **Tools**: `ToolExecutor` standardizes schema validation + timeouts.\n- **Memory**: `InMemoryAgentMemory` + interfaces for plugging persistent stores.\n- **Approvals**: new `ApprovalWorkflow` + `InMemoryApprovalStore` capture low-confidence decisions and surface them to reviewers.\n\n### @lssm/lib.support-bot\n\nComposable support automation primitives:\n\n- `TicketClassifier` → heuristics + optional LLM validation for category, priority, sentiment.\n- `TicketResolver` → RAG pipeline backed by knowledge spaces.\n- `AutoResponder` → tone-aware drafts with citations.\n- `SupportFeedbackLoop` → tracks resolution rates.\n- `createSupportTools` → ready-made tool definitions for AgentRunner.\n\n### @lssm/lib.content-gen\n\nContent generators that consume a `ContentBrief` and output production-ready assets:\n\n- `BlogGenerator`, `LandingPageGenerator`, `EmailCampaignGenerator`, `SocialPostGenerator`.\n- `SeoOptimizer` builds metadata + schema markup.\n\n### @lssm/lib.analytics\n\nQueryless analytics helpers:\n\n- `FunnelAnalyzer` – conversion/drop-off per step.\n- `CohortTracker` – retention + LTV per cohort.\n- `ChurnPredictor` – recency/frequency/error scoring.\n- `GrowthHypothesisGenerator` – surfaces experiment ideas from metric trends.\n\n### @lssm/lib.growth\n\nA/B testing toolkit:\n\n- `ExperimentRegistry` + `ExperimentRunner` – deterministic bucketing.\n- `ExperimentTracker` – persist exposures + metrics.\n- `StatsEngine` – Welch’s t-test + improvement calculations.\n\n### Human-in-the-loop UI\n\n`@lssm/lib.design-system` now exposes:\n\n- `ApprovalQueue` – list + act on pending approvals.\n- `AgentMonitor` – live view of agent sessions with confidence + status.\n\n## Examples\n\n- `examples/ai-support-bot/setup.ts` shows ticket classification → resolution → response draft.\n- `examples/content-generation/generate.ts` produces blog, landing, email, social, SEO output from one brief.\n\n## Next Steps\n\n1. Wire these libraries into vertical apps (H-Circle, ArtisanOS, etc.).\n2. Add background workers that consume the new analytics/growth trackers.\n3. Expand web-landing to highlight these Phase 2 capabilities (see separate TODO).\n"
13
+ }];
14
+ registerDocBlocks(tech_PHASE_2_AI_NATIVE_OPERATIONS_DocBlocks);
15
+
16
+ //#endregion