@plumbus/core 0.2.9 → 0.3.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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/ai/__tests__/ai-service.test.js +704 -1
- package/dist/ai/__tests__/ai-service.test.js.map +1 -1
- package/dist/ai/__tests__/chunking.test.js +34 -0
- package/dist/ai/__tests__/chunking.test.js.map +1 -1
- package/dist/ai/__tests__/provider.test.d.ts.map +1 -1
- package/dist/ai/__tests__/provider.test.js +425 -0
- package/dist/ai/__tests__/provider.test.js.map +1 -1
- package/dist/ai/__tests__/validation.test.js +200 -1
- package/dist/ai/__tests__/validation.test.js.map +1 -1
- package/dist/ai/__tests__/zod-to-provider-schema.test.d.ts +2 -0
- package/dist/ai/__tests__/zod-to-provider-schema.test.d.ts.map +1 -0
- package/dist/ai/__tests__/zod-to-provider-schema.test.js +60 -0
- package/dist/ai/__tests__/zod-to-provider-schema.test.js.map +1 -0
- package/dist/ai/ai-service.d.ts +19 -2
- package/dist/ai/ai-service.d.ts.map +1 -1
- package/dist/ai/ai-service.js +544 -110
- package/dist/ai/ai-service.js.map +1 -1
- package/dist/ai/cost-tracker.d.ts +26 -1
- package/dist/ai/cost-tracker.d.ts.map +1 -1
- package/dist/ai/cost-tracker.js +1 -0
- package/dist/ai/cost-tracker.js.map +1 -1
- package/dist/ai/index.d.ts +5 -3
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +5 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/provider.d.ts +45 -1
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +226 -32
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/rag/chunking.js +53 -3
- package/dist/ai/rag/chunking.js.map +1 -1
- package/dist/ai/refusal.d.ts +28 -0
- package/dist/ai/refusal.d.ts.map +1 -0
- package/dist/ai/refusal.js +36 -0
- package/dist/ai/refusal.js.map +1 -0
- package/dist/ai/validation.d.ts +40 -8
- package/dist/ai/validation.d.ts.map +1 -1
- package/dist/ai/validation.js +97 -6
- package/dist/ai/validation.js.map +1 -1
- package/dist/ai/zod-to-provider-schema.d.ts +15 -0
- package/dist/ai/zod-to-provider-schema.d.ts.map +1 -0
- package/dist/ai/zod-to-provider-schema.js +200 -0
- package/dist/ai/zod-to-provider-schema.js.map +1 -0
- package/dist/cli/__tests__/doctor.test.js +104 -2
- package/dist/cli/__tests__/doctor.test.js.map +1 -1
- package/dist/cli/__tests__/init.test.js +127 -7
- package/dist/cli/__tests__/init.test.js.map +1 -1
- package/dist/cli/__tests__/migrate.test.js +159 -2
- package/dist/cli/__tests__/migrate.test.js.map +1 -1
- package/dist/cli/commands/__tests__/commands.test.js +5 -0
- package/dist/cli/commands/__tests__/commands.test.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +21 -1
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +78 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +7 -2
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts +16 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +226 -25
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +258 -8
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +21 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/data/__tests__/drift-inspector.test.d.ts +2 -0
- package/dist/data/__tests__/drift-inspector.test.d.ts.map +1 -0
- package/dist/data/__tests__/drift-inspector.test.js +170 -0
- package/dist/data/__tests__/drift-inspector.test.js.map +1 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.d.ts +2 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.d.ts.map +1 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.js +329 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.js.map +1 -0
- package/dist/data/__tests__/migration.test.js +93 -2
- package/dist/data/__tests__/migration.test.js.map +1 -1
- package/dist/data/__tests__/repository.test.js +126 -0
- package/dist/data/__tests__/repository.test.js.map +1 -1
- package/dist/data/drift-inspector.d.ts +41 -0
- package/dist/data/drift-inspector.d.ts.map +1 -0
- package/dist/data/drift-inspector.js +197 -0
- package/dist/data/drift-inspector.js.map +1 -0
- package/dist/data/framework-migration-rewriter.d.ts +61 -0
- package/dist/data/framework-migration-rewriter.d.ts.map +1 -0
- package/dist/data/framework-migration-rewriter.js +357 -0
- package/dist/data/framework-migration-rewriter.js.map +1 -0
- package/dist/data/index.d.ts +2 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +2 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/migration.d.ts +31 -1
- package/dist/data/migration.d.ts.map +1 -1
- package/dist/data/migration.js +113 -3
- package/dist/data/migration.js.map +1 -1
- package/dist/data/repository.d.ts.map +1 -1
- package/dist/data/repository.js +21 -0
- package/dist/data/repository.js.map +1 -1
- package/dist/define/__tests__/definePrompt.test.js +37 -0
- package/dist/define/__tests__/definePrompt.test.js.map +1 -1
- package/dist/define/definePrompt.d.ts +13 -0
- package/dist/define/definePrompt.d.ts.map +1 -1
- package/dist/define/definePrompt.js +3 -0
- package/dist/define/definePrompt.js.map +1 -1
- package/dist/errors/http.d.ts.map +1 -1
- package/dist/errors/http.js +2 -0
- package/dist/errors/http.js.map +1 -1
- package/dist/errors/index.d.ts +12 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +21 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/events/__tests__/event-emitter.test.js +72 -0
- package/dist/events/__tests__/event-emitter.test.js.map +1 -1
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +51 -0
- package/dist/events/emitter.js.map +1 -1
- package/dist/execution/__tests__/context-factory.test.js +1 -0
- package/dist/execution/__tests__/context-factory.test.js.map +1 -1
- package/dist/execution/context-factory.d.ts.map +1 -1
- package/dist/execution/context-factory.js +2 -0
- package/dist/execution/context-factory.js.map +1 -1
- package/dist/flows/__tests__/flow-engine.test.js +451 -4
- package/dist/flows/__tests__/flow-engine.test.js.map +1 -1
- package/dist/flows/__tests__/flow-service.test.js +8 -0
- package/dist/flows/__tests__/flow-service.test.js.map +1 -1
- package/dist/flows/__tests__/step-executor.test.js +8 -2
- package/dist/flows/__tests__/step-executor.test.js.map +1 -1
- package/dist/flows/engine.d.ts +50 -1
- package/dist/flows/engine.d.ts.map +1 -1
- package/dist/flows/engine.js +427 -23
- package/dist/flows/engine.js.map +1 -1
- package/dist/flows/flow-service.d.ts.map +1 -1
- package/dist/flows/flow-service.js +4 -0
- package/dist/flows/flow-service.js.map +1 -1
- package/dist/flows/index.d.ts +1 -1
- package/dist/flows/index.d.ts.map +1 -1
- package/dist/flows/index.js +1 -1
- package/dist/flows/index.js.map +1 -1
- package/dist/flows/schema.d.ts +34 -0
- package/dist/flows/schema.d.ts.map +1 -1
- package/dist/flows/schema.js +3 -0
- package/dist/flows/schema.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/server/bootstrap.d.ts +14 -0
- package/dist/server/bootstrap.d.ts.map +1 -1
- package/dist/server/bootstrap.js +23 -4
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/testing/context.d.ts.map +1 -1
- package/dist/testing/context.js +37 -1
- package/dist/testing/context.js.map +1 -1
- package/dist/types/context.d.ts +110 -0
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/enums.d.ts +2 -0
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +2 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/types/prompt.d.ts +64 -0
- package/dist/types/prompt.d.ts.map +1 -1
- package/dist/worker/__tests__/bootstrap.test.js +36 -2
- package/dist/worker/__tests__/bootstrap.test.js.map +1 -1
- package/dist/worker/bootstrap.d.ts +7 -0
- package/dist/worker/bootstrap.d.ts.map +1 -1
- package/dist/worker/bootstrap.js +153 -12
- package/dist/worker/bootstrap.js.map +1 -1
- package/instructions/framework.md +7 -0
- package/instructions/guardrails.md +39 -0
- package/instructions/patterns.md +10 -0
- package/package.json +3 -2
package/dist/worker/bootstrap.js
CHANGED
|
@@ -2,15 +2,90 @@
|
|
|
2
2
|
// Separate process that starts background workers:
|
|
3
3
|
// outbox dispatcher, event delivery worker, flow step executor,
|
|
4
4
|
// flow scheduler. Handles graceful shutdown.
|
|
5
|
+
import { sql } from 'drizzle-orm';
|
|
5
6
|
import { createAuditService } from '../audit/service.js';
|
|
6
7
|
import { createOutboxDispatcher } from '../events/dispatcher.js';
|
|
7
8
|
import { createEventEmitter } from '../events/emitter.js';
|
|
8
9
|
import { createIdempotencyService } from '../events/idempotency.js';
|
|
9
10
|
import { createEventWorker } from '../events/worker.js';
|
|
10
11
|
import { createExecutionContext } from '../execution/context-factory.js';
|
|
11
|
-
import { createFlowEngine } from '../flows/engine.js';
|
|
12
|
+
import { createFlowEngine, generateWorkerId } from '../flows/engine.js';
|
|
13
|
+
import { FlowStatus } from '../flows/state-machine.js';
|
|
12
14
|
import { createFlowScheduler } from '../flows/scheduler.js';
|
|
13
15
|
import { createFlowTriggerHandler } from '../flows/triggers.js';
|
|
16
|
+
// ── Error description helper ──
|
|
17
|
+
// Drizzle wraps the underlying driver error in `cause`, and its own `message`
|
|
18
|
+
// is just the literal SQL with a "Failed query:" prefix. Without the cause
|
|
19
|
+
// the worker logs hide the actual Postgres failure (missing column, broken
|
|
20
|
+
// constraint, etc.), which makes operational issues — especially schema drift
|
|
21
|
+
// after an `@plumbus/core` upgrade — extremely hard to diagnose.
|
|
22
|
+
//
|
|
23
|
+
// We pull out fields that postgres-js exposes on its error objects (code,
|
|
24
|
+
// detail, hint, position, where, schema, table, column, constraint, routine)
|
|
25
|
+
// in addition to the cause's own message, and surface them as a structured
|
|
26
|
+
// log payload alongside the original error message.
|
|
27
|
+
function describeError(err) {
|
|
28
|
+
if (!(err instanceof Error)) {
|
|
29
|
+
return { error: String(err) };
|
|
30
|
+
}
|
|
31
|
+
const out = { error: err.message };
|
|
32
|
+
const cause = err.cause;
|
|
33
|
+
if (cause instanceof Error) {
|
|
34
|
+
out.causeMessage = cause.message;
|
|
35
|
+
const pgFields = [
|
|
36
|
+
'code',
|
|
37
|
+
'detail',
|
|
38
|
+
'hint',
|
|
39
|
+
'position',
|
|
40
|
+
'where',
|
|
41
|
+
'schema',
|
|
42
|
+
'table',
|
|
43
|
+
'column',
|
|
44
|
+
'constraint',
|
|
45
|
+
'routine',
|
|
46
|
+
'severity',
|
|
47
|
+
];
|
|
48
|
+
const pg = {};
|
|
49
|
+
for (const k of pgFields) {
|
|
50
|
+
const v = cause[k];
|
|
51
|
+
if (v !== undefined && v !== null && v !== '')
|
|
52
|
+
pg[k] = v;
|
|
53
|
+
}
|
|
54
|
+
if (Object.keys(pg).length > 0)
|
|
55
|
+
out.pg = pg;
|
|
56
|
+
}
|
|
57
|
+
else if (cause !== undefined) {
|
|
58
|
+
out.cause = String(cause);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
// ── Lease-column preflight ──
|
|
63
|
+
//
|
|
64
|
+
// 0.3.0 added `lease_owner` and `lease_expires_at` columns to flow_executions
|
|
65
|
+
// to support lease-based claiming across workers. If a consumer upgrades
|
|
66
|
+
// `@plumbus/core` but forgets to run `plumbus migrate generate` +
|
|
67
|
+
// `plumbus migrate apply`, the first claim-cycle UPDATE fails with PG error
|
|
68
|
+
// 42703 (undefined_column) deep inside drizzle, producing logs that don't
|
|
69
|
+
// point at the real fix. This probe runs one cheap `LIMIT 0` SELECT against
|
|
70
|
+
// those columns and rethrows a clear, actionable error when they're missing.
|
|
71
|
+
//
|
|
72
|
+
// Exported for direct testing.
|
|
73
|
+
export async function assertFlowLeaseColumns(db) {
|
|
74
|
+
try {
|
|
75
|
+
await db.execute(sql `SELECT lease_owner, lease_expires_at FROM flow_executions LIMIT 0`);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
const cause = err instanceof Error ? err.cause : undefined;
|
|
79
|
+
const pgCode = cause && typeof cause === 'object' && 'code' in cause
|
|
80
|
+
? cause.code
|
|
81
|
+
: undefined;
|
|
82
|
+
if (pgCode === '42703') {
|
|
83
|
+
throw new Error('Plumbus 0.3.0 requires new columns on flow_executions (lease_owner, lease_expires_at).\n' +
|
|
84
|
+
'Run `plumbus migrate generate` then `plumbus migrate apply` before starting workers.');
|
|
85
|
+
}
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
14
89
|
/** Create and configure a worker pool with all background processes */
|
|
15
90
|
export function createWorkerPool(poolConfig) {
|
|
16
91
|
const { db, queue, consumers, flows, stepDeps, audit, outboxPollIntervalMs = 1000, schedulerPollIntervalMs = 60_000, flowPollIntervalMs = 1000, enableDispatcher = true, enableEventWorker = true, enableScheduler = true, enableFlowRunner = true, } = poolConfig;
|
|
@@ -42,6 +117,11 @@ export function createWorkerPool(poolConfig) {
|
|
|
42
117
|
audit,
|
|
43
118
|
queue,
|
|
44
119
|
onFlowError: poolConfig.onFlowError,
|
|
120
|
+
workerId: generateWorkerId(),
|
|
121
|
+
flowLeaseDurationMs: poolConfig.flowLeaseDurationMs,
|
|
122
|
+
flowHeartbeatIntervalMs: poolConfig.flowHeartbeatIntervalMs,
|
|
123
|
+
flowClaimBatchSize: poolConfig.flowClaimBatchSize,
|
|
124
|
+
logger,
|
|
45
125
|
createDataService: createDataService ? (auth) => createDataService(auth) : undefined,
|
|
46
126
|
createEventService: eventRegistry
|
|
47
127
|
? (auth) => createEventEmitter({
|
|
@@ -79,14 +159,12 @@ export function createWorkerPool(poolConfig) {
|
|
|
79
159
|
};
|
|
80
160
|
const scheduler = enableScheduler ? createFlowScheduler(schedulerConfig) : null;
|
|
81
161
|
let flowRunnerTimer = null;
|
|
82
|
-
let flowRunnerPolling = false;
|
|
83
162
|
async function runFlowCycle() {
|
|
84
|
-
if (!enableFlowRunner
|
|
163
|
+
if (!enableFlowRunner)
|
|
85
164
|
return;
|
|
86
|
-
flowRunnerPolling = true;
|
|
87
165
|
try {
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
166
|
+
const claimed = await flowEngine.claimNext();
|
|
167
|
+
if (claimed.length === 0)
|
|
90
168
|
return;
|
|
91
169
|
const systemAuth = {
|
|
92
170
|
userId: 'system-flow-runner',
|
|
@@ -115,20 +193,75 @@ export function createWorkerPool(poolConfig) {
|
|
|
115
193
|
logger,
|
|
116
194
|
config: poolConfig.config,
|
|
117
195
|
});
|
|
118
|
-
for (const
|
|
196
|
+
for (const row of claimed) {
|
|
119
197
|
try {
|
|
120
|
-
|
|
198
|
+
// Drain consecutive in-flow steps in a single tick.
|
|
199
|
+
//
|
|
200
|
+
// Why: claimNext() acquires a lease (status='running',
|
|
201
|
+
// lease_expires_at = now()+leaseDurationMs) for the whole flow
|
|
202
|
+
// execution row. runNext() runs ONE step and, on normal
|
|
203
|
+
// advancement (next sequential step, parallel completion, or
|
|
204
|
+
// conditional branch), updates currentStep but intentionally
|
|
205
|
+
// leaves status='running' and the lease intact. If we returned
|
|
206
|
+
// here after a single step, the row would sit idle until the
|
|
207
|
+
// lease expired (default 5 min) before claimNext() picked it up
|
|
208
|
+
// again — producing multi-minute "no errors, no progress" gaps
|
|
209
|
+
// between successive steps of the same flow execution.
|
|
210
|
+
//
|
|
211
|
+
// Looping while status === Running means the worker that holds
|
|
212
|
+
// the lease keeps running steps until the flow either Waits
|
|
213
|
+
// (event/delay), Completes, Fails, or is Cancelled. Heartbeats
|
|
214
|
+
// inside runNext extend the lease while a step is executing;
|
|
215
|
+
// between steps the lease is still valid because we never
|
|
216
|
+
// released it. A hard cap (`maxStepsPerCycle`) bounds the loop
|
|
217
|
+
// so a runaway conditional/loop in a flow can't monopolise the
|
|
218
|
+
// worker forever — when the cap is hit we break, the lease will
|
|
219
|
+
// expire normally and another claim cycle (or the same worker)
|
|
220
|
+
// will pick the row up.
|
|
221
|
+
const maxStepsPerCycle = 1000;
|
|
222
|
+
let stepsRun = 0;
|
|
223
|
+
while (stepsRun < maxStepsPerCycle) {
|
|
224
|
+
const result = await flowEngine.runNext(row.id, baseCtx);
|
|
225
|
+
stepsRun += 1;
|
|
226
|
+
if (result.status !== FlowStatus.Running) {
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (stepsRun >= maxStepsPerCycle) {
|
|
231
|
+
logger.warn('Flow drain hit maxStepsPerCycle; releasing for next cycle', {
|
|
232
|
+
executionId: row.id,
|
|
233
|
+
workerId: flowEngine.workerId,
|
|
234
|
+
stepsRun,
|
|
235
|
+
maxStepsPerCycle,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
121
238
|
}
|
|
122
239
|
catch (err) {
|
|
123
240
|
logger.error('Flow execution run failed', {
|
|
124
|
-
executionId,
|
|
125
|
-
|
|
241
|
+
executionId: row.id,
|
|
242
|
+
workerId: flowEngine.workerId,
|
|
243
|
+
...describeError(err),
|
|
126
244
|
});
|
|
245
|
+
// Finalize the row as failed so the next poll cycle doesn't re-claim
|
|
246
|
+
// it via the `status='running' AND lease_expires_at < now()`
|
|
247
|
+
// crash-recovery branch in claimNext and spin forever. The engine
|
|
248
|
+
// method is idempotent and guards on status, so this is safe even
|
|
249
|
+
// if the row was concurrently finalized by cancel() or a peer worker.
|
|
250
|
+
try {
|
|
251
|
+
await flowEngine.markFailedFromRunner(row.id, err);
|
|
252
|
+
}
|
|
253
|
+
catch (finalizeErr) {
|
|
254
|
+
logger.error('Failed to finalize flow execution after run error', {
|
|
255
|
+
executionId: row.id,
|
|
256
|
+
workerId: flowEngine.workerId,
|
|
257
|
+
...describeError(finalizeErr),
|
|
258
|
+
});
|
|
259
|
+
}
|
|
127
260
|
}
|
|
128
261
|
}
|
|
129
262
|
}
|
|
130
|
-
|
|
131
|
-
|
|
263
|
+
catch (err) {
|
|
264
|
+
logger.error('Flow claim cycle failed', describeError(err));
|
|
132
265
|
}
|
|
133
266
|
}
|
|
134
267
|
let running = false;
|
|
@@ -136,6 +269,14 @@ export function createWorkerPool(poolConfig) {
|
|
|
136
269
|
async start() {
|
|
137
270
|
if (running)
|
|
138
271
|
return;
|
|
272
|
+
// Schema preflight: 0.3.0 added `lease_owner` and `lease_expires_at`
|
|
273
|
+
// to flow_executions. Consumers who upgrade `@plumbus/core` but skip
|
|
274
|
+
// `plumbus migrate apply` would otherwise hit a cryptic UPDATE error
|
|
275
|
+
// on the first claim cycle. Probe the columns once at startup and
|
|
276
|
+
// emit an actionable error instead.
|
|
277
|
+
if (enableFlowRunner) {
|
|
278
|
+
await assertFlowLeaseColumns(db);
|
|
279
|
+
}
|
|
139
280
|
running = true;
|
|
140
281
|
// Sync flow schedules to DB
|
|
141
282
|
if (scheduler) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/worker/bootstrap.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,mDAAmD;AACnD,gEAAgE;AAChE,6CAA6C;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/worker/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
Plumbus is an AI-native, contract-driven TypeScript application framework. You build applications by composing five primitives — **Entities**, **Capabilities**, **Flows**, **Events**, and **Prompts** — through a controlled execution context (`ctx`).
|
|
4
4
|
|
|
5
|
+
## Non-Negotiable Guardrails
|
|
6
|
+
|
|
7
|
+
- Plumbus primitives are the application architecture, not optional helpers.
|
|
8
|
+
- **Capabilities are the only entry point for business logic.** If behavior does not belong in a capability directly, it should be orchestrated by a flow, emitted as an event, modeled as an entity, or wrapped in a prompt.
|
|
9
|
+
- Use framework extension points and `ctx.*` subsystems before inventing custom controllers, service layers, job runners, event buses, or direct infrastructure integrations.
|
|
10
|
+
- If the correct primitive is unclear, stop and ask which Plumbus extension point should own the behavior.
|
|
11
|
+
|
|
5
12
|
## Core Abstractions
|
|
6
13
|
|
|
7
14
|
| Primitive | Purpose | Defined with |
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Agent Guardrails
|
|
2
|
+
|
|
3
|
+
These rules are mandatory when an AI agent works on a Plumbus application.
|
|
4
|
+
|
|
5
|
+
## Framework-First Architecture
|
|
6
|
+
|
|
7
|
+
- Plumbus is the application architecture, not a helper library.
|
|
8
|
+
- All business logic must be implemented through Plumbus primitives: `defineCapability()`, `defineFlow()`, `defineEntity()`, `defineEvent()`, `definePrompt()`, and translations where relevant.
|
|
9
|
+
- If a task seems to require code outside those primitives, stop and ask which Plumbus extension point should be used.
|
|
10
|
+
|
|
11
|
+
## Non-Negotiable Boundaries
|
|
12
|
+
|
|
13
|
+
- **Do not** implement business logic in ad hoc API routes, controllers, services, cron files, queues, or background workers when the behavior belongs in a capability, flow, event handler, or prompt.
|
|
14
|
+
- **Do not** bypass `ctx.*` subsystems with direct database clients, custom event buses, raw auth checks, or bespoke AI integration layers unless the framework explicitly documents that extension point.
|
|
15
|
+
- **Do not** import framework internals. Use the public SDK surface only.
|
|
16
|
+
- **Do not** edit generated files in `.plumbus/generated/`.
|
|
17
|
+
- **Do not** install framework-provided dependencies directly in the consumer app.
|
|
18
|
+
|
|
19
|
+
## Escalation Rule
|
|
20
|
+
|
|
21
|
+
- When the requirements are unclear, ask which primitive should own the behavior instead of inventing a clean-room architecture.
|
|
22
|
+
- Prefer asking for clarification over adding code that works technically but does not follow the framework contract.
|
|
23
|
+
|
|
24
|
+
## Git Safety
|
|
25
|
+
|
|
26
|
+
Read-only git inspection is allowed: `git status`, `git diff`, `git log`, `git show`.
|
|
27
|
+
|
|
28
|
+
The following actions require explicit user approval because they can discard work or rewrite history:
|
|
29
|
+
|
|
30
|
+
- `git checkout` when used to restore or overwrite files
|
|
31
|
+
- `git restore`
|
|
32
|
+
- `git reset` of any kind
|
|
33
|
+
- `git clean`
|
|
34
|
+
- `git revert` across user work you did not author
|
|
35
|
+
- `git push --force` or `git push --force-with-lease`
|
|
36
|
+
- deleting branches or tags
|
|
37
|
+
- any command that overwrites, discards, or rewrites existing work
|
|
38
|
+
|
|
39
|
+
If there is any doubt about whether a git command is destructive, stop and ask first.
|
package/instructions/patterns.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Patterns & Conventions
|
|
2
2
|
|
|
3
|
+
## Framework Boundaries
|
|
4
|
+
|
|
5
|
+
These rules are non-negotiable. They are architecture constraints, not style preferences.
|
|
6
|
+
|
|
7
|
+
- **Business logic belongs in Plumbus primitives.** Start with a capability, then compose flows, events, prompts, and entities around it.
|
|
8
|
+
- **Ask before bypassing the framework.** If the task appears to need custom routes, services, jobs, or infrastructure layers, stop and clarify the intended extension point.
|
|
9
|
+
- **Generated code is not an edit surface.** Treat `.plumbus/generated/` as read-only.
|
|
10
|
+
|
|
3
11
|
## Naming Conventions
|
|
4
12
|
|
|
5
13
|
| Element | Convention | Example |
|
|
@@ -44,8 +52,10 @@ app/prompts/<name>.prompt.ts
|
|
|
44
52
|
## Don'ts
|
|
45
53
|
|
|
46
54
|
- **Don't** access the database directly — always use `ctx.data.<Entity>`.
|
|
55
|
+
- **Don't** implement business logic in ad hoc controllers, service classes, raw API routes, cron scripts, or queue handlers when a capability or flow should own it.
|
|
47
56
|
- **Don't** emit events outside of capabilities — the outbox pattern requires a capability transaction.
|
|
48
57
|
- **Don't** bypass `ctx.auth` checks — the framework evaluates access policies before your handler runs.
|
|
58
|
+
- **Don't** bypass `ctx.*` subsystems with custom infrastructure layers unless the framework explicitly documents that extension point.
|
|
49
59
|
- **Don't** mutate the `ctx` object — it is scoped and controlled by the framework.
|
|
50
60
|
- **Don't** import framework internals — use only the public SDK surface (`defineCapability`, `defineFlow`, etc.).
|
|
51
61
|
- **Don't** store secrets in code — use `ctx.config` and environment variables.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plumbus/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Plumbus framework core — types, SDK, runtime, CLI, test utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
"postgres": "^3.4.8",
|
|
56
56
|
"tsx": "^4.19.0",
|
|
57
57
|
"vitest": "^3.0.0",
|
|
58
|
-
"zod": "^3.24.0"
|
|
58
|
+
"zod": "^3.24.0",
|
|
59
|
+
"zod-to-json-schema": "^3.25.2"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@biomejs/biome": "^2.4.6",
|