Skip to content

Commit 3f4d93e

Browse files
authored
Merge pull request #1 from loopengine/feat/1.0.0-rc.0-surface-reconciliation
feat: 1.0.0-rc.0 surface reconciliation (Branch A)
2 parents 6098446 + 5adee37 commit 3f4d93e

183 files changed

Lines changed: 42588 additions & 1306 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.changeset/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
"access": "public",
77
"baseBranch": "main",
88
"updateInternalDependencies": "patch",
9-
"ignore": ["@loop-engine/inspector", "@loop-engine/playground", "@loop-engine/dsl"]
9+
"ignore": ["@loop-engine/adapter-postgres", "@loop-engine/adapter-kafka"]
1010
}

.changeset/pre.json

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"mode": "pre",
3+
"tag": "rc",
4+
"initialVersions": {
5+
"@loop-engine/inspector": "0.1.0",
6+
"@loop-engine/playground": "0.1.0",
7+
"@loop-engine/actors": "0.1.5",
8+
"@loop-engine/adapter-anthropic": "0.1.6",
9+
"@loop-engine/adapter-commerce-gateway": "0.1.6",
10+
"@loop-engine/adapter-gemini": "0.1.7",
11+
"@loop-engine/adapter-grok": "0.1.8",
12+
"@loop-engine/adapter-memory": "0.1.6",
13+
"@loop-engine/adapter-openai": "0.1.6",
14+
"@loop-engine/adapter-openclaw": "0.1.8",
15+
"@loop-engine/adapter-pagerduty": "0.1.5",
16+
"@loop-engine/adapter-perplexity": "0.1.0",
17+
"@loop-engine/adapter-vercel-ai": "0.1.6",
18+
"@loop-engine/adapter-http": "0.1.6",
19+
"@loop-engine/adapter-kafka": "0.1.7",
20+
"@loop-engine/adapter-postgres": "0.2.0",
21+
"@loop-engine/core": "0.1.5",
22+
"@loop-engine/events": "0.1.5",
23+
"@loop-engine/guards": "0.1.5",
24+
"@loop-engine/loop-definition": "0.1.0",
25+
"@loop-engine/observability": "0.1.6",
26+
"@loop-engine/registry-client": "0.1.8",
27+
"@loop-engine/runtime": "0.1.5",
28+
"@loop-engine/sdk": "0.2.0",
29+
"@loop-engine/signals": "0.1.5",
30+
"@loop-engine/ui-devtools": "0.1.6"
31+
},
32+
"changesets": [
33+
"sr-001-engine-naming",
34+
"sr-002-loopstore-collapse",
35+
"sr-003-tooladapter-rename",
36+
"sr-004-drop-runtime-prefix",
37+
"sr-005-list-cancel-fail-open-loops",
38+
"sr-006-actor-adapter-archetype",
39+
"sr-007-can-actor-execute-transition",
40+
"sr-008-system-actor-type",
41+
"sr-009-outcome-correlation-id-schemas",
42+
"sr-010-loop-definition-schema-rewrite",
43+
"sr-011-loopbuilder-aliasing-collapse",
44+
"sr-012-id-factory-functions",
45+
"sr-013a-redact-pii-evidence-rename",
46+
"sr-013b-ai-adapters-onto-actor-adapter",
47+
"sr-014-builtin-guard-set",
48+
"sr-015-sdk-barrel-hygiene",
49+
"sr-016-adapter-postgres-production",
50+
"sr-017-adapter-kafka-subscribe-stub",
51+
"sr-018-phase-a6-example-alignment",
52+
"sr-019-phase-a7-verification"
53+
]
54+
}

