@hazeljs/organism 2.0.6
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/README.md +205 -0
- package/dist/__tests__/organism.embedding.test.d.ts +2 -0
- package/dist/__tests__/organism.embedding.test.d.ts.map +1 -0
- package/dist/__tests__/organism.embedding.test.js +166 -0
- package/dist/__tests__/organism.embedding.test.js.map +1 -0
- package/dist/__tests__/organism.phase1.test.d.ts +2 -0
- package/dist/__tests__/organism.phase1.test.d.ts.map +1 -0
- package/dist/__tests__/organism.phase1.test.js +375 -0
- package/dist/__tests__/organism.phase1.test.js.map +1 -0
- package/dist/__tests__/organism.phase2-3.test.d.ts +2 -0
- package/dist/__tests__/organism.phase2-3.test.d.ts.map +1 -0
- package/dist/__tests__/organism.phase2-3.test.js +320 -0
- package/dist/__tests__/organism.phase2-3.test.js.map +1 -0
- package/dist/__tests__/organism.phase4.test.d.ts +2 -0
- package/dist/__tests__/organism.phase4.test.d.ts.map +1 -0
- package/dist/__tests__/organism.phase4.test.js +217 -0
- package/dist/__tests__/organism.phase4.test.js.map +1 -0
- package/dist/bridge/signal-bridge.d.ts +46 -0
- package/dist/bridge/signal-bridge.d.ts.map +1 -0
- package/dist/bridge/signal-bridge.js +75 -0
- package/dist/bridge/signal-bridge.js.map +1 -0
- package/dist/core/capability-registry.d.ts +16 -0
- package/dist/core/capability-registry.d.ts.map +1 -0
- package/dist/core/capability-registry.js +71 -0
- package/dist/core/capability-registry.js.map +1 -0
- package/dist/core/clock.d.ts +17 -0
- package/dist/core/clock.d.ts.map +1 -0
- package/dist/core/clock.js +63 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/mission.d.ts +4 -0
- package/dist/core/mission.d.ts.map +1 -0
- package/dist/core/mission.js +74 -0
- package/dist/core/mission.js.map +1 -0
- package/dist/core/organism-context.d.ts +139 -0
- package/dist/core/organism-context.d.ts.map +1 -0
- package/dist/core/organism-context.js +62 -0
- package/dist/core/organism-context.js.map +1 -0
- package/dist/core/organism-runtime.d.ts +199 -0
- package/dist/core/organism-runtime.d.ts.map +1 -0
- package/dist/core/organism-runtime.js +1016 -0
- package/dist/core/organism-runtime.js.map +1 -0
- package/dist/decorators/index.d.ts +39 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +165 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/economy/market-engine.d.ts +57 -0
- package/dist/economy/market-engine.d.ts.map +1 -0
- package/dist/economy/market-engine.js +258 -0
- package/dist/economy/market-engine.js.map +1 -0
- package/dist/economy/resource-allocator.d.ts +39 -0
- package/dist/economy/resource-allocator.d.ts.map +1 -0
- package/dist/economy/resource-allocator.js +153 -0
- package/dist/economy/resource-allocator.js.map +1 -0
- package/dist/economy/utility-engine.d.ts +16 -0
- package/dist/economy/utility-engine.d.ts.map +1 -0
- package/dist/economy/utility-engine.js +80 -0
- package/dist/economy/utility-engine.js.map +1 -0
- package/dist/economy/utility-forecaster.d.ts +24 -0
- package/dist/economy/utility-forecaster.d.ts.map +1 -0
- package/dist/economy/utility-forecaster.js +60 -0
- package/dist/economy/utility-forecaster.js.map +1 -0
- package/dist/errors/organism.errors.d.ts +23 -0
- package/dist/errors/organism.errors.d.ts.map +1 -0
- package/dist/errors/organism.errors.js +50 -0
- package/dist/errors/organism.errors.js.map +1 -0
- package/dist/events/organism-events.d.ts +61 -0
- package/dist/events/organism-events.d.ts.map +1 -0
- package/dist/events/organism-events.js +95 -0
- package/dist/events/organism-events.js.map +1 -0
- package/dist/evolution/evolution-engine.d.ts +41 -0
- package/dist/evolution/evolution-engine.d.ts.map +1 -0
- package/dist/evolution/evolution-engine.js +135 -0
- package/dist/evolution/evolution-engine.js.map +1 -0
- package/dist/evolution/mutation-engine.d.ts +21 -0
- package/dist/evolution/mutation-engine.d.ts.map +1 -0
- package/dist/evolution/mutation-engine.js +84 -0
- package/dist/evolution/mutation-engine.js.map +1 -0
- package/dist/genealogy/genealogy-manager.d.ts +18 -0
- package/dist/genealogy/genealogy-manager.d.ts.map +1 -0
- package/dist/genealogy/genealogy-manager.js +64 -0
- package/dist/genealogy/genealogy-manager.js.map +1 -0
- package/dist/governance/constitution.d.ts +20 -0
- package/dist/governance/constitution.d.ts.map +1 -0
- package/dist/governance/constitution.js +109 -0
- package/dist/governance/constitution.js.map +1 -0
- package/dist/host/organism-host-registry.d.ts +24 -0
- package/dist/host/organism-host-registry.d.ts.map +1 -0
- package/dist/host/organism-host-registry.js +65 -0
- package/dist/host/organism-host-registry.js.map +1 -0
- package/dist/host/organism-host.d.ts +32 -0
- package/dist/host/organism-host.d.ts.map +1 -0
- package/dist/host/organism-host.js +64 -0
- package/dist/host/organism-host.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/create-ops-organism.d.ts +34 -0
- package/dist/integration/create-ops-organism.d.ts.map +1 -0
- package/dist/integration/create-ops-organism.js +43 -0
- package/dist/integration/create-ops-organism.js.map +1 -0
- package/dist/lifecycle/birth-engine.d.ts +41 -0
- package/dist/lifecycle/birth-engine.d.ts.map +1 -0
- package/dist/lifecycle/birth-engine.js +182 -0
- package/dist/lifecycle/birth-engine.js.map +1 -0
- package/dist/lifecycle/decision-engine.d.ts +19 -0
- package/dist/lifecycle/decision-engine.d.ts.map +1 -0
- package/dist/lifecycle/decision-engine.js +137 -0
- package/dist/lifecycle/decision-engine.js.map +1 -0
- package/dist/lifecycle/reproduction-engine.d.ts +58 -0
- package/dist/lifecycle/reproduction-engine.d.ts.map +1 -0
- package/dist/lifecycle/reproduction-engine.js +207 -0
- package/dist/lifecycle/reproduction-engine.js.map +1 -0
- package/dist/lifecycle/survival-engine.d.ts +17 -0
- package/dist/lifecycle/survival-engine.d.ts.map +1 -0
- package/dist/lifecycle/survival-engine.js +83 -0
- package/dist/lifecycle/survival-engine.js.map +1 -0
- package/dist/observability/metrics.d.ts +37 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +80 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/perception/perception-engine.d.ts +40 -0
- package/dist/perception/perception-engine.d.ts.map +1 -0
- package/dist/perception/perception-engine.js +126 -0
- package/dist/perception/perception-engine.js.map +1 -0
- package/dist/persistence/in-memory-organism-repository.d.ts +2 -0
- package/dist/persistence/in-memory-organism-repository.d.ts.map +1 -0
- package/dist/persistence/in-memory-organism-repository.js +18 -0
- package/dist/persistence/in-memory-organism-repository.js.map +1 -0
- package/dist/persistence/organism-repository.d.ts +42 -0
- package/dist/persistence/organism-repository.d.ts.map +1 -0
- package/dist/persistence/organism-repository.js +105 -0
- package/dist/persistence/organism-repository.js.map +1 -0
- package/dist/types/organism.types.d.ts +482 -0
- package/dist/types/organism.types.d.ts.map +1 -0
- package/dist/types/organism.types.js +45 -0
- package/dist/types/organism.types.js.map +1 -0
- package/examples/ecommerce-organism/run.ts +245 -0
- package/package.json +73 -0
- package/src/bridge/signal-bridge.ts +116 -0
- package/src/core/capability-registry.ts +72 -0
- package/src/core/clock.ts +58 -0
- package/src/core/mission.ts +83 -0
- package/src/core/organism-context.ts +176 -0
- package/src/core/organism-runtime.ts +1369 -0
- package/src/decorators/index.ts +180 -0
- package/src/economy/market-engine.ts +324 -0
- package/src/economy/resource-allocator.ts +188 -0
- package/src/economy/utility-engine.ts +103 -0
- package/src/economy/utility-forecaster.ts +88 -0
- package/src/errors/organism.errors.ts +47 -0
- package/src/events/organism-events.ts +122 -0
- package/src/evolution/evolution-engine.ts +167 -0
- package/src/evolution/mutation-engine.ts +110 -0
- package/src/genealogy/genealogy-manager.ts +70 -0
- package/src/governance/constitution.ts +120 -0
- package/src/host/organism-host-registry.ts +72 -0
- package/src/host/organism-host.ts +103 -0
- package/src/index.ts +78 -0
- package/src/integration/create-ops-organism.ts +80 -0
- package/src/lifecycle/birth-engine.ts +225 -0
- package/src/lifecycle/decision-engine.ts +158 -0
- package/src/lifecycle/reproduction-engine.ts +289 -0
- package/src/lifecycle/survival-engine.ts +95 -0
- package/src/observability/metrics.ts +120 -0
- package/src/perception/perception-engine.ts +140 -0
- package/src/persistence/in-memory-organism-repository.ts +1 -0
- package/src/persistence/organism-repository.ts +134 -0
- package/src/types/organism.types.ts +591 -0
- package/tsconfig.jest.json +8 -0
package/README.md
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# @hazeljs/organism
|
|
2
|
+
|
|
3
|
+
**Deploy a mission, not an agent topology.**
|
|
4
|
+
|
|
5
|
+
In conventional multi-agent systems, developers define the organization. In HazelJS Agentic Organisms, developers define the mission and operating boundaries — the organization emerges dynamically at runtime. Built on Agent OS (`@hazeljs/agent`) and `@hazeljs/core`.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@hazeljs/organism)
|
|
8
|
+
[](https://www.npmjs.com/package/@hazeljs/organism)
|
|
9
|
+
[](https://www.apache.org/licenses/LICENSE-2.0)
|
|
10
|
+
|
|
11
|
+
## Why @hazeljs/organism?
|
|
12
|
+
|
|
13
|
+
Static agent graphs force you to pre-design teams for every incident type. Organism flips that: you ship genes (capability templates), a constitution, and resource limits; need detection spawns, reuses, or specializes agents as signals arrive.
|
|
14
|
+
|
|
15
|
+
**Perfect for:**
|
|
16
|
+
|
|
17
|
+
- Ops / commerce platforms that must react to spikes without hard-coding agent teams
|
|
18
|
+
- Product teams embedding a self-organizing runtime above Agent OS
|
|
19
|
+
- Simulations and policy-bound remediations with `simulate()`, inspect, and emergency stop
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- 🎯 **Mission-first runtime** — Objective and success criteria drive behavior, not a fixed topology
|
|
24
|
+
- 🧬 **Genes & birth** — Reusable capability templates; spawn / reuse / specialize under limits
|
|
25
|
+
- 👁️ **Perception** — Environment signals → need detection → dynamic agent teams
|
|
26
|
+
- 📜 **Constitution** — Rules no agent may override (PII, refund caps, etc.)
|
|
27
|
+
- 💰 **Economy** — Finite token / money / tool budgets with utility and reputation
|
|
28
|
+
- 🔁 **Lifecycle** — Survival, reproduction, mutation, and generation evaluation
|
|
29
|
+
- 🏪 **Market (Phase 4)** — Resource bidding, clearing, and peer negotiation
|
|
30
|
+
- 🧪 **Simulation & inspect** — `simulate()`, inspect/graph, events, genealogy
|
|
31
|
+
- 📦 **Product embedding** — `createOpsOrganism`, signal bridges, `OrganismHostRegistry`
|
|
32
|
+
|
|
33
|
+
## Installation
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install @hazeljs/organism @hazeljs/agent @hazeljs/core
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Enable `experimentalDecorators` (and typically `emitDecoratorMetadata`) in `tsconfig.json`.
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
import { createOrganism } from '@hazeljs/organism';
|
|
45
|
+
|
|
46
|
+
const organism = await createOrganism({
|
|
47
|
+
mission: {
|
|
48
|
+
id: 'support',
|
|
49
|
+
objective: 'Operate customer support while maintaining 90% CSAT',
|
|
50
|
+
successCriteria: [{ name: 'csat', operator: 'gte', target: 90 }],
|
|
51
|
+
},
|
|
52
|
+
genes: [
|
|
53
|
+
{
|
|
54
|
+
id: 'support-gene',
|
|
55
|
+
capabilities: ['customer-support', 'commerce'],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'analysis-gene',
|
|
59
|
+
capabilities: ['analytics', 'analysis'],
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
constitution: {
|
|
63
|
+
id: 'commerce',
|
|
64
|
+
rules: [
|
|
65
|
+
{
|
|
66
|
+
id: 'privacy',
|
|
67
|
+
rule: 'Never expose customer personally identifiable information',
|
|
68
|
+
severity: 'critical',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: 'refund-limit',
|
|
72
|
+
rule: 'Refunds above $200 require human approval',
|
|
73
|
+
severity: 'high',
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
limits: {
|
|
78
|
+
maxAgents: 10,
|
|
79
|
+
maxGenerationDepth: 3,
|
|
80
|
+
maxChildrenPerAgent: 3,
|
|
81
|
+
maxSpawnRatePerMinute: 5,
|
|
82
|
+
maxTotalCostPerHour: 10,
|
|
83
|
+
},
|
|
84
|
+
signalNeedMappings: [
|
|
85
|
+
{
|
|
86
|
+
signalType: 'refunds.increased',
|
|
87
|
+
need: 'refund-analysis',
|
|
88
|
+
requiredCapabilities: ['analytics', 'commerce'],
|
|
89
|
+
urgency: 0.9,
|
|
90
|
+
confidence: 0.9,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
debug: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await organism.start();
|
|
97
|
+
|
|
98
|
+
await organism.observe({
|
|
99
|
+
type: 'refunds.increased',
|
|
100
|
+
source: 'analytics',
|
|
101
|
+
severity: 0.9,
|
|
102
|
+
data: { baseline: 0.04, current: 0.071 },
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const state = await organism.inspect();
|
|
106
|
+
console.log(state.agents);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Decorators
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { Mission, Organism, AgentGene, Constitution, Environment } from '@hazeljs/organism';
|
|
113
|
+
|
|
114
|
+
@Mission({ id: 'ops', objective: 'Keep the store healthy' })
|
|
115
|
+
class OpsMission {}
|
|
116
|
+
|
|
117
|
+
@AgentGene({ id: 'commerce', capabilities: ['commerce', 'support'] })
|
|
118
|
+
class CommerceGene {}
|
|
119
|
+
|
|
120
|
+
@Organism({ mission: OpsMission, genes: [CommerceGene] })
|
|
121
|
+
class StoreOrganism {}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Core Concepts
|
|
125
|
+
|
|
126
|
+
| Term | Meaning |
|
|
127
|
+
| ---------------- | ------------------------------------------------ |
|
|
128
|
+
| **Mission** | What the organism is trying to achieve |
|
|
129
|
+
| **Organism** | Autonomous runtime pursuing the mission |
|
|
130
|
+
| **Gene** | Reusable capability template for spawning agents |
|
|
131
|
+
| **Agent** | Ephemeral worker created inside the organism |
|
|
132
|
+
| **Environment** | External signals the organism observes |
|
|
133
|
+
| **Constitution** | Rules no agent may override |
|
|
134
|
+
| **Economy** | Finite token / money / tool budgets |
|
|
135
|
+
|
|
136
|
+
## Safety Defaults
|
|
137
|
+
|
|
138
|
+
- `maxAgents`, `maxGenerationDepth`, `maxSpawnRatePerMinute`, `maxTotalCostPerHour`
|
|
139
|
+
- Capability reuse before birth
|
|
140
|
+
- Constitution enforcement on spawn / refund / PII
|
|
141
|
+
- `pause()` / `resume()` / `terminate()` / `emergencyStop()`
|
|
142
|
+
|
|
143
|
+
## Embedding in Product Platforms
|
|
144
|
+
|
|
145
|
+
Prefer the host / ops APIs instead of wrapping the runtime yourself:
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
import {
|
|
149
|
+
createOpsOrganism,
|
|
150
|
+
OrganismHostRegistry,
|
|
151
|
+
toEnvironmentSignal,
|
|
152
|
+
toIncidentEnvironmentSignal,
|
|
153
|
+
} from '@hazeljs/organism';
|
|
154
|
+
|
|
155
|
+
const registry = new OrganismHostRegistry();
|
|
156
|
+
|
|
157
|
+
const host = await registry.getOrCreate(undefined, () =>
|
|
158
|
+
createOpsOrganism({
|
|
159
|
+
mission: { id: 'ops', objective: 'Keep the business healthy' },
|
|
160
|
+
genes: [{ id: 'generalist', capabilities: ['operations'] }],
|
|
161
|
+
incidentTypes: ['refund_spike'],
|
|
162
|
+
simulation: true,
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
await host.start();
|
|
167
|
+
await host.observe(toEnvironmentSignal({ type: 'refund.created', source: 'store' }));
|
|
168
|
+
await host.observe(toIncidentEnvironmentSignal({ incidentType: 'refund_spike' }));
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Inject `OrganismRepository` for persistence. Full guide: [`docs/embedding.md`](./docs/embedding.md).
|
|
172
|
+
|
|
173
|
+
## CLI
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
hazel organism list
|
|
177
|
+
hazel organism inspect <id>
|
|
178
|
+
hazel organism agents <id>
|
|
179
|
+
hazel organism genealogy <id>
|
|
180
|
+
hazel organism resources <id>
|
|
181
|
+
hazel organism events <id>
|
|
182
|
+
hazel organism pause <id>
|
|
183
|
+
hazel organism resume <id>
|
|
184
|
+
hazel organism stop <id>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Examples
|
|
188
|
+
|
|
189
|
+
See [`examples/ecommerce-organism`](./examples/ecommerce-organism) for a runnable demo.
|
|
190
|
+
|
|
191
|
+
## Docs
|
|
192
|
+
|
|
193
|
+
- [`docs/architecture.md`](./docs/architecture.md) — runtime design
|
|
194
|
+
- [`docs/embedding.md`](./docs/embedding.md) — product-platform integration
|
|
195
|
+
- [`docs/`](./docs/) — full documentation set
|
|
196
|
+
|
|
197
|
+
## License
|
|
198
|
+
|
|
199
|
+
Apache-2.0
|
|
200
|
+
|
|
201
|
+
## Links
|
|
202
|
+
|
|
203
|
+
- [npm](https://www.npmjs.com/package/@hazeljs/organism)
|
|
204
|
+
- [HazelJS](https://hazeljs.ai)
|
|
205
|
+
- [GitHub](https://github.com/hazel-js/hazeljs/tree/main/packages/organism)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organism.embedding.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/organism.embedding.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const index_1 = require("../index");
|
|
37
|
+
describe('organism embedding boilerplate', () => {
|
|
38
|
+
it('createOpsOrganism starts and observes environment + incident signals', async () => {
|
|
39
|
+
const host = await (0, index_1.createOpsOrganism)({
|
|
40
|
+
mission: {
|
|
41
|
+
id: 'ops-demo',
|
|
42
|
+
objective: 'Keep operations healthy',
|
|
43
|
+
},
|
|
44
|
+
genes: [
|
|
45
|
+
{
|
|
46
|
+
id: 'generalist',
|
|
47
|
+
capabilities: ['operations', 'analytics'],
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
signalNeedMappings: [
|
|
51
|
+
{
|
|
52
|
+
signalType: 'refunds.increased',
|
|
53
|
+
need: 'refund-analysis',
|
|
54
|
+
requiredCapabilities: ['analytics', 'operations'],
|
|
55
|
+
urgency: 0.9,
|
|
56
|
+
confidence: 0.9,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
incidentTypes: ['refund_spike'],
|
|
60
|
+
limits: { maxAgents: 5, maxTotalCostPerHour: 5 },
|
|
61
|
+
simulation: true,
|
|
62
|
+
debug: false,
|
|
63
|
+
});
|
|
64
|
+
await host.start();
|
|
65
|
+
await host.observe((0, index_1.toEnvironmentSignal)({
|
|
66
|
+
type: 'refunds.increased',
|
|
67
|
+
source: 'test',
|
|
68
|
+
severity: 0.9,
|
|
69
|
+
data: { baseline: 0.04, current: 0.09 },
|
|
70
|
+
}));
|
|
71
|
+
await host.observe((0, index_1.toIncidentEnvironmentSignal)({
|
|
72
|
+
incidentType: 'refund_spike',
|
|
73
|
+
severity: 0.85,
|
|
74
|
+
data: { incidentId: 'inc_1' },
|
|
75
|
+
}));
|
|
76
|
+
const state = await host.inspect();
|
|
77
|
+
expect(state.status === 'operating' || state.status === 'observing').toBe(true);
|
|
78
|
+
expect(state.agents.length).toBeGreaterThanOrEqual(1);
|
|
79
|
+
const agent = state.agents[0];
|
|
80
|
+
await host.reportOutcome(agent.id, (0, index_1.toAgentOutcomeReport)({
|
|
81
|
+
verdict: 'successful',
|
|
82
|
+
confidence: 0.9,
|
|
83
|
+
summary: 'Issue mitigated',
|
|
84
|
+
}));
|
|
85
|
+
await host.terminate();
|
|
86
|
+
});
|
|
87
|
+
it('incidentNeedMappings builds investigate-* mappings', () => {
|
|
88
|
+
const mappings = (0, index_1.incidentNeedMappings)(['room_readiness_issue'], ['housekeeping']);
|
|
89
|
+
expect(mappings).toEqual([
|
|
90
|
+
{
|
|
91
|
+
signalType: 'incident.room_readiness_issue',
|
|
92
|
+
need: 'investigate-room_readiness_issue',
|
|
93
|
+
requiredCapabilities: ['housekeeping'],
|
|
94
|
+
urgency: 0.85,
|
|
95
|
+
confidence: 0.9,
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
});
|
|
99
|
+
it('OrganismHostRegistry reuses hosts by id', async () => {
|
|
100
|
+
const registry = new index_1.OrganismHostRegistry();
|
|
101
|
+
let creates = 0;
|
|
102
|
+
const factory = async () => {
|
|
103
|
+
creates += 1;
|
|
104
|
+
return (0, index_1.createOpsOrganism)({
|
|
105
|
+
id: 'host_reuse',
|
|
106
|
+
mission: { id: 'm', objective: 'test' },
|
|
107
|
+
genes: [{ id: 'g', capabilities: ['operations'] }],
|
|
108
|
+
simulation: true,
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const a = await registry.getOrCreate('host_reuse', factory);
|
|
112
|
+
await a.start();
|
|
113
|
+
const b = await registry.getOrCreate('host_reuse', factory);
|
|
114
|
+
expect(a).toBe(b);
|
|
115
|
+
expect(creates).toBe(1);
|
|
116
|
+
expect(registry.size).toBe(1);
|
|
117
|
+
await a.terminate();
|
|
118
|
+
registry.clear();
|
|
119
|
+
});
|
|
120
|
+
it('restores organism record and agents from shared repository', async () => {
|
|
121
|
+
const { InMemoryOrganismRepository } = await Promise.resolve().then(() => __importStar(require('../persistence/organism-repository')));
|
|
122
|
+
const repo = new InMemoryOrganismRepository();
|
|
123
|
+
const first = await (0, index_1.createOpsOrganism)({
|
|
124
|
+
id: 'org_restore',
|
|
125
|
+
mission: { id: 'm', objective: 'Keep ops healthy' },
|
|
126
|
+
genes: [{ id: 'g', capabilities: ['operations', 'analytics'] }],
|
|
127
|
+
signalNeedMappings: [
|
|
128
|
+
{
|
|
129
|
+
signalType: 'refunds.increased',
|
|
130
|
+
need: 'refund-analysis',
|
|
131
|
+
requiredCapabilities: ['analytics', 'operations'],
|
|
132
|
+
urgency: 0.9,
|
|
133
|
+
confidence: 0.9,
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
repository: repo,
|
|
137
|
+
simulation: true,
|
|
138
|
+
});
|
|
139
|
+
await first.start();
|
|
140
|
+
await first.observe((0, index_1.toEnvironmentSignal)({
|
|
141
|
+
type: 'refunds.increased',
|
|
142
|
+
source: 'test',
|
|
143
|
+
severity: 0.9,
|
|
144
|
+
data: {},
|
|
145
|
+
}));
|
|
146
|
+
const before = await first.inspect();
|
|
147
|
+
expect(before.agents.length).toBeGreaterThanOrEqual(1);
|
|
148
|
+
const agentIds = before.agents.map((a) => a.id).sort();
|
|
149
|
+
const tokensBefore = first.runtime.getRecord().pool.tokensRemaining;
|
|
150
|
+
// Simulate another replica: empty local registry, same durable repo.
|
|
151
|
+
const second = await (0, index_1.createOpsOrganism)({
|
|
152
|
+
id: 'org_restore',
|
|
153
|
+
mission: { id: 'm', objective: 'Keep ops healthy' },
|
|
154
|
+
genes: [{ id: 'g', capabilities: ['operations', 'analytics'] }],
|
|
155
|
+
repository: repo,
|
|
156
|
+
simulation: true,
|
|
157
|
+
});
|
|
158
|
+
await second.start();
|
|
159
|
+
const after = await second.inspect();
|
|
160
|
+
expect(after.agents.map((a) => a.id).sort()).toEqual(agentIds);
|
|
161
|
+
expect(second.runtime.getRecord().pool.tokensRemaining).toBe(tokensBefore);
|
|
162
|
+
expect(second.runtime.getRecord().status === 'operating' || after.status === 'operating').toBe(true);
|
|
163
|
+
await second.terminate();
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=organism.embedding.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organism.embedding.test.js","sourceRoot":"","sources":["../../src/__tests__/organism.embedding.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organism.phase1.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/organism.phase1.test.ts"],"names":[],"mappings":""}
|