Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
9a041e9
chore(pkg-json): apply Pass A package.json hygiene across @loop-engine/*
betterdataco Apr 22, 2026
724dcfe
chore(core,sdk,changeset): drop dead exports and stale changeset entries
betterdataco Apr 22, 2026
2705513
fix(adapters,guards): correct httpEventBus emit and GuardResult.message
betterdataco Apr 22, 2026
e110dc1
feat(events,guards,runtime,loop-definition): add catalog-safe public …
betterdataco Apr 22, 2026
6241eac
refactor(core): rename LoopSystem to LoopEngine (D-07)
betterdataco Apr 23, 2026
899e2b6
chore(changeset): seed 1.0.0-rc.0 changeset for surface reconciliation
betterdataco Apr 23, 2026
d6cf1c7
refactor(core): collapse and rename LoopStorageAdapter to LoopStore (…
betterdataco Apr 23, 2026
6843194
refactor(core): rename LLMAdapter to ToolAdapter (D-13)
betterdataco Apr 23, 2026
deb1bbf
chore(changeset): append SR-003 entry for D-13 ToolAdapter rename
betterdataco Apr 23, 2026
e500143
refactor(core,runtime): drop Runtime prefix from LoopInstance/Transit…
betterdataco Apr 23, 2026
1cca9a1
chore(changeset): record SR-004 (Runtime* prefix removal)
betterdataco Apr 23, 2026
8934262
feat(runtime): add LoopEngine.listOpen + verify cancelLoop/failLoop p…
betterdataco Apr 23, 2026
bbe29a9
chore(changeset): record SR-005 (LoopEngine.listOpen + cancelLoop/fai…
betterdataco Apr 23, 2026
d477379
feat(core): introduce ActorAdapter archetype + relocate AIAgentSubmis…
betterdataco Apr 23, 2026
7bdea78
chore(changeset): record SR-006 in 1.0.0-rc.0
betterdataco Apr 23, 2026
ea34067
feat(core): rename isAuthorized to canActorExecuteTransition + add AI…
betterdataco Apr 23, 2026
f4e80d7
chore(changeset): SR-007 entry for D-08 three-piece
betterdataco Apr 23, 2026
8e0a12f
feat(core): add system to ActorTypeSchema + ship SystemActor interfac…
betterdataco Apr 23, 2026
a68b9ba
chore(changeset): SR-008 entry for D-03 system ActorType + SystemActor
betterdataco Apr 23, 2026
de0d109
feat(schemas): add OutcomeIdSchema + CorrelationIdSchema (D-02; SR-009)
betterdataco Apr 23, 2026
5091e8b
chore(changeset): SR-009 entry for D-02 brand additions
betterdataco Apr 23, 2026
4b8035d
feat(core)!: rewrite LoopDefinition/StateSpec/TransitionSpec/GuardSpe…
betterdataco Apr 23, 2026
c120a0c
refactor(loop-definition)!: remove LoopBuilder aliasing layer (D-05; …
betterdataco Apr 23, 2026
d500b50
feat(core): add ID factories — loopId/aggregateId/transitionId/guardI…
betterdataco Apr 23, 2026
d5d5871
refactor(sdk,core)!: rename SDK guardEvidence to redactPiiEvidence + …
betterdataco Apr 23, 2026
52fe962
feat(adapter-gemini)!: re-home GeminiLoopActor onto ActorAdapter (D-1…
betterdataco Apr 23, 2026
ba95b76
feat(adapter-grok)!: re-home GrokLoopActor onto ActorAdapter (D-13; P…
betterdataco Apr 23, 2026
b5e6c6d
feat(adapter-anthropic)!: re-home onto ActorAdapter with internal pro…
betterdataco Apr 23, 2026
951afa0
feat(adapter-openai)!: re-home onto ActorAdapter with internal prompt…
betterdataco Apr 23, 2026
6c5b359
chore(changeset): add SR-013b section for AI adapter re-homing
betterdataco Apr 23, 2026
9b75efa
chore(guards): confirm D-15 built-in guard set for 1.0.0-rc.0 (D-15)
betterdataco Apr 23, 2026
dbeceda
refactor(sdk): rewrite barrel per publish hygiene (R-164)
betterdataco Apr 23, 2026
d0d2642
fix(adapter-vercel-ai): apply missed D-01/D-05 field renames in loop-…
betterdataco Apr 23, 2026
bd23e2a
chore(packages): enforce single root export per D-21 (R-186)
betterdataco Apr 23, 2026
82730f8
chore(changeset): add SR-015 section for barrel hygiene + D-21 single…
betterdataco Apr 23, 2026
63f3042
test(adapter-postgres): add integration-test infrastructure for SR-016
betterdataco Apr 23, 2026
95795e7
feat(adapter-postgres): add raw-SQL migration runner with schema_migr…
betterdataco Apr 24, 2026
5f065de
feat(adapter-postgres): add withTransaction helper for atomic LoopSto…
betterdataco Apr 24, 2026
68d2d34
feat(adapter-postgres): add createPool factory with loop-engine defaults
betterdataco Apr 24, 2026
2a91952
feat(adapter-postgres): error classification + transaction integrity …
betterdataco Apr 24, 2026
2579e16
feat(adapter-postgres): idx_loop_instances_loop_id_status + EXPLAIN v…
betterdataco Apr 24, 2026
b99e3b4
chore(adapter-postgres): SR-016 rollup (DESIGN.md + 0.2.0 + changeset)
betterdataco Apr 24, 2026
b4afbf9
feat(adapter-kafka): @experimental subscribe stub (SR-017, D-12 → C c…
betterdataco Apr 24, 2026
fbf6018
chore(examples): align ai-actors/shared with post-reconciliation surf…
betterdataco Apr 24, 2026
b48c59f
docs(changeset): SR-019 Phase A.7 end-of-Branch-A verification pass
betterdataco Apr 24, 2026
6dba815
fix(core): reword JSDoc import example to avoid boundary-check false …
betterdataco Apr 24, 2026
ffa4814
chore(changesets): remove stale @loop-engine/dsl from ignore list
betterdataco Apr 24, 2026
ce811ae
chore(release): version packages for 1.0.0-rc.0
betterdataco Apr 24, 2026
5adee37
fix(release): declare workspace peerDeps + align adapter-vercel-ai po…
betterdataco Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": ["@loop-engine/inspector", "@loop-engine/playground", "@loop-engine/dsl"]
"ignore": ["@loop-engine/adapter-postgres", "@loop-engine/adapter-kafka"]
}
54 changes: 54 additions & 0 deletions .changeset/pre.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"mode": "pre",
"tag": "rc",
"initialVersions": {
"@loop-engine/inspector": "0.1.0",
"@loop-engine/playground": "0.1.0",
"@loop-engine/actors": "0.1.5",
"@loop-engine/adapter-anthropic": "0.1.6",
"@loop-engine/adapter-commerce-gateway": "0.1.6",
"@loop-engine/adapter-gemini": "0.1.7",
"@loop-engine/adapter-grok": "0.1.8",
"@loop-engine/adapter-memory": "0.1.6",
"@loop-engine/adapter-openai": "0.1.6",
"@loop-engine/adapter-openclaw": "0.1.8",
"@loop-engine/adapter-pagerduty": "0.1.5",
"@loop-engine/adapter-perplexity": "0.1.0",
"@loop-engine/adapter-vercel-ai": "0.1.6",
"@loop-engine/adapter-http": "0.1.6",
"@loop-engine/adapter-kafka": "0.1.7",
"@loop-engine/adapter-postgres": "0.2.0",
"@loop-engine/core": "0.1.5",
"@loop-engine/events": "0.1.5",
"@loop-engine/guards": "0.1.5",
"@loop-engine/loop-definition": "0.1.0",
"@loop-engine/observability": "0.1.6",
"@loop-engine/registry-client": "0.1.8",
"@loop-engine/runtime": "0.1.5",
"@loop-engine/sdk": "0.2.0",
"@loop-engine/signals": "0.1.5",
"@loop-engine/ui-devtools": "0.1.6"
},
"changesets": [
"sr-001-engine-naming",
"sr-002-loopstore-collapse",
"sr-003-tooladapter-rename",
"sr-004-drop-runtime-prefix",
"sr-005-list-cancel-fail-open-loops",
"sr-006-actor-adapter-archetype",
"sr-007-can-actor-execute-transition",
"sr-008-system-actor-type",
"sr-009-outcome-correlation-id-schemas",
"sr-010-loop-definition-schema-rewrite",
"sr-011-loopbuilder-aliasing-collapse",
"sr-012-id-factory-functions",
"sr-013a-redact-pii-evidence-rename",
"sr-013b-ai-adapters-onto-actor-adapter",
"sr-014-builtin-guard-set",
"sr-015-sdk-barrel-hygiene",
"sr-016-adapter-postgres-production",
"sr-017-adapter-kafka-subscribe-stub",
"sr-018-phase-a6-example-alignment",
"sr-019-phase-a7-verification"
]
}
62 changes: 62 additions & 0 deletions .changeset/sr-001-engine-naming.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
"@loop-engine/core": major
"@loop-engine/runtime": major
"@loop-engine/sdk": major
"@loop-engine/actors": major
"@loop-engine/guards": major
"@loop-engine/loop-definition": major
"@loop-engine/events": major
"@loop-engine/signals": major
"@loop-engine/observability": major
"@loop-engine/registry-client": major
"@loop-engine/ui-devtools": major
"@loop-engine/adapter-memory": major
"@loop-engine/adapter-vercel-ai": major
"@loop-engine/adapter-perplexity": major
"@loop-engine/adapter-anthropic": major
"@loop-engine/adapter-openai": major
"@loop-engine/adapter-gemini": major
"@loop-engine/adapter-grok": major
"@loop-engine/adapter-http": major
"@loop-engine/adapter-openclaw": major
"@loop-engine/adapter-pagerduty": major
"@loop-engine/adapter-commerce-gateway": major
---
## SR-001 · D-07 · Engine class & method naming

**Renames (no aliases, no dual names):**

- runtime class `LoopSystem` → `LoopEngine`
- runtime factory `createLoopSystem` → `createLoopEngine`
- runtime options `LoopSystemOptions` → `LoopEngineOptions`
- engine method `startLoop` → `start`
- engine method `getLoop` → `getState`

**Intentionally preserved (not breaking):**

- SDK aggregate factory `createLoopSystem` keeps its name (this is the
intentional product name for the auto-wired aggregate, not an alias
to the runtime — the runtime factory is `createLoopEngine`).
- `LoopStorageAdapter.getLoop` (D-11 territory; lands in SR-002).

**Migration:**

```diff
- import { LoopSystem, createLoopSystem } from "@loop-engine/runtime";
+ import { LoopEngine, createLoopEngine } from "@loop-engine/runtime";

- const system: LoopSystem = createLoopSystem({...});
+ const engine: LoopEngine = createLoopEngine({...});

- await system.startLoop({...});
+ await engine.start({...});

- await system.getLoop(aggregateId);
+ await engine.getState(aggregateId);
```

SDK consumers do **not** need to change `createLoopSystem` from
`@loop-engine/sdk`; that name is preserved. SDK consumers do need to
update the engine method call shape if they reach into the returned
`engine` object: `system.engine.startLoop(...)` becomes
`system.engine.start(...)`.
89 changes: 89 additions & 0 deletions .changeset/sr-002-loopstore-collapse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
"@loop-engine/core": major
"@loop-engine/runtime": major
"@loop-engine/sdk": major
"@loop-engine/actors": major
"@loop-engine/guards": major
"@loop-engine/loop-definition": major
"@loop-engine/events": major
"@loop-engine/signals": major
"@loop-engine/observability": major
"@loop-engine/registry-client": major
"@loop-engine/ui-devtools": major
"@loop-engine/adapter-memory": major
"@loop-engine/adapter-vercel-ai": major
"@loop-engine/adapter-perplexity": major
"@loop-engine/adapter-anthropic": major
"@loop-engine/adapter-openai": major
"@loop-engine/adapter-gemini": major
"@loop-engine/adapter-grok": major
"@loop-engine/adapter-http": major
"@loop-engine/adapter-openclaw": major
"@loop-engine/adapter-pagerduty": major
"@loop-engine/adapter-commerce-gateway": major
---
## SR-002 · D-11 · LoopStore collapse and rename

**Interface rename + structural collapse (6 methods → 5):**

- runtime interface `LoopStorageAdapter` → `LoopStore`
- adapter class `MemoryLoopStorageAdapter` → `MemoryStore`
- adapter factory `createMemoryLoopStorageAdapter` → `memoryStore`
- adapter factory `postgresStorageAdapter` removed (consolidated into
the canonical `postgresStore`)
- SDK option key `storage` → `store` (both `CreateLoopSystemOptions`
and the `createLoopSystem` return shape)

**Method renames + collapse:**

| Before | After | Operation |
|---|---|---|
| `getLoop` | `getInstance` | rename |
| `createLoop` | `saveInstance` | collapse with `updateLoop` |
| `updateLoop` | `saveInstance` | collapse with `createLoop` |
| `appendTransition` | `saveTransitionRecord` | rename |
| `getTransitions` | `getTransitionHistory` | rename |
| `listOpenLoops` | `listOpenInstances` | rename |

`createLoop` + `updateLoop` collapse into a single `saveInstance` method
with upsert semantics. The `MemoryStore` adapter implements this as a
single `Map.set`. The `postgresStore` adapter implements it as
`INSERT ... ON CONFLICT (aggregate_id) DO UPDATE SET ...`.

**Migration:**

```diff
- import { MemoryLoopStorageAdapter, createMemoryLoopStorageAdapter } from "@loop-engine/adapter-memory";
+ import { MemoryStore, memoryStore } from "@loop-engine/adapter-memory";

- import type { LoopStorageAdapter } from "@loop-engine/runtime";
+ import type { LoopStore } from "@loop-engine/runtime";

- const adapter = createMemoryLoopStorageAdapter();
+ const store = memoryStore();

- await createLoopSystem({ loops, storage: adapter });
+ await createLoopSystem({ loops, store });

- const { engine, storage } = await createLoopSystem({...});
+ const { engine, store } = await createLoopSystem({...});

- await storage.getLoop(aggregateId);
+ await store.getInstance(aggregateId);

- await storage.createLoop(instance); // or updateLoop
+ await store.saveInstance(instance);

- await storage.appendTransition(record);
+ await store.saveTransitionRecord(record);

- await storage.getTransitions(aggregateId);
+ await store.getTransitionHistory(aggregateId);

- await storage.listOpenLoops(loopId);
+ await store.listOpenInstances(loopId);
```

Custom adapters that implement the interface must update method names
and collapse `createLoop` + `updateLoop` into a single `saveInstance`
upsert. There is no aliasing; all consumers must migrate.
65 changes: 65 additions & 0 deletions .changeset/sr-003-tooladapter-rename.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
"@loop-engine/core": major
"@loop-engine/runtime": major
"@loop-engine/sdk": major
"@loop-engine/actors": major
"@loop-engine/guards": major
"@loop-engine/loop-definition": major
"@loop-engine/events": major
"@loop-engine/signals": major
"@loop-engine/observability": major
"@loop-engine/registry-client": major
"@loop-engine/ui-devtools": major
"@loop-engine/adapter-memory": major
"@loop-engine/adapter-vercel-ai": major
"@loop-engine/adapter-perplexity": major
"@loop-engine/adapter-anthropic": major
"@loop-engine/adapter-openai": major
"@loop-engine/adapter-gemini": major
"@loop-engine/adapter-grok": major
"@loop-engine/adapter-http": major
"@loop-engine/adapter-openclaw": major
"@loop-engine/adapter-pagerduty": major
"@loop-engine/adapter-commerce-gateway": major
---
## SR-003 · D-13 · LLMAdapter → ToolAdapter (narrow rename)

**Interface rename (no alias):**

- `@loop-engine/core` interface `LLMAdapter` → `ToolAdapter`
- source file `packages/core/src/llmAdapter.ts` →
`packages/core/src/toolAdapter.ts` (git mv; history preserved)

**Implementer update (the lone in-tree implementer):**

- `@loop-engine/adapter-perplexity` `PerplexityAdapter` now
declares `implements ToolAdapter`

**Out of scope for this row (intentionally):**

The four other AI provider adapters — `@loop-engine/adapter-anthropic`,
`@loop-engine/adapter-openai`, `@loop-engine/adapter-gemini`,
`@loop-engine/adapter-grok`, `@loop-engine/adapter-vercel-ai` — do
**not** implement `LLMAdapter` today; each carries a bespoke
`*ActorAdapter` shape. They re-home onto the new `ActorAdapter`
archetype (a separate, distinct interface) in Phase A.3 — not onto
`ToolAdapter`. Per D-13 the two archetypes carry different intents:
`ToolAdapter` is for grounded-tool calls (text-in / text-out + evidence);
`ActorAdapter` is for autonomous decision-making actors.

**Migration:**

```diff
- import type { LLMAdapter } from "@loop-engine/core";
+ import type { ToolAdapter } from "@loop-engine/core";

- class MyAdapter implements LLMAdapter { ... }
+ class MyAdapter implements ToolAdapter { ... }
```

The `invoke()`, `guardEvidence()`, and optional `stream()` methods
are unchanged in signature; only the interface name renames.
Consumers that only depend on `@loop-engine/adapter-perplexity`
(rather than implementing the interface themselves) need no code
changes — the package's public exports do not include
`LLMAdapter`/`ToolAdapter` directly.
76 changes: 76 additions & 0 deletions .changeset/sr-004-drop-runtime-prefix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
"@loop-engine/core": major
"@loop-engine/runtime": major
"@loop-engine/sdk": major
"@loop-engine/actors": major
"@loop-engine/guards": major
"@loop-engine/loop-definition": major
"@loop-engine/events": major
"@loop-engine/signals": major
"@loop-engine/observability": major
"@loop-engine/registry-client": major
"@loop-engine/ui-devtools": major
"@loop-engine/adapter-memory": major
"@loop-engine/adapter-vercel-ai": major
"@loop-engine/adapter-perplexity": major
"@loop-engine/adapter-anthropic": major
"@loop-engine/adapter-openai": major
"@loop-engine/adapter-gemini": major
"@loop-engine/adapter-grok": major
"@loop-engine/adapter-http": major
"@loop-engine/adapter-openclaw": major
"@loop-engine/adapter-pagerduty": major
"@loop-engine/adapter-commerce-gateway": major
---
## SR-004 · MECHANICAL 8.5 · Drop `Runtime` prefix from primitive types

**Renames + relocation (no aliases, no dual names):**

- runtime interface `RuntimeLoopInstance` → `LoopInstance`
- runtime interface `RuntimeTransitionRecord` → `TransitionRecord`
- both interfaces relocate from `@loop-engine/runtime` to
`@loop-engine/core` (new file `packages/core/src/loopInstance.ts`)
so they appear on the core public surface

**Attribution:** sanctioned by `MECHANICAL 8.5`; implied by D-07's
"no dual names anywhere" clause and the spec draft's use of the
post-rename names. Not enumerated explicitly in D-07's resolution
log text (per F-PB-04).

**Surface diff:**

| Package | Before | After |
|---|---|---|
| `@loop-engine/core` | — | exports `LoopInstance`, `TransitionRecord` |
| `@loop-engine/runtime` | exports `RuntimeLoopInstance`, `RuntimeTransitionRecord` | removed |
| `@loop-engine/sdk` | re-exports `Runtime*` from `@loop-engine/runtime` | re-exports new names from `@loop-engine/core` via existing `export *` barrel |

**Internal referrers updated** (import path migrates from
`@loop-engine/runtime` to `@loop-engine/core` for the type-only
imports):

- `@loop-engine/runtime` (engine.ts + interfaces.ts + engine.test.ts)
- `@loop-engine/observability` (timeline.ts, replay.ts, metrics.ts +
observability.test.ts)
- `@loop-engine/adapter-memory`
- `@loop-engine/adapter-postgres`
- `@loop-engine/sdk` (drops explicit `RuntimeLoopInstance` /
`RuntimeTransitionRecord` re-export; new names propagate via
the existing `export * from "@loop-engine/core"`)

**Migration:**

```diff
- import type { RuntimeLoopInstance, RuntimeTransitionRecord } from "@loop-engine/runtime";
+ import type { LoopInstance, TransitionRecord } from "@loop-engine/core";

- function process(instance: RuntimeLoopInstance, history: RuntimeTransitionRecord[]): void { ... }
+ function process(instance: LoopInstance, history: TransitionRecord[]): void { ... }
```

SDK consumers reading from `@loop-engine/sdk` can either keep that
import path (the new names propagate via the barrel) or migrate
directly to `@loop-engine/core`.

`LoopStore` and other interfaces using these types kept their
parameter and return types in lockstep — no runtime behavior change.
Loading
Loading