.changeset/sr-001-engine-naming.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
"@loop-engine/core": major
3+
"@loop-engine/runtime": major
4+
"@loop-engine/sdk": major
5+
"@loop-engine/actors": major
6+
"@loop-engine/guards": major
7+
"@loop-engine/loop-definition": major
8+
"@loop-engine/events": major
9+
"@loop-engine/signals": major
10+
"@loop-engine/observability": major
11+
"@loop-engine/registry-client": major
12+
"@loop-engine/ui-devtools": major
13+
"@loop-engine/adapter-memory": major
14+
"@loop-engine/adapter-vercel-ai": major
15+
"@loop-engine/adapter-perplexity": major
16+
"@loop-engine/adapter-anthropic": major
17+
"@loop-engine/adapter-openai": major
18+
"@loop-engine/adapter-gemini": major
19+
"@loop-engine/adapter-grok": major
20+
"@loop-engine/adapter-http": major
21+
"@loop-engine/adapter-openclaw": major
22+
"@loop-engine/adapter-pagerduty": major
23+
"@loop-engine/adapter-commerce-gateway": major
24+
---
25+
## SR-001 · D-07 · Engine class & method naming
26+
27+
**Renames (no aliases, no dual names):**
28+
29+
- runtime class `LoopSystem``LoopEngine`
30+
- runtime factory `createLoopSystem``createLoopEngine`
31+
- runtime options `LoopSystemOptions``LoopEngineOptions`
32+
- engine method `startLoop``start`
33+
- engine method `getLoop``getState`
34+
35+
**Intentionally preserved (not breaking):**
36+
37+
- SDK aggregate factory `createLoopSystem` keeps its name (this is the
38+
intentional product name for the auto-wired aggregate, not an alias
39+
to the runtime — the runtime factory is `createLoopEngine`).
40+
- `LoopStorageAdapter.getLoop` (D-11 territory; lands in SR-002).
41+
42+
**Migration:**
43+
44+
```diff
45+
- import { LoopSystem, createLoopSystem } from "@loop-engine/runtime";
46+
+ import { LoopEngine, createLoopEngine } from "@loop-engine/runtime";
47+
48+
- const system: LoopSystem = createLoopSystem({...});
49+
+ const engine: LoopEngine = createLoopEngine({...});
50+
51+
- await system.startLoop({...});
52+
+ await engine.start({...});
53+
54+
- await system.getLoop(aggregateId);
55+
+ await engine.getState(aggregateId);
56+
```
57+
58+
SDK consumers do **not** need to change `createLoopSystem` from
59+
`@loop-engine/sdk`; that name is preserved. SDK consumers do need to
60+
update the engine method call shape if they reach into the returned
61+
`engine` object: `system.engine.startLoop(...)` becomes
62+
`system.engine.start(...)`.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
---
2+
"@loop-engine/core": major
3+
"@loop-engine/runtime": major
4+
"@loop-engine/sdk": major
5+
"@loop-engine/actors": major
6+
"@loop-engine/guards": major
7+
"@loop-engine/loop-definition": major
8+
"@loop-engine/events": major
9+
"@loop-engine/signals": major
10+
"@loop-engine/observability": major
11+
"@loop-engine/registry-client": major
12+
"@loop-engine/ui-devtools": major
13+
"@loop-engine/adapter-memory": major
14+
"@loop-engine/adapter-vercel-ai": major
15+
"@loop-engine/adapter-perplexity": major
16+
"@loop-engine/adapter-anthropic": major
17+
"@loop-engine/adapter-openai": major
18+
"@loop-engine/adapter-gemini": major
19+
"@loop-engine/adapter-grok": major
20+
"@loop-engine/adapter-http": major
21+
"@loop-engine/adapter-openclaw": major
22+
"@loop-engine/adapter-pagerduty": major
23+
"@loop-engine/adapter-commerce-gateway": major
24+
---
25+
## SR-002 · D-11 · LoopStore collapse and rename
26+
27+
**Interface rename + structural collapse (6 methods → 5):**
28+
29+
- runtime interface `LoopStorageAdapter``LoopStore`
30+
- adapter class `MemoryLoopStorageAdapter``MemoryStore`
31+
- adapter factory `createMemoryLoopStorageAdapter``memoryStore`
32+
- adapter factory `postgresStorageAdapter` removed (consolidated into
33+
the canonical `postgresStore`)
34+
- SDK option key `storage``store` (both `CreateLoopSystemOptions`
35+
and the `createLoopSystem` return shape)
36+
37+
**Method renames + collapse:**
38+
39+
| Before | After | Operation |
40+
|---|---|---|
41+
| `getLoop` | `getInstance` | rename |
42+
| `createLoop` | `saveInstance` | collapse with `updateLoop` |
43+
| `updateLoop` | `saveInstance` | collapse with `createLoop` |
44+
| `appendTransition` | `saveTransitionRecord` | rename |
45+
| `getTransitions` | `getTransitionHistory` | rename |
46+
| `listOpenLoops` | `listOpenInstances` | rename |
47+
48+
`createLoop` + `updateLoop` collapse into a single `saveInstance` method
49+
with upsert semantics. The `MemoryStore` adapter implements this as a
50+
single `Map.set`. The `postgresStore` adapter implements it as
51+
`INSERT ... ON CONFLICT (aggregate_id) DO UPDATE SET ...`.
52+
53+
**Migration:**
54+
55+
```diff
56+
- import { MemoryLoopStorageAdapter, createMemoryLoopStorageAdapter } from "@loop-engine/adapter-memory";
57+
+ import { MemoryStore, memoryStore } from "@loop-engine/adapter-memory";
58+
59+
- import type { LoopStorageAdapter } from "@loop-engine/runtime";
60+
+ import type { LoopStore } from "@loop-engine/runtime";
61+
62+
- const adapter = createMemoryLoopStorageAdapter();
63+
+ const store = memoryStore();
64+
65+
- await createLoopSystem({ loops, storage: adapter });
66+
+ await createLoopSystem({ loops, store });
67+
68+
- const { engine, storage } = await createLoopSystem({...});
69+
+ const { engine, store } = await createLoopSystem({...});
70+
71+
- await storage.getLoop(aggregateId);
72+
+ await store.getInstance(aggregateId);
73+
74+
- await storage.createLoop(instance); // or updateLoop
75+
+ await store.saveInstance(instance);
76+
77+
- await storage.appendTransition(record);
78+
+ await store.saveTransitionRecord(record);
79+
80+
- await storage.getTransitions(aggregateId);
81+
+ await store.getTransitionHistory(aggregateId);
82+
83+
- await storage.listOpenLoops(loopId);
84+
+ await store.listOpenInstances(loopId);
85+
```
86+
87+
Custom adapters that implement the interface must update method names
88+
and collapse `createLoop` + `updateLoop` into a single `saveInstance`
89+
upsert. There is no aliasing; all consumers must migrate.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
---
2+
"@loop-engine/core": major
3+
"@loop-engine/runtime": major
4+
"@loop-engine/sdk": major
5+
"@loop-engine/actors": major
6+
"@loop-engine/guards": major
7+
"@loop-engine/loop-definition": major
8+
"@loop-engine/events": major
9+
"@loop-engine/signals": major
10+
"@loop-engine/observability": major
11+
"@loop-engine/registry-client": major
12+
"@loop-engine/ui-devtools": major
13+
"@loop-engine/adapter-memory": major
14+
"@loop-engine/adapter-vercel-ai": major
15+
"@loop-engine/adapter-perplexity": major
16+
"@loop-engine/adapter-anthropic": major
17+
"@loop-engine/adapter-openai": major
18+
"@loop-engine/adapter-gemini": major
19+
"@loop-engine/adapter-grok": major
20+
"@loop-engine/adapter-http": major
21+
"@loop-engine/adapter-openclaw": major
22+
"@loop-engine/adapter-pagerduty": major
23+
"@loop-engine/adapter-commerce-gateway": major
24+
---
25+
## SR-003 · D-13 · LLMAdapter → ToolAdapter (narrow rename)
26+
27+
**Interface rename (no alias):**
28+
29+
- `@loop-engine/core` interface `LLMAdapter``ToolAdapter`
30+
- source file `packages/core/src/llmAdapter.ts`
31+
`packages/core/src/toolAdapter.ts` (git mv; history preserved)
32+
33+
**Implementer update (the lone in-tree implementer):**
34+
35+
- `@loop-engine/adapter-perplexity` `PerplexityAdapter` now
36+
declares `implements ToolAdapter`
37+
38+
**Out of scope for this row (intentionally):**
39+
40+
The four other AI provider adapters — `@loop-engine/adapter-anthropic`,
41+
`@loop-engine/adapter-openai`, `@loop-engine/adapter-gemini`,
42+
`@loop-engine/adapter-grok`, `@loop-engine/adapter-vercel-ai` — do
43+
**not** implement `LLMAdapter` today; each carries a bespoke
44+
`*ActorAdapter` shape. They re-home onto the new `ActorAdapter`
45+
archetype (a separate, distinct interface) in Phase A.3 — not onto
46+
`ToolAdapter`. Per D-13 the two archetypes carry different intents:
47+
`ToolAdapter` is for grounded-tool calls (text-in / text-out + evidence);
48+
`ActorAdapter` is for autonomous decision-making actors.
49+
50+
**Migration:**
51+
52+
```diff
53+
- import type { LLMAdapter } from "@loop-engine/core";
54+
+ import type { ToolAdapter } from "@loop-engine/core";
55+
56+
- class MyAdapter implements LLMAdapter { ... }
57+
+ class MyAdapter implements ToolAdapter { ... }
58+
```
59+
60+
The `invoke()`, `guardEvidence()`, and optional `stream()` methods
61+
are unchanged in signature; only the interface name renames.
62+
Consumers that only depend on `@loop-engine/adapter-perplexity`
63+
(rather than implementing the interface themselves) need no code
64+
changes — the package's public exports do not include
65+
`LLMAdapter`/`ToolAdapter` directly.
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
"@loop-engine/core": major
3+
"@loop-engine/runtime": major
4+
"@loop-engine/sdk": major
5+
"@loop-engine/actors": major
6+
"@loop-engine/guards": major
7+
"@loop-engine/loop-definition": major
8+
"@loop-engine/events": major
9+
"@loop-engine/signals": major
10+
"@loop-engine/observability": major
11+
"@loop-engine/registry-client": major
12+
"@loop-engine/ui-devtools": major
13+
"@loop-engine/adapter-memory": major
14+
"@loop-engine/adapter-vercel-ai": major
15+
"@loop-engine/adapter-perplexity": major
16+
"@loop-engine/adapter-anthropic": major
17+
"@loop-engine/adapter-openai": major
18+
"@loop-engine/adapter-gemini": major
19+
"@loop-engine/adapter-grok": major
20+
"@loop-engine/adapter-http": major
21+
"@loop-engine/adapter-openclaw": major
22+
"@loop-engine/adapter-pagerduty": major
23+
"@loop-engine/adapter-commerce-gateway": major
24+
---
25+
## SR-004 · MECHANICAL 8.5 · Drop `Runtime` prefix from primitive types
26+
27+
**Renames + relocation (no aliases, no dual names):**
28+
29+
- runtime interface `RuntimeLoopInstance``LoopInstance`
30+
- runtime interface `RuntimeTransitionRecord``TransitionRecord`
31+
- both interfaces relocate from `@loop-engine/runtime` to
32+
`@loop-engine/core` (new file `packages/core/src/loopInstance.ts`)
33+
so they appear on the core public surface
34+
35+
**Attribution:** sanctioned by `MECHANICAL 8.5`; implied by D-07's
36+
"no dual names anywhere" clause and the spec draft's use of the
37+
post-rename names. Not enumerated explicitly in D-07's resolution
38+
log text (per F-PB-04).
39+
40+
**Surface diff:**
41+
42+
| Package | Before | After |
43+
|---|---|---|
44+
| `@loop-engine/core` || exports `LoopInstance`, `TransitionRecord` |
45+
| `@loop-engine/runtime` | exports `RuntimeLoopInstance`, `RuntimeTransitionRecord` | removed |
46+
| `@loop-engine/sdk` | re-exports `Runtime*` from `@loop-engine/runtime` | re-exports new names from `@loop-engine/core` via existing `export *` barrel |
47+
48+
**Internal referrers updated** (import path migrates from
49+
`@loop-engine/runtime` to `@loop-engine/core` for the type-only
50+
imports):
51+
52+
- `@loop-engine/runtime` (engine.ts + interfaces.ts + engine.test.ts)
53+
- `@loop-engine/observability` (timeline.ts, replay.ts, metrics.ts +
54+
observability.test.ts)
55+
- `@loop-engine/adapter-memory`
56+
- `@loop-engine/adapter-postgres`
57+
- `@loop-engine/sdk` (drops explicit `RuntimeLoopInstance` /
58+
`RuntimeTransitionRecord` re-export; new names propagate via
59+
the existing `export * from "@loop-engine/core"`)
60+
61+
**Migration:**
62+
63+
```diff
64+
- import type { RuntimeLoopInstance, RuntimeTransitionRecord } from "@loop-engine/runtime";
65+
+ import type { LoopInstance, TransitionRecord } from "@loop-engine/core";
66+
67+
- function process(instance: RuntimeLoopInstance, history: RuntimeTransitionRecord[]): void { ... }
68+
+ function process(instance: LoopInstance, history: TransitionRecord[]): void { ... }
69+
```
70+
71+
SDK consumers reading from `@loop-engine/sdk` can either keep that
72+
import path (the new names propagate via the barrel) or migrate
73+
directly to `@loop-engine/core`.
74+
75+
`LoopStore` and other interfaces using these types kept their
76+
parameter and return types in lockstep — no runtime behavior change.

0 commit comments

Comments
 (0)