@fenixforce/edition-pro 0.1.0 → 0.1.1

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 (2) hide show
  1. package/dist/index.js +431 -53
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,15 +1,393 @@
1
- import{createKernel as Mt,KERNEL_VERSION as Zn,EDITION_PRO as Lt}from"@fenixforce/kernel";import{z as f}from"zod";function ae(r){return r.replace(/\$\{(\w+)\}/g,(e,t)=>process.env[t]??"")}function W(r){if(typeof r=="string")return ae(r);if(Array.isArray(r))return r.map(W);if(r!==null&&typeof r=="object"){let e={};for(let[t,n]of Object.entries(r))e[t]=W(n);return e}return r}var P=f.object({requireApproval:f.array(f.string()).default([]),autoApprove:f.array(f.string()).default([]),expirationDays:f.number().int().positive().default(7),notifyOn:f.array(f.string()).default(["requested","expired"]),notifyChannel:f.string().nullable().default(null)}),F=f.object({dailyLimit:f.number().nonnegative().default(10),monthlyLimit:f.number().nonnegative().default(200),perWorkspaceDailyLimit:f.number().nonnegative().default(0)}),N=f.object({mentionPrefix:f.string().default("@"),fallbackWorkspace:f.string().default("default"),classificationModel:f.string().default("auto"),confidenceThreshold:f.number().min(0).max(1).default(.6)}),ce=f.object({id:f.string().min(1),name:f.string().min(1),identityDir:f.string().default("./identity"),channels:f.array(f.string()).default([]),tools:f.array(f.string()).default([]),layers:f.array(f.string()).default([]),approval:P.optional(),budget:F.partial().optional(),integrationGrants:f.record(f.string(),f.string()).default({}),metadata:f.record(f.string(),f.unknown()).default({})}),le=f.object({channel:f.string().min(1),workspaceId:f.string().min(1),config:f.record(f.string(),f.unknown()).default({})}),O=f.object({id:f.string().min(1).default("default-fleet"),name:f.string().default("Fenix Fleet"),version:f.literal(1).default(1),routing:N.default(()=>N.parse({})),budget:F.default(()=>F.parse({})),channelBindings:f.array(le).default([]),workspaces:f.array(ce).default([]),approval:P.default(()=>P.parse({}))}),Te=O.parse({});function E(r,e={}){let{resolveEnv:t=!0}=e,n=t?W(r):r,o=O.safeParse(n);if(!o.success){let i=o.error.issues.map(s=>` ${s.path.join(".")}: ${s.message}`).join(`
1
+ var ur=Object.defineProperty;var ve=(n,e)=>()=>(n&&(e=n(n=0)),e);var pr=(n,e)=>{for(var r in e)ur(n,r,{get:e[r],enumerable:!0})};import*as Co from"pg";function xt(n){return{id:n.id,conversationId:n.conversation_id,userId:n.user_id,role:n.role,content:n.content,channel:n.channel,tokenCount:n.token_count??null,metadata:n.metadata??{},createdAt:new Date(n.created_at)}}function Sn(n){return{id:n.id,userId:n.user_id,title:n.title??null,channel:n.channel,metadata:n.metadata??{},createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function An(n){return{id:n.id,userId:n.user_id,content:n.content,category:n.category,embedding:n.embedding?Mn(n.embedding):null,heat:n.heat,accessCount:n.access_count,lastAccessedAt:new Date(n.last_accessed_at),createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function In(n){return{userId:n.user_id,summary:n.summary,updatedAt:new Date(n.updated_at)}}function Rn(n){return{id:n.id,userId:n.user_id,conversationId:n.conversation_id??null,content:n.content,category:n.category,reviewed:n.reviewed,createdAt:new Date(n.created_at),reviewedAt:n.reviewed_at?new Date(n.reviewed_at):null}}function Pn(n){return{id:n.id,conversationId:n.conversation_id,artifactType:n.artifact_type,title:n.title,content:n.content,metadata:n.metadata??{},createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function _n(n){return{id:n.id,userId:n.user_id,conversationId:n.conversation_id??null,provider:n.provider,model:n.model,inputTokens:n.input_tokens,outputTokens:n.output_tokens,costUsd:n.cost_usd,createdAt:new Date(n.created_at)}}function pe(n){return{id:n.id,type:n.type,status:n.status,priority:n.priority,payload:n.payload??{},result:n.result??null,error:n.error??null,attempts:n.attempts,maxAttempts:n.max_attempts,claimedAt:n.claimed_at?new Date(n.claimed_at):null,completedAt:n.completed_at?new Date(n.completed_at):null,createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function Se(n){return{id:n.id,userId:n.user_id,sourceType:n.source_type,uri:n.uri,status:n.status,metadata:n.metadata??{},createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function Et(n){return{id:n.id,sourceId:n.source_id,content:n.content,embedding:n.embedding?Mn(n.embedding):null,chunkIndex:n.chunk_index,metadata:n.metadata??{},createdAt:new Date(n.created_at)}}function Ct(n){return{id:n.id,userId:n.user_id,provider:n.provider,encryptedData:n.encrypted_data,iv:n.iv,authTag:n.auth_tag,createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function St(n){return{id:n.id,workspaceId:n.workspace_id,fileName:n.file_name,content:n.content,metadata:n.metadata??{},createdAt:new Date(n.created_at),updatedAt:new Date(n.updated_at)}}function Mn(n){return Array.isArray(n)?n:typeof n=="string"?n.replace(/^\[|\]$/g,"").split(",").map(Number):[]}function Ae(n){return`[${n.join(",")}]`}function ge(n){let e=new So({connectionString:n.connectionString,max:n.max??20});return{async initialize(){let t=await e.connect();try{await t.query(Ao),console.log("[kernel/storage] PostgreSQL migration complete")}finally{t.release()}},async close(){await e.end()},async saveMessage(t){let{rows:o}=await e.query(`INSERT INTO messages (conversation_id, user_id, role, content, channel, token_count, metadata)
2
+ VALUES ($1, $2, $3, $4, $5, $6, $7)
3
+ RETURNING *`,[t.conversationId,t.userId,t.role,t.content,t.channel,t.tokenCount,JSON.stringify(t.metadata)]);return xt(o[0])},async getMessagesByConversation(t,o=50){let{rows:s}=await e.query("SELECT * FROM messages WHERE conversation_id = $1 ORDER BY created_at ASC LIMIT $2",[t,o]);return s.map(xt)},async getMessageById(t){let{rows:o}=await e.query("SELECT * FROM messages WHERE id = $1",[t]);return o[0]?xt(o[0]):null},async createConversation(t){let{rows:o}=await e.query(`INSERT INTO conversations (user_id, title, channel, metadata)
4
+ VALUES ($1, $2, $3, $4)
5
+ RETURNING *`,[t.userId,t.title,t.channel,JSON.stringify(t.metadata)]);return Sn(o[0])},async listConversations(t,o){let s=o?.limit??50,i=o?.offset??0,{rows:a}=await e.query("SELECT * FROM conversations WHERE user_id = $1 ORDER BY updated_at DESC LIMIT $2 OFFSET $3",[t,s,i]);return a.map(Sn)},async deleteConversation(t){await e.query("DELETE FROM conversations WHERE id = $1",[t])},async saveMemorySegment(t){let o=t.embedding?Ae(t.embedding):null,{rows:s}=await e.query(`INSERT INTO memory_segments (user_id, content, category, embedding, heat)
6
+ VALUES ($1, $2, $3, $4::vector, $5)
7
+ RETURNING *`,[t.userId,t.content,t.category,o,t.heat]);return An(s[0])},async searchMemoryByEmbedding(t,o,s=10){let i=Ae(o),{rows:a}=await e.query(`SELECT *, 1 - (embedding <=> $2::vector) AS score
8
+ FROM memory_segments
9
+ WHERE user_id = $1 AND embedding IS NOT NULL
10
+ ORDER BY embedding <=> $2::vector
11
+ LIMIT $3`,[t,i,s]);return a.map(c=>({segment:An(c),score:c.score}))},async getProfile(t){let{rows:o}=await e.query("SELECT * FROM user_profiles WHERE user_id = $1",[t]);return o[0]?In(o[0]):null},async upsertProfile(t,o){let{rows:s}=await e.query(`INSERT INTO user_profiles (user_id, summary, updated_at)
12
+ VALUES ($1, $2, now())
13
+ ON CONFLICT (user_id) DO UPDATE SET summary = $2, updated_at = now()
14
+ RETURNING *`,[t,o]);return In(s[0])},async updateHeatScores(t,o){t.length!==0&&await e.query(`UPDATE memory_segments
15
+ SET heat = heat + $2, access_count = access_count + 1, last_accessed_at = now()
16
+ WHERE id = ANY($1)`,[t,o])},async saveObservation(t){let{rows:o}=await e.query(`INSERT INTO observations (user_id, conversation_id, content, category)
17
+ VALUES ($1, $2, $3, $4)
18
+ RETURNING *`,[t.userId,t.conversationId,t.content,t.category]);return Rn(o[0])},async listPendingObservations(t,o){let s=o?.limit??50,i=o?.offset??0,{rows:a}=await e.query(`SELECT * FROM observations
19
+ WHERE user_id = $1 AND NOT reviewed
20
+ ORDER BY created_at DESC
21
+ LIMIT $2 OFFSET $3`,[t,s,i]);return a.map(Rn)},async markObservationReviewed(t){await e.query("UPDATE observations SET reviewed = TRUE, reviewed_at = now() WHERE id = $1",[t])},async saveBrainArtifact(t){let{rows:o}=await e.query(`INSERT INTO brain_artifacts (conversation_id, artifact_type, title, content, metadata)
22
+ VALUES ($1, $2, $3, $4, $5)
23
+ RETURNING *`,[t.conversationId,t.artifactType,t.title,t.content,JSON.stringify(t.metadata)]);return Pn(o[0])},async loadBrainArtifacts(t){let{rows:o}=await e.query("SELECT * FROM brain_artifacts WHERE conversation_id = $1 ORDER BY created_at ASC",[t]);return o.map(Pn)},async deleteBrainArtifact(t){await e.query("DELETE FROM brain_artifacts WHERE id = $1",[t])},async insertCostLog(t){let{rows:o}=await e.query(`INSERT INTO cost_logs (user_id, conversation_id, provider, model, input_tokens, output_tokens, cost_usd)
24
+ VALUES ($1, $2, $3, $4, $5, $6, $7)
25
+ RETURNING *`,[t.userId,t.conversationId,t.provider,t.model,t.inputTokens,t.outputTokens,t.costUsd]);return _n(o[0])},async queryCostLogs(t){let{rows:o}=await e.query(`SELECT * FROM cost_logs
26
+ WHERE user_id = $1 AND created_at >= $2 AND created_at <= $3
27
+ ORDER BY created_at DESC`,[t.userId,t.startDate,t.endDate]);return o.map(_n)},async createJob(t){let{rows:o}=await e.query(`INSERT INTO jobs (type, priority, payload, max_attempts)
28
+ VALUES ($1, $2, $3, $4)
29
+ RETURNING *`,[t.type,t.priority,JSON.stringify(t.payload),t.maxAttempts]);return pe(o[0])},async claimNextJob(t){let o=t&&t.length>0?"AND type = ANY($1)":"",s=t&&t.length>0?[t]:[],{rows:i}=await e.query(`UPDATE jobs
30
+ SET status = 'running', claimed_at = now(), attempts = attempts + 1, updated_at = now()
31
+ WHERE id = (
32
+ SELECT id FROM jobs
33
+ WHERE status = 'pending' ${o}
34
+ ORDER BY priority DESC, created_at ASC
35
+ LIMIT 1
36
+ FOR UPDATE SKIP LOCKED
37
+ )
38
+ RETURNING *`,s);return i[0]?pe(i[0]):null},async updateJobStatus(t,o,s,i){let a=o==="completed"||o==="failed"||o==="dead"?"now()":"NULL",{rows:c}=await e.query(`UPDATE jobs
39
+ SET status = $2,
40
+ result = $3,
41
+ error = $4,
42
+ completed_at = ${a==="now()"?"now()":"completed_at"},
43
+ updated_at = now()
44
+ WHERE id = $1
45
+ RETURNING *`,[t,o,s?JSON.stringify(s):null,i??null]);return pe(c[0])},async getJobById(t){let{rows:o}=await e.query("SELECT * FROM jobs WHERE id = $1",[t]);return o[0]?pe(o[0]):null},async listJobs(t,o){let s=[],i=[],a=1;t.status&&(s.push(`status = $${a++}`),i.push(t.status)),t.type&&(s.push(`type = $${a++}`),i.push(t.type));let c=s.length>0?`WHERE ${s.join(" AND ")}`:"",l=o?.limit??50,d=o?.offset??0;i.push(l,d);let{rows:u}=await e.query(`SELECT * FROM jobs ${c} ORDER BY created_at DESC LIMIT $${a++} OFFSET $${a}`,i);return u.map(pe)},async markDeadJobs(t){let{rowCount:o}=await e.query(`UPDATE jobs
46
+ SET status = 'dead', updated_at = now(), completed_at = now()
47
+ WHERE status = 'running'
48
+ AND claimed_at < now() - ($1 || ' seconds')::interval`,[t]);return o??0},async createContentSource(t){let{rows:o}=await e.query(`INSERT INTO content_sources (user_id, source_type, uri, status, metadata)
49
+ VALUES ($1, $2, $3, $4, $5)
50
+ RETURNING *`,[t.userId,t.sourceType,t.uri,t.status,JSON.stringify(t.metadata)]);return Se(o[0])},async updateContentSourceStatus(t,o){let{rows:s}=await e.query("UPDATE content_sources SET status = $2, updated_at = now() WHERE id = $1 RETURNING *",[t,o]);return Se(s[0])},async getContentSourceById(t){let{rows:o}=await e.query("SELECT * FROM content_sources WHERE id = $1",[t]);return o[0]?Se(o[0]):null},async listContentSources(t,o){let s=o?.limit??50,i=o?.offset??0,{rows:a}=await e.query("SELECT * FROM content_sources WHERE user_id = $1 ORDER BY created_at DESC LIMIT $2 OFFSET $3",[t,s,i]);return a.map(Se)},async bulkInsertContentChunks(t){if(t.length===0)return[];let o=[],s=[],i=1;for(let c of t){let l=c.embedding?Ae(c.embedding):null;o.push(`($${i++}, $${i++}, $${i++}::vector, $${i++}, $${i++})`),s.push(c.sourceId,c.content,l,c.chunkIndex,JSON.stringify(c.metadata))}let{rows:a}=await e.query(`INSERT INTO content_chunks (source_id, content, embedding, chunk_index, metadata)
51
+ VALUES ${o.join(", ")}
52
+ RETURNING *`,s);return a.map(Et)},async searchContentChunksByEmbedding(t,o,s=10){if(t.length===0)return[];let i=Ae(o),{rows:a}=await e.query(`SELECT *, 1 - (embedding <=> $2::vector) AS score
53
+ FROM content_chunks
54
+ WHERE source_id = ANY($1) AND embedding IS NOT NULL
55
+ ORDER BY embedding <=> $2::vector
56
+ LIMIT $3`,[t,i,s]);return a.map(c=>({chunk:Et(c),score:c.score}))},async searchContentChunksByText(t,o,s=10){if(t.length===0)return[];let{rows:i}=await e.query(`SELECT *, ts_rank(tsv, plainto_tsquery('english', $2)) AS score
57
+ FROM content_chunks
58
+ WHERE source_id = ANY($1) AND tsv @@ plainto_tsquery('english', $2)
59
+ ORDER BY score DESC
60
+ LIMIT $3`,[t,o,s]);return i.map(a=>({chunk:Et(a),score:a.score}))},async deleteContentChunksBySource(t){let{rowCount:o}=await e.query("DELETE FROM content_chunks WHERE source_id = $1",[t]);return o??0},async saveCredential(t){let{rows:o}=await e.query(`INSERT INTO encrypted_credentials (user_id, provider, encrypted_data, iv, auth_tag)
61
+ VALUES ($1, $2, $3, $4, $5)
62
+ ON CONFLICT (user_id, provider) DO UPDATE
63
+ SET encrypted_data = $3, iv = $4, auth_tag = $5, updated_at = now()
64
+ RETURNING *`,[t.userId,t.provider,t.encryptedData,t.iv,t.authTag]);return Ct(o[0])},async getCredential(t,o){let{rows:s}=await e.query("SELECT * FROM encrypted_credentials WHERE user_id = $1 AND provider = $2",[t,o]);return s[0]?Ct(s[0]):null},async deleteCredential(t){await e.query("DELETE FROM encrypted_credentials WHERE id = $1",[t])},async listCredentials(t){let{rows:o}=await e.query("SELECT * FROM encrypted_credentials WHERE user_id = $1 ORDER BY provider",[t]);return o.map(Ct)},async saveIdentityFile(t){let{rows:o}=await e.query(`INSERT INTO identity_files (workspace_id, file_name, content, metadata)
65
+ VALUES ($1, $2, $3, $4)
66
+ ON CONFLICT (workspace_id, file_name) DO UPDATE
67
+ SET content = $3, metadata = $4, updated_at = now()
68
+ RETURNING *`,[t.workspaceId,t.fileName,t.content,JSON.stringify(t.metadata)]);return St(o[0])},async getIdentityFile(t){let{rows:o}=await e.query("SELECT * FROM identity_files WHERE workspace_id = $1 ORDER BY created_at DESC LIMIT 1",[t]);return o[0]?St(o[0]):null},async listIdentityFiles(){let{rows:t}=await e.query("SELECT * FROM identity_files ORDER BY created_at DESC");return t.map(St)},async query(t,o){let{rows:s}=await e.query(t,o);return s}}}var So,Ao,Ie=ve(()=>{"use strict";({Pool:So}=Co),Ao=`
69
+ -- \u2550\u2550\u2550 Extensions \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
70
+ CREATE EXTENSION IF NOT EXISTS vector;
71
+ CREATE EXTENSION IF NOT EXISTS pgcrypto;
72
+
73
+ -- \u2550\u2550\u2550 v1.2 \u2014 Core tables \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
74
+
75
+ CREATE TABLE IF NOT EXISTS users (
76
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
77
+ external_id TEXT NOT NULL,
78
+ platform TEXT NOT NULL,
79
+ display_name TEXT,
80
+ email TEXT,
81
+ metadata JSONB NOT NULL DEFAULT '{}',
82
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
83
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
84
+ UNIQUE (external_id, platform)
85
+ );
86
+
87
+ CREATE TABLE IF NOT EXISTS conversations (
88
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
89
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
90
+ title TEXT,
91
+ channel TEXT NOT NULL DEFAULT 'web',
92
+ metadata JSONB NOT NULL DEFAULT '{}',
93
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
94
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
95
+ );
96
+ CREATE INDEX IF NOT EXISTS idx_conversations_user ON conversations(user_id, updated_at DESC);
97
+
98
+ CREATE TABLE IF NOT EXISTS messages (
99
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
100
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
101
+ user_id TEXT NOT NULL,
102
+ role TEXT NOT NULL,
103
+ content TEXT NOT NULL,
104
+ channel TEXT NOT NULL DEFAULT 'web',
105
+ token_count INTEGER,
106
+ metadata JSONB NOT NULL DEFAULT '{}',
107
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
108
+ );
109
+ CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id, created_at);
110
+ CREATE INDEX IF NOT EXISTS idx_messages_user ON messages(user_id, created_at DESC);
111
+
112
+ CREATE TABLE IF NOT EXISTS memory_segments (
113
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
114
+ user_id TEXT NOT NULL,
115
+ content TEXT NOT NULL,
116
+ category TEXT NOT NULL DEFAULT 'fact',
117
+ embedding vector(1536),
118
+ heat REAL NOT NULL DEFAULT 1.0,
119
+ access_count INTEGER NOT NULL DEFAULT 0,
120
+ last_accessed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
121
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
122
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
123
+ );
124
+ CREATE INDEX IF NOT EXISTS idx_memory_user ON memory_segments(user_id);
125
+ CREATE INDEX IF NOT EXISTS idx_memory_updated ON memory_segments(updated_at DESC);
126
+
127
+ -- ivfflat index for vector search (created only if enough rows exist or deferred)
128
+ -- We use a DO block so it doesn't fail on first run with zero rows.
129
+ DO $$
130
+ BEGIN
131
+ IF NOT EXISTS (
132
+ SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embedding_ivfflat'
133
+ ) THEN
134
+ BEGIN
135
+ CREATE INDEX idx_memory_embedding_ivfflat
136
+ ON memory_segments USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
137
+ EXCEPTION WHEN others THEN
138
+ -- ivfflat requires rows to train; will be created later
139
+ RAISE NOTICE 'Skipping ivfflat index (likely not enough rows): %', SQLERRM;
140
+ END;
141
+ END IF;
142
+ END $$;
143
+
144
+ CREATE TABLE IF NOT EXISTS user_profiles (
145
+ user_id TEXT PRIMARY KEY,
146
+ summary TEXT NOT NULL,
147
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
148
+ );
149
+
150
+ CREATE TABLE IF NOT EXISTS observations (
151
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
152
+ user_id TEXT NOT NULL,
153
+ conversation_id TEXT,
154
+ content TEXT NOT NULL,
155
+ category TEXT NOT NULL DEFAULT 'general',
156
+ reviewed BOOLEAN NOT NULL DEFAULT FALSE,
157
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
158
+ reviewed_at TIMESTAMPTZ
159
+ );
160
+ CREATE INDEX IF NOT EXISTS idx_observations_pending ON observations(user_id) WHERE NOT reviewed;
161
+
162
+ -- \u2550\u2550\u2550 v1.4 \u2014 Knowledge graph + cost + artifacts \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
163
+
164
+ CREATE TABLE IF NOT EXISTS entities (
165
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
166
+ user_id TEXT NOT NULL,
167
+ name TEXT NOT NULL,
168
+ entity_type TEXT NOT NULL,
169
+ metadata JSONB NOT NULL DEFAULT '{}',
170
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
171
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
172
+ );
173
+ CREATE INDEX IF NOT EXISTS idx_entities_user ON entities(user_id);
174
+
175
+ CREATE TABLE IF NOT EXISTS relations (
176
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
177
+ user_id TEXT NOT NULL,
178
+ source_entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
179
+ target_entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
180
+ relation_type TEXT NOT NULL,
181
+ strength REAL NOT NULL DEFAULT 1.0,
182
+ metadata JSONB NOT NULL DEFAULT '{}',
183
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
184
+ );
185
+ CREATE INDEX IF NOT EXISTS idx_relations_source ON relations(source_entity_id);
186
+ CREATE INDEX IF NOT EXISTS idx_relations_target ON relations(target_entity_id);
187
+
188
+ CREATE TABLE IF NOT EXISTS checkpoints (
189
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
190
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
191
+ summary TEXT NOT NULL,
192
+ tokens_saved INTEGER NOT NULL DEFAULT 0,
193
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
194
+ );
195
+ CREATE INDEX IF NOT EXISTS idx_checkpoints_conv ON checkpoints(conversation_id, created_at DESC);
196
+
197
+ CREATE TABLE IF NOT EXISTS cost_logs (
198
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
199
+ user_id TEXT NOT NULL,
200
+ conversation_id TEXT,
201
+ provider TEXT NOT NULL,
202
+ model TEXT NOT NULL,
203
+ input_tokens INTEGER NOT NULL DEFAULT 0,
204
+ output_tokens INTEGER NOT NULL DEFAULT 0,
205
+ cost_usd REAL NOT NULL DEFAULT 0,
206
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
207
+ );
208
+ CREATE INDEX IF NOT EXISTS idx_cost_logs_user_date ON cost_logs(user_id, created_at);
209
+
210
+ CREATE TABLE IF NOT EXISTS brain_artifacts (
211
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
212
+ conversation_id TEXT NOT NULL,
213
+ artifact_type TEXT NOT NULL,
214
+ title TEXT NOT NULL,
215
+ content TEXT NOT NULL,
216
+ metadata JSONB NOT NULL DEFAULT '{}',
217
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
218
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
219
+ );
220
+ CREATE INDEX IF NOT EXISTS idx_brain_artifacts_conv ON brain_artifacts(conversation_id);
221
+
222
+ CREATE TABLE IF NOT EXISTS approval_records (
223
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
224
+ user_id TEXT NOT NULL,
225
+ conversation_id TEXT NOT NULL,
226
+ action TEXT NOT NULL,
227
+ status TEXT NOT NULL DEFAULT 'pending',
228
+ payload JSONB NOT NULL DEFAULT '{}',
229
+ decided_at TIMESTAMPTZ,
230
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
231
+ );
232
+ CREATE INDEX IF NOT EXISTS idx_approvals_user ON approval_records(user_id, created_at DESC);
233
+
234
+ -- \u2550\u2550\u2550 v1.5 \u2014 Jobs, content pipeline, credentials \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
235
+
236
+ CREATE TABLE IF NOT EXISTS jobs (
237
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
238
+ type TEXT NOT NULL,
239
+ status TEXT NOT NULL DEFAULT 'pending',
240
+ priority INTEGER NOT NULL DEFAULT 0,
241
+ payload JSONB NOT NULL DEFAULT '{}',
242
+ result JSONB,
243
+ error TEXT,
244
+ attempts INTEGER NOT NULL DEFAULT 0,
245
+ max_attempts INTEGER NOT NULL DEFAULT 3,
246
+ claimed_at TIMESTAMPTZ,
247
+ completed_at TIMESTAMPTZ,
248
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
249
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
250
+ );
251
+ -- Priority-ordered index for SKIP LOCKED claiming
252
+ CREATE INDEX IF NOT EXISTS idx_jobs_claimable
253
+ ON jobs(priority DESC, created_at ASC)
254
+ WHERE status = 'pending';
255
+ CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status);
256
+ CREATE INDEX IF NOT EXISTS idx_jobs_type ON jobs(type);
257
+
258
+ CREATE TABLE IF NOT EXISTS content_sources (
259
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
260
+ user_id TEXT NOT NULL,
261
+ source_type TEXT NOT NULL,
262
+ uri TEXT NOT NULL,
263
+ status TEXT NOT NULL DEFAULT 'pending',
264
+ metadata JSONB NOT NULL DEFAULT '{}',
265
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
266
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
267
+ );
268
+ CREATE INDEX IF NOT EXISTS idx_content_sources_user ON content_sources(user_id);
269
+
270
+ CREATE TABLE IF NOT EXISTS content_chunks (
271
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
272
+ source_id TEXT NOT NULL REFERENCES content_sources(id) ON DELETE CASCADE,
273
+ content TEXT NOT NULL,
274
+ embedding vector(1536),
275
+ chunk_index INTEGER NOT NULL DEFAULT 0,
276
+ metadata JSONB NOT NULL DEFAULT '{}',
277
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
278
+ );
279
+ CREATE INDEX IF NOT EXISTS idx_content_chunks_source ON content_chunks(source_id);
280
+
281
+ -- Full-text GIN index on content_chunks
282
+ DO $$
283
+ BEGIN
284
+ IF NOT EXISTS (
285
+ SELECT 1 FROM information_schema.columns
286
+ WHERE table_name = 'content_chunks' AND column_name = 'tsv'
287
+ ) THEN
288
+ ALTER TABLE content_chunks ADD COLUMN tsv tsvector
289
+ GENERATED ALWAYS AS (to_tsvector('english', content)) STORED;
290
+ CREATE INDEX idx_content_chunks_tsv ON content_chunks USING GIN(tsv);
291
+ END IF;
292
+ END $$;
293
+
294
+ -- pgvector index on content_chunks
295
+ DO $$
296
+ BEGIN
297
+ IF NOT EXISTS (
298
+ SELECT 1 FROM pg_indexes WHERE indexname = 'idx_content_chunks_embedding'
299
+ ) THEN
300
+ BEGIN
301
+ CREATE INDEX idx_content_chunks_embedding
302
+ ON content_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
303
+ EXCEPTION WHEN others THEN
304
+ RAISE NOTICE 'Skipping content_chunks ivfflat index: %', SQLERRM;
305
+ END;
306
+ END IF;
307
+ END $$;
308
+
309
+ -- AES-256-GCM encrypted credentials
310
+ CREATE TABLE IF NOT EXISTS encrypted_credentials (
311
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
312
+ user_id TEXT NOT NULL,
313
+ provider TEXT NOT NULL,
314
+ encrypted_data BYTEA NOT NULL,
315
+ iv BYTEA NOT NULL,
316
+ auth_tag BYTEA NOT NULL,
317
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
318
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
319
+ UNIQUE (user_id, provider)
320
+ );
321
+
322
+ -- \u2550\u2550\u2550 v1.6 \u2014 Identity files, cost events \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
323
+
324
+ CREATE TABLE IF NOT EXISTS identity_files (
325
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
326
+ workspace_id TEXT NOT NULL,
327
+ file_name TEXT NOT NULL,
328
+ content TEXT NOT NULL,
329
+ metadata JSONB NOT NULL DEFAULT '{}',
330
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
331
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
332
+ UNIQUE (workspace_id, file_name)
333
+ );
334
+
335
+ CREATE TABLE IF NOT EXISTS cost_events (
336
+ id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
337
+ user_id TEXT NOT NULL,
338
+ event_type TEXT NOT NULL,
339
+ amount REAL NOT NULL DEFAULT 0,
340
+ currency TEXT NOT NULL DEFAULT 'USD',
341
+ metadata JSONB NOT NULL DEFAULT '{}',
342
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
343
+ );
344
+ CREATE INDEX IF NOT EXISTS idx_cost_events_user ON cost_events(user_id, created_at);
345
+ `});function y(){throw new Error(Io)}function me(){return{initialize:y,close:y,saveMessage:y,getMessagesByConversation:y,getMessageById:y,createConversation:y,listConversations:y,deleteConversation:y,saveMemorySegment:y,searchMemoryByEmbedding:y,getProfile:y,upsertProfile:y,updateHeatScores:y,saveObservation:y,listPendingObservations:y,markObservationReviewed:y,saveBrainArtifact:y,loadBrainArtifacts:y,deleteBrainArtifact:y,insertCostLog:y,queryCostLogs:y,createJob:y,claimNextJob:y,updateJobStatus:y,getJobById:y,listJobs:y,markDeadJobs:y,createContentSource:y,updateContentSourceStatus:y,getContentSourceById:y,listContentSources:y,bulkInsertContentChunks:y,searchContentChunksByEmbedding:y,searchContentChunksByText:y,deleteContentChunksBySource:y,saveCredential:y,getCredential:y,deleteCredential:y,listCredentials:y,saveIdentityFile:y,getIdentityFile:y,listIdentityFiles:y,query:y}}var Io,Re=ve(()=>{"use strict";Io="SQLite not implemented \u2014 use PostgreSQL. Mobile edition will use SQLite + zvec."});var Dn=ve(()=>{"use strict"});var Ln={};pr(Ln,{createPostgresStorage:()=>ge,createSqliteStorage:()=>me,createStorage:()=>On});function On(n){switch(n.backend){case"postgres":{if(!n.connectionString)throw new Error("connectionString is required for the postgres backend");return ge({connectionString:n.connectionString,max:n.maxConnections})}case"sqlite":return me();default:throw new Error(`Unknown storage backend: ${n.backend}`)}}var At=ve(()=>{"use strict";Ie();Re();Dn();Ie();Re()});var Be={name:"pro",label:"Fenix Pro",tools:["*"],maxWorkers:8};var Rr={failureThreshold:5,resetTimeoutMs:6e4,maxResetTimeoutMs:36e5,billingResetTimeoutMs:18e6,billingMaxResetTimeoutMs:864e5};function Pr(n){if(typeof n=="object"&&n!==null){let e=n.statusCode??n.status;if(e===402||e===429)return!0;let r=n.message??"";return/quota|billing|rate.limit|insufficient.funds|payment.required/i.test(r)}return!1}var te=class n{state="closed";failureCount=0;consecutiveResets=0;lastFailureTime=0;isBillingFailure=!1;config;keyBreakers=null;constructor(e){this.config={...Rr,...e}}getState(){return this.state==="open"&&Date.now()-this.lastFailureTime>=this.currentTimeout()&&(this.state="half-open"),this.state}canAttempt(){let e=this.getState();return e==="closed"||e==="half-open"}recordSuccess(){this.failureCount=0,this.consecutiveResets=0,this.isBillingFailure=!1,this.state="closed"}recordFailure(e){this.failureCount++,this.lastFailureTime=Date.now(),this.isBillingFailure=Pr(e),(this.state==="half-open"||this.failureCount>=this.config.failureThreshold)&&(this.state==="half-open"&&this.consecutiveResets++,this.state="open")}getKeyBreaker(e){this.keyBreakers||(this.keyBreakers=new Map);let r=this.keyBreakers.get(e);return r||(r=new n(this.config),this.keyBreakers.set(e,r)),r}getHealthyKey(e){if(!this.keyBreakers)return e[0]??null;for(let r of e){let t=this.keyBreakers.get(r);if(!t||t.canAttempt())return r}return null}currentTimeout(){return this.isBillingFailure?Math.min(this.config.billingResetTimeoutMs*2**this.consecutiveResets,this.config.billingMaxResetTimeoutMs):Math.min(this.config.resetTimeoutMs*2**this.consecutiveResets,this.config.maxResetTimeoutMs)}};function an(n){return n.priority??5}function _r(n){return n.urgency??"immediate"}function cn(n,e){return e.priority-n.priority}var V=class{handlers=new Map;allHandlers=new Set;errorHandler;soonQueue=[];soonScheduled=!1;laterQueue=[];subscribe(e,r){return this.handlers.has(e)||this.handlers.set(e,new Set),this.handlers.get(e).add(r),()=>{this.handlers.get(e)?.delete(r)}}subscribeAll(e){return this.allHandlers.add(e),()=>{this.allHandlers.delete(e)}}onError(e){this.errorHandler=e}async emit(e){let r=_r(e);if(r==="soon"){this.soonQueue.push({event:e,priority:an(e)}),this.scheduleSoonDrain();return}if(r==="later"){this.laterQueue.push({event:e,priority:an(e)});return}await this.deliver(e)}async drainDeferred(){if(this.laterQueue.length===0)return 0;let e=this.laterQueue.splice(0);e.sort(cn);for(let{event:r}of e)await this.deliver(r);return e.length}get pendingCount(){return this.soonQueue.length+this.laterQueue.length}listenerCount(e){if(e)return(this.handlers.get(e)?.size??0)+this.allHandlers.size;let r=this.allHandlers.size;for(let t of this.handlers.values())r+=t.size;return r}clear(){this.handlers.clear(),this.allHandlers.clear(),this.soonQueue.length=0,this.laterQueue.length=0}async deliver(e){let r=[],t=this.handlers.get(e.type);if(t&&r.push(...t),r.push(...this.allHandlers),r.length===0)return;let o=await Promise.allSettled(r.map(async s=>s(e)));for(let s of o)s.status==="rejected"&&this.errorHandler&&this.errorHandler(s.reason,e)}scheduleSoonDrain(){this.soonScheduled||(this.soonScheduled=!0,queueMicrotask(async()=>{this.soonScheduled=!1;let e=this.soonQueue.splice(0);e.sort(cn);for(let{event:r}of e)await this.deliver(r)}))}};var z=class{sessions=new Map;timers=new Map;bufferTtlMs;maxBufferSize;constructor(e){this.bufferTtlMs=e?.bufferTtlMs??1800*1e3,this.maxBufferSize=e?.maxBufferSize??1e4}create(e){let r=e??`sess-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,t={id:r,createdAt:Date.now(),events:[],listeners:new Set};return this.sessions.set(r,t),this.resetTtl(r),t}get(e){return this.sessions.get(e)}subscribe(e,r){let t=this.sessions.get(e);if(!t)throw new Error(`Session not found: ${e}`);return t.listeners.add(r),()=>{t.listeners.delete(r)}}async bufferEvent(e,r){let t=this.sessions.get(e);if(t){t.events.length>=this.maxBufferSize&&t.events.shift(),t.events.push(r),this.resetTtl(e);for(let o of t.listeners)o(r)}}replay(e,r){let t=this.sessions.get(e);if(!t)return 0;for(let o of t.events)r(o);return t.events.length}connectBus(e,r){return e.subscribeAll(t=>{"sessionId"in t&&t.sessionId===r&&this.bufferEvent(r,t)})}delete(e){return this.clearTtl(e),this.sessions.delete(e)}get size(){return this.sessions.size}destroy(){for(let[e]of this.sessions)this.clearTtl(e);this.sessions.clear()}resetTtl(e){this.clearTtl(e),this.timers.set(e,setTimeout(()=>{this.sessions.delete(e),this.timers.delete(e)},this.bufferTtlMs))}clearTtl(e){let r=this.timers.get(e);r&&(clearTimeout(r),this.timers.delete(e))}};var be=class{constructor(e,r=3,t=15){this.inner=e;this.inputCostPerM=r;this.outputCostPerM=t;this.id=e.id,e.stream&&(this.stream=o=>{this.model=o.model??this.model;let s=e.stream(o);return this.wrapStream(s)}),e.generateObject&&(this.generateObject=async o=>{this.model=o.model??this.model;let s=await e.generateObject(o),i=o.messages.reduce((c,l)=>c+(typeof l.content=="string"?l.content.length:0),0),a=JSON.stringify(s).length;return this.record(Math.ceil(i/4),Math.ceil(a/4)),s}),e.streamObject&&(this.streamObject=o=>{this.model=o.model??this.model;let s=e.streamObject(o);return this.wrapObjectStream(s)})}id;records=[];model="unknown";stream;generateObject;streamObject;capabilities(){return this.inner.capabilities()}async complete(e){this.model=e.model??this.model;let r=await this.inner.complete(e);return r.usage&&this.record(r.usage.inputTokens,r.usage.outputTokens),r}async embed(e){if(!this.inner.embed)throw new Error(`Provider ${this.id} does not support embeddings`);let r=await this.inner.embed(e);return r.usage&&this.record(r.usage.totalTokens,0),r}getRecords(){return this.records}getSummary(){let e=0,r=0,t=0;for(let o of this.records)e+=o.inputTokens,r+=o.outputTokens,t+=o.estimatedCost;return{totalInputTokens:e,totalOutputTokens:r,totalEstimatedCost:t,recordCount:this.records.length}}record(e,r){let t=e/1e6*this.inputCostPerM+r/1e6*this.outputCostPerM;this.records.push({provider:this.id,model:this.model,inputTokens:e,outputTokens:r,estimatedCost:t,timestamp:Date.now()})}wrapStream(e){let r=this;return{[Symbol.asyncIterator](){let t=e[Symbol.asyncIterator]();return{async next(){let o=await t.next();return!o.done&&o.value.usage&&r.record(o.value.usage.prompt_tokens??0,o.value.usage.completion_tokens??0),o}}}}}wrapObjectStream(e){let r=this;return{[Symbol.asyncIterator](){let t=e[Symbol.asyncIterator]();return{async next(){let o=await t.next();return!o.done&&o.value.usage&&r.record(o.value.usage.inputTokens,o.value.usage.outputTokens),o}}}}}};var ln=[{id:"anthropic",envVars:["ANTHROPIC_API_KEY"]},{id:"openai",envVars:["OPENAI_API_KEY"]},{id:"google",envVars:["GOOGLE_API_KEY"]},{id:"openrouter",envVars:["OPENROUTER_API_KEY"]},{id:"groq",envVars:["GROQ_API_KEY"]},{id:"bedrock",envVars:["AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY"]},{id:"nvidia",envVars:["NVIDIA_API_KEY"]},{id:"cloudflare",envVars:["CLOUDFLARE_API_TOKEN"]},{id:"github",envVars:["GITHUB_TOKEN"]}],dn="http://localhost:11434",Mr=[{id:"sidecar-qwen3",type:"gpu-model",modelPath:"Qwen3-TTS"},{id:"google-tts",type:"env",envVars:["GOOGLE_API_KEY"]},{id:"sidecar-moss",type:"gpu-model",modelPath:"MOSS-TTS"},{id:"speechmatics-tts",type:"env",envVars:["SPEECHMATICS_API_KEY"]},{id:"elevenlabs",type:"env",envVars:["ELEVENLABS_API_KEY"]},{id:"deepgram-tts",type:"env",envVars:["DEEPGRAM_API_KEY"]},{id:"openai-tts",type:"env",envVars:["OPENAI_API_KEY"]},{id:"groq",type:"env",envVars:["GROQ_API_KEY"]},{id:"nvidia",type:"env",envVars:["NVIDIA_API_KEY"]},{id:"cloudflare",type:"env",envVars:["CLOUDFLARE_API_TOKEN"]}],Dr=[{id:"sidecar-parakeet",type:"gpu-model",modelPath:"Parakeet"},{id:"groq",type:"env",envVars:["GROQ_API_KEY"]},{id:"speechmatics",type:"env",envVars:["SPEECHMATICS_API_KEY"]},{id:"deepgram",type:"env",envVars:["DEEPGRAM_API_KEY"]},{id:"google-stt",type:"env",envVars:["GOOGLE_API_KEY"]},{id:"sidecar-whisper",type:"gpu-model",modelPath:"Whisper"},{id:"nvidia",type:"env",envVars:["NVIDIA_API_KEY"]}];function Ue(n){return n.every(e=>!!process.env[e])}function Or(){return!!(process.env.CUDA_VISIBLE_DEVICES||process.env.NVIDIA_VISIBLE_DEVICES)}async function Lr(n){try{let e=new AbortController,r=setTimeout(()=>e.abort(),2e3),t=await fetch(`${n}/api/tags`,{signal:e.signal});return clearTimeout(r),t.ok}catch{return!1}}async function ne(){let n=[],e=null;for(let s of ln)if(Ue(s.envVars)){e={id:s.id,slot:"chat",apiKeyEnv:s.envVars[0]};break}if(!e&&await Lr(dn)&&(e={id:"ollama",slot:"chat",baseUrl:dn}),!e){let s=ln.map(i=>i.envVars.join(" + ")).join(", ");throw new Error(`No LLM provider detected. Set one of: ${s}, or run Ollama on localhost:11434`)}let r=null,t=Or();for(let s of Mr){if(s.type==="gpu-model"&&t){r={id:s.id,slot:"tts"};break}if(s.type==="env"&&s.envVars&&Ue(s.envVars)){r={id:s.id,slot:"tts",apiKeyEnv:s.envVars[0]},e.apiKeyEnv&&e.apiKeyEnv===s.envVars[0]&&n.push(e.apiKeyEnv);break}}let o=null;for(let s of Dr){if(s.type==="gpu-model"&&t){o={id:s.id,slot:"stt"};break}if(s.type==="env"&&s.envVars&&Ue(s.envVars)){o={id:s.id,slot:"stt",apiKeyEnv:s.envVars[0]},e.apiKeyEnv&&e.apiKeyEnv===s.envVars[0]&&!n.includes(e.apiKeyEnv)&&n.push(e.apiKeyEnv);break}}return{chat:e,tts:r,stt:o,reusedKeys:n}}var re=class{slots=new Map;enableCostTracking;constructor(e={}){this.enableCostTracking=e.enableCostTracking??!1}register(e,r){let t=this.enableCostTracking?new be(r):r,o=new te;this.slots.set(e,{provider:t,breaker:o,slot:e})}getHealthy(e){let r=this.slots.get(e);return!r||!r.breaker.canAttempt()?null:r.provider}getBreaker(e){return this.slots.get(e)?.breaker??null}getByCapability(e,r="chat"){let t=[r];e==="vision"?(r!=="vision"&&t.unshift("vision"),t.includes("chat")||t.push("chat")):(t.includes("chat")||t.push("chat"),t.includes("utility")||t.push("utility"));for(let o of t){let s=this.slots.get(o);if(!s||!s.breaker.canAttempt())continue;if(s.provider.capabilities()[e])return s.provider}return null}listSlots(){return Array.from(this.slots.keys())}get(e){return this.slots.get(e)}hasSlots(){return this.slots.size>0}static async autoDetect(){return ne()}};function ke(n){try{return JSON.parse(n)}catch{}let e=n.trim();e.startsWith("```json")?e=e.slice(7):e.startsWith("```")&&(e=e.slice(3)),e.endsWith("```")&&(e=e.slice(0,-3)),e=e.trim();try{return JSON.parse(e)}catch{}e=e.replace(/,\s*([\]}])/g,"$1");try{return JSON.parse(e)}catch{}e=un(e);try{return JSON.parse(e)}catch{let r=Nr(e);if(r!==e)try{return JSON.parse(r)}catch{}}throw new Error(`Unable to repair JSON: ${n.slice(0,100)}...`)}function Y(n){if(n.trim())try{return ke(n)}catch{return}}function un(n){let e=!1,r=!1,t=[];for(let o=0;o<n.length;o++){let s=n[o];if(r){r=!1;continue}if(s==="\\"){r=!0;continue}if(s==='"'){e=!e;continue}e||(s==="{"?t.push("}"):s==="["?t.push("]"):(s==="}"||s==="]")&&t.length>0&&t[t.length-1]===s&&t.pop())}for(e&&(n+='"'),n=n.replace(/,\s*$/,"");t.length>0;)n+=t.pop();return n}function Nr(n){let e=n.lastIndexOf(",");if(e>0){let r=n.slice(0,e);return un(r)}return n}var F=class{id;baseUrl;apiKey;model;caps;constructor(e){this.id=e.id??`openai-compat:${e.model}`,this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.apiKey=e.apiKey,this.model=e.model,this.caps={nativeToolCalling:!0,vision:!1,streaming:!0,structuredOutput:!0,maxContextTokens:128e3,...e.capabilities}}capabilities(){return{...this.caps}}async complete(e){let r=this.buildRequestBody(e,!1),t=await fetch(`${this.baseUrl}/v1/chat/completions`,{method:"POST",headers:this.headers(),body:JSON.stringify(r)});if(!t.ok){let a=await t.text().catch(()=>"");throw Object.assign(new Error(`OpenAI API error ${t.status}: ${a}`),{statusCode:t.status})}let o=await t.json(),s=o.choices[0],i=s?.message?.tool_calls?.map(a=>({id:a.id,type:"function",function:{name:a.function.name,arguments:a.function.arguments}}));return{content:s?.message?.content??"",toolCalls:i?.length?i:void 0,finishReason:this.mapFinishReason(s?.finish_reason),usage:o.usage?{inputTokens:o.usage.prompt_tokens,outputTokens:o.usage.completion_tokens}:void 0}}stream(e){let r=this,t=this.buildRequestBody(e,!0);return{[Symbol.asyncIterator](){let o=null,s="",i=!1;return{async next(){if(i)return{done:!0,value:void 0};if(!o){let c=await fetch(`${r.baseUrl}/v1/chat/completions`,{method:"POST",headers:r.headers(),body:JSON.stringify(t)});if(!c.ok){let l=await c.text().catch(()=>"");throw Object.assign(new Error(`OpenAI API error ${c.status}: ${l}`),{statusCode:c.status})}o=c.body.getReader()}let a=new TextDecoder;for(;;){let c=s.indexOf(`
346
+ `);if(c!==-1){let u=s.slice(0,c).trim();if(s=s.slice(c+1),u==="data: [DONE]")return i=!0,{done:!0,value:void 0};if(u.startsWith("data: "))try{return{done:!1,value:JSON.parse(u.slice(6))}}catch{continue}continue}let{value:l,done:d}=await o.read();if(d)return i=!0,{done:!0,value:void 0};s+=a.decode(l,{stream:!0})}}}}}}async embed(e){let r=Array.isArray(e)?e:[e],t=await fetch(`${this.baseUrl}/v1/embeddings`,{method:"POST",headers:this.headers(),body:JSON.stringify({model:this.model,input:r})});if(!t.ok){let s=await t.text().catch(()=>"");throw Object.assign(new Error(`OpenAI Embeddings API error ${t.status}: ${s}`),{statusCode:t.status})}let o=await t.json();return{embeddings:o.data.map(s=>s.embedding),usage:o.usage?{totalTokens:o.usage.total_tokens}:void 0}}async generateObject(e){let r={model:e.model??this.model,messages:e.messages,response_format:{type:"json_schema",json_schema:{name:e.schemaName??"response",description:e.schemaDescription,schema:e.schema,strict:!0}}};e.temperature!==void 0&&(r.temperature=e.temperature),e.maxTokens!==void 0&&(r.max_tokens=e.maxTokens);let t=await fetch(`${this.baseUrl}/v1/chat/completions`,{method:"POST",headers:this.headers(),body:JSON.stringify(r)});if(!t.ok){let i=await t.text().catch(()=>"");throw Object.assign(new Error(`OpenAI API error ${t.status}: ${i}`),{statusCode:t.status})}let s=(await t.json()).choices[0]?.message?.content??"";return ke(s)}streamObject(e){let r=this,t={model:e.model??this.model,messages:e.messages,stream:!0,stream_options:{include_usage:!0},response_format:{type:"json_schema",json_schema:{name:e.schemaName??"response",description:e.schemaDescription,schema:e.schema,strict:!0}}};return e.temperature!==void 0&&(t.temperature=e.temperature),e.maxTokens!==void 0&&(t.max_tokens=e.maxTokens),{[Symbol.asyncIterator](){let o=null,s="",i="",a=!1;return{async next(){if(a)return{done:!0,value:void 0};if(!o){let l=await fetch(`${r.baseUrl}/v1/chat/completions`,{method:"POST",headers:r.headers(),body:JSON.stringify(t)});if(!l.ok){let d=await l.text().catch(()=>"");throw Object.assign(new Error(`OpenAI API error ${l.status}: ${d}`),{statusCode:l.status})}o=l.body.getReader()}let c=new TextDecoder;for(;;){let l=s.indexOf(`
347
+ `);if(l!==-1){let m=s.slice(0,l).trim();if(s=s.slice(l+1),m==="data: [DONE]")return a=!0,{done:!1,value:{partial:Y(i)??{},done:!0}};if(m.startsWith("data: "))try{let g=JSON.parse(m.slice(6)),p=g.choices?.[0]?.delta?.content;if(p){i+=p;let f=Y(i);if(f!==void 0){let v=g.usage?{inputTokens:g.usage.prompt_tokens??0,outputTokens:g.usage.completion_tokens??0}:void 0;return{done:!1,value:{partial:f,done:!1,usage:v}}}}if(g.usage&&!p)return{done:!1,value:{partial:Y(i)??{},done:!1,usage:{inputTokens:g.usage.prompt_tokens??0,outputTokens:g.usage.completion_tokens??0}}}}catch{continue}continue}let{value:d,done:u}=await o.read();if(u)return a=!0,{done:!1,value:{partial:Y(i)??{},done:!0}};s+=c.decode(d,{stream:!0})}}}}}}headers(){return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`}}buildRequestBody(e,r){let t={model:e.model??this.model,messages:e.messages,stream:r};return e.temperature!==void 0&&(t.temperature=e.temperature),e.maxTokens!==void 0&&(t.max_tokens=e.maxTokens),e.tools?.length&&(t.tools=e.tools),e.stop!==void 0&&(t.stop=e.stop),r&&(t.stream_options={include_usage:!0}),t}mapFinishReason(e){switch(e){case"stop":return"stop";case"tool_calls":return"tool_calls";case"length":return"length";case"content_filter":return"content_filter";default:return null}}};var $r="2023-06-01",oe=class{id;apiKey;model;baseUrl;maxTokens;constructor(e){this.id=e.id??`anthropic:${e.model}`,this.apiKey=e.apiKey,this.model=e.model,this.baseUrl=(e.baseUrl??"https://api.anthropic.com").replace(/\/+$/,""),this.maxTokens=e.maxTokens??4096}capabilities(){return{nativeToolCalling:!0,vision:!0,streaming:!0,structuredOutput:!1,maxContextTokens:2e5}}async complete(e){let r=this.buildRequestBody(e),t=await fetch(`${this.baseUrl}/v1/messages`,{method:"POST",headers:this.headers(),body:JSON.stringify(r)});if(!t.ok){let a=await t.text().catch(()=>"");throw Object.assign(new Error(`Anthropic API error ${t.status}: ${a}`),{statusCode:t.status})}let o=await t.json(),s="",i=[];for(let a of o.content)a.type==="text"&&a.text?s+=a.text:a.type==="tool_use"&&a.id&&a.name&&i.push({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input??{})}});return{content:s,toolCalls:i.length>0?i:void 0,finishReason:this.mapStopReason(o.stop_reason),usage:{inputTokens:o.usage.input_tokens,outputTokens:o.usage.output_tokens}}}stream(e){let r=this,t={...this.buildRequestBody(e),stream:!0};return{[Symbol.asyncIterator](){let o=null,s="",i=!1,a=0;return{async next(){if(i)return{done:!0,value:void 0};if(!o){let l=await fetch(`${r.baseUrl}/v1/messages`,{method:"POST",headers:r.headers(),body:JSON.stringify(t)});if(!l.ok){let d=await l.text().catch(()=>"");throw Object.assign(new Error(`Anthropic API error ${l.status}: ${d}`),{statusCode:l.status})}o=l.body.getReader()}let c=new TextDecoder;for(;;){let l=s.indexOf(`
348
+ `);if(l!==-1){let m=s.slice(0,l).trim();if(s=s.slice(l+1),!m.startsWith("data: "))continue;let g=m.slice(6),p;try{p=JSON.parse(g)}catch{continue}if(p.type==="message_start"&&p.message?.usage&&(a=p.message.usage.input_tokens),p.type==="content_block_delta"&&p.delta?.text)return{done:!1,value:{choices:[{delta:{content:p.delta.text},finish_reason:null,index:0}]}};if(p.type==="message_delta"){let f=p.usage?.output_tokens??0;return{done:!1,value:{choices:[{delta:{},finish_reason:p.delta?.stop_reason==="end_turn"?"stop":p.delta?.stop_reason??null,index:0}],usage:{prompt_tokens:a,completion_tokens:f}}}}if(p.type==="message_stop")return i=!0,{done:!0,value:void 0};continue}let{value:d,done:u}=await o.read();if(u)return i=!0,{done:!0,value:void 0};s+=c.decode(d,{stream:!0})}}}}}}headers(){return{"Content-Type":"application/json","x-api-key":this.apiKey,"anthropic-version":$r}}buildRequestBody(e){let r,t=[];for(let s of e.messages)s.role==="system"?r=typeof s.content=="string"?s.content:"":t.push({role:s.role==="tool"?"user":s.role,content:this.convertContent(s)});let o={model:e.model??this.model,messages:t,max_tokens:e.maxTokens??this.maxTokens};return r&&(o.system=r),e.temperature!==void 0&&(o.temperature=e.temperature),e.stop!==void 0&&(o.stop_sequences=Array.isArray(e.stop)?e.stop:[e.stop]),e.tools?.length&&(o.tools=e.tools.map(s=>({name:s.function.name,description:s.function.description,input_schema:s.function.parameters??{type:"object",properties:{}}}))),o}convertContent(e){return typeof e.content=="string"?e.content:e.content===null?"":e.content.map(r=>r.type==="text"?{type:"text",text:r.text}:r.type==="image_url"&&r.image_url?{type:"image",source:{type:"url",url:r.image_url.url}}:{type:"text",text:""})}mapStopReason(e){switch(e){case"end_turn":case"stop_sequence":return"stop";case"tool_use":return"tool_calls";case"max_tokens":return"length";default:return null}}};async function je(n,e){let r=[...n].sort((o,s)=>o.priority-s.priority),t={...e.data};for(let o of r){if(!o.enabled||o.point==="event"&&e.event&&o.eventTypes?.length&&!o.eventTypes.includes(e.event.type))continue;let s={...e,data:t},i=await o.handler(s);if(i.data&&(t={...t,...i.data}),i.action==="skip"||i.action==="halt")return{action:i.action,data:t}}return{action:"continue",data:t}}var pn=0;function gn(n,e,r,t){return pn++,{id:t?.id??`hook-${pn}`,extensionId:n,point:e,priority:t?.priority??50,eventTypes:t?.eventTypes,handler:r,enabled:t?.enabled??!0}}var se=class{extensions=new Map;hooks=new Map;allHooks=new Map;async register(e){this.extensions.has(e.id)&&await this.unregister(e.id),this.extensions.set(e.id,e);let r={extensionId:e.id,registerHook:(t,o,s)=>{let i=gn(e.id,t,o,s);this.allHooks.has(i.id)&&this.removeHook(i.id),this.allHooks.set(i.id,i);let a=this.hooks.get(t)??[];return a.push(i),this.hooks.set(t,a),i.id}};await e.setup(r)}async registerAll(e){for(let r of e)await this.register(r)}async unregister(e){let r=this.extensions.get(e);if(r){r.teardown&&await r.teardown();for(let[t,o]of this.hooks)this.hooks.set(t,o.filter(s=>s.extensionId!==e));for(let[t,o]of this.allHooks)o.extensionId===e&&this.allHooks.delete(t);this.extensions.delete(e)}}has(e){return this.extensions.has(e)}listExtensions(){return Array.from(this.extensions.keys())}getHooks(e){return[...this.hooks.get(e)??[]].sort((t,o)=>t.priority-o.priority)}getHook(e){return this.allHooks.get(e)}setHookEnabled(e,r){let t=this.allHooks.get(e);return t?(t.enabled=r,!0):!1}get hookCount(){return this.allHooks.size}async dispatch(e,r){let t=this.hooks.get(e)??[];return t.length===0?{action:"continue",data:r.data}:je(t,{...r,hookPoint:e})}async dispatchEvent(e,r,t){let o=this.hooks.get("event")??[];o.length!==0&&await je(o,{sessionId:r,hookPoint:"event",event:e,data:t??{}})}removeHook(e){let r=this.allHooks.get(e);if(!r)return;let t=this.hooks.get(r.point);t&&this.hooks.set(r.point,t.filter(o=>o.id!==e)),this.allHooks.delete(e)}};var ie=class{tools=new Map;register(e){if(this.tools.has(e.name))throw new Error(`Tool "${e.name}" is already registered`);this.tools.set(e.name,e)}registerAll(e){for(let r of e)this.register(r)}get(e){return this.tools.get(e)}has(e){return this.tools.has(e)}list(e){let r=[];for(let t of this.tools.values())(!e||!t.modes?.length||t.modes.includes(e))&&r.push(t);return r}get size(){return this.tools.size}};var we=class{workspaceConfig={};editionConfig=null;canAccess(e,r){return e.requiredPermissions?.length?e.requiredPermissions.every(t=>r.permissions.includes(t)):!0}check(e,r){if(!e.requiredPermissions?.length)return null;let t=e.requiredPermissions.filter(o=>!r.permissions.includes(o));return t.length===0?null:{tool:e.name,reason:`Missing permissions: ${t.join(", ")}`,missing:t}}setWorkspaceConfig(e){this.workspaceConfig={...e}}getWorkspaceConfig(){return{...this.workspaceConfig}}setEditionConfig(e){this.editionConfig={...e}}getEditionConfig(){return this.editionConfig?{...this.editionConfig}:null}checkACL(e,r){let t=e.name;if(this.editionConfig&&!this.isToolInEdition(t))return{allowed:!1,tool:t,reason:`Tool "${t}" not available in active edition`};if(this.workspaceConfig.whitelist?.length&&!this.matchesPattern(t,this.workspaceConfig.whitelist))return{allowed:!1,tool:t,reason:`Tool "${t}" not in workspace whitelist`};if(this.workspaceConfig.blacklist?.length&&this.matchesPattern(t,this.workspaceConfig.blacklist))return{allowed:!1,tool:t,reason:`Tool "${t}" blocked by workspace blacklist`};let o=this.check(e,r);return o?{allowed:!1,tool:t,reason:o.reason}:{allowed:!0,tool:t,reason:"Access granted"}}filterVisible(e,r){return e.filter(t=>this.checkACL(t,r).allowed)}isToolInEdition(e){if(!this.editionConfig||this.editionConfig.tools.includes("*")||this.editionConfig.tools.includes(e))return!0;if(this.editionConfig.categories){for(let r of this.editionConfig.categories)if(e.startsWith(`${r}.`)||e===r)return!0}return!1}matchesPattern(e,r){for(let t of r)if(t==="*"||t===e||t.endsWith(".*")&&e.startsWith(`${t.slice(0,-2)}.`))return!0;return!1}};var ae=class{constructor(e,r){this.registry=e;this.acl=r??new we}acl;async route(e,r){let t=this.registry.get(e.name);if(!t)return{name:e.name,error:`Unknown tool: "${e.name}"`};if(t.modes?.length&&!t.modes.includes(r.mode))return{name:e.name,error:`Tool "${e.name}" is not available in "${r.mode}" mode`};let o=this.acl.check(t,r);if(o)return{name:e.name,error:o.reason};try{let s=await t.handler(e.arguments,r);return{name:e.name,result:s}}catch(s){let i=s instanceof Error?s.message:String(s);return{name:e.name,error:i}}}listAvailable(e){return this.registry.list(e.mode).filter(r=>this.acl.canAccess(r,e))}};function Fr(n){return n.role!=="assistant"||!n.tool_calls?[]:n.tool_calls.map(e=>e.id)}function ce(n){let e=Br(n);return Ur(n,e),Wr(n),qr(n,e),Hr(n,e),Jr(n),Gr(n),n}function Br(n){let e=new Set;for(let r of n)for(let t of Fr(r))e.add(t);return e}function Ur(n,e){for(let r=n.length-1;r>=0;r--)n[r].role==="tool"&&n[r].tool_call_id&&!e.has(n[r].tool_call_id)&&n.splice(r,1)}function jr(n){return n.content===null?!n.tool_calls?.length:typeof n.content=="string"||Array.isArray(n.content)?n.content.length===0:!0}function Wr(n){for(let e=n.length-1;e>=0;e--)jr(n[e])&&n.splice(e,1)}function qr(n,e){let r=[];for(let t=n.length-1;t>=0;t--)n[t].role==="tool"&&n[t].tool_call_id&&(r.push(n[t]),n.splice(t,1));r.reverse();for(let t of r){let o=t.tool_call_id,s=n.length;for(let i=0;i<n.length;i++){let a=n[i];if(a.role==="assistant"&&a.tool_calls&&a.tool_calls.some(c=>c.id===o)){for(s=i+1;s<n.length&&n[s].role==="tool";)s++;break}}n.splice(s,0,t)}}function Hr(n,e){let r=new Set;for(let t of n)t.role==="tool"&&t.tool_call_id&&r.add(t.tool_call_id);for(let t of e)if(!r.has(t))for(let o=0;o<n.length;o++){let s=n[o];if(s.role==="assistant"&&s.tool_calls&&s.tool_calls.some(i=>i.id===t)){let i=o+1;for(;i<n.length&&n[i].role==="tool";)i++;n.splice(i,0,{role:"tool",content:"[session-repair] Tool result missing \u2014 session was interrupted.",tool_call_id:t});break}}}function Jr(n){let e=new Set;for(let r=n.length-1;r>=0;r--)n[r].role==="tool"&&n[r].tool_call_id&&(e.has(n[r].tool_call_id)?n.splice(r,1):e.add(n[r].tool_call_id))}function Gr(n){for(let e=n.length-1;e>0;e--){let r=n[e],t=n[e-1];r.role===t.role&&(r.role==="user"||r.role==="system")&&typeof r.content=="string"&&typeof t.content=="string"&&!r.tool_call_id&&!t.tool_call_id&&(t.content=t.content+`
349
+ `+r.content,n.splice(e,1))}}function O(n){let e=0;for(let r of n)e+=Kr(r);return Math.ceil(e/4)}function Kr(n){if(n.content===null)return 0;if(typeof n.content=="string")return n.content.length;let e=0;for(let r of n.content)e+=r.text?.length??0,r.image_url&&(e+=200);return e}function Vr(n){return n.map(e=>e.role!=="tool"||typeof e.content!="string"||e.content.length<=512?e:{...e,content:e.content.slice(0,512)+`
350
+ ...[truncated]`})}function mn(n,e){let r=n.filter(s=>s.role==="system"),o=n.filter(s=>s.role!=="system").slice(-e);return[...r,...o]}var zr="Summarize the following conversation concisely. Preserve key facts, decisions, tool results, and user preferences. Output only the summary.";async function Yr(n,e,r){let t=n.filter(l=>l.role==="system"),o=n.filter(l=>l.role!=="system");if(o.length<=4)return n;let s=o.slice(0,-4),i=o.slice(-4),a=s.map(l=>{let d=l.content===null?"":typeof l.content=="string"?l.content:l.content.map(u=>u.text??"").join("");return`[${l.role}]: ${d}`}).join(`
351
+ `),c={model:r,messages:[{role:"system",content:zr},{role:"user",content:a}],maxTokens:1024,temperature:0};try{let l=await e.complete(c),d={role:"system",content:`[Compacted ${s.length} messages]
352
+ ${l.content}`};return[...t,d,...i]}catch{return n}}async function*We(n,e){let r=e.contextWindowTokens??2e5,t=e.sessionId,o=Date.now(),s=n,i=O(s)/r;if(i<.7)return{messages:s,stage:0,strategy:"none"};let a=O(s);if(s=Vr(s),i=O(s)/r,yield{type:"context:overflow",timestamp:o,sessionId:t,tokensUsed:a,tokenBudget:r},yield{type:"context:truncating",timestamp:o,sessionId:t,beforeTokens:a,afterTokens:O(s),strategy:"trim_tool_results"},i<.7)return{messages:s,stage:1,strategy:"trim_tool_results"};let c=O(s);if(s=mn(s,10),i=O(s)/r,yield{type:"context:truncating",timestamp:o,sessionId:t,beforeTokens:c,afterTokens:O(s),strategy:"remove_oldest"},i<.7)return{messages:s,stage:2,strategy:"remove_oldest"};if(e.utilityProvider){let d=O(s);if(s=await Yr(s,e.utilityProvider,e.utilityModel??"claude-haiku-4-5-20251001"),i=O(s)/r,yield{type:"context:truncating",timestamp:o,sessionId:t,beforeTokens:d,afterTokens:O(s),strategy:"llm_compaction"},i<.7)return{messages:s,stage:3,strategy:"llm_compaction"}}let l=O(s);return s=mn(s,2),yield{type:"context:truncating",timestamp:o,sessionId:t,beforeTokens:l,afterTokens:O(s),strategy:"emergency_truncation"},{messages:s,stage:4,strategy:"emergency_truncation"}}function qe(n,e){let r=e??2e5,t=O(n);return{ratio:t/r,overLimit:t/r>=.7}}var fn={blocked:!1,warning:!1};function He(n){let e=n.function.name+":"+n.function.arguments;return Bun.hash(e).toString(16)}function Qr(n){return Bun.hash(n).toString(16)}var J=class{maxTotal;history=[];callCounts=new Map;pairCounts=new Map;constructor(e=25){this.maxTotal=e}check(e){for(let t of e){let o=He(t);this.history.push(o),this.callCounts.set(o,(this.callCounts.get(o)??0)+1)}if(this.history.length>=this.maxTotal)return{blocked:!0,warning:!1,reason:`Max total calls reached (${this.maxTotal})`};for(let t of e){let o=He(t),s=this.callCounts.get(o);if(s>=5)return{blocked:!0,warning:!1,reason:`Identical call repeated ${s} times`};if(s>=3){let i=this.detectPingPong();return i||{blocked:!1,warning:!0,reason:`Identical call repeated ${s} times`}}}let r=this.detectPingPong();return r||fn}recordResult(e,r){let t=He(e)+":"+Qr(r),o=(this.pairCounts.get(t)??0)+1;return this.pairCounts.set(t,o),o>=3?{blocked:!0,warning:!1,reason:`Same call+result pair repeated ${o} times`}:o>=2?{blocked:!1,warning:!0,reason:`Same call+result pair repeated ${o} times`}:fn}reset(){this.history=[],this.callCounts.clear(),this.pairCounts.clear()}totalCalls(){return this.history.length}detectPingPong(){let e=this.history;if(e.length<6)return null;let r=e.length,t=e[r-1],o=e[r-2];if(t===o)return null;let s=1;for(let i=r-3;i>=0&&!(i-1<0);i-=2)if(e[i]===t&&e[i-1]===o)s++;else break;return s>=3?{blocked:!0,warning:!1,reason:`Ping-pong pattern detected (${s} alternations)`}:null}};var Xr=0;function Zr(){return`task-${Date.now()}-${++Xr}`}var le=class{_tasks=[];get tasks(){return this._tasks}add(e){let r={id:Zr(),title:e,status:"pending"};return this._tasks.push(r),r}update(e,r){let t=this._tasks.find(o=>o.id===e);t&&(t.status=r)}current(){let e=this._tasks.find(r=>r.status==="in_progress");return e||this._tasks.find(r=>r.status==="pending")}plan(e){let r=[];for(let t of e)r.push(this.add(t));return r}complete(e){this.update(e,"done")}block(e){this.update(e,"blocked")}summary(){let e=0,r=0,t=0,o=0;for(let s of this._tasks)switch(s.status){case"pending":e++;break;case"in_progress":r++;break;case"done":t++;break;case"blocked":o++;break}return{total:this._tasks.length,pending:e,inProgress:r,done:t,blocked:o}}};async function*Je(n){let{sessionId:e,tracker:r,toolLog:t,brainArtifacts:o,conversationId:s,userId:i}=n;for(let m of r.tasks)m.status==="in_progress"&&r.update(m.id,"blocked");let a=0,c=0,l=0;for(let m of r.tasks)switch(m.status){case"done":a++;break;case"pending":c++;break;case"blocked":l++;break}let d=r.tasks.length,u=t.map(m=>`${m.tool}:${m.ok?"ok":"fail"}`).join(", ");if(o&&s&&i){let m=r.tasks.filter(g=>g.status==="pending"||g.status==="blocked");if(m.length>0){let g=["# Open Tasks (from wrapup)","",...m.map(p=>`- [${p.status}] ${p.title}`),"",`Session: ${e}`,`Timestamp: ${new Date().toISOString()}`].join(`
353
+ `);try{await o.save(s,i,"open-tasks.md",g)}catch{}}}yield{type:"wrapup:complete",timestamp:Date.now(),sessionId:e,summary:`Completed ${a}/${d} tasks (${c} pending, ${l} blocked). Tools: ${u||"none"}`}}var Te=class{blocks=new Map;nextId=1;create(e,r){let t=`blk-${this.nextId++}`;return this.blocks.set(t,{type:e,data:r}),t}append(e,r){let t=this.blocks.get(e);return t?(typeof t.data=="string"&&(t.data+=r),{op:"append",path:"data",value:r}):null}get(e){return this.blocks.get(e)}get size(){return this.blocks.size}};async function*Ge(n,e){let{providers:r,toolRouter:t,jobQueue:o,extensions:s,sessionId:i,maxTurns:a=20,tokenBudget:c=128e3,contextWindowTokens:l=2e5,initialMode:d="conversation",systemPrompt:u,permissions:m=[],classifyQuery:g,emitBlocks:p=!1,readOnlyTools:f=new Set}=n,v=d,x=0,R=0,C=[],G=new Te,S=new J(a),j=new le,_=[],N={sessionId:i,mode:v,turnNumber:0,tokenBudget:c,tokensUsed:0,activeTools:[]};if(yield{type:"agent:start",timestamp:Date.now(),sessionId:i,mode:v,input:e},u&&C.push({role:"system",content:u}),e.text&&C.push({role:"user",content:e.text}),o)try{let D=await o.getJobsByStatus("queued");D.length>0&&C.push({role:"system",content:`[System] ${D.length} pending job(s) in queue: ${D.map(W=>`${W.type}(${W.id})`).join(", ")}`})}catch{}let Ne=eo(C);if(R+=Ne,yield{type:"context:built",timestamp:Date.now(),sessionId:i,tokenCount:Ne,messageCount:C.length},g&&e.text)try{let D=await g(e.text,N);if(yield{type:"query:classified",timestamp:Date.now(),sessionId:i,queryId:`q-${i}-${x}`,classification:D.classification,standaloneQuery:D.standaloneQuery,skipAgent:D.skipAgent},D.skipAgent&&D.directResponse){yield*yn(D.directResponse,G,p,i,0),yield{type:"response:final",timestamp:Date.now(),sessionId:i,content:D.directResponse,usage:{inputTokens:Ne,outputTokens:to(D.directResponse)},finishReason:"stop"},yield{type:"agent:end",timestamp:Date.now(),sessionId:i,reason:"complete",totalTurns:0,totalTokens:R};return}}catch{}for(;x<a;){if(x++,N.turnNumber=x,N.mode=v,N.tokensUsed=R,ce(C),qe(C,l).overLimit){let A=We(C,{contextWindowTokens:l,utilityProvider:r.getHealthy("utility")??void 0,sessionId:i}),H;for(;;){let Z=await A.next();if(Z.done){H=Z.value;break}yield Z.value}C.length=0,C.push(...H.messages)}if(R>=c){yield{type:"context:overflow",timestamp:Date.now(),sessionId:i,tokensUsed:R,tokenBudget:c};break}let W=r.getHealthy("chat");if(!W){yield{type:"error",timestamp:Date.now(),sessionId:i,error:`No healthy provider available for mode "${v}"`,recoverable:!1};break}let $e={mode:v,permissions:m},en=t.listAvailable($e);N.activeTools=en.map(A=>A.name);let tn=en.map(A=>({type:"function",function:{name:A.name,description:A.description,parameters:A.parameters?ro(A.parameters):void 0}}));s&&await s.dispatch("prompt:build",{sessionId:i,data:{messages:C,mode:v,turn:x},messages:C.map(A=>({role:A.role,content:typeof A.content=="string"?A.content:""}))});let nn={messages:[...C],tools:tn.length>0?tn:void 0,temperature:v==="code"?.2:.7},E;try{E=await W.complete(nn)}catch(A){let H=A instanceof Error?A.message:String(A);yield{type:"error",timestamp:Date.now(),sessionId:i,error:`LLM call failed: ${H}`,code:"LLM_ERROR",recoverable:!0};break}if(E.usage&&(R+=E.usage.inputTokens+E.usage.outputTokens,yield{type:"cost:tracked",timestamp:Date.now(),sessionId:i,provider:W.id,model:nn.model??"default",inputTokens:E.usage.inputTokens,outputTokens:E.usage.outputTokens,estimatedCost:no(E.usage.inputTokens,E.usage.outputTokens)}),E.content&&(yield*yn(E.content,G,p,i,x-1),C.push({role:"assistant",content:E.content})),E.toolCalls&&E.toolCalls.length>0){C.push({role:"assistant",content:null,tool_calls:E.toolCalls});let A=S.check(E.toolCalls);if(A.blocked){yield{type:"loop:blocked",timestamp:Date.now(),sessionId:i,turnCount:x,reason:A.reason??"Loop guard blocked"};break}A.warning&&(yield{type:"loop:warning",timestamp:Date.now(),sessionId:i,turnCount:x,pattern:A.reason??"repetition_detected"});let H=E.toolCalls.filter(P=>f.has(P.function.name)),Z=E.toolCalls.filter(P=>!f.has(P.function.name));if(H.length>0){let P=H.map(async U=>{let b=hn(U.function.arguments);if(s&&(await s.dispatch("tool:before",{sessionId:i,data:{toolName:U.function.name,arguments:b}})).action==="halt")return{tc:U,toolResult:{name:U.function.name,error:"Blocked by extension"},args:b,durationMs:0};let M=Date.now(),K=await t.route({name:U.function.name,arguments:b},$e);return{tc:U,toolResult:K,args:b,durationMs:Date.now()-M}}),ee=await Promise.allSettled(P);for(let U of ee){if(U.status!=="fulfilled")continue;let{tc:b,toolResult:M,args:K,durationMs:$}=U.value;if(_.push({tool:b.function.name,ok:!M.error}),yield{type:"tool:start",timestamp:Date.now(),sessionId:i,toolName:b.function.name,arguments:K,callId:b.id},yield{type:"tool:result",timestamp:Date.now(),sessionId:i,toolName:b.function.name,callId:b.id,result:M.result,error:M.error,durationMs:$},s&&await s.dispatch("tool:after",{sessionId:i,data:{toolName:b.function.name,result:M,durationMs:$}}),p){let dr=G.create(M.error?"error":"tool_result",M.error??M.result);yield{type:"block:emitted",timestamp:Date.now(),sessionId:i,blockId:dr,blockType:M.error?"error":"tool_result",data:M.error??M.result}}let rn=JSON.stringify(M.error??M.result);S.recordResult(b,rn),C.push({role:"tool",content:rn,tool_call_id:b.id})}}for(let P of Z){let ee=hn(P.function.arguments);if(s&&(await s.dispatch("tool:before",{sessionId:i,data:{toolName:P.function.name,arguments:ee}})).action==="halt"){_.push({tool:P.function.name,ok:!1}),C.push({role:"tool",content:'{"error":"Blocked by extension"}',tool_call_id:P.id});continue}yield{type:"tool:start",timestamp:Date.now(),sessionId:i,toolName:P.function.name,arguments:ee,callId:P.id};let U=Date.now(),b=await t.route({name:P.function.name,arguments:ee},$e),M=Date.now()-U;if(_.push({tool:P.function.name,ok:!b.error}),yield{type:"tool:result",timestamp:Date.now(),sessionId:i,toolName:P.function.name,callId:P.id,result:b.result,error:b.error,durationMs:M},s&&await s.dispatch("tool:after",{sessionId:i,data:{toolName:P.function.name,result:b,durationMs:M}}),p){let $=G.create(b.error?"error":"tool_result",b.error??b.result);yield{type:"block:emitted",timestamp:Date.now(),sessionId:i,blockId:$,blockType:b.error?"error":"tool_result",data:b.error??b.result}}let K=JSON.stringify(b.error??b.result);if(S.recordResult(P,K),b.result&&typeof b.result=="object"){let $=b.result;$.id&&$.status==="queued"&&$.type&&(yield{type:"job:enqueued",timestamp:Date.now(),sessionId:i,jobId:$.id,jobType:$.type,jobPriority:$.priority??"normal"})}C.push({role:"tool",content:K,tool_call_id:P.id})}continue}if(E.finishReason==="stop"||E.finishReason===null){if(v==="task"&&E.content?.includes("[PLAN]")){let A=v;v="code",yield{type:"mode:changed",timestamp:Date.now(),sessionId:i,from:A,to:v,reason:"Planning phase complete, moving to execution"};continue}yield{type:"response:final",timestamp:Date.now(),sessionId:i,content:E.content??"",usage:E.usage??{inputTokens:0,outputTokens:0},finishReason:E.finishReason};break}if(E.finishReason==="length"){yield{type:"context:overflow",timestamp:Date.now(),sessionId:i,tokensUsed:R,tokenBudget:c};break}}if(x>=a){yield{type:"loop:warning",timestamp:Date.now(),sessionId:i,turnCount:x,pattern:"max_turns_reached"};let D=Je({sessionId:i,tracker:j,toolLog:_});for await(let W of D)yield W}yield{type:"agent:end",timestamp:Date.now(),sessionId:i,reason:x>=a?"timeout":"complete",totalTurns:x,totalTokens:R}}function hn(n){try{return JSON.parse(n)}catch{return{}}}function*yn(n,e,r,t,o){if(r){let s=e.create("text",n);yield{type:"block:emitted",timestamp:Date.now(),sessionId:t,blockId:s,blockType:"text",data:n}}else yield{type:"token",timestamp:Date.now(),sessionId:t,content:n,index:o}}function eo(n){let e=0;for(let r of n)if(typeof r.content=="string")e+=r.content.length;else if(Array.isArray(r.content))for(let t of r.content)t.text&&(e+=t.text.length);return Math.ceil(e/4)}function to(n){return Math.ceil(n.length/4)}function no(n,e){return n/1e6*3+e/1e6*15}function ro(n){let e={},r=[];for(let[t,o]of Object.entries(n))e[t]={type:o.type,description:o.description},o.required&&r.push(t);return{type:"object",properties:e,required:r}}var oo={type:"object",properties:{intent:{type:"string",enum:["factual","creative","analytical","conversational","code","search"],description:"Primary intent of the query"},confidence:{type:"number",description:"Confidence score 0-1"},standaloneQuery:{type:"string",description:"Rewritten standalone version of the query (for follow-ups)"},skipAgent:{type:"boolean",description:"True if the query can be answered directly without tools"},directResponse:{type:"string",description:"Direct response if skipAgent is true, omit otherwise"}},required:["intent","confidence","standaloneQuery","skipAgent"],additionalProperties:!1},vn=`You are a query classifier. Analyze the user's query and determine:
354
+ 1. The primary intent (factual, creative, analytical, conversational, code, search)
355
+ 2. Whether it can be answered directly without tools (simple greetings, factual questions you know)
356
+ 3. A standalone rewrite if the query references prior context
357
+
358
+ For trivial queries like "hello", "thanks", "what is 2+2", set skipAgent=true and provide a directResponse.
359
+ For anything requiring tools, code execution, file access, or research, set skipAgent=false.`;function Ke(n){return async(e,r)=>{let t=ao(e);if(t)return t;if(n.generateObject){let s=await n.generateObject({messages:[{role:"system",content:vn},{role:"user",content:e}],schema:oo,schemaName:"query_classification",temperature:0,maxTokens:256});return bn(s,e)}let o=await n.complete({messages:[{role:"system",content:vn+`
360
+
361
+ Respond with JSON only.`},{role:"user",content:e}],temperature:0,maxTokens:256});try{let s=JSON.parse(o.content);return bn(s,e)}catch{return{classification:{intent:"conversational",confidence:.5},standaloneQuery:e,skipAgent:!1}}}}var so=/^(hi|hello|hey|howdy|greetings|yo|sup)\b[!?.]*$/i,io=/^(thanks?|thank\s*you|thx|ty)\b[!?.]*$/i;function ao(n){let e=n.trim();return so.test(e)?{classification:{intent:"conversational",confidence:1},standaloneQuery:e,skipAgent:!0,directResponse:"Hello! How can I help you today?"}:io.test(e)?{classification:{intent:"conversational",confidence:1},standaloneQuery:e,skipAgent:!0,directResponse:"You're welcome! Let me know if you need anything else."}:null}function bn(n,e){return{classification:{intent:n.intent,confidence:Math.max(0,Math.min(1,n.confidence))},standaloneQuery:n.standaloneQuery||e,skipAgent:n.skipAgent,directResponse:n.skipAgent?n.directResponse:void 0}}function Ve(n){n.register({id:"fenix.session-repair",name:"Session Repair",setup(e){e.registerHook("prompt:build",async r=>{let t=r.data.messages;return t&&ce(t),{action:"continue",data:r.data}},{id:"session:repair",priority:5})}})}function ze(n){n.register({id:"fenix.logging",name:"Event Logging",setup(e){e.registerHook("event",async r=>(r.event&&console.log(`[event] ${r.event.type}`,r.event.sessionId),{action:"continue",data:r.data}),{id:"event:log",priority:10})}})}function Ye(n,e){let r=new J(e);n.register({id:"fenix.loop-guard",name:"Loop Guard",setup(t){t.registerHook("tool:before",async o=>{let s=o.data.toolCalls;if(s&&s.length>0){let i=r.check(s);if(i.blocked)return{action:"halt",data:{reason:i.reason}}}return{action:"continue",data:o.data}},{id:"loop:guard",priority:15})}})}function kn(n){let e=n.split(".");if(e.length!==4)return null;let r=0;for(let t of e){let o=t.startsWith("0")&&t.length>1?parseInt(t,8):parseInt(t,10);if(Number.isNaN(o)||o<0||o>255)return null;r=r<<8|o}return r>>>0}var co=[{base:0,mask:4278190080,label:"Blocked IP range"},{base:167772160,mask:4278190080,label:"private (10.0.0.0/8)"},{base:2886729728,mask:4293918720,label:"private (172.16.0.0/12)"},{base:3232235520,mask:4294901760,label:"private (192.168.0.0/16)"},{base:2130706432,mask:4278190080,label:"loopback (127.0.0.0/8)"},{base:2851995648,mask:4294901760,label:"linkLocal (169.254.0.0/16)"}];function Qe(n){for(let e of co)if((n&e.mask)>>>0===e.base)return e.label;return null}function lo(n){let e=n.replace(/^\[|]$/g,"").toLowerCase(),r=e.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);if(r){let o=kn(r[1]);if(o!==null){let s=Qe(o);if(s)return`IPv6-mapped ${s}`}}let t=e.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);if(t){let o=parseInt(t[1],16),s=parseInt(t[2],16),i=(o<<16|s)>>>0,a=Qe(i);if(a)return`IPv6-mapped ${a}`}return e==="::1"?"IPv6 loopback":/^fc/.test(e)||/^fd/.test(e)?"fc00::/7 unique local":/^fe[89ab]/.test(e)?"fe80::/10 link-local":null}function uo(n){let e=kn(n);if(e!==null){let r=Qe(e);return r?{safe:!1,reason:`IP in ${r}`}:{safe:!0}}if(n.startsWith("[")||n.includes(":")){let r=lo(n);return r?{safe:!1,reason:r}:{safe:!0}}return{safe:!0}}var po=new Set(["file:","data:","javascript:","ftp:","gopher:"]),go=new Set(["http:","https:"]);function wn(n){if(n.includes("\0"))return{safe:!1,reason:"URL contains null bytes"};if(/\.\.[/\\]/.test(n))return{safe:!1,reason:"URL contains path traversal"};let e;try{e=new URL(n)}catch{return{safe:!1,reason:"Invalid URL"}}return po.has(e.protocol)?{safe:!1,reason:`Blocked protocol: ${e.protocol}`}:go.has(e.protocol)?uo(e.hostname):{safe:!1,reason:`Unsupported protocol: ${e.protocol}`}}function Xe(n){n.register({id:"fenix.ssrf-protection",name:"SSRF Protection",setup(e){e.registerHook("tool:before",async r=>{let t=r.data.url;if(t){let o=wn(t);if(!o.safe)return{action:"halt",data:{reason:o.reason}}}return{action:"continue",data:r.data}},{id:"security:ssrf",priority:25})}})}function Ze(n,e=6e4,r=60){let t=new Map;n.register({id:"fenix.rate-limiting",name:"Rate Limiting",setup(o){o.registerHook("tool:before",async s=>{let i=s.data.userId,a=s.data.action;if(!i)return{action:"continue",data:s.data};let c=`${i}:${a??"default"}`,l=Date.now(),d=t.get(c)?.filter(u=>u>l-e)??[];return d.push(l),t.set(c,d),d.length>r?{action:"halt",data:{reason:`Rate limit exceeded: ${r}/${e}ms`}}:{action:"continue",data:s.data}},{id:"security:rate-limit",priority:30})}})}var mo=new Set(["PATH","HOME","TERM","USER","SHELL","PWD","LANG","NODE_ENV","BUN_ENV"]);function fo(n){return mo.has(n)||n.startsWith("LC_")}var ho=[{re:/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,label:"${VAR}",group:1},{re:/(?<![\\$\{])\$([A-Za-z_][A-Za-z0-9_]*)/g,label:"$VAR",group:1},{re:/process\.env\.([A-Za-z_][A-Za-z0-9_]*)/g,label:"process.env.VAR",group:1},{re:/process\.env\[['"]([A-Za-z_][A-Za-z0-9_]*)['"]\]/g,label:"process.env['VAR']",group:1},{re:/os\.environ\[['"]([A-Za-z_][A-Za-z0-9_]*)['"]\]/g,label:"os.environ['VAR']",group:1},{re:/os\.environ\.get\(\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]/g,label:"os.environ.get('VAR')",group:1},{re:/ENV\[['"]([A-Za-z_][A-Za-z0-9_]*)['"]\]/g,label:"ENV['VAR']",group:1},{re:/ENV\.fetch\(\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]/g,label:"ENV.fetch('VAR')",group:1}];function Tn(n,e="warn"){let r=n.split(`
362
+ `),t=[],o=new Set;for(let i=0;i<r.length;i++){let a=r[i];for(let c of ho){c.re.lastIndex=0;let l;for(;(l=c.re.exec(a))!==null;){let d=l[c.group],u=`${i}:${d}:${c.label}`;fo(d)||o.has(u)||(o.add(u),t.push({variable:d,line:i+1,pattern:c.label}))}}}let s=t.length===0;return{safe:s,action:e,leaks:t,blocked:!s&&e==="block"}}function et(n){n.register({id:"fenix.shell-bleed",name:"Shell Bleed Detection",setup(e){e.registerHook("tool:before",async r=>{let t=r.data.script;if(t){let o=Tn(t);if(!o.safe)return{action:"halt",data:{reason:`Shell bleed: ${o.leaks.map(s=>s.variable).join(", ")}`}}}return{action:"continue",data:r.data}},{id:"security:shell-bleed",priority:35})}})}var yo="Summarize the following conversation concisely. Preserve key facts, decisions, tool results, and user preferences. Output only the summary, no preamble.";function tt(n){let e=0;for(let r of n)if(r.content!==null)if(typeof r.content=="string")e+=r.content.length;else for(let t of r.content)e+=t.text?.length??0;return Math.ceil(e/4)}function nt(n,e){return n.length>30?!0:tt(n)/e.contextWindowTokens>.7}function vo(n,e){return e.utilityProvider?n.length>=50?"hybrid":"summarize-all":"summarize-oldest"}function bo(n){return n.map(e=>{let r=e.content===null?"":typeof e.content=="string"?e.content:e.content.map(t=>t.text??"").join("");return`[${e.role}]: ${r}`}).join(`
363
+ `)}async function xn(n,e,r){return(await e.complete({model:r,messages:[{role:"system",content:yo},{role:"user",content:bo(n)}],maxTokens:1024,temperature:0})).content}async function ko(n,e,r){return xn(n,e,r)}async function wo(n){let e=n[0],r=n[n.length-1],t=e?.content===null?"":typeof e?.content=="string"?e.content:"[complex content]",o=r?.content===null?"":typeof r?.content=="string"?r.content:"[complex content]";return`[Compacted: ${n.length} messages removed]
364
+ First: ${t.slice(0,200)}
365
+ Last: ${o.slice(0,200)}`}async function To(n,e,r){let t=[];for(let s=0;s<n.length;s+=10)t.push(n.slice(s,s+10));return(await Promise.all(t.map(s=>xn(s,e,r)))).join(`
366
+
367
+ `)}async function rt(n,e){let r=vo(n,e),t=e.utilityModel??"claude-haiku-4-5-20251001",o=tt(n);if(n.length<=6)return{messages:n,removed:0,strategy:r,beforeTokens:o,afterTokens:o};let s=n.slice(0,-6),i=n.slice(-6),a;switch(r){case"summarize-all":a=await ko(s,e.utilityProvider,t);break;case"hybrid":a=await To(s,e.utilityProvider,t);break;case"summarize-oldest":a=await wo(s);break}let l=[{role:"system",content:`[Session Summary]
368
+ ${a}`},...i],d=tt(l);return{messages:l,removed:s.length,strategy:r,beforeTokens:o,afterTokens:d}}function ot(n){n.register({id:"fenix.context-survival",name:"Context Survival",setup(e){e.registerHook("prompt:build",async r=>{let t=r.data.messages,o=r.data.contextWindowTokens;if(!t)return{action:"continue",data:r.data};let s={contextWindowTokens:o??2e5};if(!nt(t,s))return{action:"continue",data:{...r.data,compacted:!1}};let i=await rt(t,s);return{action:"continue",data:{...r.data,messages:i.messages,compacted:!0}}},{id:"context:survival",priority:45})}})}var st={steeringRules:.2,memories:.4,orientContext:.2,brainArtifacts:.2};function xe(n){return Math.ceil(n.length/4)}function it(n,e){let r=Math.max(0,n-200),o=Object.keys(st).filter(a=>e[a]>0);if(o.length===0)return{identity:200,steeringRules:0,memories:0,orientContext:0,brainArtifacts:0,total:200};let s=o.reduce((a,c)=>a+st[c],0),i={identity:200,steeringRules:0,memories:0,orientContext:0,brainArtifacts:0,total:0};for(let a of o)i[a]=Math.floor(r*(st[a]/s));return i.total=i.identity+i.steeringRules+i.memories+i.orientContext+i.brainArtifacts,i}function Ee(n,e){if(e<=0)return"";if(xe(n)<=e)return n;let t=e*4,o=n.slice(0,t),s=o.lastIndexOf(`
369
+ `);return(s>0?o.slice(0,s):o)+`
370
+ [...truncated]`}function at(n){n.register({id:"fenix.context-budget",name:"Context Budget",setup(e){e.registerHook("prompt:build",async r=>{let t=r.data.sections,o=r.data.totalBudget;if(!t||!o)return{action:"continue",data:r.data};let s=Object.fromEntries(Object.entries(t).map(([c,l])=>[c,xe(l)])),i=it(o,s),a=Object.fromEntries(Object.entries(t).map(([c,l])=>{let d=i[c]??o;return[c,Ee(l,d)]}));return{action:"continue",data:{...r.data,sections:a,allocation:i}}},{id:"context:budget",priority:50})}})}function ct(n={}){let e=[];return{id:"fenix.job-dispatch",name:"Job Dispatch Tracker",version:"1.0.0",setup(r){r.registerHook("event",async t=>{let o=t.event;if(!o||o.type!=="tool:result")return{action:"continue"};let s=o.result;if(s&&typeof s=="object"){let i=s;if(i.id&&i.status==="queued"&&i.type){let a={id:i.id,type:i.type,toolName:o.toolName,timestamp:o.timestamp};return e.push(a),n.onJobDispatched&&n.onJobDispatched({id:a.id,type:a.type,toolName:a.toolName}),{action:"continue",data:{lastDispatchedJob:a,dispatchedJobCount:e.length}}}}return{action:"continue"}},{id:"fenix.job-dispatch.tracker",priority:65,eventTypes:["tool:result"]})},teardown(){e.length=0}}}function lt(n){let e=[`# Skill: ${n.name}`,n.description,"",n.body];return n.files.length>0&&e.push("","Files:",...n.files.map(r=>`- ${r}`)),e.join(`
371
+ `)}function dt(n,e,r=3){let t=e.toLowerCase().split(/\s+/).filter(Boolean);return t.length===0?[]:n.map(s=>{let i=`${s.name} ${s.description}`.toLowerCase(),a=t.reduce((c,l)=>c+(i.includes(l)?1:0),0);return{skill:s,score:a}}).filter(s=>s.score>0).sort((s,i)=>i.score-s.score).slice(0,r).map(s=>lt(s.skill))}function ut(n){let e=n.maxSkills??2;return{id:"fenix.skill-loader",name:"Skill Loader",version:"1.0.0",setup(r){r.registerHook("prompt:build",async t=>{let o=t.data.query;if(!o||n.skills.length===0)return{action:"continue"};let s=dt(n.skills,o,e);if(s.length===0)return{action:"continue"};if(t.messages)for(let i of s)t.messages.push({role:"system",content:`[Skill Context]
372
+ ${i}`});return n.onSkillsLoaded&&n.onSkillsLoaded(s),{action:"continue",data:{loadedSkills:s.length,skillNames:s.map(i=>i.match(/^# Skill: (.+)$/m)?.[1]??"unknown")}}},{id:"fenix.skill-loader.prompt-build",priority:70})}}}function pt(n){return[{name:"memory.search",description:"Search user memory for relevant facts, preferences, and knowledge by semantic similarity",parameters:{userId:{type:"string",required:!0,description:"User ID to search memories for"},query:{type:"string",required:!0,description:"Natural language search query"},limit:{type:"number",description:"Max results to return (default: 5)"}},handler:async e=>(await n.search(e.userId,e.query,e.limit??5)).map(t=>({id:t.segment.id,content:t.segment.content,category:t.segment.category,score:t.score,heat:t.segment.heat}))},{name:"memory.expand",description:"Expand a memory segment with related context and connections",parameters:{userId:{type:"string",required:!0,description:"User ID"},query:{type:"string",required:!0,description:"Topic to expand on"},limit:{type:"number",description:"Max related segments (default: 10)"}},handler:async e=>{let r=await n.search(e.userId,e.query,e.limit??10);return{topic:e.query,segments:r.map(t=>({content:t.segment.content,category:t.segment.category,score:t.score})),count:r.length}}},{name:"memory.context",description:"Get the user's profile summary and recent memory context",parameters:{userId:{type:"string",required:!0,description:"User ID"}},handler:async e=>{let r=await n.getProfile(e.userId);return{userId:e.userId,profile:r??"No profile available"}}},{name:"memory.save",description:"Save a new memory segment (fact, preference, experience, or knowledge)",parameters:{userId:{type:"string",required:!0,description:"User ID"},content:{type:"string",required:!0,description:"Memory content to save"},category:{type:"string",required:!0,description:"fact | preference | experience | knowledge"}},requiredPermissions:["memory:write"],handler:async e=>{let r=await n.save(e.userId,e.content,e.category);return{id:r.id,saved:!0,category:r.category}}},{name:"memory.forget",description:"Remove a specific memory segment by ID",parameters:{segmentId:{type:"string",required:!0,description:"Memory segment ID to remove"}},requiredPermissions:["memory:write"],handler:async e=>({deleted:await n.forget(e.segmentId),segmentId:e.segmentId})},{name:"memory.list",description:"List memory segments for a user, optionally filtered by category",parameters:{userId:{type:"string",required:!0,description:"User ID"},category:{type:"string",description:"Filter by: fact | preference | experience | knowledge"},limit:{type:"number",description:"Max results (default: 20)"}},handler:async e=>(await n.list(e.userId,e.category,e.limit??20)).map(t=>({id:t.id,content:t.content,category:t.category,heat:t.heat,createdAt:t.createdAt}))},{name:"memory.graph",description:"Query the knowledge graph for entity relationships",parameters:{userId:{type:"string",required:!0,description:"User ID"},entity:{type:"string",required:!0,description:"Entity name to query"}},handler:async e=>n.graphQuery?n.graphQuery(e.userId,e.entity):{error:"Knowledge graph not available"}}]}function gt(n){return[{name:"web.search",description:"Search the web for information. Uses primary search provider with fallback on failure",parameters:{query:{type:"string",required:!0,description:"Search query"},limit:{type:"number",description:"Max results (default: 5)"}},handler:async e=>{let r=e.query,t=e.limit??5;try{return await n.primary.search(r,{limit:t})}catch(o){if(!n.fallback)throw o;try{return await n.fallback.search(r,{limit:t})}catch{throw o}}}},{name:"web.fetch",description:"Fetch and extract content from a URL. Returns cleaned page text",parameters:{url:{type:"string",required:!0,description:"URL to fetch content from"}},handler:async e=>n.fetcher.fetch(e.url)}]}function mt(n){return[{name:"code.execute",description:"Execute code in a sandboxed environment. Supports JavaScript, Python, and shell",parameters:{code:{type:"string",required:!0,description:"Code to execute"},language:{type:"string",required:!0,description:"Language: javascript | python | shell"},timeout:{type:"number",description:"Timeout in ms (default: 30000)"}},requiredPermissions:["code:execute"],handler:async e=>n.execute(e.code,e.language,e.timeout??3e4)},{name:"code.analyze",description:"Analyze code for complexity, patterns, and potential issues",parameters:{code:{type:"string",required:!0,description:"Code to analyze"},language:{type:"string",required:!0,description:"Programming language"}},handler:async e=>n.analyze(e.code,e.language)},{name:"code.explain",description:"Generate a human-readable explanation of code",parameters:{code:{type:"string",required:!0,description:"Code to explain"},language:{type:"string",required:!0,description:"Programming language"}},handler:async e=>({explanation:await n.explain(e.code,e.language),language:e.language})}]}function ft(n){return[{name:"files.read",description:"Read the contents of a file",parameters:{path:{type:"string",required:!0,description:"File path to read"}},handler:async e=>{let r=await n.read(e.path);return{path:e.path,content:r}}},{name:"files.write",description:"Write content to a file (creates or overwrites)",parameters:{path:{type:"string",required:!0,description:"File path to write to"},content:{type:"string",required:!0,description:"Content to write"}},requiredPermissions:["files:write"],handler:async e=>n.write(e.path,e.content)},{name:"files.list",description:"List files and directories at a given path",parameters:{directory:{type:"string",required:!0,description:"Directory path to list"},recursive:{type:"boolean",description:"Include subdirectories recursively (default: false)"}},handler:async e=>(await n.list(e.directory,e.recursive)).map(t=>({path:t.path,name:t.name,size:t.size,isDirectory:t.isDirectory,modifiedAt:t.modifiedAt}))},{name:"files.search",description:"Search for text patterns across files in a directory",parameters:{directory:{type:"string",required:!0,description:"Directory to search in"},pattern:{type:"string",required:!0,description:"Search pattern (regex supported)"},limit:{type:"number",description:"Max results (default: 20)"}},handler:async e=>n.search(e.directory,e.pattern,{limit:e.limit??20})}]}function ht(n){return[{name:"schedule.create",description:"Create a scheduled task. Supports one-time (runAt) or recurring (cron) schedules",parameters:{name:{type:"string",required:!0,description:"Schedule name/description"},cron:{type:"string",description:"Cron expression for recurring (e.g. '0 9 * * *')"},runAt:{type:"string",description:"ISO 8601 datetime for one-time execution"},payload:{type:"object",required:!0,description:"Data to pass to the scheduled task"}},requiredPermissions:["schedule:write"],handler:async e=>{let r=await n.create({name:e.name,cron:e.cron,runAt:e.runAt,payload:e.payload??{}});return{id:r.id,name:r.name,status:r.status,cron:r.cron,runAt:r.runAt}}},{name:"schedule.list",description:"List scheduled tasks, optionally filtered by status",parameters:{status:{type:"string",description:"Filter by: active | paused | cancelled | completed"}},handler:async e=>(await n.list(e.status)).map(t=>({id:t.id,name:t.name,status:t.status,cron:t.cron,runAt:t.runAt,createdAt:t.createdAt}))},{name:"schedule.cancel",description:"Cancel a scheduled task by ID",parameters:{id:{type:"string",required:!0,description:"Schedule ID to cancel"}},requiredPermissions:["schedule:write"],handler:async e=>({cancelled:await n.cancel(e.id),id:e.id})}]}function yt(n){return[{name:"tasks.plan",description:"Create a task plan by decomposing a goal into actionable steps",parameters:{goal:{type:"string",required:!0,description:"High-level goal to accomplish"},context:{type:"string",description:"Additional context or constraints"}},handler:async e=>n.plan(e.goal,e.context)},{name:"tasks.update",description:"Update the status of a step within a task plan",parameters:{planId:{type:"string",required:!0,description:"Task plan ID"},stepId:{type:"string",required:!0,description:"Step ID within the plan"},status:{type:"string",required:!0,description:"pending | in_progress | done | skipped"},result:{type:"string",description:"Result or notes for this step"}},handler:async e=>n.update(e.planId,e.stepId,e.status,e.result)},{name:"tasks.list",description:"List task plans, optionally filtered by status",parameters:{status:{type:"string",description:"Filter by: planning | active | completed | cancelled"}},handler:async e=>n.list(e.status)},{name:"tasks.complete",description:"Mark a task plan as completed with a summary",parameters:{planId:{type:"string",required:!0,description:"Task plan ID to complete"},summary:{type:"string",required:!0,description:"Completion summary"}},handler:async e=>n.complete(e.planId,e.summary)}]}function vt(n){return[{name:"browser.navigate",description:"Navigate to a URL and return the page title and content summary",parameters:{url:{type:"string",required:!0,description:"The URL to navigate to"}},handler:async e=>n.navigate(e.url)},{name:"browser.click",description:"Click an element on the current page by CSS selector",parameters:{selector:{type:"string",required:!0,description:"CSS selector of element to click"}},handler:async e=>n.click(e.selector)},{name:"browser.type",description:"Fill an input field on the current page",parameters:{selector:{type:"string",required:!0,description:"CSS selector of the input field"},text:{type:"string",required:!0,description:"Text to type into the field"}},handler:async e=>n.type(e.selector,e.text)},{name:"browser.extract",description:"Extract cleaned page content (strips nav, ads, scripts). Optionally scope to a CSS selector",parameters:{selector:{type:"string",description:"Optional CSS selector to scope extraction"}},handler:async e=>n.extract(e.selector)},{name:"browser.screenshot",description:"Capture a screenshot of the current viewport as base64 PNG for vision analysis",handler:async()=>n.screenshot()}]}var q={maxRestartAttempts:3,baseCooldownMs:5e3,backoffMultiplier:3,maxCooldownMs:3e5,healthCheckIntervalMs:3e4},de=class{sidecars=new Map;startFn;healthCheckFn;pendingEvents=[];constructor(e,r){this.startFn=e,this.healthCheckFn=r}add(e){this.sidecars.set(e.id,{config:e,state:"stopped",restartAttempts:0,cooldownCycle:0,cooldownUntilMs:0,cooldownTimer:null,healthTimer:null})}async*start(e,r){let t=this.sidecars.get(e);return t?(t.state="starting",await this.startFn(t.config.command)?(t.state="running",t.restartAttempts=0,t.cooldownCycle=0,t.cooldownUntilMs=0,yield{type:"voice:sidecar:started",timestamp:Date.now(),sessionId:r,provider:t.config.id,endpoint:t.config.healthEndpoint},this.startHealthLoop(t,r),!0):(yield*this.handleFailure(t,r),t.state==="running")):!1}inFailureCooldown(e){let r=this.sidecars.get(e);return r?r.state==="cooldown"&&Date.now()<r.cooldownUntilMs:!1}cooldownUntil(e){return this.sidecars.get(e)?.cooldownUntilMs??0}async*markFailure(e,r){let t=this.sidecars.get(e);t&&(yield*this.handleFailure(t,r))}async*clearFailure(e,r){let t=this.sidecars.get(e);return t?(t.cooldownTimer&&(clearTimeout(t.cooldownTimer),t.cooldownTimer=null),t.restartAttempts=0,t.cooldownCycle=0,t.cooldownUntilMs=0,yield*this.start(e,r)):!1}activeFallback(e){let r=this.sidecars.get(e);return!r||r.state!=="cooldown"?null:r.config.fallbackProvider??null}getState(e){return this.sidecars.get(e)?.state??null}stop(e){let r=this.sidecars.get(e);r&&(r.cooldownTimer&&(clearTimeout(r.cooldownTimer),r.cooldownTimer=null),r.healthTimer&&(clearTimeout(r.healthTimer),r.healthTimer=null),r.state="stopped")}stopAll(){for(let e of this.sidecars.keys())this.stop(e)}drainEvents(){let e=[...this.pendingEvents];return this.pendingEvents=[],e}async*handleFailure(e,r){let t=e.config.maxRestartAttempts??q.maxRestartAttempts;for(;e.restartAttempts<t;)if(e.restartAttempts++,e.state="restarting",yield{type:"voice:sidecar:crashed",timestamp:Date.now(),sessionId:r,provider:e.config.id,error:`Restart attempt ${e.restartAttempts}/${t}`,restartAttempt:e.restartAttempts},await this.startFn(e.config.command)){e.state="running",e.restartAttempts=0,e.cooldownCycle=0,e.cooldownUntilMs=0,yield{type:"voice:sidecar:started",timestamp:Date.now(),sessionId:r,provider:e.config.id,endpoint:e.config.healthEndpoint},this.startHealthLoop(e,r);return}yield*this.enterCooldown(e,r)}async*enterCooldown(e,r){let t=e.config.baseCooldownMs??q.baseCooldownMs,o=e.config.backoffMultiplier??q.backoffMultiplier,s=e.config.maxCooldownMs??q.maxCooldownMs,i=Math.min(t*Math.pow(o,e.cooldownCycle),s);e.state="cooldown",e.cooldownUntilMs=Date.now()+i,yield{type:"sidecar:cooldown",timestamp:Date.now(),sessionId:r,provider:e.config.id,cooldownUntil:e.cooldownUntilMs,attempts:e.restartAttempts},e.cooldownTimer=setTimeout(()=>{e.cooldownTimer=null,this.probeAfterCooldown(e,r)},i)}async probeAfterCooldown(e,r){if(!await this.healthCheckFn(e.config.healthEndpoint)&&!await this.startFn(e.config.command)){e.cooldownCycle++,e.restartAttempts=0;let s=e.config.baseCooldownMs??q.baseCooldownMs,i=e.config.backoffMultiplier??q.backoffMultiplier,a=e.config.maxCooldownMs??q.maxCooldownMs,c=Math.min(s*Math.pow(i,e.cooldownCycle),a);e.cooldownUntilMs=Date.now()+c,this.pendingEvents.push({type:"sidecar:cooldown",timestamp:Date.now(),sessionId:r,provider:e.config.id,cooldownUntil:e.cooldownUntilMs,attempts:e.restartAttempts}),e.cooldownTimer=setTimeout(()=>{e.cooldownTimer=null,this.probeAfterCooldown(e,r)},c);return}e.state="running",e.restartAttempts=0,e.cooldownCycle=0,e.cooldownUntilMs=0,this.pendingEvents.push({type:"voice:sidecar:started",timestamp:Date.now(),sessionId:r,provider:e.config.id,endpoint:e.config.healthEndpoint}),this.startHealthLoop(e,r)}startHealthLoop(e,r){e.healthTimer&&clearTimeout(e.healthTimer);let t=e.config.healthCheckIntervalMs??q.healthCheckIntervalMs,o=async()=>{if(e.state!=="running")return;if(!await this.healthCheckFn(e.config.healthEndpoint)&&e.state==="running"){e.healthTimer=null,this.pendingEvents.push({type:"voice:sidecar:crashed",timestamp:Date.now(),sessionId:r,provider:e.config.id,error:"Health check failed",restartAttempt:0}),this.probeAfterCooldown(e,r);return}e.state==="running"&&(e.healthTimer=setTimeout(o,t))};e.healthTimer=setTimeout(o,t)}};var ue=class{queue=[];playing=null;listener;onEvent(e){this.listener=e}enqueue(e){if(e.interruptMode==="force"){this.forceInterrupt(e);return}if(e.interruptMode==="soft"&&this.playing&&e.priority>this.playing.priority){this.queue.unshift(e),this.emit("speech:queued",e);return}let r=this.queue.findIndex(t=>t.priority<e.priority);r===-1?this.queue.push(e):this.queue.splice(r,0,e),this.emit("speech:queued",e)}forceInterrupt(e){this.playing&&this.emit("speech:interrupted",this.playing),this.playing=e,this.emit("speech:started",e)}interrupt(e){if(this.playing?.id===e)return this.emit("speech:interrupted",this.playing),this.playing=null,this.advance(),!0;let r=this.queue.findIndex(t=>t.id===e);return r>=0?(this.queue.splice(r,1),!0):!1}completeCurrent(){this.playing&&(this.emit("speech:completed",this.playing),this.playing=null),this.advance()}current(){return this.playing}pending(){return[...this.queue]}get size(){return(this.playing?1:0)+this.queue.length}flush(){this.queue.length=0}advance(){if(this.playing)return;let e=this.queue.shift();e&&(this.playing=e,this.emit("speech:started",e))}emit(e,r){this.listener?.(e,r)}};var En={happy:{intensity:.7,speed:1.05},sad:{intensity:.6,speed:.9},excited:{intensity:.9,speed:1.15},angry:{intensity:.8,speed:1.1},thoughtful:{intensity:.4,speed:.85},calm:{intensity:.3,speed:.95},nervous:{intensity:.6,speed:1.1},whisper:{intensity:.2,speed:.8}},Cn=/\[([a-zA-Z][\w-]*)\]([\s\S]*?)\[\/\1\]/g,xo=/\[([a-zA-Z][\w-]*)\]/g,Eo=/\[\/([a-zA-Z][\w-]*)\]/g;function bt(n,e=En){let r=[],t=0;for(let o of n.matchAll(Cn)){let s=o.index;if(s>t){let l=n.slice(t,s).trim();l&&r.push({text:l})}let i=o[1],a=o[2].trim(),c=e[i];a&&r.push({text:a,emotion:i,intensity:c?.intensity,speed:c?.speed}),t=s+o[0].length}if(t<n.length){let o=n.slice(t).trim();o&&r.push({text:o})}return r.length===0&&n.trim()&&r.push({text:n.trim()}),r}function kt(n){return n.replace(Cn,"$2").replace(xo,"").replace(Eo,"").replace(/\s{2,}/g," ").trim()}function wt(n,e,r=""){let t=[];if(n==null)return t.push(`${r||"root"}: expected ${e.type}, got ${n}`),t;if(e.type==="object"&&typeof n=="object"&&!Array.isArray(n)){let o=n;if(e.required)for(let s of e.required)s in o||t.push(`${r?r+".":""}${s}: required field missing`);if(e.properties)for(let[s,i]of Object.entries(e.properties))s in o&&t.push(...wt(o[s],i,`${r?r+".":""}${s}`))}else if(e.type==="array"&&Array.isArray(n)){if(e.items)for(let o=0;o<n.length;o++)t.push(...wt(n[o],e.items,`${r}[${o}]`))}else e.type==="string"&&typeof n!="string"?t.push(`${r||"root"}: expected string, got ${typeof n}`):e.type==="number"&&typeof n!="number"?t.push(`${r||"root"}: expected number, got ${typeof n}`):e.type==="boolean"&&typeof n!="boolean"&&t.push(`${r||"root"}: expected boolean, got ${typeof n}`);return e.enum&&!e.enum.includes(n)&&t.push(`${r||"root"}: value ${JSON.stringify(n)} not in enum [${e.enum.join(", ")}]`),t}async function Tt(n,e,r={}){if(!n.generateObject)throw new Error(`Provider "${n.id}" does not support generateObject`);let t=r.maxRetries??2,o=[],s=0;for(let i=0;i<=t;i++){s++;let a=await n.generateObject(e),c=wt(a,e.schema),l=r.validate?.(a);if(l&&c.push(l),c.length===0)return{data:a,attempts:s,violations:o};o.push(...c.map(d=>`[attempt ${s}] ${d}`)),i<t&&(e={...e,messages:[...e.messages,{role:"assistant",content:JSON.stringify(a)},{role:"user",content:`The previous response had validation errors:
373
+ ${c.join(`
374
+ `)}
375
+
376
+ Please fix and return a valid response.`}]})}throw new Ce(`Structured output validation failed after ${s} attempts`,o)}var Ce=class extends Error{constructor(r,t){super(r);this.violations=t;this.name="StructuredOutputError"}};var Nn="0.1.0";async function It(n,e={}){let r=new V,t=new z,o=e.storage??null;if(!o&&(n.databaseUrl||n.storageBackend)){let{createStorage:S}=await Promise.resolve().then(()=>(At(),Ln));o=S({backend:n.storageBackend??"postgres",connectionString:n.databaseUrl})}let s=new re({enableCostTracking:!0});if(n.providers&&Object.keys(n.providers).length>0)for(let[S,j]of Object.entries(n.providers)){let _=$n(j);_&&s.register(S,_)}else{let S=await ne(),j=[S.chat,S.tts,S.stt].filter(_=>_!==null);for(let _ of j){let N=$n({provider:_.id,model:_.id,apiKey:_.apiKeyEnv?process.env[_.apiKeyEnv]:void 0,baseUrl:_.baseUrl});N&&s.register(_.slot,N)}}let i=new se,a=[Ve,ze,Xe,et,ot,at];for(let S of a)try{S(i)}catch{}try{Ye(i)}catch{}try{Ze(i)}catch{}try{await i.register(ct())}catch{}try{await i.register(ut({skills:[]}))}catch{}let c=new ie,l=new ae(c),d=n.tools??["*"],u=d.includes("*");e.memoryBackend&&(u||d.includes("memory"))&&c.registerAll(pt(e.memoryBackend)),e.webBackend&&(u||d.includes("web"))&&c.registerAll(gt(e.webBackend)),e.codeBackend&&(u||d.includes("code"))&&c.registerAll(mt(e.codeBackend)),e.fileBackend&&(u||d.includes("files"))&&c.registerAll(ft(e.fileBackend)),e.scheduleBackend&&(u||d.includes("schedule"))&&c.registerAll(ht(e.scheduleBackend)),e.taskBackend&&(u||d.includes("tasks"))&&c.registerAll(yt(e.taskBackend)),e.browserEngine&&(u||d.includes("browser"))&&c.registerAll(vt(e.browserEngine));let m=new de(async S=>!1,async S=>!1),g=new ue,p=null,f;if(n.enablePreClassification){let S=s.getHealthy("utility")??s.getHealthy("chat");S&&(f=Ke(S))}let v=n.systemPrompt??`You are Fenix, an AI agent (${n.edition} edition). You can use tools to help the user.`,x=new Set(n.readOnlyTools??["memory.search","memory.list","memory.context","web.search","web.fetch","files.read","files.list","files.search","tasks.list"]);async function*R(S,j){yield*Ge({providers:s,toolRouter:l,extensions:i,sessionId:S,maxTurns:n.maxTurns??20,tokenBudget:n.tokenBudget??128e3,contextWindowTokens:n.contextWindowTokens??2e5,systemPrompt:v,emitBlocks:n.emitBlocks??!1,readOnlyTools:x,classifyQuery:f},j)}function C(){let j=["chat","utility","embedding","vision","stt","tts"].map(N=>({slot:N,healthy:s.getHealthy(N)!==null}));return{status:j.some(N=>N.healthy)?"ok":"degraded",edition:n.edition,version:Nn,providers:j,storage:o!==null,extensions:i.listExtensions().length,tools:c.list().length}}async function G(){m.stopAll();for(let S of i.listExtensions())try{await i.unregister(S)}catch{}}return{edition:n.edition,version:Nn,config:n,bus:r,sessions:t,providers:s,extensions:i,toolRegistry:c,toolRouter:l,storage:o,voice:{sidecarManager:m,speechQueue:g,parseMarkers:bt,stripMarkers:kt},memory:{progressiveSearch:p},verifiedGenerateObject:Tt,sendMessage:R,health:C,stop:G}}function $n(n){switch(n.provider){case"anthropic":return new oe({apiKey:n.apiKey??process.env.ANTHROPIC_API_KEY??"",model:n.model});case"openrouter":return new F({apiKey:n.apiKey??process.env.OPENROUTER_API_KEY??"",baseUrl:n.baseUrl??"https://openrouter.ai/api/v1",model:n.model,id:`openrouter:${n.model}`});case"ollama":return new F({apiKey:"",baseUrl:n.baseUrl??"http://localhost:11434/v1",model:n.model,id:`ollama:${n.model}`});case"groq":return new F({apiKey:n.apiKey??process.env.GROQ_API_KEY??"",baseUrl:n.baseUrl??"https://api.groq.com/openai/v1",model:n.model,id:`groq:${n.model}`});case"openai":return new F({apiKey:n.apiKey??process.env.OPENAI_API_KEY??"",baseUrl:n.baseUrl??"https://api.openai.com/v1",model:n.model,id:`openai:${n.model}`});case"nvidia":return new F({apiKey:n.apiKey??process.env.NVIDIA_API_KEY??"",baseUrl:n.baseUrl??"https://integrate.api.nvidia.com/v1",model:n.model,id:`nvidia:${n.model}`});case"cloudflare":return new F({apiKey:n.apiKey??process.env.CLOUDFLARE_API_TOKEN??"",baseUrl:n.baseUrl??"https://api.cloudflare.com/client/v4/accounts",model:n.model,id:`cloudflare:${n.model}`});case"github":return new F({apiKey:n.apiKey??process.env.GITHUB_TOKEN??"",baseUrl:n.baseUrl??"https://models.inference.ai.azure.com",model:n.model,id:`github:${n.model}`});default:return n.baseUrl?new F({apiKey:n.apiKey??"",baseUrl:n.baseUrl,model:n.model,id:`${n.provider}:${n.model}`}):null}}var Vc=new TextEncoder;At();Ie();Re();var Fo={plan:{filename:"plan.md",template:["# Task Plan","","## Objective","<!-- Describe the current goal -->","","## Checklist","- [ ] Step 1","","## Notes",""].join(`
377
+ `)},observations:{filename:"observations.md",template:["# Observations","","Key observations accumulated this session:","","- ",""].join(`
378
+ `)},context:{filename:"context.md",template:["# Critical Context","","Context that must survive truncation:","","## User Preferences","","## Active Constraints","","## Key Decisions",""].join(`
379
+ `)}};var fe="0.1.0";function Pe(n){let e=new V,r=new z;return{edition:n.edition,version:fe,config:n,bus:e,sessions:r}}import{z as h}from"zod";function qn(n){return n.replace(/\$\{(\w+)\}/g,(e,r)=>process.env[r]??"")}function Rt(n){if(typeof n=="string")return qn(n);if(Array.isArray(n))return n.map(Rt);if(n!==null&&typeof n=="object"){let e={};for(let[r,t]of Object.entries(n))e[r]=Rt(t);return e}return n}var _e=h.object({requireApproval:h.array(h.string()).default([]),autoApprove:h.array(h.string()).default([]),expirationDays:h.number().int().positive().default(7),notifyOn:h.array(h.string()).default(["requested","expired"]),notifyChannel:h.string().nullable().default(null)}),Me=h.object({dailyLimit:h.number().nonnegative().default(10),monthlyLimit:h.number().nonnegative().default(200),perWorkspaceDailyLimit:h.number().nonnegative().default(0)}),Pt=h.object({mentionPrefix:h.string().default("@"),fallbackWorkspace:h.string().default("default"),classificationModel:h.string().default("auto"),confidenceThreshold:h.number().min(0).max(1).default(.6)}),Hn=h.object({id:h.string().min(1),name:h.string().min(1),identityDir:h.string().default("./identity"),channels:h.array(h.string()).default([]),tools:h.array(h.string()).default([]),layers:h.array(h.string()).default([]),approval:_e.optional(),budget:Me.partial().optional(),integrationGrants:h.record(h.string(),h.string()).default({}),metadata:h.record(h.string(),h.unknown()).default({})}),Jn=h.object({channel:h.string().min(1),workspaceId:h.string().min(1),config:h.record(h.string(),h.unknown()).default({})}),_t=h.object({id:h.string().min(1).default("default-fleet"),name:h.string().default("Fenix Fleet"),version:h.literal(1).default(1),routing:Pt.default(()=>Pt.parse({})),budget:Me.default(()=>Me.parse({})),channelBindings:h.array(Jn).default([]),workspaces:h.array(Hn).default([]),approval:_e.default(()=>_e.parse({}))}),Wo=_t.parse({});function Q(n,e={}){let{resolveEnv:r=!0}=e,t=r?Rt(n):n,o=_t.safeParse(t);if(!o.success){let s=o.error.issues.map(i=>` ${i.path.join(".")}: ${i.message}`).join(`
2
380
  `);throw new Error(`Invalid fleet configuration:
3
- ${i}`)}return o.data}function Pe(r,e={}){let t;try{t=JSON.parse(r)}catch{throw new Error("Invalid JSON in fleet configuration file")}return E(t,e)}function B(r=100){let e=[];return{add(t){e.push(t),e.length>r&&e.shift()},recent(t=20){return e.slice(-t)},flush(){let t=[...e];return e.length=0,t},get size(){return e.length}}}function $(r,e={}){let t=new Map,n=new Map,o=new Map,{drainTimeoutMs:i=1e4}=r,s=1;function a(){return`ws_${s++}`}let d={async createWorkspace(c,l,p,h){let g=p.id||a();if(t.has(g))throw new Error(`Workspace "${g}" already exists`);let u={id:g,fleetId:c,name:l,config:p,status:"created",identityDir:h??p.identityDir,createdAt:new Date,startedAt:null,stoppedAt:null};return t.set(g,u),r.storage&&await r.storage.saveIdentityFile({workspaceId:g,fileName:"persona.md",content:`# ${l}
4
- Workspace identity placeholder.`,metadata:{fleetId:c,identityDir:u.identityDir}}),e.onCreated?.(u),u},async startWorkspace(c){let l=t.get(c);if(!l)throw new Error(`Workspace "${c}" not found`);if(l.status==="running")return l;l.status="starting";try{if(r.identityAssembler){let h=await r.identityAssembler.assemble(c);o.set(c,h)}let p=r.createSTM();return n.set(c,p),l.status="running",l.startedAt=new Date,e.onStarted?.(l),l}catch(p){l.status="error";let h=p instanceof Error?p:new Error(String(p));throw e.onError?.(c,h),h}},async stopWorkspace(c){let l=t.get(c);if(!l)throw new Error(`Workspace "${c}" not found`);if(l.status==="stopped"||l.status==="created")return l;l.status="stopping";let p=n.get(c);if(p){let h=Date.now(),g=p.flush();Date.now()-h<i&&g.length>0,n.delete(c)}return o.delete(c),l.status="stopped",l.stoppedAt=new Date,e.onStopped?.(l),l},async deleteWorkspace(c){let l=t.get(c);if(!l)throw new Error(`Workspace "${c}" not found`);(l.status==="running"||l.status==="starting")&&await d.stopWorkspace(c),t.delete(c),n.delete(c),o.delete(c),e.onDeleted?.(c)},getWorkspace(c){return t.get(c)},listWorkspaces(c){return[...t.values()].filter(l=>l.fleetId===c)},getSTM(c){return n.get(c)},async getIdentity(c){let l=o.get(c);if(l)return l;if(r.identityAssembler){let p=await r.identityAssembler.assemble(c);return o.set(c,p),p}return null}};return d}function _(r){let{fleetId:e,memoryEngine:t,embed:n}=r,o=new Map;return{async saveFact(s,a,d){let c=n?await n(a.content):null,l=await t.saveMemorySegment({userId:s,content:`[ws:${d}] ${a.content}`,category:a.category,embedding:c,heat:a.confidence??1}),p={id:l.id,userId:s,content:a.content,category:a.category,sourceWorkspace:d,confidence:a.confidence??1,createdAt:l.createdAt,updatedAt:l.updatedAt};return o.set(l.id,p),p},async recallFacts(s,a,d=10,c){if(!n)return[...o.values()].filter(u=>u.userId===s).filter(u=>!c||u.sourceWorkspace===c).filter(u=>u.content.toLowerCase().includes(a.toLowerCase())).slice(0,d).map(u=>({fact:u,score:1}));let l=await n(a),p=await t.searchMemoryByEmbedding(s,l,d*2),h=[];for(let g of p){let u=o.get(g.segment.id);if(u&&!(c&&u.sourceWorkspace!==c)&&(h.push({fact:u,score:g.score}),h.length>=d))break}return h},async getRelevantContext(s,a,d=5){return[...o.values()].filter(l=>l.userId===s).sort((l,p)=>p.confidence-l.confidence).slice(0,d)},get fleetId(){return e},get factCount(){return o.size}}}function de(r,e){let t=r.trimStart();if(!t.startsWith(e))return null;let o=t.slice(e.length).match(/^([\w-]+)\s*(.*)/s);return o?{workspaceName:o[1].toLowerCase(),remainingText:o[2].trim()}:null}function pe(r,e){return e.find(n=>n.channel===r)?.workspaceId??null}function Fe(r,e){return`Given these available agents:
5
- ${e.map(n=>{let o=n.description.slice(0,200),i=n.tools.length>0?`Tools: ${n.tools.join(", ")}`:"Tools: general";return`- ${n.name} (id: ${n.id}): ${o}
6
- ${i}`}).join(`
381
+ ${s}`)}return o.data}function qo(n,e={}){let r;try{r=JSON.parse(n)}catch{throw new Error("Invalid JSON in fleet configuration file")}return Q(r,e)}function Mt(n=100){let e=[];return{add(r){e.push(r),e.length>n&&e.shift()},recent(r=20){return e.slice(-r)},flush(){let r=[...e];return e.length=0,r},get size(){return e.length}}}function Dt(n,e={}){let r=new Map,t=new Map,o=new Map,{drainTimeoutMs:s=1e4}=n,i=1;function a(){return`ws_${i++}`}let c={async createWorkspace(l,d,u,m){let g=u.id||a();if(r.has(g))throw new Error(`Workspace "${g}" already exists`);let p={id:g,fleetId:l,name:d,config:u,status:"created",identityDir:m??u.identityDir,createdAt:new Date,startedAt:null,stoppedAt:null};return r.set(g,p),n.storage&&await n.storage.saveIdentityFile({workspaceId:g,fileName:"persona.md",content:`# ${d}
382
+ Workspace identity placeholder.`,metadata:{fleetId:l,identityDir:p.identityDir}}),e.onCreated?.(p),p},async startWorkspace(l){let d=r.get(l);if(!d)throw new Error(`Workspace "${l}" not found`);if(d.status==="running")return d;d.status="starting";try{if(n.identityAssembler){let m=await n.identityAssembler.assemble(l);o.set(l,m)}let u=n.createSTM();return t.set(l,u),d.status="running",d.startedAt=new Date,e.onStarted?.(d),d}catch(u){d.status="error";let m=u instanceof Error?u:new Error(String(u));throw e.onError?.(l,m),m}},async stopWorkspace(l){let d=r.get(l);if(!d)throw new Error(`Workspace "${l}" not found`);if(d.status==="stopped"||d.status==="created")return d;d.status="stopping";let u=t.get(l);if(u){let m=Date.now(),g=u.flush();Date.now()-m<s&&g.length>0,t.delete(l)}return o.delete(l),d.status="stopped",d.stoppedAt=new Date,e.onStopped?.(d),d},async deleteWorkspace(l){let d=r.get(l);if(!d)throw new Error(`Workspace "${l}" not found`);(d.status==="running"||d.status==="starting")&&await c.stopWorkspace(l),r.delete(l),t.delete(l),o.delete(l),e.onDeleted?.(l)},getWorkspace(l){return r.get(l)},listWorkspaces(l){return[...r.values()].filter(d=>d.fleetId===l)},getSTM(l){return t.get(l)},async getIdentity(l){let d=o.get(l);if(d)return d;if(n.identityAssembler){let u=await n.identityAssembler.assemble(l);return o.set(l,u),u}return null}};return c}function Ot(n){let{fleetId:e,memoryEngine:r,embed:t}=n,o=new Map;return{async saveFact(i,a,c){let l=t?await t(a.content):null,d=await r.saveMemorySegment({userId:i,content:`[ws:${c}] ${a.content}`,category:a.category,embedding:l,heat:a.confidence??1}),u={id:d.id,userId:i,content:a.content,category:a.category,sourceWorkspace:c,confidence:a.confidence??1,createdAt:d.createdAt,updatedAt:d.updatedAt};return o.set(d.id,u),u},async recallFacts(i,a,c=10,l){if(!t)return[...o.values()].filter(p=>p.userId===i).filter(p=>!l||p.sourceWorkspace===l).filter(p=>p.content.toLowerCase().includes(a.toLowerCase())).slice(0,c).map(p=>({fact:p,score:1}));let d=await t(a),u=await r.searchMemoryByEmbedding(i,d,c*2),m=[];for(let g of u){let p=o.get(g.segment.id);if(p&&!(l&&p.sourceWorkspace!==l)&&(m.push({fact:p,score:g.score}),m.length>=c))break}return m},async getRelevantContext(i,a,c=5){return[...o.values()].filter(d=>d.userId===i).sort((d,u)=>u.confidence-d.confidence).slice(0,c)},get fleetId(){return e},get factCount(){return o.size}}}function Gn(n,e){let r=n.trimStart();if(!r.startsWith(e))return null;let o=r.slice(e.length).match(/^([\w-]+)\s*(.*)/s);return o?{workspaceName:o[1].toLowerCase(),remainingText:o[2].trim()}:null}function Kn(n,e){return e.find(t=>t.channel===n)?.workspaceId??null}function Ho(n,e){return`Given these available agents:
383
+ ${e.map(t=>{let o=t.description.slice(0,200),s=t.tools.length>0?`Tools: ${t.tools.join(", ")}`:"Tools: general";return`- ${t.name} (id: ${t.id}): ${o}
384
+ ${s}`}).join(`
7
385
  `)}
8
386
 
9
387
  Route this message to the most appropriate agent:
10
- "${r}"
388
+ "${n}"
11
389
 
12
- Respond with JSON: { "workspace": "id", "confidence": 0.0-1.0, "reasoning": "one line" }`}function De(r){try{let e=r.trim();e.startsWith("```")&&(e=e.replace(/^```(?:json)?\s*/,"").replace(/\s*```$/,""));let t=JSON.parse(e);return typeof t.workspace=="string"&&typeof t.confidence=="number"?{workspace:t.workspace,confidence:Math.max(0,Math.min(1,t.confidence)),reasoning:typeof t.reasoning=="string"?t.reasoning:""}:null}catch{return null}}function j(r,e){let t={async route(n,o,i){let{text:s,channel:a}=n,d=de(s,r.mentionPrefix);if(d){let p=o.find(h=>h.name.toLowerCase()===d.workspaceName||h.id.toLowerCase()===d.workspaceName);if(p)return{workspaceId:p.id,strategy:"mention",confidence:1,cleanedText:d.remainingText||s}}let c=pe(a,i);if(c&&o.some(h=>h.id===c))return{workspaceId:c,strategy:"channel_binding",confidence:1,cleanedText:s};if(e&&o.length>1){let p=await t.classifyIntent(s,o);if(p){let h=o.find(g=>g.id===p.workspace);if(h&&p.confidence>=r.confidenceThreshold)return{workspaceId:h.id,strategy:"intent_classification",confidence:p.confidence,cleanedText:s,reasoning:p.reasoning}}}return{workspaceId:o.some(p=>p.id===r.fallbackWorkspace)?r.fallbackWorkspace:o[0]?.id??r.fallbackWorkspace,strategy:"fallback",confidence:0,cleanedText:s}},async classifyIntent(n,o){if(!e)return null;let i=Fe(n,o);try{let s=await e.complete({messages:[{role:"system",content:"You are a message routing classifier. Respond only with valid JSON."},{role:"user",content:i}],temperature:.1});return De(s.content)}catch{return null}}};return t}function ue(){let r=0,e=0,t=new Map;return{recordCost(n,o){r+=n,e+=n,o&&t.set(o,(t.get(o)??0)+n)},getDailySpent:()=>r,getMonthlySpent:()=>e,getWorkspaceDailySpent:n=>t.get(n)??0,isOverBudget(n){return n.dailyLimit>0&&r>=n.dailyLimit||n.monthlyLimit>0&&e>=n.monthlyLimit},reset(){r=0,e=0,t.clear()}}}function H(r,e,t={}){let n="created",o=null,i=0,s=new Set;function a(u){for(let m of s)try{m(u)}catch{}}let d=ue(),c=$({createSTM:()=>B(),identityAssembler:t.identityAssembler,storage:t.storage},{onStarted:u=>{a({type:"workspace:started",fleetId:e.id,timestamp:Date.now(),workspaceId:u.id})},onStopped:u=>{a({type:"workspace:stopped",fleetId:e.id,timestamp:Date.now(),workspaceId:u.id})},onError:(u,m)=>{a({type:"workspace:error",fleetId:e.id,timestamp:Date.now(),workspaceId:u,error:m.message})}}),l=t.memoryEngine?_({fleetId:e.id,memoryEngine:t.memoryEngine,embed:t.embed}):null,p=j(e.routing,t.classificationProvider);function h(){return c.listWorkspaces(e.id).filter(u=>u.status==="running").map(u=>({id:u.id,name:u.name,description:u.config.metadata?.description??u.name,tools:u.config.tools}))}return{async start(){if(n!=="running"){n="starting";for(let u of e.workspaces)try{await c.createWorkspace(e.id,u.name,u),await c.startWorkspace(u.id)}catch(m){a({type:"workspace:error",fleetId:e.id,timestamp:Date.now(),workspaceId:u.id,error:m instanceof Error?m.message:String(m)})}n="running",o=new Date,a({type:"fleet:started",fleetId:e.id,timestamp:Date.now()})}},async stop(){if(n==="stopped"||n==="created")return;n="stopping";let u=c.listWorkspaces(e.id);await Promise.allSettled(u.filter(m=>m.status==="running"||m.status==="starting").map(m=>c.stopWorkspace(m.id))),n="stopped",a({type:"fleet:stopped",fleetId:e.id,timestamp:Date.now()})},async route(u){let m=h(),C=await p.route(u,m,e.channelBindings);return i++,a({type:"message:routed",fleetId:e.id,timestamp:Date.now(),workspaceId:C.workspaceId,routeResult:C}),C},status(){let u=c.listWorkspaces(e.id);return{fleetId:e.id,customerId:r,status:n,workspaces:u.map(m=>({id:m.id,name:m.name,status:m.status})),budget:{dailySpent:d.getDailySpent(),monthlySpent:d.getMonthlySpent(),dailyLimit:e.budget.dailyLimit,monthlyLimit:e.budget.monthlyLimit},messageCount:i,startedAt:o}},async addWorkspace(u){let m=await c.createWorkspace(e.id,u.name,u);return await c.startWorkspace(m.id),c.getWorkspace(m.id)},async removeWorkspace(u){await c.deleteWorkspace(u)},on(u){return s.add(u),()=>{s.delete(u)}},get workspaceManager(){return c},get sharedMemory(){return l},get budget(){return d},get fleetStatus(){return n}}}import{writeFileSync as ge,mkdirSync as Me,existsSync as Le}from"node:fs";import{join as me}from"node:path";var U=[{id:"blog-writer",name:"Blog Writer",description:"SEO-focused content writer using proven copywriting frameworks.",persona:`# Blog Writer
390
+ Respond with JSON: { "workspace": "id", "confidence": 0.0-1.0, "reasoning": "one line" }`}function Jo(n){try{let e=n.trim();e.startsWith("```")&&(e=e.replace(/^```(?:json)?\s*/,"").replace(/\s*```$/,""));let r=JSON.parse(e);return typeof r.workspace=="string"&&typeof r.confidence=="number"?{workspace:r.workspace,confidence:Math.max(0,Math.min(1,r.confidence)),reasoning:typeof r.reasoning=="string"?r.reasoning:""}:null}catch{return null}}function Lt(n,e){let r={async route(t,o,s){let{text:i,channel:a}=t,c=Gn(i,n.mentionPrefix);if(c){let u=o.find(m=>m.name.toLowerCase()===c.workspaceName||m.id.toLowerCase()===c.workspaceName);if(u)return{workspaceId:u.id,strategy:"mention",confidence:1,cleanedText:c.remainingText||i}}let l=Kn(a,s);if(l&&o.some(m=>m.id===l))return{workspaceId:l,strategy:"channel_binding",confidence:1,cleanedText:i};if(e&&o.length>1){let u=await r.classifyIntent(i,o);if(u){let m=o.find(g=>g.id===u.workspace);if(m&&u.confidence>=n.confidenceThreshold)return{workspaceId:m.id,strategy:"intent_classification",confidence:u.confidence,cleanedText:i,reasoning:u.reasoning}}}return{workspaceId:o.some(u=>u.id===n.fallbackWorkspace)?n.fallbackWorkspace:o[0]?.id??n.fallbackWorkspace,strategy:"fallback",confidence:0,cleanedText:i}},async classifyIntent(t,o){if(!e)return null;let s=Ho(t,o);try{let i=await e.complete({messages:[{role:"system",content:"You are a message routing classifier. Respond only with valid JSON."},{role:"user",content:s}],temperature:.1});return Jo(i.content)}catch{return null}}};return r}function Vn(){let n=0,e=0,r=new Map;return{recordCost(t,o){n+=t,e+=t,o&&r.set(o,(r.get(o)??0)+t)},getDailySpent:()=>n,getMonthlySpent:()=>e,getWorkspaceDailySpent:t=>r.get(t)??0,isOverBudget(t){return t.dailyLimit>0&&n>=t.dailyLimit||t.monthlyLimit>0&&e>=t.monthlyLimit},reset(){n=0,e=0,r.clear()}}}function Nt(n,e,r={}){let t="created",o=null,s=0,i=new Set;function a(p){for(let f of i)try{f(p)}catch{}}let c=Vn(),l=Dt({createSTM:()=>Mt(),identityAssembler:r.identityAssembler,storage:r.storage},{onStarted:p=>{a({type:"workspace:started",fleetId:e.id,timestamp:Date.now(),workspaceId:p.id})},onStopped:p=>{a({type:"workspace:stopped",fleetId:e.id,timestamp:Date.now(),workspaceId:p.id})},onError:(p,f)=>{a({type:"workspace:error",fleetId:e.id,timestamp:Date.now(),workspaceId:p,error:f.message})}}),d=r.memoryEngine?Ot({fleetId:e.id,memoryEngine:r.memoryEngine,embed:r.embed}):null,u=Lt(e.routing,r.classificationProvider);function m(){return l.listWorkspaces(e.id).filter(p=>p.status==="running").map(p=>({id:p.id,name:p.name,description:p.config.metadata?.description??p.name,tools:p.config.tools}))}return{async start(){if(t!=="running"){t="starting";for(let p of e.workspaces)try{await l.createWorkspace(e.id,p.name,p),await l.startWorkspace(p.id)}catch(f){a({type:"workspace:error",fleetId:e.id,timestamp:Date.now(),workspaceId:p.id,error:f instanceof Error?f.message:String(f)})}t="running",o=new Date,a({type:"fleet:started",fleetId:e.id,timestamp:Date.now()})}},async stop(){if(t==="stopped"||t==="created")return;t="stopping";let p=l.listWorkspaces(e.id);await Promise.allSettled(p.filter(f=>f.status==="running"||f.status==="starting").map(f=>l.stopWorkspace(f.id))),t="stopped",a({type:"fleet:stopped",fleetId:e.id,timestamp:Date.now()})},async route(p){let f=m(),v=await u.route(p,f,e.channelBindings);return s++,a({type:"message:routed",fleetId:e.id,timestamp:Date.now(),workspaceId:v.workspaceId,routeResult:v}),v},status(){let p=l.listWorkspaces(e.id);return{fleetId:e.id,customerId:n,status:t,workspaces:p.map(f=>({id:f.id,name:f.name,status:f.status})),budget:{dailySpent:c.getDailySpent(),monthlySpent:c.getMonthlySpent(),dailyLimit:e.budget.dailyLimit,monthlyLimit:e.budget.monthlyLimit},messageCount:s,startedAt:o}},async addWorkspace(p){let f=await l.createWorkspace(e.id,p.name,p);return await l.startWorkspace(f.id),l.getWorkspace(f.id)},async removeWorkspace(p){await l.deleteWorkspace(p)},on(p){return i.add(p),()=>{i.delete(p)}},get workspaceManager(){return l},get sharedMemory(){return d},get budget(){return c},get fleetStatus(){return t}}}import{writeFileSync as zn,mkdirSync as Go,existsSync as Ko}from"node:fs";import{join as Yn}from"node:path";var $t=[{id:"blog-writer",name:"Blog Writer",description:"SEO-focused content writer using proven copywriting frameworks.",persona:`# Blog Writer
13
391
 
14
392
  You are a professional blog writer and content strategist.
15
393
  Your writing is clear, engaging, and optimized for search engines.
@@ -513,23 +891,23 @@ with strong communication to make data accessible to all.
513
891
  - Findings: organized by business question, each with supporting visual
514
892
  - Limitations: data gaps, caveats, confidence levels
515
893
  - Recommendations: specific, actionable, prioritized by impact
516
- - Appendix: detailed tables, SQL queries, additional breakdowns`,tools:["code.execute","files.*","web.search"],channels:["web","telegram","slack"],layers:["knowledge-graph"]}];function G(){return[...U]}function q(r){return U.find(e=>e.id===r)}function We(r,e,t){let n=t?.personaAppend?`${r.persona}
894
+ - Appendix: detailed tables, SQL queries, additional breakdowns`,tools:["code.execute","files.*","web.search"],channels:["web","telegram","slack"],layers:["knowledge-graph"]}];function Ft(){return[...$t]}function Bt(n){return $t.find(e=>e.id===n)}function Vo(n,e,r){let t=r?.personaAppend?`${n.persona}
517
895
 
518
- ${t.personaAppend}`:r.persona,o=t?.knowledgeAppend?`${r.knowledge}
896
+ ${r.personaAppend}`:n.persona,o=r?.knowledgeAppend?`${n.knowledge}
519
897
 
520
- ${t.knowledgeAppend}`:r.knowledge,i=t?.tools??r.tools,s=t?.channels??r.channels,a=t?.layers??r.layers;Le(e)||Me(e,{recursive:!0});let d=me(e,"persona.md"),c=me(e,"knowledge.md");return ge(d,n,"utf-8"),ge(c,o,"utf-8"),{personaPath:d,knowledgePath:c,tools:i,channels:s,layers:a}}import{randomUUID as Ne}from"node:crypto";var J=class{storage;executor;notifier;config;listeners=new Set;constructor(e,t,n,o={}){this.storage=e,this.executor=t,this.notifier=n??null,this.config={defaultExpirationDays:o.defaultExpirationDays??7,notifyChannel:o.notifyChannel??null,autoApprovalThreshold:o.autoApprovalThreshold??5}}on(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}emit(e,t){for(let n of this.listeners)try{n({type:e,item:t})}catch{}}async submit(e){let t=new Date,n=new Date(t.getTime()+this.config.defaultExpirationDays*24*60*60*1e3),o={id:Ne(),...e,status:"pending",createdAt:t,expiresAt:n,resolvedAt:null,resolvedBy:null,notes:null};if(await this.storage.insertApproval(o),this.emit("approval:pending",o),this.notifier&&this.config.notifyChannel){let i=`\u{1F514} Approval needed: ${o.content}
898
+ ${r.knowledgeAppend}`:n.knowledge,s=r?.tools??n.tools,i=r?.channels??n.channels,a=r?.layers??n.layers;Ko(e)||Go(e,{recursive:!0});let c=Yn(e,"persona.md"),l=Yn(e,"knowledge.md");return zn(c,t,"utf-8"),zn(l,o,"utf-8"),{personaPath:c,knowledgePath:l,tools:s,channels:i,layers:a}}import{randomUUID as zo}from"node:crypto";var Ut=class{storage;executor;notifier;config;listeners=new Set;constructor(e,r,t,o={}){this.storage=e,this.executor=r,this.notifier=t??null,this.config={defaultExpirationDays:o.defaultExpirationDays??7,notifyChannel:o.notifyChannel??null,autoApprovalThreshold:o.autoApprovalThreshold??5}}on(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}emit(e,r){for(let t of this.listeners)try{t({type:e,item:r})}catch{}}async submit(e){let r=new Date,t=new Date(r.getTime()+this.config.defaultExpirationDays*24*60*60*1e3),o={id:zo(),...e,status:"pending",createdAt:r,expiresAt:t,resolvedAt:null,resolvedBy:null,notes:null};if(await this.storage.insertApproval(o),this.emit("approval:pending",o),this.notifier&&this.config.notifyChannel){let s=`\u{1F514} Approval needed: ${o.content}
521
899
  Workspace: ${o.workspaceId}
522
900
  Tool: ${o.toolCall.tool}
523
- ID: ${o.id}`;await this.notifier.send(this.config.notifyChannel,i).catch(()=>{})}return o}async list(e){return this.storage.listApprovals(e??{})}async approve(e,t){let n=await this.storage.getApproval(e);if(!n)throw new Error(`Approval item "${e}" not found`);if(n.status!=="pending")throw new Error(`Cannot approve item with status "${n.status}"`);let o=await this.executor.execute(n.toolCall),i={status:"approved",resolvedAt:new Date,resolvedBy:t??null};await this.storage.updateApproval(e,i);let s={...n,...i};return this.emit("approval:approved",s),{item:s,result:o}}async reject(e,t,n){let o=await this.storage.getApproval(e);if(!o)throw new Error(`Approval item "${e}" not found`);if(o.status!=="pending")throw new Error(`Cannot reject item with status "${o.status}"`);let i={status:"rejected",resolvedAt:new Date,resolvedBy:n??null,notes:t??null};await this.storage.updateApproval(e,i);let s={...o,...i};return this.emit("approval:rejected",s),s}async edit(e,t,n){let o=await this.storage.getApproval(e);if(!o)throw new Error(`Approval item "${e}" not found`);if(o.status!=="pending")throw new Error(`Cannot edit item with status "${o.status}"`);let i={status:"edited",resolvedAt:new Date,resolvedBy:n??null,notes:t};await this.storage.updateApproval(e,i);let s={...o,...i};return this.emit("approval:edited",s),s}async expireStale(){let e=await this.storage.listApprovals({status:"pending"}),t=new Date,n=[];for(let o of e)if(o.expiresAt<=t){let i={status:"expired",resolvedAt:t};await this.storage.updateApproval(o.id,i);let s={...o,...i};this.emit("approval:expired",s),n.push(s)}return n}};async function Oe(r,e,t,n=5){return await r.countConsecutiveApprovals(e,t)>=n}var D=[{id:"gmail",name:"Gmail",protocol:"MCP",authMethod:"oauth2",capabilities:["email.read","email.send","email.draft"]},{id:"google-calendar",name:"Google Calendar",protocol:"MCP",authMethod:"oauth2",capabilities:["calendar.read","calendar.write","calendar.schedule"]},{id:"facebook",name:"Facebook",protocol:"MCP",authMethod:"oauth2",capabilities:["social.post","social.read"]},{id:"instagram",name:"Instagram",protocol:"MCP",authMethod:"oauth2",capabilities:["social.post","social.read"]},{id:"linkedin",name:"LinkedIn",protocol:"MCP",authMethod:"oauth2",capabilities:["social.post","social.read"]},{id:"x-twitter",name:"X (Twitter)",protocol:"MCP",authMethod:"api_key",capabilities:["social.post","social.read"]},{id:"notion",name:"Notion",protocol:"MCP",authMethod:"api_key",capabilities:["docs.read","docs.write"]},{id:"slack",name:"Slack",protocol:"MCP",authMethod:"oauth2",capabilities:["messaging.send","messaging.read"]},{id:"wordpress",name:"WordPress",protocol:"builtin",authMethod:"api_key",capabilities:["publish.post","publish.page"]}];function Be(){let r=new Map,e=new Map;function t(o,i){return`${o}:${i}`}function n(o,i){return`${o}:${i}`}return{getConnection(o,i){return r.get(t(o,i))},saveConnection(o){r.set(t(o.fleetId,o.integrationId),o)},deleteConnection(o,i){return r.delete(t(o,i))},listConnections(o){let i=[];for(let s of r.values())s.fleetId===o&&i.push(s);return i},getWorkspaceGrant(o,i){return e.get(n(o,i))},saveWorkspaceGrant(o){e.set(n(o.workspaceId,o.integrationId),o)},deleteWorkspaceGrant(o,i){return e.delete(n(o,i))},listWorkspaceGrants(o){let i=[];for(let s of e.values())s.workspaceId===o&&i.push(s);return i}}}var z=class{constructor(e,t){this.storage=e;this.secretStore=t}listAvailable(){return D}async connect(e,t,n){if(!D.find(s=>s.id===t))throw new Error(`Unknown integration: ${t}`);if(!n)throw new Error("Credentials must not be empty");await this.secretStore.store(e,t,n);let i={fleetId:e,integrationId:t,status:"connected",connectedAt:new Date};return this.storage.saveConnection(i),i}disconnect(e,t){this.secretStore.delete(e,t),this.storage.deleteConnection(e,t)}getStatus(e,t){let n=this.storage.getConnection(e,t);return n||{fleetId:e,integrationId:t,status:"disconnected",connectedAt:null}}grantAccess(e,t){if(!D.find(o=>o.id===t))throw new Error(`Unknown integration: ${t}`);this.storage.saveWorkspaceGrant({workspaceId:e,integrationId:t,grantedAt:new Date})}revokeAccess(e,t){this.storage.deleteWorkspaceGrant(e,t)}getWorkspaceIntegrations(e){return this.storage.listWorkspaceGrants(e)}};function K(r){let e=r??new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()}function V(r){let e=r??new Date;return new Date(e.getFullYear(),e.getMonth(),1).getTime()}var Y=class{constructor(e,t){this.config=e;this.costTracker=t}entries=[];handlers=new Set;recordCost(e,t){this.entries.push({workspaceId:e,amount:t,timestamp:Date.now()})}getCostToday(){let e=K(),t=0;for(let n of this.entries)n.timestamp>=e&&(t+=n.amount);return t}getCostThisMonth(){let e=V(),t=0;for(let n of this.entries)n.timestamp>=e&&(t+=n.amount);return t}getWorkspaceCost(e,t){let n=t==="day"?K():V(),o=0;for(let i of this.entries)i.workspaceId===e&&i.timestamp>=n&&(o+=i.amount);return o}canSpend(e,t){if(this.config.dailyLimit>0){let o=this.getCostToday()+t;if(o>this.config.dailyLimit)return this.notifyExceeded({workspaceId:e,type:"fleet_daily",current:o,limit:this.config.dailyLimit}),!1}if(this.config.monthlyLimit>0){let o=this.getCostThisMonth()+t;if(o>this.config.monthlyLimit)return this.notifyExceeded({workspaceId:e,type:"fleet_monthly",current:o,limit:this.config.monthlyLimit}),!1}let n=this.config.perWorkspaceDailyLimit;if(n&&n>0){let o=this.getWorkspaceCost(e,"day")+t;if(o>n)return this.notifyExceeded({workspaceId:e,type:"workspace_daily",current:o,limit:n}),!1}return!0}onBudgetExceeded(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}getBreakdown(){let e=new Map,t=K(),n=V();for(let o of this.entries){let i=e.get(o.workspaceId);i||(i={daily:0,monthly:0},e.set(o.workspaceId,i)),o.timestamp>=n&&(i.monthly+=o.amount),o.timestamp>=t&&(i.daily+=o.amount)}return e}notifyExceeded(e){for(let t of this.handlers)try{t(e)}catch{}}};function $e(){return`task_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}async function fe(r,e,t){let n=r.taskQueue.filter(l=>l.status==="pending").length,o=r.taskQueue.filter(l=>l.status==="completed").length,i=r.taskQueue.filter(l=>l.status==="failed").length,s=_e(r,n,o,i),a=await e(s),d=je(a),c=[];for(let l of d.newTasks){let p={id:$e(),workspaceId:r.workspaceId,title:l.title,description:l.description,scope:l.scope,status:l.assignToWorkerId?"assigned":"pending",assignedWorkerIds:l.assignToWorkerId?[l.assignToWorkerId]:[],createdAt:new Date};c.push(p),t?.("planner:task-created",{taskId:p.id,title:p.title,scope:p.scope,workspaceId:r.workspaceId})}return d.spawnSubPlanner&&t?.("planner:sub-planner-requested",{domain:d.spawnSubPlanner.domain,scope:d.spawnSubPlanner.scope,parentWorkspaceId:r.workspaceId}),c}function he(r,e,t){return r.status="assigned",r.assignedWorkerIds=[e],t?.("planner:task-assigned",{taskId:r.id,workerId:e}),r}function _e(r,e,t,n){let o=r.taskQueue.slice(-10).map(i=>`- [${i.status}] ${i.title} (${i.scope})`).join(`
524
- `);return`You are a Planner agent for workspace ${r.workspaceId}.
901
+ ID: ${o.id}`;await this.notifier.send(this.config.notifyChannel,s).catch(()=>{})}return o}async list(e){return this.storage.listApprovals(e??{})}async approve(e,r){let t=await this.storage.getApproval(e);if(!t)throw new Error(`Approval item "${e}" not found`);if(t.status!=="pending")throw new Error(`Cannot approve item with status "${t.status}"`);let o=await this.executor.execute(t.toolCall),s={status:"approved",resolvedAt:new Date,resolvedBy:r??null};await this.storage.updateApproval(e,s);let i={...t,...s};return this.emit("approval:approved",i),{item:i,result:o}}async reject(e,r,t){let o=await this.storage.getApproval(e);if(!o)throw new Error(`Approval item "${e}" not found`);if(o.status!=="pending")throw new Error(`Cannot reject item with status "${o.status}"`);let s={status:"rejected",resolvedAt:new Date,resolvedBy:t??null,notes:r??null};await this.storage.updateApproval(e,s);let i={...o,...s};return this.emit("approval:rejected",i),i}async edit(e,r,t){let o=await this.storage.getApproval(e);if(!o)throw new Error(`Approval item "${e}" not found`);if(o.status!=="pending")throw new Error(`Cannot edit item with status "${o.status}"`);let s={status:"edited",resolvedAt:new Date,resolvedBy:t??null,notes:r};await this.storage.updateApproval(e,s);let i={...o,...s};return this.emit("approval:edited",i),i}async expireStale(){let e=await this.storage.listApprovals({status:"pending"}),r=new Date,t=[];for(let o of e)if(o.expiresAt<=r){let s={status:"expired",resolvedAt:r};await this.storage.updateApproval(o.id,s);let i={...o,...s};this.emit("approval:expired",i),t.push(i)}return t}};async function Yo(n,e,r,t=5){return await n.countConsecutiveApprovals(e,r)>=t}var De=[{id:"gmail",name:"Gmail",protocol:"MCP",authMethod:"oauth2",capabilities:["email.read","email.send","email.draft"]},{id:"google-calendar",name:"Google Calendar",protocol:"MCP",authMethod:"oauth2",capabilities:["calendar.read","calendar.write","calendar.schedule"]},{id:"facebook",name:"Facebook",protocol:"MCP",authMethod:"oauth2",capabilities:["social.post","social.read"]},{id:"instagram",name:"Instagram",protocol:"MCP",authMethod:"oauth2",capabilities:["social.post","social.read"]},{id:"linkedin",name:"LinkedIn",protocol:"MCP",authMethod:"oauth2",capabilities:["social.post","social.read"]},{id:"x-twitter",name:"X (Twitter)",protocol:"MCP",authMethod:"api_key",capabilities:["social.post","social.read"]},{id:"notion",name:"Notion",protocol:"MCP",authMethod:"api_key",capabilities:["docs.read","docs.write"]},{id:"slack",name:"Slack",protocol:"MCP",authMethod:"oauth2",capabilities:["messaging.send","messaging.read"]},{id:"wordpress",name:"WordPress",protocol:"builtin",authMethod:"api_key",capabilities:["publish.post","publish.page"]}];function Qo(){let n=new Map,e=new Map;function r(o,s){return`${o}:${s}`}function t(o,s){return`${o}:${s}`}return{getConnection(o,s){return n.get(r(o,s))},saveConnection(o){n.set(r(o.fleetId,o.integrationId),o)},deleteConnection(o,s){return n.delete(r(o,s))},listConnections(o){let s=[];for(let i of n.values())i.fleetId===o&&s.push(i);return s},getWorkspaceGrant(o,s){return e.get(t(o,s))},saveWorkspaceGrant(o){e.set(t(o.workspaceId,o.integrationId),o)},deleteWorkspaceGrant(o,s){return e.delete(t(o,s))},listWorkspaceGrants(o){let s=[];for(let i of e.values())i.workspaceId===o&&s.push(i);return s}}}var jt=class{constructor(e,r){this.storage=e;this.secretStore=r}listAvailable(){return De}async connect(e,r,t){if(!De.find(i=>i.id===r))throw new Error(`Unknown integration: ${r}`);if(!t)throw new Error("Credentials must not be empty");await this.secretStore.store(e,r,t);let s={fleetId:e,integrationId:r,status:"connected",connectedAt:new Date};return this.storage.saveConnection(s),s}disconnect(e,r){this.secretStore.delete(e,r),this.storage.deleteConnection(e,r)}getStatus(e,r){let t=this.storage.getConnection(e,r);return t||{fleetId:e,integrationId:r,status:"disconnected",connectedAt:null}}grantAccess(e,r){if(!De.find(o=>o.id===r))throw new Error(`Unknown integration: ${r}`);this.storage.saveWorkspaceGrant({workspaceId:e,integrationId:r,grantedAt:new Date})}revokeAccess(e,r){this.storage.deleteWorkspaceGrant(e,r)}getWorkspaceIntegrations(e){return this.storage.listWorkspaceGrants(e)}};function Wt(n){let e=n??new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()}function qt(n){let e=n??new Date;return new Date(e.getFullYear(),e.getMonth(),1).getTime()}var Ht=class{constructor(e,r){this.config=e;this.costTracker=r}entries=[];handlers=new Set;recordCost(e,r){this.entries.push({workspaceId:e,amount:r,timestamp:Date.now()})}getCostToday(){let e=Wt(),r=0;for(let t of this.entries)t.timestamp>=e&&(r+=t.amount);return r}getCostThisMonth(){let e=qt(),r=0;for(let t of this.entries)t.timestamp>=e&&(r+=t.amount);return r}getWorkspaceCost(e,r){let t=r==="day"?Wt():qt(),o=0;for(let s of this.entries)s.workspaceId===e&&s.timestamp>=t&&(o+=s.amount);return o}canSpend(e,r){if(this.config.dailyLimit>0){let o=this.getCostToday()+r;if(o>this.config.dailyLimit)return this.notifyExceeded({workspaceId:e,type:"fleet_daily",current:o,limit:this.config.dailyLimit}),!1}if(this.config.monthlyLimit>0){let o=this.getCostThisMonth()+r;if(o>this.config.monthlyLimit)return this.notifyExceeded({workspaceId:e,type:"fleet_monthly",current:o,limit:this.config.monthlyLimit}),!1}let t=this.config.perWorkspaceDailyLimit;if(t&&t>0){let o=this.getWorkspaceCost(e,"day")+r;if(o>t)return this.notifyExceeded({workspaceId:e,type:"workspace_daily",current:o,limit:t}),!1}return!0}onBudgetExceeded(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}getBreakdown(){let e=new Map,r=Wt(),t=qt();for(let o of this.entries){let s=e.get(o.workspaceId);s||(s={daily:0,monthly:0},e.set(o.workspaceId,s)),o.timestamp>=t&&(s.monthly+=o.amount),o.timestamp>=r&&(s.daily+=o.amount)}return e}notifyExceeded(e){for(let r of this.handlers)try{r(e)}catch{}}};function Xo(){return`task_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}async function Qn(n,e,r){let t=n.taskQueue.filter(d=>d.status==="pending").length,o=n.taskQueue.filter(d=>d.status==="completed").length,s=n.taskQueue.filter(d=>d.status==="failed").length,i=Zo(n,t,o,s),a=await e(i),c=es(a),l=[];for(let d of c.newTasks){let u={id:Xo(),workspaceId:n.workspaceId,title:d.title,description:d.description,scope:d.scope,status:d.assignToWorkerId?"assigned":"pending",assignedWorkerIds:d.assignToWorkerId?[d.assignToWorkerId]:[],createdAt:new Date};l.push(u),r?.("planner:task-created",{taskId:u.id,title:u.title,scope:u.scope,workspaceId:n.workspaceId})}return c.spawnSubPlanner&&r?.("planner:sub-planner-requested",{domain:c.spawnSubPlanner.domain,scope:c.spawnSubPlanner.scope,parentWorkspaceId:n.workspaceId}),l}function Xn(n,e,r){return n.status="assigned",n.assignedWorkerIds=[e],r?.("planner:task-assigned",{taskId:n.id,workerId:e}),n}function Zo(n,e,r,t){let o=n.taskQueue.slice(-10).map(s=>`- [${s.status}] ${s.title} (${s.scope})`).join(`
902
+ `);return`You are a Planner agent for workspace ${n.workspaceId}.
525
903
  Your role: decompose goals into tasks and assign them to workers. Never execute tasks yourself.
526
904
 
527
905
  ## Current State
528
- - Available workers: ${r.workerIds.length} (${r.workerIds.join(", ")})
906
+ - Available workers: ${n.workerIds.length} (${n.workerIds.join(", ")})
529
907
  - Pending tasks: ${e}
530
- - Completed tasks: ${t}
531
- - Failed tasks: ${n}
532
- ${r.roleConfig.taskScope?`- Task scope: ${r.roleConfig.taskScope}`:""}
908
+ - Completed tasks: ${r}
909
+ - Failed tasks: ${t}
910
+ ${n.roleConfig.taskScope?`- Task scope: ${n.roleConfig.taskScope}`:""}
533
911
 
534
912
  ## Recent Tasks
535
913
  ${o||"(none)"}
@@ -538,101 +916,101 @@ ${o||"(none)"}
538
916
  Analyze the current state and output JSON:
539
917
  {"newTasks": [{"title": "...", "description": "...", "scope": "...", "assignToWorkerId": "..."}], "spawnSubPlanner": null}
540
918
 
541
- Only create tasks if there is meaningful work to do. If all goals are met, output empty newTasks.`}function je(r){try{let e=r.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]);return{newTasks:Array.isArray(t.newTasks)?t.newTasks:[],spawnSubPlanner:t.spawnSubPlanner??void 0}}}catch{}return{newTasks:[]}}async function ye(r,e,t,n){if(r.loopWarningCount>=3){let o={taskId:e.id,workerId:r.workspaceId,reason:`Loop warning threshold reached (${r.loopWarningCount} warnings)`,context:e.description};return n?.("escalation:requested",{...o,suggestOracle:!0}),e.status="escalated",{task:e,output:null,escalated:!0}}e.status="running",n?.("worker:task-started",{taskId:e.id,workspaceId:r.workspaceId});try{let o=await t(e);return e.status="completed",e.result=o,e.completedAt=new Date,n?.("worker:task-completed",{taskId:e.id,workspaceId:r.workspaceId}),{task:e,output:o,escalated:!1}}catch(o){return e.status="failed",e.error=o instanceof Error?o.message:String(o),n?.("worker:task-failed",{taskId:e.id,workspaceId:r.workspaceId,error:e.error}),{task:e,output:null,escalated:!1}}}function we(r,e){let t=r.filter(o=>!(o.status!=="pending"&&o.status!=="assigned"||o.status==="assigned"&&!o.assignedWorkerIds.includes(e.workspaceId)||e.taskScope&&o.scope!==e.taskScope)),n=t.find(o=>o.assignedWorkerIds.includes(e.workspaceId));return n||(t.sort((o,i)=>o.createdAt.getTime()-i.createdAt.getTime())[0]??null)}function ke(r,e,t){return{taskId:r.id,workerId:e,reason:t,context:`Task: ${r.title}
542
- Description: ${r.description}
543
- Scope: ${r.scope}`}}var Q={completionThreshold:.9,maxErrorRate:.2,requireHumanApproval:!1};async function ve(r,e=Q,t,n){let o=r.tasks.length;if(o===0)return{verdict:"cycle:complete",goalAchievementRate:1,openTaskCount:0,workerErrorRate:0,notes:"No tasks in cycle \u2014 trivially complete."};let i=r.tasks.filter(g=>g.status==="completed").length,s=r.tasks.filter(g=>g.status==="failed").length,a=r.tasks.filter(g=>g.status==="pending"||g.status==="assigned"||g.status==="running").length,d=i/o,c=o>0?s/o:0,l,p;if(d>=e.completionThreshold&&a===0?(l="cycle:complete",p=`Achievement rate ${(d*100).toFixed(0)}% meets threshold.`):c>e.maxErrorRate?(l="cycle:escalate",p=`Error rate ${(c*100).toFixed(0)}% exceeds max ${(e.maxErrorRate*100).toFixed(0)}%.`):a>0?(l="cycle:continue",p=`${a} tasks still open. Achievement at ${(d*100).toFixed(0)}%.`):(l="cycle:continue",p=`Achievement rate ${(d*100).toFixed(0)}% below threshold ${(e.completionThreshold*100).toFixed(0)}%.`),t&&r.roleConfig.evaluationCriteria?.length){let g=await He(r,t);g&&(p+=` LLM evaluation: ${g}`)}let h={verdict:l,goalAchievementRate:d,openTaskCount:a,workerErrorRate:c,notes:p};return n?.(l,{workspaceId:r.workspaceId,...h,requiresApproval:l==="cycle:escalate"&&e.requireHumanApproval}),h}function Ce(r){return r.some(e=>e.status==="pending"||e.status==="assigned"||e.status==="running")}async function He(r,e){let t=r.roleConfig.evaluationCriteria?.join(`
544
- - `)??"",n=r.tasks.map(i=>`[${i.status}] ${i.title}: ${i.error??"ok"}`).join(`
919
+ Only create tasks if there is meaningful work to do. If all goals are met, output empty newTasks.`}function es(n){try{let e=n.match(/\{[\s\S]*\}/);if(e){let r=JSON.parse(e[0]);return{newTasks:Array.isArray(r.newTasks)?r.newTasks:[],spawnSubPlanner:r.spawnSubPlanner??void 0}}}catch{}return{newTasks:[]}}async function Zn(n,e,r,t){if(n.loopWarningCount>=3){let o={taskId:e.id,workerId:n.workspaceId,reason:`Loop warning threshold reached (${n.loopWarningCount} warnings)`,context:e.description};return t?.("escalation:requested",{...o,suggestOracle:!0}),e.status="escalated",{task:e,output:null,escalated:!0}}e.status="running",t?.("worker:task-started",{taskId:e.id,workspaceId:n.workspaceId});try{let o=await r(e);return e.status="completed",e.result=o,e.completedAt=new Date,t?.("worker:task-completed",{taskId:e.id,workspaceId:n.workspaceId}),{task:e,output:o,escalated:!1}}catch(o){return e.status="failed",e.error=o instanceof Error?o.message:String(o),t?.("worker:task-failed",{taskId:e.id,workspaceId:n.workspaceId,error:e.error}),{task:e,output:null,escalated:!1}}}function er(n,e){let r=n.filter(o=>!(o.status!=="pending"&&o.status!=="assigned"||o.status==="assigned"&&!o.assignedWorkerIds.includes(e.workspaceId)||e.taskScope&&o.scope!==e.taskScope)),t=r.find(o=>o.assignedWorkerIds.includes(e.workspaceId));return t||(r.sort((o,s)=>o.createdAt.getTime()-s.createdAt.getTime())[0]??null)}function tr(n,e,r){return{taskId:n.id,workerId:e,reason:r,context:`Task: ${n.title}
920
+ Description: ${n.description}
921
+ Scope: ${n.scope}`}}var Jt={completionThreshold:.9,maxErrorRate:.2,requireHumanApproval:!1};async function nr(n,e=Jt,r,t){let o=n.tasks.length;if(o===0)return{verdict:"cycle:complete",goalAchievementRate:1,openTaskCount:0,workerErrorRate:0,notes:"No tasks in cycle \u2014 trivially complete."};let s=n.tasks.filter(g=>g.status==="completed").length,i=n.tasks.filter(g=>g.status==="failed").length,a=n.tasks.filter(g=>g.status==="pending"||g.status==="assigned"||g.status==="running").length,c=s/o,l=o>0?i/o:0,d,u;if(c>=e.completionThreshold&&a===0?(d="cycle:complete",u=`Achievement rate ${(c*100).toFixed(0)}% meets threshold.`):l>e.maxErrorRate?(d="cycle:escalate",u=`Error rate ${(l*100).toFixed(0)}% exceeds max ${(e.maxErrorRate*100).toFixed(0)}%.`):a>0?(d="cycle:continue",u=`${a} tasks still open. Achievement at ${(c*100).toFixed(0)}%.`):(d="cycle:continue",u=`Achievement rate ${(c*100).toFixed(0)}% below threshold ${(e.completionThreshold*100).toFixed(0)}%.`),r&&n.roleConfig.evaluationCriteria?.length){let g=await ts(n,r);g&&(u+=` LLM evaluation: ${g}`)}let m={verdict:d,goalAchievementRate:c,openTaskCount:a,workerErrorRate:l,notes:u};return t?.(d,{workspaceId:n.workspaceId,...m,requiresApproval:d==="cycle:escalate"&&e.requireHumanApproval}),m}function rr(n){return n.some(e=>e.status==="pending"||e.status==="assigned"||e.status==="running")}async function ts(n,e){let r=n.roleConfig.evaluationCriteria?.join(`
922
+ - `)??"",t=n.tasks.map(s=>`[${s.status}] ${s.title}: ${s.error??"ok"}`).join(`
545
923
  `),o=`Evaluate this planning cycle against the criteria below.
546
924
 
547
925
  ## Criteria
548
- - ${t}
926
+ - ${r}
549
927
 
550
928
  ## Tasks
551
- ${n}
929
+ ${t}
552
930
 
553
- Provide a one-sentence evaluation summary.`;try{return await e(o)}catch{return null}}var be={slot:"oracle",maxTokensIn:2e3,maxTokensOut:500,invocationBudget:5},X=class{config;llmCall;recordCost;emit;sessionInvocations=new Map;constructor(e={},t,n){this.config={...be,...e},this.llmCall=t,this.recordCost=n?.recordCost??null,this.emit=n?.emit??null}async consult(e){let t=this.sessionInvocations.get(e.sessionId)??0;if(t>=this.config.invocationBudget)throw new M(e.sessionId,t,this.config.invocationBudget);let n=this.config.maxTokensIn*4,o=e.contextExcerpt.length>n?e.contextExcerpt.slice(0,n)+`
554
- [...truncated]`:e.contextExcerpt,i=Ue(e.problem,o,e.question),s=await this.llmCall(i,this.config.maxTokensOut),a=`oracle_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return this.sessionInvocations.set(e.sessionId,t+1),this.recordCost?.(s.tokensUsed,"oracle_spend",e.sessionId),this.emit?.("oracle:consultation-completed",{consultationId:a,workerId:e.workerId,sessionId:e.sessionId,tokensCost:s.tokensUsed,invocationNumber:t+1,budgetRemaining:this.config.invocationBudget-t-1}),{guidance:s.text,tokensCost:s.tokensUsed,consultationId:a}}formatGuidanceBlock(e){return`## Oracle Guidance
931
+ Provide a one-sentence evaluation summary.`;try{return await e(o)}catch{return null}}var or={slot:"oracle",maxTokensIn:2e3,maxTokensOut:500,invocationBudget:5},Gt=class{config;llmCall;recordCost;emit;sessionInvocations=new Map;constructor(e={},r,t){this.config={...or,...e},this.llmCall=r,this.recordCost=t?.recordCost??null,this.emit=t?.emit??null}async consult(e){let r=this.sessionInvocations.get(e.sessionId)??0;if(r>=this.config.invocationBudget)throw new Oe(e.sessionId,r,this.config.invocationBudget);let t=this.config.maxTokensIn*4,o=e.contextExcerpt.length>t?e.contextExcerpt.slice(0,t)+`
932
+ [...truncated]`:e.contextExcerpt,s=ns(e.problem,o,e.question),i=await this.llmCall(s,this.config.maxTokensOut),a=`oracle_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return this.sessionInvocations.set(e.sessionId,r+1),this.recordCost?.(i.tokensUsed,"oracle_spend",e.sessionId),this.emit?.("oracle:consultation-completed",{consultationId:a,workerId:e.workerId,sessionId:e.sessionId,tokensCost:i.tokensUsed,invocationNumber:r+1,budgetRemaining:this.config.invocationBudget-r-1}),{guidance:i.text,tokensCost:i.tokensUsed,consultationId:a}}formatGuidanceBlock(e){return`## Oracle Guidance
555
933
  _Consultation ${e.consultationId}_
556
934
 
557
- ${e.guidance}`}getRemainingBudget(e){let t=this.sessionInvocations.get(e)??0;return Math.max(0,this.config.invocationBudget-t)}resetSession(e){this.sessionInvocations.delete(e)}};function Ue(r,e,t){return`You are an Oracle \u2014 a high-capability strategic advisor. A worker agent is stuck and needs your guidance.
935
+ ${e.guidance}`}getRemainingBudget(e){let r=this.sessionInvocations.get(e)??0;return Math.max(0,this.config.invocationBudget-r)}resetSession(e){this.sessionInvocations.delete(e)}};function ns(n,e,r){return`You are an Oracle \u2014 a high-capability strategic advisor. A worker agent is stuck and needs your guidance.
558
936
 
559
937
  ## Problem
560
- ${r}
938
+ ${n}
561
939
 
562
940
  ## Relevant Context
563
941
  ${e}
564
942
 
565
943
  ## Question
566
- ${t}
944
+ ${r}
567
945
 
568
- Provide concise, actionable strategic guidance. Focus on unblocking the worker. Do not repeat the problem statement.`}var M=class extends Error{constructor(t,n,o){super(`Oracle budget exceeded for session ${t}: ${n}/${o} invocations used`);this.sessionId=t;this.used=n;this.budget=o;this.name="OracleBudgetExceededError"}};var xe={k:3,minJudgeConfidence:.7,maxDepth:3},Z=class{config;execute;judge;investigate;checkBudget;emit;constructor(e={},t){this.config={...xe,...e},this.execute=t.execute,this.judge=t.judge,this.investigate=t.investigate??null,this.checkBudget=t.checkBudget??null,this.emit=t.emit??null}async select(e,t=0){if(t>=this.config.maxDepth)throw new Error(`Best-of-N max depth ${this.config.maxDepth} reached for task ${e.id}`);if(this.checkBudget&&!this.checkBudget(this.config.k))throw new L(e.id,this.config.k);this.emit?.("bestofn:spawning-candidates",{taskId:e.id,k:this.config.k,depth:t});let n=Array.from({length:this.config.k},(p,h)=>`candidate_${e.id}_${h}_${Math.random().toString(36).slice(2,6)}`),i=(await Promise.allSettled(n.map(p=>this.execute(e,p)))).filter(p=>p.status==="fulfilled").map(p=>p.value);if(i.length===0)throw new Error(`All ${this.config.k} candidates failed for task ${e.id}`);let s=await this.judge(i,this.config.judgePrompt),a=[...s].sort((p,h)=>h.score-p.score),d=a[0],c=!1;if(d.confidence<this.config.minJudgeConfidence&&this.investigate){this.emit?.("bestofn:low-confidence-investigating",{taskId:e.id,topConfidence:d.confidence,threshold:this.config.minJudgeConfidence});let p=await this.investigate(e,i,s),h=await this.judge(i,`${this.config.judgePrompt??""}
946
+ Provide concise, actionable strategic guidance. Focus on unblocking the worker. Do not repeat the problem statement.`}var Oe=class extends Error{constructor(r,t,o){super(`Oracle budget exceeded for session ${r}: ${t}/${o} invocations used`);this.sessionId=r;this.used=t;this.budget=o;this.name="OracleBudgetExceededError"}};var sr={k:3,minJudgeConfidence:.7,maxDepth:3},Kt=class{config;execute;judge;investigate;checkBudget;emit;constructor(e={},r){this.config={...sr,...e},this.execute=r.execute,this.judge=r.judge,this.investigate=r.investigate??null,this.checkBudget=r.checkBudget??null,this.emit=r.emit??null}async select(e,r=0){if(r>=this.config.maxDepth)throw new Error(`Best-of-N max depth ${this.config.maxDepth} reached for task ${e.id}`);if(this.checkBudget&&!this.checkBudget(this.config.k))throw new Le(e.id,this.config.k);this.emit?.("bestofn:spawning-candidates",{taskId:e.id,k:this.config.k,depth:r});let t=Array.from({length:this.config.k},(u,m)=>`candidate_${e.id}_${m}_${Math.random().toString(36).slice(2,6)}`),s=(await Promise.allSettled(t.map(u=>this.execute(e,u)))).filter(u=>u.status==="fulfilled").map(u=>u.value);if(s.length===0)throw new Error(`All ${this.config.k} candidates failed for task ${e.id}`);let i=await this.judge(s,this.config.judgePrompt),a=[...i].sort((u,m)=>m.score-u.score),c=a[0],l=!1;if(c.confidence<this.config.minJudgeConfidence&&this.investigate){this.emit?.("bestofn:low-confidence-investigating",{taskId:e.id,topConfidence:c.confidence,threshold:this.config.minJudgeConfidence});let u=await this.investigate(e,s,i),m=await this.judge(s,`${this.config.judgePrompt??""}
569
947
 
570
948
  Additional context from investigation:
571
- ${p}`),g=[...h].sort((m,C)=>C.score-m.score),u=i.find(m=>m.candidateId===g[0].candidateId);return this.emit?.("bestofn:winner-selected",{taskId:e.id,winnerId:u.candidateId,score:g[0].score,confidence:g[0].confidence,reranAfterInvestigation:!0}),{winner:u,scores:h,depth:t,reranAfterInvestigation:!0}}let l=i.find(p=>p.candidateId===d.candidateId);return this.emit?.("bestofn:winner-selected",{taskId:e.id,winnerId:l.candidateId,score:d.score,confidence:d.confidence,reranAfterInvestigation:c}),{winner:l,scores:a,depth:t,reranAfterInvestigation:c}}},L=class extends Error{constructor(t,n){super(`Budget exceeded: cannot spawn ${n} candidates for task ${t}`);this.taskId=t;this.candidatesRequested=n;this.name="BudgetExceededError"}};var Ge={rounds:2,requireApproval:!1};async function qe(r,e,t){let n=[],o=0,i=r.advocatePrompt??"You are an Advocate. Propose and defend a solution. Be specific and actionable.",s=r.criticPrompt??"You are a Critic. Challenge assumptions, find failure modes, and identify risks. Be thorough but constructive.",a=await e("advocate",Ie(i,r.topic,r.context,null));o++;for(let l=1;l<=r.rounds;l++){t?.("debate:round-started",{round:l,topic:r.topic});let p=await e("critic",Je(s,r.topic,r.context,a));o++,n.push({roundNumber:l,advocateArgument:a,criticChallenge:p}),l<r.rounds&&(a=await e("advocate",Ie(i,r.topic,r.context,p)),o++),t?.("debate:round-completed",{round:l,topic:r.topic})}let d=await e("synthesizer",ze(r.topic,n));o++;let c=Ke(r.topic,n,d,o);return t?.("debate:completed",{topic:r.topic,rounds:r.rounds,llmCallCount:o,requiresApproval:r.requireApproval??!1}),c}function Ie(r,e,t,n){let o=`${r}
949
+ ${u}`),g=[...m].sort((f,v)=>v.score-f.score),p=s.find(f=>f.candidateId===g[0].candidateId);return this.emit?.("bestofn:winner-selected",{taskId:e.id,winnerId:p.candidateId,score:g[0].score,confidence:g[0].confidence,reranAfterInvestigation:!0}),{winner:p,scores:m,depth:r,reranAfterInvestigation:!0}}let d=s.find(u=>u.candidateId===c.candidateId);return this.emit?.("bestofn:winner-selected",{taskId:e.id,winnerId:d.candidateId,score:c.score,confidence:c.confidence,reranAfterInvestigation:l}),{winner:d,scores:a,depth:r,reranAfterInvestigation:l}}},Le=class extends Error{constructor(r,t){super(`Budget exceeded: cannot spawn ${t} candidates for task ${r}`);this.taskId=r;this.candidatesRequested=t;this.name="BudgetExceededError"}};var rs={rounds:2,requireApproval:!1};async function os(n,e,r){let t=[],o=0,s=n.advocatePrompt??"You are an Advocate. Propose and defend a solution. Be specific and actionable.",i=n.criticPrompt??"You are a Critic. Challenge assumptions, find failure modes, and identify risks. Be thorough but constructive.",a=await e("advocate",ir(s,n.topic,n.context,null));o++;for(let d=1;d<=n.rounds;d++){r?.("debate:round-started",{round:d,topic:n.topic});let u=await e("critic",ss(i,n.topic,n.context,a));o++,t.push({roundNumber:d,advocateArgument:a,criticChallenge:u}),d<n.rounds&&(a=await e("advocate",ir(s,n.topic,n.context,u)),o++),r?.("debate:round-completed",{round:d,topic:n.topic})}let c=await e("synthesizer",is(n.topic,t));o++;let l=as(n.topic,t,c,o);return r?.("debate:completed",{topic:n.topic,rounds:n.rounds,llmCallCount:o,requiresApproval:n.requireApproval??!1}),l}function ir(n,e,r,t){let o=`${n}
572
950
 
573
951
  ## Topic
574
952
  ${e}
575
953
 
576
954
  ## Context
577
- ${t}`;return n?o+=`
955
+ ${r}`;return t?o+=`
578
956
 
579
957
  ## Critic's Challenge
580
- ${n}
958
+ ${t}
581
959
 
582
960
  Respond to the critic's challenges. Strengthen your proposal where valid, concede where the critic is right.`:o+=`
583
961
 
584
- Propose a solution and defend it.`,o}function Je(r,e,t,n){return`${r}
962
+ Propose a solution and defend it.`,o}function ss(n,e,r,t){return`${n}
585
963
 
586
964
  ## Topic
587
965
  ${e}
588
966
 
589
967
  ## Context
590
- ${t}
968
+ ${r}
591
969
 
592
970
  ## Advocate's Proposal
593
- ${n}
971
+ ${t}
594
972
 
595
- Challenge the advocate's assumptions and identify failure modes.`}function ze(r,e){let t=e.map(n=>`### Round ${n.roundNumber}
596
- **Advocate:** ${n.advocateArgument}
973
+ Challenge the advocate's assumptions and identify failure modes.`}function is(n,e){let r=e.map(t=>`### Round ${t.roundNumber}
974
+ **Advocate:** ${t.advocateArgument}
597
975
 
598
- **Critic:** ${n.criticChallenge}`).join(`
976
+ **Critic:** ${t.criticChallenge}`).join(`
599
977
 
600
978
  `);return`Synthesize this debate into a structured recommendation.
601
979
 
602
980
  ## Topic
603
- ${r}
981
+ ${n}
604
982
 
605
983
  ## Debate Transcript
606
- ${t}
984
+ ${r}
607
985
 
608
986
  Output JSON:
609
- {"recommendation": "...", "keyRisks": ["..."], "minorityConsiderations": ["..."]}`}function Ke(r,e,t,n){try{let o=t.match(/\{[\s\S]*\}/);if(o){let i=JSON.parse(o[0]);return{topic:r,rounds:e,recommendation:i.recommendation??t,keyRisks:Array.isArray(i.keyRisks)?i.keyRisks:[],minorityConsiderations:Array.isArray(i.minorityConsiderations)?i.minorityConsiderations:[],llmCallCount:n}}}catch{}return{topic:r,rounds:e,recommendation:t,keyRisks:[],minorityConsiderations:[],llmCallCount:n}}var Ve={agentCount:4,synthesize:!0};async function Ye(r,e,t){let n=r.agentCount??4,o=r.perspectives??tt(n);t?.("brainstorm:started",{agentCount:n,perspectives:o,prompt:r.prompt});let i=o.slice(0,n).map((p,h)=>{let g=`brainstorm_agent_${h}`,u=Qe(r.prompt,p);return e(g,u).then(m=>Xe(m,p))}),s=await Promise.allSettled(i),a=s.filter(p=>p.status==="fulfilled").flatMap(p=>p.value);if(t?.("brainstorm:ideas-collected",{totalIdeas:a.length,agentsResponded:s.filter(p=>p.status==="fulfilled").length}),!r.synthesize)return{topIdeas:a.map(p=>({...p,crossAgentFrequency:1,score:1})),allIdeas:a,themes:[],agentCount:n};let d=Ze(a),c=et(a),l=d.sort((p,h)=>h.score-p.score).slice(0,10);return t?.("brainstorm:completed",{topIdeasCount:l.length,themeCount:c.length,totalIdeas:a.length}),{topIdeas:l,allIdeas:a,themes:c,agentCount:n}}function Qe(r,e){return`You are a brainstorming agent with the perspective: **${e}**.
987
+ {"recommendation": "...", "keyRisks": ["..."], "minorityConsiderations": ["..."]}`}function as(n,e,r,t){try{let o=r.match(/\{[\s\S]*\}/);if(o){let s=JSON.parse(o[0]);return{topic:n,rounds:e,recommendation:s.recommendation??r,keyRisks:Array.isArray(s.keyRisks)?s.keyRisks:[],minorityConsiderations:Array.isArray(s.minorityConsiderations)?s.minorityConsiderations:[],llmCallCount:t}}}catch{}return{topic:n,rounds:e,recommendation:r,keyRisks:[],minorityConsiderations:[],llmCallCount:t}}var cs={agentCount:4,synthesize:!0};async function ls(n,e,r){let t=n.agentCount??4,o=n.perspectives??ms(t);r?.("brainstorm:started",{agentCount:t,perspectives:o,prompt:n.prompt});let s=o.slice(0,t).map((u,m)=>{let g=`brainstorm_agent_${m}`,p=ds(n.prompt,u);return e(g,p).then(f=>us(f,u))}),i=await Promise.allSettled(s),a=i.filter(u=>u.status==="fulfilled").flatMap(u=>u.value);if(r?.("brainstorm:ideas-collected",{totalIdeas:a.length,agentsResponded:i.filter(u=>u.status==="fulfilled").length}),!n.synthesize)return{topIdeas:a.map(u=>({...u,crossAgentFrequency:1,score:1})),allIdeas:a,themes:[],agentCount:t};let c=ps(a),l=gs(a),d=c.sort((u,m)=>m.score-u.score).slice(0,10);return r?.("brainstorm:completed",{topIdeasCount:d.length,themeCount:l.length,totalIdeas:a.length}),{topIdeas:d,allIdeas:a,themes:l,agentCount:t}}function ds(n,e){return`You are a brainstorming agent with the perspective: **${e}**.
610
988
 
611
989
  ## Problem
612
- ${r}
990
+ ${n}
613
991
 
614
992
  ## Instructions
615
993
  Generate 3-5 creative ideas. For each idea output a JSON line:
616
994
  {"title": "...", "rationale": "...", "implementationSketch": "..."}
617
995
 
618
- Think from your assigned perspective. Be creative and specific. Output only JSON lines.`}function Xe(r,e){let t=[];for(let n of r.split(`
619
- `)){let o=n.trim();if(!(!o||!o.startsWith("{")))try{let i=JSON.parse(o);i.title&&i.rationale&&t.push({title:i.title,rationale:i.rationale,implementationSketch:i.implementationSketch??"",agentPerspective:e})}catch{}}return t}function Ze(r){return r.map(e=>{let t=new Set(e.title.toLowerCase().split(/\s+/)),n=0;for(let o of r){if(o===e||o.agentPerspective===e.agentPerspective)continue;let i=new Set(o.title.toLowerCase().split(/\s+/));[...t].filter(a=>i.has(a)&&a.length>3).length>=2&&n++}return{...e,crossAgentFrequency:n+1,score:n+1}})}function et(r){let e=new Map;for(let t of r){let n=t.title.toLowerCase().split(/\s+/).filter(s=>s.length>3),o=n.slice(0,2).join(" ")||"general",i=!1;for(let[s,a]of e){let d=new Set(s.split(" "));if(n.some(c=>d.has(c))){a.push(t),i=!0;break}}i||e.set(o,[t])}return Array.from(e.entries()).map(([t,n])=>({theme:t,ideas:n}))}function tt(r){return["technical feasibility","user experience","cost efficiency","risk assessment","scalability","innovation","simplicity","market fit"].slice(0,r)}import{execFile as nt}from"node:child_process";var Se=3e4,ee=20;async function rt(r,e,t){let n=r.timeout||Se;if(r.packagePaths&&r.packagePaths.length>1)return st(r,n,e,t);let o=Date.now(),{stdout:i,stderr:s,exitCode:a}=await Ee(r.command,n),d=Date.now()-o,c=`${i}
620
- ${s}`;await t?.(`compile-log/${r.workspaceId}/${Date.now()}`,c);let l=te(s),p=a===0,h=l.sort((u,m)=>u.line-m.line).slice(0,ee),g={workspaceId:r.workspaceId,passed:p,fileCount:r.changedFiles.length,elapsedMs:d,errors:h};return e?.(p?"compile:pass":"compile:fail",{workspaceId:r.workspaceId,fileCount:g.fileCount,elapsedMs:d,errorCount:l.length}),g}function ot(r){if(r.passed)return`Compilation passed (${r.fileCount} files, ${r.elapsedMs}ms).`;let e=[`Compilation failed \u2014 ${r.errors.length} error(s):`];for(let t of r.errors)e.push(` ${t.file}:${t.line}:${t.column} \u2014 ${t.message}`);if(r.packageResults){let t=r.packageResults.filter(n=>!n.passed);t.length&&e.push(`Failed packages: ${t.map(n=>n.packagePath).join(", ")}`)}return e.join(`
621
- `)}async function st(r,e,t,n){let o=Date.now(),s=(await Promise.allSettled(r.packagePaths.map(async l=>{let p=Date.now(),h=`cd ${l} && ${r.command}`,{stderr:g,exitCode:u}=await Ee(h,e),m=te(g);return await n?.(`compile-log/${r.workspaceId}/${l}/${Date.now()}`,g),{packagePath:l,passed:u===0,errors:m.slice(0,ee),elapsedMs:Date.now()-p}}))).filter(l=>l.status==="fulfilled").map(l=>l.value),a=s.flatMap(l=>l.errors).slice(0,ee),d=s.every(l=>l.passed),c={workspaceId:r.workspaceId,passed:d,fileCount:r.changedFiles.length,elapsedMs:Date.now()-o,errors:a,packageResults:s};return t?.(d?"compile:pass":"compile:fail",{workspaceId:r.workspaceId,packageCount:s.length,failedPackages:s.filter(l=>!l.passed).length,elapsedMs:c.elapsedMs}),c}function te(r){let e=[],t=[/^(.+?)\((\d+),(\d+)\):\s*(error|warning)\s+(.+)$/gm,/^(.+?):(\d+):(\d+):\s*(error|warning):?\s*(.+)$/gm];for(let n of t){let o;for(;(o=n.exec(r))!==null;)e.push({file:o[1].trim(),line:parseInt(o[2],10),column:parseInt(o[3],10),severity:o[4],message:o[5].trim()})}return e}function Ee(r,e){return new Promise(t=>{let[n,...o]=r.split(/\s+/);nt(n,o,{timeout:e,shell:!0,maxBuffer:4*1024*1024},(s,a,d)=>{t({stdout:a??"",stderr:d??"",exitCode:s?s.code??1:0})}).on("error",()=>{t({stdout:"",stderr:"Failed to spawn process",exitCode:1})})})}async function it(r,e,t){let n=(r.recentToolCalls??[]).slice(-50);t?.("handoff:generating-summary",{taskId:r.taskId,toolCallCount:n.length,trigger:r.trigger});let o=n.map(p=>`[${p.tool}] ${p.input.slice(0,200)} \u2192 ${p.output.slice(0,200)}`).join(`
622
- `),i=await e(lt(o)),s=dt(n),a=pt(n),d=ut(n),c=[];r.gitBranch&&c.push(`branch: ${r.gitBranch}`),r.modifiedFiles&&c.push(...r.modifiedFiles.map(p=>`file: ${p}`));let l={taskId:r.taskId,completedSteps:s,currentState:a,openQuestions:d,artifacts:c,suggestedNextActions:gt(s,d),compressedContext:i};return t?.("handoff:summary-ready",{taskId:r.taskId,stepsCount:s.length,questionsCount:d.length,artifactsCount:c.length}),l}function at(r){return[`# Handoff: Task ${r.taskId}`,"","## Completed Steps",...r.completedSteps.map(t=>`- ${t}`),"","## Current State",r.currentState,"","## Open Questions",...r.openQuestions.length?r.openQuestions.map(t=>`- ${t}`):["(none)"],"","## Artifacts",...r.artifacts.map(t=>`- ${t}`),"","## Suggested Next Actions",...r.suggestedNextActions.map(t=>`- ${t}`),"","## Working Context (compressed)",r.compressedContext].join(`
623
- `)}async function ct(r,e){await e(`handoff/${r.taskId}`,JSON.stringify(r,null,2))}function lt(r){return`Compress the following agent tool call log into a concise summary.
996
+ Think from your assigned perspective. Be creative and specific. Output only JSON lines.`}function us(n,e){let r=[];for(let t of n.split(`
997
+ `)){let o=t.trim();if(!(!o||!o.startsWith("{")))try{let s=JSON.parse(o);s.title&&s.rationale&&r.push({title:s.title,rationale:s.rationale,implementationSketch:s.implementationSketch??"",agentPerspective:e})}catch{}}return r}function ps(n){return n.map(e=>{let r=new Set(e.title.toLowerCase().split(/\s+/)),t=0;for(let o of n){if(o===e||o.agentPerspective===e.agentPerspective)continue;let s=new Set(o.title.toLowerCase().split(/\s+/));[...r].filter(a=>s.has(a)&&a.length>3).length>=2&&t++}return{...e,crossAgentFrequency:t+1,score:t+1}})}function gs(n){let e=new Map;for(let r of n){let t=r.title.toLowerCase().split(/\s+/).filter(i=>i.length>3),o=t.slice(0,2).join(" ")||"general",s=!1;for(let[i,a]of e){let c=new Set(i.split(" "));if(t.some(l=>c.has(l))){a.push(r),s=!0;break}}s||e.set(o,[r])}return Array.from(e.entries()).map(([r,t])=>({theme:r,ideas:t}))}function ms(n){return["technical feasibility","user experience","cost efficiency","risk assessment","scalability","innovation","simplicity","market fit"].slice(0,n)}import{execFile as fs}from"node:child_process";var ar=3e4,Vt=20;async function hs(n,e,r){let t=n.timeout||ar;if(n.packagePaths&&n.packagePaths.length>1)return vs(n,t,e,r);let o=Date.now(),{stdout:s,stderr:i,exitCode:a}=await cr(n.command,t),c=Date.now()-o,l=`${s}
998
+ ${i}`;await r?.(`compile-log/${n.workspaceId}/${Date.now()}`,l);let d=zt(i),u=a===0,m=d.sort((p,f)=>p.line-f.line).slice(0,Vt),g={workspaceId:n.workspaceId,passed:u,fileCount:n.changedFiles.length,elapsedMs:c,errors:m};return e?.(u?"compile:pass":"compile:fail",{workspaceId:n.workspaceId,fileCount:g.fileCount,elapsedMs:c,errorCount:d.length}),g}function ys(n){if(n.passed)return`Compilation passed (${n.fileCount} files, ${n.elapsedMs}ms).`;let e=[`Compilation failed \u2014 ${n.errors.length} error(s):`];for(let r of n.errors)e.push(` ${r.file}:${r.line}:${r.column} \u2014 ${r.message}`);if(n.packageResults){let r=n.packageResults.filter(t=>!t.passed);r.length&&e.push(`Failed packages: ${r.map(t=>t.packagePath).join(", ")}`)}return e.join(`
999
+ `)}async function vs(n,e,r,t){let o=Date.now(),i=(await Promise.allSettled(n.packagePaths.map(async d=>{let u=Date.now(),m=`cd ${d} && ${n.command}`,{stderr:g,exitCode:p}=await cr(m,e),f=zt(g);return await t?.(`compile-log/${n.workspaceId}/${d}/${Date.now()}`,g),{packagePath:d,passed:p===0,errors:f.slice(0,Vt),elapsedMs:Date.now()-u}}))).filter(d=>d.status==="fulfilled").map(d=>d.value),a=i.flatMap(d=>d.errors).slice(0,Vt),c=i.every(d=>d.passed),l={workspaceId:n.workspaceId,passed:c,fileCount:n.changedFiles.length,elapsedMs:Date.now()-o,errors:a,packageResults:i};return r?.(c?"compile:pass":"compile:fail",{workspaceId:n.workspaceId,packageCount:i.length,failedPackages:i.filter(d=>!d.passed).length,elapsedMs:l.elapsedMs}),l}function zt(n){let e=[],r=[/^(.+?)\((\d+),(\d+)\):\s*(error|warning)\s+(.+)$/gm,/^(.+?):(\d+):(\d+):\s*(error|warning):?\s*(.+)$/gm];for(let t of r){let o;for(;(o=t.exec(n))!==null;)e.push({file:o[1].trim(),line:parseInt(o[2],10),column:parseInt(o[3],10),severity:o[4],message:o[5].trim()})}return e}function cr(n,e){return new Promise(r=>{let[t,...o]=n.split(/\s+/);fs(t,o,{timeout:e,shell:!0,maxBuffer:4*1024*1024},(i,a,c)=>{r({stdout:a??"",stderr:c??"",exitCode:i?i.code??1:0})}).on("error",()=>{r({stdout:"",stderr:"Failed to spawn process",exitCode:1})})})}async function bs(n,e,r){let t=(n.recentToolCalls??[]).slice(-50);r?.("handoff:generating-summary",{taskId:n.taskId,toolCallCount:t.length,trigger:n.trigger});let o=t.map(u=>`[${u.tool}] ${u.input.slice(0,200)} \u2192 ${u.output.slice(0,200)}`).join(`
1000
+ `),s=await e(Ts(o)),i=xs(t),a=Es(t),c=Cs(t),l=[];n.gitBranch&&l.push(`branch: ${n.gitBranch}`),n.modifiedFiles&&l.push(...n.modifiedFiles.map(u=>`file: ${u}`));let d={taskId:n.taskId,completedSteps:i,currentState:a,openQuestions:c,artifacts:l,suggestedNextActions:Ss(i,c),compressedContext:s};return r?.("handoff:summary-ready",{taskId:n.taskId,stepsCount:i.length,questionsCount:c.length,artifactsCount:l.length}),d}function ks(n){return[`# Handoff: Task ${n.taskId}`,"","## Completed Steps",...n.completedSteps.map(r=>`- ${r}`),"","## Current State",n.currentState,"","## Open Questions",...n.openQuestions.length?n.openQuestions.map(r=>`- ${r}`):["(none)"],"","## Artifacts",...n.artifacts.map(r=>`- ${r}`),"","## Suggested Next Actions",...n.suggestedNextActions.map(r=>`- ${r}`),"","## Working Context (compressed)",n.compressedContext].join(`
1001
+ `)}async function ws(n,e){await e(`handoff/${n.taskId}`,JSON.stringify(n,null,2))}function Ts(n){return`Compress the following agent tool call log into a concise summary.
624
1002
  Include decision rationale, not just action logs. Target 10:1 compression ratio.
625
1003
  Focus on: what was decided, why, and what state the work is in.
626
1004
 
627
1005
  ## Tool Call Log
628
- ${r}
1006
+ ${n}
629
1007
 
630
- Provide a compressed summary paragraph.`}function dt(r){let e=[];for(let t of r)t.tool==="write"||t.tool==="edit"?e.push(`Modified file via ${t.tool}`):t.tool==="bash"&&t.output.length>0?e.push(`Ran command: ${t.input.slice(0,80)}`):t.tool==="read"&&e.push(`Read file: ${t.input.slice(0,80)}`);return e.filter((t,n)=>n===0||t!==e[n-1])}function pt(r){if(r.length===0)return"No activity recorded.";let e=r[r.length-1];return`Last action: [${e.tool}] ${e.input.slice(0,150)}`}function ut(r){let e=[];for(let t of r)(t.output.includes("error")||t.output.includes("Error"))&&e.push(`Possible issue with ${t.tool}: ${t.output.slice(0,100)}`);return e.slice(0,5)}function gt(r,e){let t=[];return e.length>0&&t.push("Review and resolve open questions listed above"),r.length>0&&t.push("Verify the changes made during the background session"),t.push("Run tests to validate the current state"),t}var mt={agentCount:3,evaluationCriteria:{correctness:.5,efficiency:.3,style:.2}},ne=class{execute;judge;generateDiff;emit;constructor(e){this.execute=e.execute,this.judge=e.judge,this.generateDiff=e.generateDiff??null,this.emit=e.emit??null}async compete(e){let{taskId:t,agentCount:n,evaluationCriteria:o}=e;this.emit?.("arena:started",{taskId:t,agentCount:n});let i=Array.from({length:n},(u,m)=>`arena_${t}_${m}_${Math.random().toString(36).slice(2,6)}`),a=(await Promise.allSettled(i.map(u=>{let m=this.execute(t,u);return e.timeLimitMs?Promise.race([m,ht(e.timeLimitMs,u)]):m}))).filter(u=>u.status==="fulfilled").map(u=>u.value);if(a.length===0)throw new Error(`All ${n} arena contestants failed for task ${t}`);this.emit?.("arena:contestants-finished",{taskId:t,finished:a.length,total:n});let c=(await this.judge(a,o)).map(u=>({...u,weightedTotal:u.correctnessScore*o.correctness+u.efficiencyScore*o.efficiency+u.styleScore*o.style})),l=[...c].sort((u,m)=>m.weightedTotal-u.weightedTotal),p=a.find(u=>u.agentId===l[0].agentId),h=[];if(this.generateDiff){let u=a.filter(C=>C.agentId!==p.agentId),m=await Promise.allSettled(u.map(async C=>({winnerId:p.agentId,loserId:C.agentId,diffSummary:await this.generateDiff(p,C)})));for(let C of m)C.status==="fulfilled"&&h.push(C.value)}let g={taskId:t,winner:p,scores:c,diffs:h,allContestants:a};return this.emit?.("arena:completed",{taskId:t,winnerId:p.agentId,winnerScore:l[0].weightedTotal,contestantCount:a.length}),g}};function ft(r){let e=r.scores.sort((t,n)=>n.weightedTotal-t.weightedTotal).map((t,n)=>`${n+1}. ${t.agentId}: ${t.weightedTotal.toFixed(2)} \u2014 ${t.reasoning}`).join(`
631
- `);return{type:"arena-review",taskId:r.taskId,summary:`Arena: ${r.allContestants.length} contestants, winner=${r.winner.agentId}
1008
+ Provide a compressed summary paragraph.`}function xs(n){let e=[];for(let r of n)r.tool==="write"||r.tool==="edit"?e.push(`Modified file via ${r.tool}`):r.tool==="bash"&&r.output.length>0?e.push(`Ran command: ${r.input.slice(0,80)}`):r.tool==="read"&&e.push(`Read file: ${r.input.slice(0,80)}`);return e.filter((r,t)=>t===0||r!==e[t-1])}function Es(n){if(n.length===0)return"No activity recorded.";let e=n[n.length-1];return`Last action: [${e.tool}] ${e.input.slice(0,150)}`}function Cs(n){let e=[];for(let r of n)(r.output.includes("error")||r.output.includes("Error"))&&e.push(`Possible issue with ${r.tool}: ${r.output.slice(0,100)}`);return e.slice(0,5)}function Ss(n,e){let r=[];return e.length>0&&r.push("Review and resolve open questions listed above"),n.length>0&&r.push("Verify the changes made during the background session"),r.push("Run tests to validate the current state"),r}var As={agentCount:3,evaluationCriteria:{correctness:.5,efficiency:.3,style:.2}},Yt=class{execute;judge;generateDiff;emit;constructor(e){this.execute=e.execute,this.judge=e.judge,this.generateDiff=e.generateDiff??null,this.emit=e.emit??null}async compete(e){let{taskId:r,agentCount:t,evaluationCriteria:o}=e;this.emit?.("arena:started",{taskId:r,agentCount:t});let s=Array.from({length:t},(p,f)=>`arena_${r}_${f}_${Math.random().toString(36).slice(2,6)}`),a=(await Promise.allSettled(s.map(p=>{let f=this.execute(r,p);return e.timeLimitMs?Promise.race([f,Rs(e.timeLimitMs,p)]):f}))).filter(p=>p.status==="fulfilled").map(p=>p.value);if(a.length===0)throw new Error(`All ${t} arena contestants failed for task ${r}`);this.emit?.("arena:contestants-finished",{taskId:r,finished:a.length,total:t});let l=(await this.judge(a,o)).map(p=>({...p,weightedTotal:p.correctnessScore*o.correctness+p.efficiencyScore*o.efficiency+p.styleScore*o.style})),d=[...l].sort((p,f)=>f.weightedTotal-p.weightedTotal),u=a.find(p=>p.agentId===d[0].agentId),m=[];if(this.generateDiff){let p=a.filter(v=>v.agentId!==u.agentId),f=await Promise.allSettled(p.map(async v=>({winnerId:u.agentId,loserId:v.agentId,diffSummary:await this.generateDiff(u,v)})));for(let v of f)v.status==="fulfilled"&&m.push(v.value)}let g={taskId:r,winner:u,scores:l,diffs:m,allContestants:a};return this.emit?.("arena:completed",{taskId:r,winnerId:u.agentId,winnerScore:d[0].weightedTotal,contestantCount:a.length}),g}};function Is(n){let e=n.scores.sort((r,t)=>t.weightedTotal-r.weightedTotal).map((r,t)=>`${t+1}. ${r.agentId}: ${r.weightedTotal.toFixed(2)} \u2014 ${r.reasoning}`).join(`
1009
+ `);return{type:"arena-review",taskId:n.taskId,summary:`Arena: ${n.allContestants.length} contestants, winner=${n.winner.agentId}
632
1010
 
633
- ${e}`,metadata:{winnerId:r.winner.agentId,scores:r.scores,diffs:r.diffs}}}function ht(r,e){return new Promise((t,n)=>setTimeout(()=>n(new Error(`Arena timeout for ${e} after ${r}ms`)),r))}function re(r){let e=new Map(r.map(s=>[s.id,s])),t=new Map,n=new Set,o=new Set;function i(s){if(t.has(s))return t.get(s);if(o.has(s))throw new Error(`Circular dependency detected involving node "${s}"`);o.add(s);let a=e.get(s);if(!a)throw new Error(`Unknown node dependency: "${s}"`);let d=0;for(let c of a.dependsOn)d=Math.max(d,i(c)+1);return o.delete(s),n.add(s),t.set(s,d),d}for(let s of r)n.has(s.id)||i(s.id);return r.map(s=>({node:s,depth:t.get(s.id)})).sort((s,a)=>s.depth-a.depth)}async function yt(r,e,t){let n=r.concurrentNodes??3,o=re(r.nodes),i=new Map(r.nodes.map(g=>[g.id,g])),s={},a={};for(let g of r.nodes)a[g.id]="pending";let d=Date.now();function c(g,u,m){t?.({type:g,pipelineId:r.id,nodeId:u,timestamp:Date.now(),detail:m})}c("pipeline:start");let l=new Map;for(let{node:g,depth:u}of o){let m=l.get(u)??[];m.push(g),l.set(u,m)}let p=Math.max(...Array.from(l.keys()),0);try{for(let g=0;g<=p;g++){let u=l.get(g)??[];if(u.length!==0)for(let m=0;m<u.length;m+=n){let C=u.slice(m,m+n);await Promise.all(C.map(async I=>{try{await h(I)}catch(S){throw a[I.id]="failed",c("node:error",I.id,S instanceof Error?S.message:String(S)),S}}))}}return c("pipeline:complete"),{pipelineId:r.id,status:"completed",results:s,nodeStatuses:a,startedAt:d,completedAt:Date.now()}}catch(g){let u=g instanceof Error?g.message:String(g);return c("pipeline:error",void 0,u),{pipelineId:r.id,status:"failed",results:s,nodeStatuses:a,startedAt:d,completedAt:Date.now(),error:u}}async function h(g){let u={};for(let I of g.dependsOn)s[I]&&(u[I]=s[I]);let m={prompt:"",previous:u};if(g.inputTransformer&&(m=await g.inputTransformer(m)),g.skipCondition?.(m)){a[g.id]="skipped",c("node:skip",g.id),s[g.id]={nodeId:g.id,output:"",metadata:{skipped:!0},finishReason:"completed",durationMs:0};return}a[g.id]="running",c("node:start",g.id);let C=Date.now();if(!g.agent&&g.inputTransformer)s[g.id]={nodeId:g.id,output:m.prompt,metadata:m.context??{},finishReason:"completed",durationMs:Date.now()-C};else{let I=await e(g.id,g.agent,m),S={nodeId:g.id,output:I.output,metadata:I.metadata??{},finishReason:I.finishReason??"completed",durationMs:Date.now()-C};if(g.outputTransformer){let ie=await g.outputTransformer({prompt:S.output,context:S.metadata,previous:u});S={...S,output:ie.prompt,metadata:ie.context??{}}}s[g.id]=S}a[g.id]="completed",c("node:complete",g.id)}}function wt(r){re(r)}function kt(r){return re(r).map(({node:e})=>e.id)}var R=class extends Error{constructor(t){super(`Circular swarm dependency detected: ${t.join(" \u2192 ")}`);this.cycle=t;this.name="CircularSwarmDependencyError"}},oe=class{entries=new Map;handlers=new Set;parentId;constructor(e){this.parentId=e}register(e,t){this.detectCycles(e,t.coordinator);let n={...t,id:e,hierarchy:[this.parentId,e],started:!1};this.entries.set(e,n),this.emit("swarm:registered",e,n.hierarchy)}async unregister(e){let t=this.entries.get(e);t&&(t.started&&await t.coordinator.stop(),this.entries.delete(e),this.emit("swarm:unregistered",e,t.hierarchy))}has(e){return this.entries.has(e)}get(e){return this.entries.get(e)}list(){return Array.from(this.entries.keys())}async delegate(e,t){let n=this.entries.get(e);if(!n)throw new Error(`Swarm "${e}" is not registered`);n.started||(await n.coordinator.start(),n.started=!0),this.emit("swarm:delegation:start",e,n.hierarchy);try{let o=await n.coordinator.route(t);return this.emit("swarm:delegation:complete",e,n.hierarchy),o}catch(o){let i=o instanceof Error?o.message:String(o);throw this.emit("swarm:delegation:error",e,n.hierarchy,i),o}}on(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async stopAll(){let e=Array.from(this.entries.values());await Promise.allSettled(e.filter(t=>t.started).map(async t=>{await t.coordinator.stop(),t.started=!1}))}detectCycles(e,t){let n=new Set,o=[e];for(;o.length>0;){let i=o.pop();if(n.has(i))continue;if(n.add(i),this.entries.get(i)&&i===this.parentId){let a=Array.from(n);throw new R(a)}}for(let[i,s]of this.entries)if(s.coordinator===t&&i!==e)throw new R([this.parentId,e,i])}emit(e,t,n,o){let i={type:e,swarmId:t,hierarchy:n,timestamp:Date.now(),detail:o};for(let s of this.handlers)try{s(i)}catch{}}};var vt=new Set(["agent:step","tool:executing","tool:start","llm:generating","token"]),Ct=new Set(["agent:stop","swarm:stop","agent:end"]),se=class{statuses=new Map;pendingApprovals=new Map;pendingHIL=new Map;handlers=new Set;config;constructor(e={}){this.config={unknownThresholdMs:e.unknownThresholdMs??3e4,recentWindowMs:e.recentWindowMs??5e3}}ingest(e){let{agentInstanceId:t,type:n,timestamp:o}=e;if(n==="approval:requested"){let d=e.data?.callId;if(d){let c=this.pendingApprovals.get(t)??new Set;c.add(d),this.pendingApprovals.set(t,c)}}if(n==="approval:granted"||n==="approval:denied"){let d=e.data?.callId;d&&this.pendingApprovals.get(t)?.delete(d)}if(n==="hil:question"){let d=e.data?.questionId;if(d){let c=this.pendingHIL.get(t)??new Set;c.add(d),this.pendingHIL.set(t,c)}}if(n==="hil:answered"||n==="hil:timeout"){let d=e.data?.questionId;d&&this.pendingHIL.get(t)?.delete(d)}let i=this.classify(t,n,e.data),a=this.statuses.get(t)?.status??"unknown";this.statuses.set(t,{agentInstanceId:t,status:i,lastSignalAt:o,detail:n}),a!==i&&this.emit({type:"worker:status:changed",agentInstanceId:t,previousStatus:a,newStatus:i,timestamp:o})}getStatus(e){let t=this.statuses.get(e);return!t||Date.now()-t.lastSignalAt>this.config.unknownThresholdMs?"unknown":t.status}getRecord(e){return this.statuses.get(e)}listAll(){return Array.from(this.statuses.values()).map(e=>({...e,status:this.getStatus(e.agentInstanceId)}))}getAvailable(){return this.listAll().filter(e=>e.status==="idle").map(e=>e.agentInstanceId)}on(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}clear(){this.statuses.clear(),this.pendingApprovals.clear(),this.pendingHIL.clear()}classify(e,t,n){let o=this.pendingApprovals.get(e);if(o&&o.size>0)return"awaiting-approval";let i=this.pendingHIL.get(e);if(i&&i.size>0)return"awaiting-hil";if((t==="error"||t==="swarm:stop"||t==="agent:end")&&(n?.finishReason??n?.reason)==="error")return"error";if(vt.has(t))return"processing";if(Ct.has(t)){let a=n?.finishReason??n?.reason;return a==="complete"||a==="completed"?"idle":a==="error"?"error":"idle"}return this.statuses.get(e)?.status??"processing"}emit(e){for(let t of this.handlers)try{t(e)}catch{}}};import{createKernel as bt,bootKernel as xt,KERNEL_VERSION as Ae}from"@fenixforce/kernel";var It={edition:"pro",channels:["telegram","web","discord","slack","whatsapp","sms"],tools:["*"],layers:["memory","knowledge-graph","content-pipeline","jobs","approval-gates"]};async function St(r,e={}){let t=bt({...It,...e.kernelConfig}),n=await xt({edition:"pro",tools:["*"],maxTurns:20,databaseUrl:process.env.DATABASE_URL});if(r!=null){let o=E(r),i=e.customerId??"default",s=H(i,o,e.fleetDeps);return s.on(a=>{t.bus.emit({type:"extension:fired",timestamp:a.timestamp,sessionId:a.workspaceId??a.fleetId,extensionId:"fleet-coordinator",hook:a.type})}),await s.start(),{mode:"fleet",kernel:t,runningKernel:n,fleet:s,health(){let a=s.status(),d=a.workspaces.some(l=>l.status==="error"),c=a.workspaces.length>0&&a.workspaces.every(l=>l.status==="running");return{status:d?"degraded":c?"ok":"degraded",mode:"fleet",version:Ae,fleet:a}},async stop(){await s.stop(),await n.stop()}}}return{mode:"single",kernel:t,runningKernel:n,fleet:null,health(){return{status:n.health().status,mode:"single",version:Ae}},async stop(){await n.stop()}}}var A={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization"};function Et(){return new Response(null,{status:204,headers:A})}function y(r,e=200){return Response.json(r,{status:e,headers:A})}function b(r,e,t){return Response.json({error:e,...t?{code:t}:{}},{status:r,headers:A})}var v=class extends Error{constructor(t,n,o){super(n);this.status=t;this.code=o}};function Re(r){return async(e,t)=>{try{return await r(e,t)}catch(n){if(n instanceof v)return b(n.status,n.message,n.code);let o=n instanceof Error?n.message:String(n);return b(500,`Internal server error: ${o}`,"INTERNAL_ERROR")}}}function w(r,e){if(!e)return null;let t=r.headers.get("Authorization");if(!t)throw new v(401,"Missing Authorization header","AUTH_REQUIRED");let n=t.replace(/^Bearer\s+/i,"");if(n!==e)throw new v(401,"Invalid token","AUTH_INVALID");return n}async function x(r){try{return await r.json()}catch{throw new v(400,"Invalid JSON body","INVALID_JSON")}}function T(r,e){let t=e.filter(n=>r[n]===void 0||r[n]===null);if(t.length>0)throw new v(400,`Missing required fields: ${t.join(", ")}`,"VALIDATION_ERROR")}function k(r,e,t){let n=[],o=e.replace(/:(\w+)/g,(i,s)=>(n.push(s),"([^/]+)"));return{method:r.toUpperCase(),pattern:new RegExp(`^${o}$`),paramNames:n,handler:Re(t)}}function At(r,e,t){for(let n of r){if(n.method!==e.toUpperCase())continue;let o=t.match(n.pattern);if(o){let i={};for(let s=0;s<n.paramNames.length;s++)i[n.paramNames[s]]=o[s+1];return{route:n,params:i}}}return null}function Rt(r){let{coordinator:e,fleetBudget:t,authToken:n,onConfigUpdate:o,onWorkspaceMessage:i}=r;return[k("GET","/api/v1/fleet",s=>(w(s,n),y(e.status()))),k("PUT","/api/v1/fleet/config",async s=>{w(s,n);let a=await x(s),d=E(a);return o&&await o(d),y({updated:!0,config:d})}),k("GET","/api/v1/workspaces",s=>{w(s,n);let a=e.status();return y({workspaces:a.workspaces})}),k("POST","/api/v1/workspaces",async s=>{w(s,n);let a=await x(s),d;if(a.templateId){let l=q(a.templateId);if(!l)throw new v(400,`Unknown template: ${a.templateId}`,"INVALID_TEMPLATE");d={id:a.id??`ws-${a.templateId}-${Date.now()}`,name:a.name??l.name,identityDir:"./identity",channels:l.channels,tools:l.tools,layers:l.layers,integrationGrants:{},metadata:{templateId:a.templateId}}}else{if(!a.id||!a.name)throw new v(400,"Either templateId or both id and name are required","VALIDATION_ERROR");d={id:a.id,name:a.name,identityDir:a.config?.identityDir??"./identity",channels:a.config?.channels??[],tools:a.config?.tools??[],layers:a.config?.layers??[],integrationGrants:a.config?.integrationGrants??{},metadata:a.config?.metadata??{}}}let c=await e.addWorkspace(d);return y({id:c.id,name:c.name,status:c.status},201)}),k("GET","/api/v1/workspaces/:id",(s,a)=>{w(s,n);let d=e.workspaceManager.getWorkspace(a.id);if(!d)return b(404,"Workspace not found","NOT_FOUND");let c=t?{daily:t.getWorkspaceCost(a.id,"day"),monthly:t.getWorkspaceCost(a.id,"month")}:null;return y({id:d.id,name:d.name,status:d.status,fleetId:d.fleetId,config:d.config,cost:c,createdAt:d.createdAt,startedAt:d.startedAt})}),k("PUT","/api/v1/workspaces/:id",async(s,a)=>{w(s,n);let d=e.workspaceManager.getWorkspace(a.id);if(!d)return b(404,"Workspace not found","NOT_FOUND");let c=await x(s),l={...d.config,...c,id:d.config.id};await e.removeWorkspace(a.id);let p=await e.addWorkspace(l);return y({id:p.id,name:p.name,status:p.status,updated:!0})}),k("DELETE","/api/v1/workspaces/:id",async(s,a)=>(w(s,n),e.workspaceManager.getWorkspace(a.id)?(await e.removeWorkspace(a.id),y({deleted:!0,id:a.id})):b(404,"Workspace not found","NOT_FOUND"))),k("POST","/api/v1/workspaces/:id/start",async(s,a)=>{if(w(s,n),!e.workspaceManager.getWorkspace(a.id))return b(404,"Workspace not found","NOT_FOUND");await e.workspaceManager.startWorkspace(a.id);let c=e.workspaceManager.getWorkspace(a.id);return y({id:c.id,status:c.status})}),k("POST","/api/v1/workspaces/:id/stop",async(s,a)=>{if(w(s,n),!e.workspaceManager.getWorkspace(a.id))return b(404,"Workspace not found","NOT_FOUND");await e.workspaceManager.stopWorkspace(a.id);let c=e.workspaceManager.getWorkspace(a.id);return y({id:a.id,status:c?.status??"stopped"})}),k("POST","/api/v1/workspaces/:id/message",async(s,a)=>{w(s,n);let d=e.workspaceManager.getWorkspace(a.id);if(!d)return b(404,"Workspace not found","NOT_FOUND");if(d.status!=="running")throw new v(400,`Workspace is ${d.status}, not running`,"WORKSPACE_NOT_RUNNING");let c=await x(s);if(T(c,["message"]),i){let l=await i(a.id,c.message,c.userId??"api");return y({delivered:!0,workspaceId:a.id,result:l})}return y({delivered:!0,workspaceId:a.id})}),k("GET","/api/v1/templates",s=>{w(s,n);let a=G().map(d=>({id:d.id,name:d.name,description:d.description,tools:d.tools,channels:d.channels}));return y({templates:a})}),k("GET","/api/v1/fleet/budget",s=>(w(s,n),t?y({daily:{spent:t.getCostToday()},monthly:{spent:t.getCostThisMonth()}}):b(501,"Budget tracking not configured","NOT_IMPLEMENTED"))),k("GET","/api/v1/fleet/budget/breakdown",s=>{if(w(s,n),!t)return b(501,"Budget tracking not configured","NOT_IMPLEMENTED");let a=t.getBreakdown(),d={};for(let[c,l]of a)d[c]=l;return y({breakdown:d})})]}function Tt(r){let{registry:e,fleetId:t,authToken:n}=r;return[k("GET","/api/v1/integrations",o=>{w(o,n);let s=e.listAvailable().map(a=>{let d=e.getStatus(t,a.id);return{...a,connectionStatus:d.status,connectedAt:d.connectedAt}});return y({integrations:s})}),k("POST","/api/v1/integrations/:id/connect",async(o,i)=>{w(o,n);let s=await x(o);T(s,["credentials"]);try{let a=await e.connect(t,i.id,s.credentials);return y(a,201)}catch(a){throw a instanceof Error&&a.message.startsWith("Unknown integration")?new v(404,a.message,"NOT_FOUND"):a}}),k("DELETE","/api/v1/integrations/:id/disconnect",(o,i)=>(w(o,n),e.disconnect(t,i.id),y({disconnected:!0,integrationId:i.id}))),k("POST","/api/v1/integrations/:id/grant/:wsId",(o,i)=>{w(o,n);try{e.grantAccess(i.wsId,i.id)}catch(s){throw s instanceof Error&&s.message.startsWith("Unknown integration")?new v(404,s.message,"NOT_FOUND"):s}return y({granted:!0,workspaceId:i.wsId,integrationId:i.id})}),k("DELETE","/api/v1/integrations/:id/revoke/:wsId",(o,i)=>(w(o,n),e.revokeAccess(i.wsId,i.id),y({revoked:!0,workspaceId:i.wsId,integrationId:i.id})))]}var Pt={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive",...A};function Ft(r,e){return`event: ${r}
1011
+ ${e}`,metadata:{winnerId:n.winner.agentId,scores:n.scores,diffs:n.diffs}}}function Rs(n,e){return new Promise((r,t)=>setTimeout(()=>t(new Error(`Arena timeout for ${e} after ${n}ms`)),n))}function Qt(n){let e=new Map(n.map(i=>[i.id,i])),r=new Map,t=new Set,o=new Set;function s(i){if(r.has(i))return r.get(i);if(o.has(i))throw new Error(`Circular dependency detected involving node "${i}"`);o.add(i);let a=e.get(i);if(!a)throw new Error(`Unknown node dependency: "${i}"`);let c=0;for(let l of a.dependsOn)c=Math.max(c,s(l)+1);return o.delete(i),t.add(i),r.set(i,c),c}for(let i of n)t.has(i.id)||s(i.id);return n.map(i=>({node:i,depth:r.get(i.id)})).sort((i,a)=>i.depth-a.depth)}async function Ps(n,e,r){let t=n.concurrentNodes??3,o=Qt(n.nodes),s=new Map(n.nodes.map(g=>[g.id,g])),i={},a={};for(let g of n.nodes)a[g.id]="pending";let c=Date.now();function l(g,p,f){r?.({type:g,pipelineId:n.id,nodeId:p,timestamp:Date.now(),detail:f})}l("pipeline:start");let d=new Map;for(let{node:g,depth:p}of o){let f=d.get(p)??[];f.push(g),d.set(p,f)}let u=Math.max(...Array.from(d.keys()),0);try{for(let g=0;g<=u;g++){let p=d.get(g)??[];if(p.length!==0)for(let f=0;f<p.length;f+=t){let v=p.slice(f,f+t);await Promise.all(v.map(async x=>{try{await m(x)}catch(R){throw a[x.id]="failed",l("node:error",x.id,R instanceof Error?R.message:String(R)),R}}))}}return l("pipeline:complete"),{pipelineId:n.id,status:"completed",results:i,nodeStatuses:a,startedAt:c,completedAt:Date.now()}}catch(g){let p=g instanceof Error?g.message:String(g);return l("pipeline:error",void 0,p),{pipelineId:n.id,status:"failed",results:i,nodeStatuses:a,startedAt:c,completedAt:Date.now(),error:p}}async function m(g){let p={};for(let x of g.dependsOn)i[x]&&(p[x]=i[x]);let f={prompt:"",previous:p};if(g.inputTransformer&&(f=await g.inputTransformer(f)),g.skipCondition?.(f)){a[g.id]="skipped",l("node:skip",g.id),i[g.id]={nodeId:g.id,output:"",metadata:{skipped:!0},finishReason:"completed",durationMs:0};return}a[g.id]="running",l("node:start",g.id);let v=Date.now();if(!g.agent&&g.inputTransformer)i[g.id]={nodeId:g.id,output:f.prompt,metadata:f.context??{},finishReason:"completed",durationMs:Date.now()-v};else{let x=await e(g.id,g.agent,f),R={nodeId:g.id,output:x.output,metadata:x.metadata??{},finishReason:x.finishReason??"completed",durationMs:Date.now()-v};if(g.outputTransformer){let C=await g.outputTransformer({prompt:R.output,context:R.metadata,previous:p});R={...R,output:C.prompt,metadata:C.context??{}}}i[g.id]=R}a[g.id]="completed",l("node:complete",g.id)}}function _s(n){Qt(n)}function Ms(n){return Qt(n).map(({node:e})=>e.id)}var he=class extends Error{constructor(r){super(`Circular swarm dependency detected: ${r.join(" \u2192 ")}`);this.cycle=r;this.name="CircularSwarmDependencyError"}},Xt=class{entries=new Map;handlers=new Set;parentId;constructor(e){this.parentId=e}register(e,r){this.detectCycles(e,r.coordinator);let t={...r,id:e,hierarchy:[this.parentId,e],started:!1};this.entries.set(e,t),this.emit("swarm:registered",e,t.hierarchy)}async unregister(e){let r=this.entries.get(e);r&&(r.started&&await r.coordinator.stop(),this.entries.delete(e),this.emit("swarm:unregistered",e,r.hierarchy))}has(e){return this.entries.has(e)}get(e){return this.entries.get(e)}list(){return Array.from(this.entries.keys())}async delegate(e,r){let t=this.entries.get(e);if(!t)throw new Error(`Swarm "${e}" is not registered`);t.started||(await t.coordinator.start(),t.started=!0),this.emit("swarm:delegation:start",e,t.hierarchy);try{let o=await t.coordinator.route(r);return this.emit("swarm:delegation:complete",e,t.hierarchy),o}catch(o){let s=o instanceof Error?o.message:String(o);throw this.emit("swarm:delegation:error",e,t.hierarchy,s),o}}on(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async stopAll(){let e=Array.from(this.entries.values());await Promise.allSettled(e.filter(r=>r.started).map(async r=>{await r.coordinator.stop(),r.started=!1}))}detectCycles(e,r){let t=new Set,o=[e];for(;o.length>0;){let s=o.pop();if(t.has(s))continue;if(t.add(s),this.entries.get(s)&&s===this.parentId){let a=Array.from(t);throw new he(a)}}for(let[s,i]of this.entries)if(i.coordinator===r&&s!==e)throw new he([this.parentId,e,s])}emit(e,r,t,o){let s={type:e,swarmId:r,hierarchy:t,timestamp:Date.now(),detail:o};for(let i of this.handlers)try{i(s)}catch{}}};var Ds=new Set(["agent:step","tool:executing","tool:start","llm:generating","token"]),Os=new Set(["agent:stop","swarm:stop","agent:end"]),Zt=class{statuses=new Map;pendingApprovals=new Map;pendingHIL=new Map;handlers=new Set;config;constructor(e={}){this.config={unknownThresholdMs:e.unknownThresholdMs??3e4,recentWindowMs:e.recentWindowMs??5e3}}ingest(e){let{agentInstanceId:r,type:t,timestamp:o}=e;if(t==="approval:requested"){let c=e.data?.callId;if(c){let l=this.pendingApprovals.get(r)??new Set;l.add(c),this.pendingApprovals.set(r,l)}}if(t==="approval:granted"||t==="approval:denied"){let c=e.data?.callId;c&&this.pendingApprovals.get(r)?.delete(c)}if(t==="hil:question"){let c=e.data?.questionId;if(c){let l=this.pendingHIL.get(r)??new Set;l.add(c),this.pendingHIL.set(r,l)}}if(t==="hil:answered"||t==="hil:timeout"){let c=e.data?.questionId;c&&this.pendingHIL.get(r)?.delete(c)}let s=this.classify(r,t,e.data),a=this.statuses.get(r)?.status??"unknown";this.statuses.set(r,{agentInstanceId:r,status:s,lastSignalAt:o,detail:t}),a!==s&&this.emit({type:"worker:status:changed",agentInstanceId:r,previousStatus:a,newStatus:s,timestamp:o})}getStatus(e){let r=this.statuses.get(e);return!r||Date.now()-r.lastSignalAt>this.config.unknownThresholdMs?"unknown":r.status}getRecord(e){return this.statuses.get(e)}listAll(){return Array.from(this.statuses.values()).map(e=>({...e,status:this.getStatus(e.agentInstanceId)}))}getAvailable(){return this.listAll().filter(e=>e.status==="idle").map(e=>e.agentInstanceId)}on(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}clear(){this.statuses.clear(),this.pendingApprovals.clear(),this.pendingHIL.clear()}classify(e,r,t){let o=this.pendingApprovals.get(e);if(o&&o.size>0)return"awaiting-approval";let s=this.pendingHIL.get(e);if(s&&s.size>0)return"awaiting-hil";if((r==="error"||r==="swarm:stop"||r==="agent:end")&&(t?.finishReason??t?.reason)==="error")return"error";if(Ds.has(r))return"processing";if(Os.has(r)){let a=t?.finishReason??t?.reason;return a==="complete"||a==="completed"?"idle":a==="error"?"error":"idle"}return this.statuses.get(e)?.status??"processing"}emit(e){for(let r of this.handlers)try{r(e)}catch{}}};var Ls={edition:"pro",channels:["telegram","web","discord","slack","whatsapp","sms"],tools:["*"],layers:["memory","knowledge-graph","content-pipeline","jobs","approval-gates"]};async function Ns(n,e={}){let r=Pe({...Ls,...e.kernelConfig}),t=await It({edition:"pro",tools:["*"],maxTurns:20,databaseUrl:process.env.DATABASE_URL});if(n!=null){let o=Q(n),s=e.customerId??"default",i=Nt(s,o,e.fleetDeps);return i.on(a=>{r.bus.emit({type:"extension:fired",timestamp:a.timestamp,sessionId:a.workspaceId??a.fleetId,extensionId:"fleet-coordinator",hook:a.type})}),await i.start(),{mode:"fleet",kernel:r,runningKernel:t,fleet:i,health(){let a=i.status(),c=a.workspaces.some(d=>d.status==="error"),l=a.workspaces.length>0&&a.workspaces.every(d=>d.status==="running");return{status:c?"degraded":l?"ok":"degraded",mode:"fleet",version:fe,fleet:a}},async stop(){await i.stop(),await t.stop()}}}return{mode:"single",kernel:r,runningKernel:t,fleet:null,health(){return{status:t.health().status,mode:"single",version:fe}},async stop(){await t.stop()}}}var X={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization"};function $s(){return new Response(null,{status:204,headers:X})}function k(n,e=200){return Response.json(n,{status:e,headers:X})}function L(n,e,r){return Response.json({error:e,...r?{code:r}:{}},{status:n,headers:X})}var I=class extends Error{constructor(r,t,o){super(t);this.status=r;this.code=o}};function lr(n){return async(e,r)=>{try{return await n(e,r)}catch(t){if(t instanceof I)return L(t.status,t.message,t.code);let o=t instanceof Error?t.message:String(t);return L(500,`Internal server error: ${o}`,"INTERNAL_ERROR")}}}function w(n,e){if(!e)return null;let r=n.headers.get("Authorization");if(!r)throw new I(401,"Missing Authorization header","AUTH_REQUIRED");let t=r.replace(/^Bearer\s+/i,"");if(t!==e)throw new I(401,"Invalid token","AUTH_INVALID");return t}async function B(n){try{return await n.json()}catch{throw new I(400,"Invalid JSON body","INVALID_JSON")}}function ye(n,e){let r=e.filter(t=>n[t]===void 0||n[t]===null);if(r.length>0)throw new I(400,`Missing required fields: ${r.join(", ")}`,"VALIDATION_ERROR")}function T(n,e,r){let t=[],o=e.replace(/:(\w+)/g,(s,i)=>(t.push(i),"([^/]+)"));return{method:n.toUpperCase(),pattern:new RegExp(`^${o}$`),paramNames:t,handler:lr(r)}}function Fs(n,e,r){for(let t of n){if(t.method!==e.toUpperCase())continue;let o=r.match(t.pattern);if(o){let s={};for(let i=0;i<t.paramNames.length;i++)s[t.paramNames[i]]=o[i+1];return{route:t,params:s}}}return null}function Bs(n){let{coordinator:e,fleetBudget:r,authToken:t,onConfigUpdate:o,onWorkspaceMessage:s}=n;return[T("GET","/api/v1/fleet",i=>(w(i,t),k(e.status()))),T("PUT","/api/v1/fleet/config",async i=>{w(i,t);let a=await B(i),c=Q(a);return o&&await o(c),k({updated:!0,config:c})}),T("GET","/api/v1/workspaces",i=>{w(i,t);let a=e.status();return k({workspaces:a.workspaces})}),T("POST","/api/v1/workspaces",async i=>{w(i,t);let a=await B(i),c;if(a.templateId){let d=Bt(a.templateId);if(!d)throw new I(400,`Unknown template: ${a.templateId}`,"INVALID_TEMPLATE");c={id:a.id??`ws-${a.templateId}-${Date.now()}`,name:a.name??d.name,identityDir:"./identity",channels:d.channels,tools:d.tools,layers:d.layers,integrationGrants:{},metadata:{templateId:a.templateId}}}else{if(!a.id||!a.name)throw new I(400,"Either templateId or both id and name are required","VALIDATION_ERROR");c={id:a.id,name:a.name,identityDir:a.config?.identityDir??"./identity",channels:a.config?.channels??[],tools:a.config?.tools??[],layers:a.config?.layers??[],integrationGrants:a.config?.integrationGrants??{},metadata:a.config?.metadata??{}}}let l=await e.addWorkspace(c);return k({id:l.id,name:l.name,status:l.status},201)}),T("GET","/api/v1/workspaces/:id",(i,a)=>{w(i,t);let c=e.workspaceManager.getWorkspace(a.id);if(!c)return L(404,"Workspace not found","NOT_FOUND");let l=r?{daily:r.getWorkspaceCost(a.id,"day"),monthly:r.getWorkspaceCost(a.id,"month")}:null;return k({id:c.id,name:c.name,status:c.status,fleetId:c.fleetId,config:c.config,cost:l,createdAt:c.createdAt,startedAt:c.startedAt})}),T("PUT","/api/v1/workspaces/:id",async(i,a)=>{w(i,t);let c=e.workspaceManager.getWorkspace(a.id);if(!c)return L(404,"Workspace not found","NOT_FOUND");let l=await B(i),d={...c.config,...l,id:c.config.id};await e.removeWorkspace(a.id);let u=await e.addWorkspace(d);return k({id:u.id,name:u.name,status:u.status,updated:!0})}),T("DELETE","/api/v1/workspaces/:id",async(i,a)=>(w(i,t),e.workspaceManager.getWorkspace(a.id)?(await e.removeWorkspace(a.id),k({deleted:!0,id:a.id})):L(404,"Workspace not found","NOT_FOUND"))),T("POST","/api/v1/workspaces/:id/start",async(i,a)=>{if(w(i,t),!e.workspaceManager.getWorkspace(a.id))return L(404,"Workspace not found","NOT_FOUND");await e.workspaceManager.startWorkspace(a.id);let l=e.workspaceManager.getWorkspace(a.id);return k({id:l.id,status:l.status})}),T("POST","/api/v1/workspaces/:id/stop",async(i,a)=>{if(w(i,t),!e.workspaceManager.getWorkspace(a.id))return L(404,"Workspace not found","NOT_FOUND");await e.workspaceManager.stopWorkspace(a.id);let l=e.workspaceManager.getWorkspace(a.id);return k({id:a.id,status:l?.status??"stopped"})}),T("POST","/api/v1/workspaces/:id/message",async(i,a)=>{w(i,t);let c=e.workspaceManager.getWorkspace(a.id);if(!c)return L(404,"Workspace not found","NOT_FOUND");if(c.status!=="running")throw new I(400,`Workspace is ${c.status}, not running`,"WORKSPACE_NOT_RUNNING");let l=await B(i);if(ye(l,["message"]),s){let d=await s(a.id,l.message,l.userId??"api");return k({delivered:!0,workspaceId:a.id,result:d})}return k({delivered:!0,workspaceId:a.id})}),T("GET","/api/v1/templates",i=>{w(i,t);let a=Ft().map(c=>({id:c.id,name:c.name,description:c.description,tools:c.tools,channels:c.channels}));return k({templates:a})}),T("GET","/api/v1/fleet/budget",i=>(w(i,t),r?k({daily:{spent:r.getCostToday()},monthly:{spent:r.getCostThisMonth()}}):L(501,"Budget tracking not configured","NOT_IMPLEMENTED"))),T("GET","/api/v1/fleet/budget/breakdown",i=>{if(w(i,t),!r)return L(501,"Budget tracking not configured","NOT_IMPLEMENTED");let a=r.getBreakdown(),c={};for(let[l,d]of a)c[l]=d;return k({breakdown:c})})]}function Us(n){let{registry:e,fleetId:r,authToken:t}=n;return[T("GET","/api/v1/integrations",o=>{w(o,t);let i=e.listAvailable().map(a=>{let c=e.getStatus(r,a.id);return{...a,connectionStatus:c.status,connectedAt:c.connectedAt}});return k({integrations:i})}),T("POST","/api/v1/integrations/:id/connect",async(o,s)=>{w(o,t);let i=await B(o);ye(i,["credentials"]);try{let a=await e.connect(r,s.id,i.credentials);return k(a,201)}catch(a){throw a instanceof Error&&a.message.startsWith("Unknown integration")?new I(404,a.message,"NOT_FOUND"):a}}),T("DELETE","/api/v1/integrations/:id/disconnect",(o,s)=>(w(o,t),e.disconnect(r,s.id),k({disconnected:!0,integrationId:s.id}))),T("POST","/api/v1/integrations/:id/grant/:wsId",(o,s)=>{w(o,t);try{e.grantAccess(s.wsId,s.id)}catch(i){throw i instanceof Error&&i.message.startsWith("Unknown integration")?new I(404,i.message,"NOT_FOUND"):i}return k({granted:!0,workspaceId:s.wsId,integrationId:s.id})}),T("DELETE","/api/v1/integrations/:id/revoke/:wsId",(o,s)=>(w(o,t),e.revokeAccess(s.wsId,s.id),k({revoked:!0,workspaceId:s.wsId,integrationId:s.id})))]}var js={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive",...X};function Ws(n,e){return`event: ${n}
634
1012
  data: ${JSON.stringify(e)}
635
1013
 
636
- `}function Dt(r){let{approvalQueue:e,authToken:t}=r;return[k("GET","/api/v1/approvals",async n=>{w(n,t);let o=new URL(n.url),i=o.searchParams.get("workspaceId")??void 0,s=o.searchParams.get("status"),a=parseInt(o.searchParams.get("limit")??"50",10),d=await e.list({workspaceId:i,status:s,limit:a});return y({approvals:d,total:d.length})}),k("GET","/api/v1/approvals/stream",n=>{w(n,t);let o=new ReadableStream({start(i){let s=new TextEncoder,a=(l,p)=>{try{i.enqueue(s.encode(Ft(l,p)))}catch{}},d=e.on(l=>{a(l.type,l.item)}),c=setInterval(()=>{try{i.enqueue(s.encode(`: heartbeat
1014
+ `}function qs(n){let{approvalQueue:e,authToken:r}=n;return[T("GET","/api/v1/approvals",async t=>{w(t,r);let o=new URL(t.url),s=o.searchParams.get("workspaceId")??void 0,i=o.searchParams.get("status"),a=parseInt(o.searchParams.get("limit")??"50",10),c=await e.list({workspaceId:s,status:i,limit:a});return k({approvals:c,total:c.length})}),T("GET","/api/v1/approvals/stream",t=>{w(t,r);let o=new ReadableStream({start(s){let i=new TextEncoder,a=(d,u)=>{try{s.enqueue(i.encode(Ws(d,u)))}catch{}},c=e.on(d=>{a(d.type,d.item)}),l=setInterval(()=>{try{s.enqueue(i.encode(`: heartbeat
637
1015
 
638
- `))}catch{clearInterval(c),d()}},3e4);n.signal.addEventListener("abort",()=>{clearInterval(c),d();try{i.close()}catch{}})}});return new Response(o,{headers:Pt})}),k("GET","/api/v1/approvals/:id",async(n,o)=>{w(n,t);let s=(await e.list({})).find(a=>a.id===o.id);return s?y(s):b(404,"Approval not found","NOT_FOUND")}),k("POST","/api/v1/approvals/:id/approve",async(n,o)=>{w(n,t);let i=await x(n).catch(()=>({}));try{let{item:s,result:a}=await e.approve(o.id,i.resolvedBy);return y({item:s,result:a})}catch(s){if(s instanceof Error){if(s.message.includes("not found"))throw new v(404,s.message,"NOT_FOUND");if(s.message.includes("Cannot approve"))throw new v(400,s.message,"INVALID_STATUS")}throw s}}),k("POST","/api/v1/approvals/:id/reject",async(n,o)=>{w(n,t);let i=await x(n).catch(()=>({}));try{let s=await e.reject(o.id,i.notes,i.resolvedBy);return y(s)}catch(s){if(s instanceof Error){if(s.message.includes("not found"))throw new v(404,s.message,"NOT_FOUND");if(s.message.includes("Cannot reject"))throw new v(400,s.message,"INVALID_STATUS")}throw s}}),k("POST","/api/v1/approvals/:id/edit",async(n,o)=>{w(n,t);let i=await x(n);if(!i.notes)throw new v(400,"Notes are required for edit","VALIDATION_ERROR");try{let s=await e.edit(o.id,i.notes,i.resolvedBy);return y(s)}catch(s){if(s instanceof Error){if(s.message.includes("not found"))throw new v(404,s.message,"NOT_FOUND");if(s.message.includes("Cannot edit"))throw new v(400,s.message,"INVALID_STATUS")}throw s}})]}var Wt="pro",er={...Lt},Nt={edition:Wt,channels:["telegram","web","discord","slack","whatsapp","sms"],tools:["*"],layers:["memory","knowledge-graph","content-pipeline","jobs","approval-gates"]};function tr(r){return Mt({...Nt,...r})}export{v as ApiException,P as ApprovalConfigSchema,J as ApprovalQueue,ne as ArenaEngine,U as BUILTIN_TEMPLATES,L as BestOfNBudgetError,Z as BestOfNEngine,F as BudgetConfigSchema,A as CORS_HEADERS,le as ChannelBindingSchema,R as CircularSwarmDependencyError,mt as DEFAULT_ARENA_CONFIG,xe as DEFAULT_BEST_OF_N,Ve as DEFAULT_BRAINSTORM_CONFIG,Se as DEFAULT_COMPILE_TIMEOUT,Ge as DEFAULT_DEBATE_CONFIG,Te as DEFAULT_FLEET_CONFIG,Q as DEFAULT_JUDGE_CONFIG,be as DEFAULT_ORACLE_CONFIG,Wt as EDITION,Y as FleetBudget,O as FleetConfigSchema,N as FleetRouterConfigSchema,z as IntegrationRegistry,Zn as KERNEL_VERSION,D as KNOWN_INTEGRATIONS,M as OracleBudgetExceededError,X as OracleHandler,Nt as PRO_KERNEL_CONFIG,er as PRO_MANIFEST,se as StatusDetector,oe as SwarmRegistry,ce as WorkspaceConfigSchema,We as applyTemplate,he as assignTaskToWorker,St as bootPro,k as buildRoute,Oe as checkAutoApproval,we as claimNextTask,Et as corsPreflightResponse,Dt as createApprovalRoutes,ke as createEscalation,ue as createFleetBudgetTracker,H as createFleetCoordinator,j as createFleetRouter,Rt as createFleetRoutes,Be as createInMemoryIntegrationStorage,B as createInMemorySTM,Tt as createIntegrationRoutes,Mt as createKernel,_ as createSharedMemoryBridge,$ as createWorkspaceManager,b as errorResponse,ve as evaluateCycle,yt as executePipeline,ye as executeWorkerTask,de as extractMention,ft as formatArenaForApproval,ot as formatErrorSummary,at as formatHandoffMessage,it as generateHandoffSummary,kt as getExecutionOrder,q as getTemplate,y as jsonResponse,G as listTemplates,E as loadFleetConfig,Pe as loadFleetConfigFromJSON,pe as matchChannelBinding,At as matchRoute,te as parseCompileErrors,x as parseJsonBody,ct as persistHandoff,ae as resolveEnvVar,Ye as runBrainstorm,rt as runCompileCheck,qe as runDebate,fe as runPlannerCycle,Ce as shouldContinue,tr as startPro,w as validateAuth,wt as validateDAG,T as validateRequired,Re as withErrorHandling};
1016
+ `))}catch{clearInterval(l),c()}},3e4);t.signal.addEventListener("abort",()=>{clearInterval(l),c();try{s.close()}catch{}})}});return new Response(o,{headers:js})}),T("GET","/api/v1/approvals/:id",async(t,o)=>{w(t,r);let i=(await e.list({})).find(a=>a.id===o.id);return i?k(i):L(404,"Approval not found","NOT_FOUND")}),T("POST","/api/v1/approvals/:id/approve",async(t,o)=>{w(t,r);let s=await B(t).catch(()=>({}));try{let{item:i,result:a}=await e.approve(o.id,s.resolvedBy);return k({item:i,result:a})}catch(i){if(i instanceof Error){if(i.message.includes("not found"))throw new I(404,i.message,"NOT_FOUND");if(i.message.includes("Cannot approve"))throw new I(400,i.message,"INVALID_STATUS")}throw i}}),T("POST","/api/v1/approvals/:id/reject",async(t,o)=>{w(t,r);let s=await B(t).catch(()=>({}));try{let i=await e.reject(o.id,s.notes,s.resolvedBy);return k(i)}catch(i){if(i instanceof Error){if(i.message.includes("not found"))throw new I(404,i.message,"NOT_FOUND");if(i.message.includes("Cannot reject"))throw new I(400,i.message,"INVALID_STATUS")}throw i}}),T("POST","/api/v1/approvals/:id/edit",async(t,o)=>{w(t,r);let s=await B(t);if(!s.notes)throw new I(400,"Notes are required for edit","VALIDATION_ERROR");try{let i=await e.edit(o.id,s.notes,s.resolvedBy);return k(i)}catch(i){if(i instanceof Error){if(i.message.includes("not found"))throw new I(404,i.message,"NOT_FOUND");if(i.message.includes("Cannot edit"))throw new I(400,i.message,"INVALID_STATUS")}throw i}})]}var Hs="pro",gh={...Be},Js={edition:Hs,channels:["telegram","web","discord","slack","whatsapp","sms"],tools:["*"],layers:["memory","knowledge-graph","content-pipeline","jobs","approval-gates"]};function mh(n){return Pe({...Js,...n})}export{I as ApiException,_e as ApprovalConfigSchema,Ut as ApprovalQueue,Yt as ArenaEngine,$t as BUILTIN_TEMPLATES,Le as BestOfNBudgetError,Kt as BestOfNEngine,Me as BudgetConfigSchema,X as CORS_HEADERS,Jn as ChannelBindingSchema,he as CircularSwarmDependencyError,As as DEFAULT_ARENA_CONFIG,sr as DEFAULT_BEST_OF_N,cs as DEFAULT_BRAINSTORM_CONFIG,ar as DEFAULT_COMPILE_TIMEOUT,rs as DEFAULT_DEBATE_CONFIG,Wo as DEFAULT_FLEET_CONFIG,Jt as DEFAULT_JUDGE_CONFIG,or as DEFAULT_ORACLE_CONFIG,Hs as EDITION,Ht as FleetBudget,_t as FleetConfigSchema,Pt as FleetRouterConfigSchema,jt as IntegrationRegistry,fe as KERNEL_VERSION,De as KNOWN_INTEGRATIONS,Oe as OracleBudgetExceededError,Gt as OracleHandler,Js as PRO_KERNEL_CONFIG,gh as PRO_MANIFEST,Zt as StatusDetector,Xt as SwarmRegistry,Hn as WorkspaceConfigSchema,Vo as applyTemplate,Xn as assignTaskToWorker,Ns as bootPro,T as buildRoute,Yo as checkAutoApproval,er as claimNextTask,$s as corsPreflightResponse,qs as createApprovalRoutes,tr as createEscalation,Vn as createFleetBudgetTracker,Nt as createFleetCoordinator,Lt as createFleetRouter,Bs as createFleetRoutes,Qo as createInMemoryIntegrationStorage,Mt as createInMemorySTM,Us as createIntegrationRoutes,Pe as createKernel,Ot as createSharedMemoryBridge,Dt as createWorkspaceManager,L as errorResponse,nr as evaluateCycle,Ps as executePipeline,Zn as executeWorkerTask,Gn as extractMention,Is as formatArenaForApproval,ys as formatErrorSummary,ks as formatHandoffMessage,bs as generateHandoffSummary,Ms as getExecutionOrder,Bt as getTemplate,k as jsonResponse,Ft as listTemplates,Q as loadFleetConfig,qo as loadFleetConfigFromJSON,Kn as matchChannelBinding,Fs as matchRoute,zt as parseCompileErrors,B as parseJsonBody,ws as persistHandoff,qn as resolveEnvVar,ls as runBrainstorm,hs as runCompileCheck,os as runDebate,Qn as runPlannerCycle,rr as shouldContinue,mh as startPro,w as validateAuth,_s as validateDAG,ye as validateRequired,lr as withErrorHandling};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenixforce/edition-pro",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,13 +24,13 @@
24
24
  "skills/builtin/*/SKILL.md"
25
25
  ],
26
26
  "scripts": {
27
- "build": "esbuild src/index.ts --bundle --format=esm --platform=node --target=es2022 --minify --outfile=dist/index.js --external:@fenixforce/kernel --external:zod && tsc --emitDeclarationOnly --project tsconfig.build.json",
27
+ "build": "esbuild src/index.ts --bundle --format=esm --platform=node --target=es2022 --minify --outfile=dist/index.js --external:pg --external:zod && tsc --emitDeclarationOnly --project tsconfig.build.json",
28
28
  "test": "bun test",
29
29
  "typecheck": "tsc --noEmit",
30
30
  "migrate": "bun run src/migrations/migrate.ts"
31
31
  },
32
32
  "dependencies": {
33
- "@fenixforce/kernel": "workspace:*",
33
+ "pg": "^8.13.0",
34
34
  "zod": "^4.3.6"
35
35
  },
36
36
  "devDependencies": {}