memeloop 0.1.3 → 0.2.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.
- package/dist/browser.cjs +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +15 -15
- package/dist/browser.d.ts +15 -15
- package/dist/browser.js +1 -1
- package/dist/{chunk-5JEV7632.js → chunk-5VYZV33O.js} +2 -1
- package/dist/{chunk-5JEV7632.js.map → chunk-5VYZV33O.js.map} +1 -1
- package/dist/chunk-E5R24U4I.js +1292 -0
- package/dist/chunk-E5R24U4I.js.map +1 -0
- package/dist/{chunk-MRKY4HGF.js → chunk-EPHRIRAL.js} +20 -11
- package/dist/chunk-EPHRIRAL.js.map +1 -0
- package/dist/{chunk-P6L3444O.js → chunk-KV6TC5UJ.js} +2 -2
- package/dist/chunk-MXRXYGWW.js +1 -0
- package/dist/{chunk-CCEFAOSH.js → chunk-WHXFUMDE.js} +2 -2
- package/dist/{chunk-CCEFAOSH.js.map → chunk-WHXFUMDE.js.map} +1 -1
- package/dist/conversation.d.cts +3 -3
- package/dist/conversation.d.ts +3 -3
- package/dist/device-network-portable.cjs +814 -144
- package/dist/device-network-portable.cjs.map +1 -1
- package/dist/device-network-portable.d.cts +24 -14
- package/dist/device-network-portable.d.ts +24 -14
- package/dist/device-network-portable.js +18 -2
- package/dist/device-network.cjs +833 -154
- package/dist/device-network.cjs.map +1 -1
- package/dist/device-network.d.cts +5 -5
- package/dist/device-network.d.ts +5 -5
- package/dist/device-network.js +19 -3
- package/dist/{fetchProvider-WWnWnQFP.d.ts → fetchProvider-BhqRqi5-.d.ts} +1 -1
- package/dist/{fetchProvider-toTHy5Nu.d.cts → fetchProvider-HJ_FkORN.d.cts} +1 -1
- package/dist/index.cjs +841 -157
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -16
- package/dist/index.d.ts +16 -16
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/{interface-IrKBFtL1.d.ts → interface-3C3eG8Hn.d.cts} +13 -1
- package/dist/{interface-IrKBFtL1.d.cts → interface-3C3eG8Hn.d.ts} +13 -1
- package/dist/llm-providers.d.cts +2 -2
- package/dist/llm-providers.d.ts +2 -2
- package/dist/loop-api.cjs +1 -0
- package/dist/loop-api.cjs.map +1 -1
- package/dist/loop-api.d.cts +7 -7
- package/dist/loop-api.d.ts +7 -7
- package/dist/loop-api.js +2 -2
- package/dist/mobile.d.cts +5 -5
- package/dist/mobile.d.ts +5 -5
- package/dist/{orchestration-portable-BHB_YrNN.d.ts → orchestration-portable-B4udCSVd.d.ts} +4 -4
- package/dist/{orchestration-portable-mvYBvGBb.d.cts → orchestration-portable-BWaCsCGK.d.cts} +4 -4
- package/dist/orchestration-portable.cjs +1 -1
- package/dist/orchestration-portable.cjs.map +1 -1
- package/dist/orchestration-portable.d.cts +5 -5
- package/dist/orchestration-portable.d.ts +5 -5
- package/dist/orchestration-portable.js +1 -1
- package/dist/pairingInvite-DENOiqa0.d.cts +271 -0
- package/dist/pairingInvite-DZy77i0p.d.ts +271 -0
- package/dist/{promptConcat-0WNFTg4l.d.ts → promptConcat-CUEIA_3T.d.ts} +3 -3
- package/dist/{promptConcat-D6wr5V-V.d.cts → promptConcat-VLe5SEN4.d.cts} +3 -3
- package/dist/{providerRegistry-CPsktuiX.d.cts → providerRegistry-BDGGs5gz.d.cts} +2 -2
- package/dist/{providerRegistry-Bi6pAvSj.d.ts → providerRegistry-CaFK_aUd.d.ts} +2 -2
- package/dist/{registry-D0kbxksn.d.cts → registry-DNSEVYug.d.cts} +3 -3
- package/dist/{registry-DDbvhlhs.d.ts → registry-yGnYHWhq.d.ts} +3 -3
- package/dist/{remoteClient-CBggnRy3.d.cts → remoteClient-DFIyCZEv.d.cts} +2 -2
- package/dist/{remoteClient-B_spK019.d.ts → remoteClient-DwBCoHpc.d.ts} +2 -2
- package/dist/{runtime-UONPTAYK.js → runtime-6EELHWVB.js} +2 -2
- package/dist/{scriptDeploymentPipeline-CXJcC82H.d.ts → scriptDeploymentPipeline-B1q-UhrO.d.ts} +1 -1
- package/dist/{scriptDeploymentPipeline-yG1ZhVVI.d.cts → scriptDeploymentPipeline-XJzQyYys.d.cts} +1 -1
- package/dist/{syncCloudDevices-Ds_Kcgrv.d.cts → syncCloudDevices-BFw_c1g5.d.cts} +6 -5
- package/dist/{syncCloudDevices-BEqwgrhD.d.ts → syncCloudDevices-C8fCUhnX.d.ts} +6 -5
- package/dist/{types-CdFVSntj.d.ts → types-C8gnhG9M.d.cts} +6 -4
- package/dist/{types-7pYti-k9.d.cts → types-CcFFIk8W.d.ts} +6 -4
- package/package.json +1 -1
- package/dist/chunk-426CJUZP.js +0 -630
- package/dist/chunk-426CJUZP.js.map +0 -1
- package/dist/chunk-MRKY4HGF.js.map +0 -1
- package/dist/chunk-VZKQX5PP.js +0 -1
- package/dist/pairingInvite-BXPWY3aM.d.cts +0 -149
- package/dist/pairingInvite-Cuz0wuq9.d.ts +0 -149
- /package/dist/{chunk-P6L3444O.js.map → chunk-KV6TC5UJ.js.map} +0 -0
- /package/dist/{chunk-VZKQX5PP.js.map → chunk-MXRXYGWW.js.map} +0 -0
- /package/dist/{runtime-UONPTAYK.js.map → runtime-6EELHWVB.js.map} +0 -0
package/dist/browser.cjs
CHANGED
|
@@ -910,7 +910,7 @@ var PromptPreviewController = class {
|
|
|
910
910
|
};
|
|
911
911
|
|
|
912
912
|
// src/orchestration/remoteClient.ts
|
|
913
|
-
var REMOTE_ORCHESTRATION_PROTOCOL = "memeloop.resource.
|
|
913
|
+
var REMOTE_ORCHESTRATION_PROTOCOL = "memeloop.resource.v2";
|
|
914
914
|
var REMOTE_OPERATIONS = /* @__PURE__ */ new Set([
|
|
915
915
|
"capabilities",
|
|
916
916
|
"apply",
|
package/dist/browser.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser.ts","../src/orchestration/errors.ts","../src/storage/tiddlyWikiHttpStorage.ts","../src/agent/categories.ts","../src/agent-management/AgentSessionController.ts","../src/agent-management/AgentDefinitionEditorController.ts","../src/agent-management/AgentCreationController.ts","../src/agent-management/PromptPreviewController.ts","../src/orchestration/remoteClient.ts"],"sourcesContent":["/**\n * Browser-safe entry point for memeloop.\n *\n * Bundlers that respect the \"browser\" condition (Vite, webpack, etc.) will\n * resolve `import ... from 'memeloop'` to this file instead of the full Node.js\n * entry, avoiding libp2p, crypto, and other Node.js-specific dependencies.\n *\n * Only type-only re-exports and browser-safe utilities are included.\n * For the full Node.js runtime, import from 'memeloop/node' or use the\n * \"default\"/\"node\" condition.\n */\n\n// ── Types (compile-time only — erased by TypeScript/esbuild) ──────────────\nexport type * from './agent-management/types.js';\nexport type * from './agent/agentProfileRegistry.js';\nexport type * from './agent/agentProfiles.js';\nexport type * from './agent/types.js';\nexport type * from './conversation/types.js';\nexport type * from './device-network/index.js';\nexport type * from './im/index.js';\nexport type * from './llm/providerRegistry.js';\nexport type * from './loopAPI/controlStoreLoopCheckpointStore.js';\nexport type * from './loopAPI/types.js';\nexport type * from './orchestration/index.js';\nexport type * from './permission/index.js';\nexport type * from './plugin/index.js';\nexport type * from './promptUtilities/types.js';\nexport type * from './storage/sessionStorage.js';\nexport { TiddlyWikiHttpStorage } from './storage/tiddlyWikiHttpStorage.js';\nexport type { TiddlyWikiHttpStorageOptions } from './storage/tiddlyWikiHttpStorage.js';\nexport type * from './sync/protocol.js';\nexport type * from './types.js';\n\n// Re-export AgentInstance type (used by UI layer)\nexport type { AgentInstanceModel, AgentInstanceModel as AgentInstance } from './types.js';\n\n// ── Browser-safe runtime values (no libp2p, no Node.js APIs) ─────────────\n\n// Categories — constants with no dependencies\nexport * from './agent/categories.js';\n\n// Agent management contracts — headless, type-only based\nexport * from './agent-management/index.js';\n\n// Remote declarative orchestration — fetch/ReadableStream only, no Node APIs\nexport { OrchestrationError } from './orchestration/errors.js';\nexport * from './orchestration/remoteClient.js';\n","export const ORCHESTRATION_ERROR_CODES = [\n 'UNSUPPORTED',\n 'FORBIDDEN',\n 'CONFLICT',\n 'STALE_EPOCH',\n 'NOT_FOUND',\n 'INVALID',\n 'EXHAUSTED',\n 'UNAVAILABLE',\n 'TIMEOUT',\n 'CANCELLED',\n 'UNKNOWN_EFFECT',\n 'WATCH_COMPACTED',\n 'INTERNAL',\n] as const;\n\nexport type OrchestrationErrorCode = typeof ORCHESTRATION_ERROR_CODES[number];\n\nexport interface OrchestrationErrorData {\n code: OrchestrationErrorCode;\n message: string;\n retryable: boolean;\n retryAfterMs?: number;\n reason?: string;\n details?: Record<string, unknown>;\n}\n\nexport class OrchestrationError extends Error {\n readonly code: OrchestrationErrorCode;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly reason?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(data: OrchestrationErrorData) {\n super(data.message);\n this.name = 'OrchestrationError';\n this.code = data.code;\n this.retryable = data.retryable;\n this.retryAfterMs = data.retryAfterMs;\n this.reason = data.reason;\n this.details = data.details;\n }\n\n toJSON(): OrchestrationErrorData {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n retryAfterMs: this.retryAfterMs,\n reason: this.reason,\n details: this.details,\n };\n }\n}\n\nexport function isOrchestrationError(error: unknown): error is OrchestrationError {\n return error instanceof OrchestrationError;\n}\n\nexport function toOrchestrationErrorData(\n error: unknown,\n fallback: Pick<OrchestrationErrorData, 'code' | 'retryable'> = {\n code: 'INTERNAL',\n retryable: false,\n },\n): OrchestrationErrorData {\n if (isOrchestrationError(error)) return error.toJSON();\n return {\n ...fallback,\n message: error instanceof Error ? error.message : String(error),\n };\n}\n","import type { AgentDefinition, AgentInstanceMeta } from '../agent/types.js';\nimport type { AttachmentReference, ChatMessage } from '../conversation/index.js';\nimport type { IMChannelBinding } from '../im/protocol.js';\nimport { OrchestrationError } from '../orchestration/errors.js';\nimport type { ConversationMeta } from '../sync/protocol.js';\n\nimport type { FullAgentStorage, GetMessagesOptions, ListConversationsOptions } from './ports.js';\n\n/**\n * TiddlyWiki HTTP storage driver (plan 24.44).\n *\n * Portable: depends only on an injectable `fetch` (browser and Node 18+).\n * Every tiddler write is a compare-and-swap: the driver reads the current\n * ETag, writes with `If-Match`, and retries a bounded number of times on\n * 412/409 before failing with CONFLICT. Blobs are stored inline as base64 up\n * to `maxInlineBlobBytes`; larger payloads are rejected with guidance to use\n * an external BlobStore, keeping tiddlers small.\n *\n * Credentials are materialized per request by a trusted resolver from an\n * opaque handle. Raw credentials never enter this portable driver.\n */\n\nexport interface TiddlyWikiCredentialResolver {\n resolveHeaders(handle: string, request: { url: string; method: string }): Promise<Record<string, string>>;\n}\n\nexport interface TiddlyWikiHttpStorageOptions {\n /** Wiki base URL, e.g. `http://localhost:8080`. */\n baseUrl: string;\n /** TiddlyWeb recipe (default `default`). */\n recipe?: string;\n /** Injectable fetch implementation. */\n fetchImpl?: typeof fetch;\n /** Opaque CredentialGrant handle and trusted materialization port. */\n credentialHandle?: string;\n credentialResolver?: TiddlyWikiCredentialResolver;\n /** Maximum inline blob size in bytes (default 256 KiB). */\n maxInlineBlobBytes?: number;\n /** CAS retry budget per write (default 3). */\n maxCasAttempts?: number;\n}\n\nconst PREFIX = '$:/memeloop';\nconst DEFAULT_MAX_INLINE_BLOB = 256 * 1024;\nconst DEFAULT_CAS_ATTEMPTS = 3;\n\ninterface Tiddler {\n title: string;\n text?: string;\n type?: string;\n revision?: string;\n fields?: Record<string, string>;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return bytes;\n}\n\nfunction escapeFilterValue(value: string): string {\n return value.replace(/[\"\\\\[\\]]/g, (character) => `\\\\${character}`);\n}\n\nexport class TiddlyWikiHttpStorage implements FullAgentStorage {\n private readonly baseUrl: string;\n private readonly recipe: string;\n private readonly fetchImpl: typeof fetch;\n private readonly credentialHandle?: string;\n private readonly credentialResolver?: TiddlyWikiCredentialResolver;\n private readonly maxInlineBlobBytes: number;\n private readonly maxCasAttempts: number;\n\n constructor(options: TiddlyWikiHttpStorageOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.recipe = options.recipe ?? 'default';\n this.fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.maxInlineBlobBytes = options.maxInlineBlobBytes ?? DEFAULT_MAX_INLINE_BLOB;\n this.maxCasAttempts = options.maxCasAttempts ?? DEFAULT_CAS_ATTEMPTS;\n if ((options.credentialHandle === undefined) !== (options.credentialResolver === undefined)) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'credentialHandle and credentialResolver must be provided together',\n retryable: false,\n });\n }\n this.credentialHandle = options.credentialHandle;\n this.credentialResolver = options.credentialResolver;\n }\n\n private eventTitle(conversationId: string, messageId: string): string {\n return `${PREFIX}/e/${conversationId}/${messageId}`;\n }\n\n private metaTitle(conversationId: string): string {\n return `${PREFIX}/meta/${conversationId}`;\n }\n\n private blobTitle(contentHash: string): string {\n return `${PREFIX}/blob/${contentHash}`;\n }\n\n private definitionTitle(id: string): string {\n return `${PREFIX}/def/${id}`;\n }\n\n private instanceTitle(id: string): string {\n return `${PREFIX}/inst/${id}`;\n }\n\n private imTitle(channelId: string, imUserId: string): string {\n return `${PREFIX}/im/${channelId}/${imUserId}`;\n }\n\n private tiddlerUrl(title: string): string {\n return `${this.baseUrl}/recipes/${encodeURIComponent(this.recipe)}/tiddlers/${encodeURIComponent(title)}`;\n }\n\n private filterUrl(filter: string): string {\n return `${this.baseUrl}/recipes/${encodeURIComponent(this.recipe)}/tiddlers.json?filter=${encodeURIComponent(filter)}`;\n }\n\n private async headers(url: string, method: string, extra: Record<string, string> = {}): Promise<Record<string, string>> {\n const credentialHeaders = this.credentialHandle && this.credentialResolver\n ? await this.credentialResolver.resolveHeaders(this.credentialHandle, { url, method })\n : {};\n return {\n 'content-type': 'application/json',\n 'x-requested-with': 'TiddlyWiki',\n ...credentialHeaders,\n ...extra,\n };\n }\n\n /** GET a tiddler; returns null on 404. Includes the ETag when the server sends one. */\n private async readTiddler(title: string): Promise<{ tiddler: Tiddler; etag?: string } | null> {\n const url = this.tiddlerUrl(title);\n const response = await this.fetchImpl(url, { headers: await this.headers(url, 'GET') });\n if (response.status === 404) return null;\n if (!response.ok) {\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler read failed: HTTP ${response.status}`, retryable: true });\n }\n const tiddler = (await response.json()) as Tiddler;\n const etag = response.headers.get('etag') ?? undefined;\n return { tiddler, ...(etag ? { etag } : {}) };\n }\n\n /** CAS write: If-Match when an ETag is known; bounded retries on 412/409. */\n private async writeTiddler(title: string, build: (current: Tiddler | null) => Tiddler): Promise<void> {\n for (let attempt = 1; attempt <= this.maxCasAttempts; attempt += 1) {\n const current = await this.readTiddler(title);\n if (current && !current.etag) {\n throw new OrchestrationError({ code: 'CONFLICT', message: `tiddler '${title}' has no ETag for a safe update`, retryable: false });\n }\n const next = build(current?.tiddler ?? null);\n const url = this.tiddlerUrl(title);\n const precondition: Record<string, string> = current ? { 'if-match': current.etag! } : { 'if-none-match': '*' };\n const response = await this.fetchImpl(url, {\n method: 'PUT',\n headers: await this.headers(url, 'PUT', precondition),\n body: JSON.stringify(next),\n });\n if (response.ok) return;\n if (response.status === 412 || response.status === 409) {\n if (attempt === this.maxCasAttempts) {\n throw new OrchestrationError({\n code: 'CONFLICT',\n message: `tiddler '${title}' was modified concurrently after ${attempt} CAS attempts`,\n retryable: true,\n });\n }\n continue;\n }\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler write failed: HTTP ${response.status}`, retryable: true });\n }\n }\n\n private async listByPrefix(prefix: string): Promise<Tiddler[]> {\n const filter = `[prefix[\"${escapeFilterValue(prefix)}\"]]`;\n const url = this.filterUrl(filter);\n const response = await this.fetchImpl(url, { headers: await this.headers(url, 'GET') });\n if (!response.ok) {\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler list failed: HTTP ${response.status}`, retryable: true });\n }\n return (await response.json()) as Tiddler[];\n }\n\n private parsePayload(tiddler: Tiddler): unknown {\n return JSON.parse(tiddler.text ?? '{}');\n }\n\n async listConversations(options: ListConversationsOptions = {}): Promise<ConversationMeta[]> {\n const tiddlers = await this.listByPrefix(`${PREFIX}/meta/`);\n const metas = tiddlers.map((tiddler) => this.parsePayload(tiddler) as ConversationMeta);\n metas.sort((a, b) => (b.lastMessageTimestamp ?? 0) - (a.lastMessageTimestamp ?? 0));\n const offset = options.offset ?? 0;\n const limit = options.limit ?? metas.length;\n return metas.slice(offset, offset + limit);\n }\n\n async getMessages(conversationId: string, _options: GetMessagesOptions = {}): Promise<ChatMessage[]> {\n const tiddlers = await this.listByPrefix(`${PREFIX}/e/${conversationId}/`);\n const messages = tiddlers.map((tiddler) => this.parsePayload(tiddler) as ChatMessage);\n messages.sort((a, b) => (a.lamportClock ?? 0) - (b.lamportClock ?? 0));\n return messages;\n }\n\n async appendMessage(message: ChatMessage): Promise<void> {\n await this.writeTiddler(this.eventTitle(message.conversationId, message.messageId), () => ({\n title: this.eventTitle(message.conversationId, message.messageId),\n text: JSON.stringify(message),\n }));\n }\n\n async insertMessagesIfAbsent(messages: ChatMessage[]): Promise<void> {\n for (const message of messages) {\n const title = this.eventTitle(message.conversationId, message.messageId);\n const existing = await this.readTiddler(title);\n if (!existing) {\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(message) }));\n }\n }\n }\n\n async getMaxLamportClockForConversation(conversationId: string): Promise<number> {\n const messages = await this.getMessages(conversationId);\n return messages.reduce((max, message) => Math.max(max, message.lamportClock ?? 0), 0);\n }\n\n async upsertConversationMetadata(meta: ConversationMeta): Promise<void> {\n const title = this.metaTitle(meta.conversationId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(meta) }));\n }\n\n async getConversationMeta(conversationId: string): Promise<ConversationMeta | null> {\n const result = await this.readTiddler(this.metaTitle(conversationId));\n return result ? this.parsePayload(result.tiddler) as ConversationMeta : null;\n }\n\n async saveAttachment(reference: AttachmentReference, data: Uint8Array): Promise<void> {\n if (data.byteLength > this.maxInlineBlobBytes) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: `blob of ${data.byteLength} bytes exceeds the inline limit ${this.maxInlineBlobBytes}; store it in an external BlobStore and keep the reference`,\n retryable: false,\n details: { maxInlineBlobBytes: this.maxInlineBlobBytes },\n });\n }\n const title = this.blobTitle(reference.contentHash);\n await this.writeTiddler(title, () => ({\n title,\n text: JSON.stringify({ reference, dataBase64: bytesToBase64(data) }),\n }));\n }\n\n async getAttachment(contentHash: string): Promise<AttachmentReference | null> {\n const result = await this.readTiddler(this.blobTitle(contentHash));\n if (!result) return null;\n return (this.parsePayload(result.tiddler) as { reference: AttachmentReference }).reference;\n }\n\n async readAttachmentData(contentHash: string): Promise<Uint8Array | null> {\n const result = await this.readTiddler(this.blobTitle(contentHash));\n if (!result) return null;\n return base64ToBytes((this.parsePayload(result.tiddler) as { dataBase64: string }).dataBase64);\n }\n\n async getAgentDefinition(id: string): Promise<AgentDefinition | null> {\n const result = await this.readTiddler(this.definitionTitle(id));\n return result ? this.parsePayload(result.tiddler) as AgentDefinition : null;\n }\n\n async saveAgentDefinition(definition: AgentDefinition & { id: string }): Promise<void> {\n const title = this.definitionTitle(definition.id);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(definition) }));\n }\n\n async saveAgentInstance(meta: AgentInstanceMeta): Promise<void> {\n const title = this.instanceTitle(meta.instanceId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(meta) }));\n }\n\n async getImBinding(channelId: string, imUserId: string): Promise<IMChannelBinding | null> {\n const result = await this.readTiddler(this.imTitle(channelId, imUserId));\n return result ? this.parsePayload(result.tiddler) as IMChannelBinding : null;\n }\n\n async setImBinding(record: IMChannelBinding): Promise<void> {\n const title = this.imTitle(record.channelId, record.imUserId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(record) }));\n }\n}\n","/**\n * Task category system for routing tasks to appropriate agent configurations.\n * Each category maps to a model, temperature, and description for delegation decisions.\n */\n\nexport type TaskCategory =\n | 'visual-engineering'\n | 'ultrabrain'\n | 'artistry'\n | 'quick'\n | 'unspecified-low'\n | 'unspecified-high'\n | 'writing';\n\nexport interface CategoryConfig {\n /** Model identifier (e.g., \"default\", \"gpt-4o\", \"claude-opus\") */\n model: string;\n /** LLM temperature (0.0 = deterministic, 1.0 = creative) */\n temperature: number;\n /** Human-readable description of the category's purpose */\n description: string;\n}\n\nconst CATEGORY_CONFIGS: Record<TaskCategory, CategoryConfig> = {\n 'visual-engineering': {\n model: 'default',\n temperature: 0.3,\n description: 'UI/UX visual engineering tasks requiring precise rendering and layout',\n },\n ultrabrain: {\n model: 'default',\n temperature: 0.1,\n description: 'Deep logical reasoning, architecture decisions, and complex problem-solving',\n },\n artistry: {\n model: 'default',\n temperature: 0.8,\n description: 'Creative writing, design, and artistic generation tasks',\n },\n quick: {\n model: 'default',\n temperature: 0.2,\n description: 'Fast, straightforward tasks with minimal deliberation needed',\n },\n 'unspecified-low': {\n model: 'default',\n temperature: 0.5,\n description: 'Unclassified tasks of moderate complexity and effort',\n },\n 'unspecified-high': {\n model: 'default',\n temperature: 0.4,\n description: 'Unclassified tasks requiring substantial effort across multiple systems',\n },\n writing: {\n model: 'default',\n temperature: 0.7,\n description: 'Documentation, prose, technical writing, and content generation',\n },\n};\n\n/**\n * Get the configuration for a task category.\n * @throws {Error} if the category is unknown\n */\nexport function getCategoryConfig(category: TaskCategory): CategoryConfig {\n const config = CATEGORY_CONFIGS[category];\n if (!config) {\n throw new Error(`Unknown task category: ${category}`);\n }\n return { ...config };\n}\n\n/**\n * Type guard: check if a string is a valid TaskCategory.\n */\nexport function isTaskCategory(value: string): value is TaskCategory {\n return value in CATEGORY_CONFIGS;\n}\n\n/** All registered category identifiers (read-only). */\nexport const ALL_CATEGORIES = Object.keys(CATEGORY_CONFIGS) as TaskCategory[];\n\n/**\n * Resolve a category string (or fallback to \"unspecified-low\").\n * Never throws; always returns a valid config.\n */\nexport function resolveCategory(category: string): CategoryConfig {\n if (isTaskCategory(category)) {\n return getCategoryConfig(category);\n }\n return getCategoryConfig('unspecified-low');\n}\n","/**\n * AgentSessionController — headless controller for an active agent conversation session.\n *\n * Manages agent runtime state, message sending, streaming, delete/retry turns,\n * and subscription to live agent updates.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentConversationClient, AgentInstanceClient, AgentRuntimeView, WikiTiddlerAttachment } from './types.js';\n\n/** Read-only snapshot of the session state. */\nexport interface AgentSessionSnapshot {\n agent: AgentRuntimeView | null;\n loading: boolean;\n error: Error | null;\n messages: ChatMessage[];\n orderedMessageIds: string[];\n streamingMessageIds: Set<string>;\n}\n\n/** Listener for snapshot changes. */\nexport type AgentSessionListener = (snapshot: AgentSessionSnapshot) => void;\n\n/** Options for creating an AgentSessionController. */\nexport interface AgentSessionControllerOptions {\n agentInstanceClient: AgentInstanceClient;\n conversationClient: AgentConversationClient;\n /** Polling interval in ms for agent status updates. Default 500. */\n pollInterval?: number;\n}\n\n/**\n * Headless controller for an agent conversation session.\n *\n * Call {@link start} to load an agent, then {@link subscribe} to receive snapshot\n * updates. Use {@link sendMessage}, {@link deleteTurn}, {@link retryTurn}, {@link cancel}\n * to drive the conversation.\n *\n * Host UI frameworks (React, Ink) subscribe via {@link subscribe} and render\n * the snapshot.\n */\nexport class AgentSessionController {\n private readonly options: Required<AgentSessionControllerOptions>;\n private listener: AgentSessionListener | null = null;\n private snapshot: AgentSessionSnapshot = {\n agent: null,\n loading: false,\n error: null,\n messages: [],\n orderedMessageIds: [],\n streamingMessageIds: new Set(),\n };\n private unsubAgentUpdates: (() => void) | null = null;\n private unsubMessages: (() => void) | null = null;\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private agentId: string | null = null;\n\n constructor(options: AgentSessionControllerOptions) {\n this.options = {\n pollInterval: 500,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /**\n * Start a session for the given agent ID.\n * Fetches the agent, subscribes to live updates, and loads messages.\n */\n async start(agentId: string): Promise<void> {\n this.agentId = agentId;\n this.emitPartial({ loading: true, error: null });\n\n try {\n const [agent, rawMessages] = await Promise.all([\n this.options.agentInstanceClient.fetchAgent(agentId),\n this.options.conversationClient.getMessages(agentId),\n ]);\n\n const orderedMessageIds = rawMessages.map((m) => m.messageId);\n const messagesMap = new Map<string, ChatMessage>();\n for (const m of rawMessages) messagesMap.set(m.messageId, m);\n\n this.emitPartial({\n agent,\n loading: false,\n messages: rawMessages,\n orderedMessageIds,\n streamingMessageIds: new Set(),\n });\n\n // Subscribe to live agent updates\n this.unsubAgentUpdates = this.options.agentInstanceClient.subscribeToUpdates(\n agentId,\n this.handleAgentUpdate,\n );\n\n // Subscribe to new messages\n this.unsubMessages = this.options.conversationClient.subscribeToMessages(\n agentId,\n this.handleNewMessage,\n );\n\n // Poll for status changes\n this.startPolling(agentId);\n } catch (error_) {\n this.emitPartial({\n loading: false,\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Stop the session and clean up subscriptions. */\n stop(): void {\n this.stopPolling();\n this.unsubAgentUpdates?.();\n this.unsubAgentUpdates = null;\n this.unsubMessages?.();\n this.unsubMessages = null;\n this.agentId = null;\n }\n\n // ── Actions ───────────────────────────────────────────────────\n\n /** Send a user message. */\n async sendMessage(\n content: string,\n file?: File,\n wikiTiddlers?: WikiTiddlerAttachment[],\n ): Promise<void> {\n if (!this.agentId) return;\n this.emitPartial({ error: null });\n try {\n await this.options.conversationClient.sendMessage(this.agentId, content, file, wikiTiddlers);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Cancel the current agent operation. */\n async cancel(): Promise<void> {\n if (!this.agentId) return;\n try {\n await this.options.agentInstanceClient.cancelAgent(this.agentId);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Delete a turn starting at the given user message ID. */\n async deleteTurn(userMessageId: string): Promise<string | undefined> {\n return this.options.conversationClient.deleteTurn(userMessageId);\n }\n\n /** Retry a turn starting at the given user message ID. */\n async retryTurn(userMessageId: string): Promise<void> {\n return this.options.conversationClient.retryTurn(userMessageId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n /** Subscribe to snapshot changes. Returns unsubscribe function. */\n subscribe(listener: AgentSessionListener): () => void {\n this.listener = listener;\n // Immediately emit current state\n listener({ ...this.snapshot, streamingMessageIds: new Set(this.snapshot.streamingMessageIds) });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n /** Get current snapshot without subscribing. */\n getSnapshot(): AgentSessionSnapshot {\n return this.snapshot;\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n private emitPartial(partial: Partial<AgentSessionSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...partial };\n if (this.listener) {\n this.listener({\n ...this.snapshot,\n streamingMessageIds: new Set(this.snapshot.streamingMessageIds),\n });\n }\n }\n\n private handleAgentUpdate = (update: Partial<AgentRuntimeView>): void => {\n if (this.snapshot.agent) {\n this.emitPartial({ agent: { ...this.snapshot.agent, ...update } });\n }\n };\n\n private handleNewMessage = (message: ChatMessage): void => {\n const messages = [...this.snapshot.messages.filter((m) => m.messageId !== message.messageId), message];\n const orderedMessageIds = [...new Set([...this.snapshot.orderedMessageIds, message.messageId])];\n this.emitPartial({ messages, orderedMessageIds });\n };\n\n private startPolling(agentId: string): void {\n this.stopPolling();\n this.pollingTimer = setInterval(async () => {\n try {\n const agent = await this.options.agentInstanceClient.fetchAgent(agentId);\n this.emitPartial({ agent });\n } catch {\n // Silently retry on next poll\n }\n }, this.options.pollInterval);\n }\n\n private stopPolling(): void {\n if (this.pollingTimer !== null) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n}\n","/**\n * AgentDefinitionEditorController — headless controller for editing an agent definition.\n *\n * Manages definition loading, autosave, schema loading, preview agent lifecycle,\n * and scheduled task CRUD.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentDefinitionEditorState, AgentDefinitionRepository, AgentInstanceClient, CreateScheduledTaskInput, ScheduledTask, ScheduledTaskClient } from './types.js';\n\n/** Partial state emitted to the listener. */\nexport type EditorStateChange = Partial<AgentDefinitionEditorState>;\n\n/** Listener for editor state changes. */\nexport type EditorStateListener = (change: EditorStateChange) => void;\n\n/** Schedule editor sub-state for the UI layer. */\nexport interface ScheduleEditorState {\n mode: 'none' | 'interval' | 'daily' | 'cron';\n intervalValue: number;\n intervalUnit: 's' | 'min' | 'h';\n dailyTime: string;\n activeHoursStart: string;\n activeHoursEnd: string;\n cronExpression: string;\n timezone: string;\n message: string;\n existingTaskId?: string;\n}\n\n/** Options for creating an AgentDefinitionEditorController. */\nexport interface AgentDefinitionEditorControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n scheduledTaskClient: ScheduledTaskClient;\n /** Debounce interval for autosave in ms. Default 1000. */\n autosaveDebounceMs?: number;\n}\n\n/**\n * Headless controller for editing an agent definition.\n *\n * Call {@link loadDefinition} to start, then {@link subscribe} for state updates.\n */\nexport class AgentDefinitionEditorController {\n private readonly options: Required<AgentDefinitionEditorControllerOptions>;\n private listener: EditorStateListener | null = null;\n private state: AgentDefinitionEditorState = {\n agentDefinition: null,\n agentName: '',\n previewAgentId: null,\n isLoading: false,\n isSaving: false,\n promptSchema: null,\n };\n private autosaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: AgentDefinitionEditorControllerOptions) {\n this.options = {\n autosaveDebounceMs: 1_000,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /** Load an agent definition and its prompt schema. */\n async loadDefinition(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n const [definition, previewAgentId] = await Promise.all([\n this.options.definitionRepository.getAgentDef(definitionId),\n this.findOrCreatePreviewAgent(definitionId),\n ]);\n\n if (!definition) {\n this.emit({ isLoading: false });\n return;\n }\n\n let promptSchema: Record<string, unknown> | null = null;\n if (definition.agentFrameworkID) {\n try {\n promptSchema = await this.options.agentInstanceClient.getFrameworkConfigSchema(\n definition.agentFrameworkID,\n );\n } catch {\n promptSchema = null;\n }\n }\n\n this.state = {\n agentDefinition: definition,\n agentName: definition.name ?? '',\n previewAgentId,\n isLoading: false,\n isSaving: false,\n promptSchema,\n };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Update the agent definition field. Triggers debounced autosave. */\n updateDefinition(change: Partial<AgentDefinition> & { id: string }): void {\n if (!this.state.agentDefinition) return;\n const updated = { ...this.state.agentDefinition, ...change };\n this.state = { ...this.state, agentDefinition: updated, agentName: updated.name ?? '' };\n this.emit({ agentDefinition: updated, agentName: this.state.agentName });\n this.scheduleAutosave(updated);\n }\n\n /** Force an immediate save to the repository. */\n async saveNow(): Promise<void> {\n if (!this.state.agentDefinition) return;\n this.emit({ isSaving: true });\n try {\n await this.options.definitionRepository.updateAgentDef({\n id: this.state.agentDefinition.id,\n name: this.state.agentName,\n description: this.state.agentDefinition.description,\n agentFrameworkConfig: this.state.agentDefinition.agentFrameworkConfig,\n aiApiConfig: this.state.agentDefinition.aiApiConfig,\n agentTools: this.state.agentDefinition.agentTools,\n heartbeat: this.state.agentDefinition.heartbeat,\n });\n } catch {\n // Host should surface errors via its UI layer\n } finally {\n this.emit({ isSaving: false });\n }\n }\n\n /** Reload the prompt schema for a framework ID. */\n async reloadSchema(frameworkId: string): Promise<void> {\n try {\n const schema = await this.options.agentInstanceClient.getFrameworkConfigSchema(frameworkId);\n this.emit({ promptSchema: schema });\n } catch {\n this.emit({ promptSchema: null });\n }\n }\n\n // ── Preview agent lifecycle ───────────────────────────────────\n\n /** Get or create a preview agent instance tied to this definition. */\n private async findOrCreatePreviewAgent(definitionId: string): Promise<string | null> {\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n return result.id;\n } catch {\n return null;\n }\n }\n\n // ── Scheduled tasks ───────────────────────────────────────────\n\n async loadScheduledTasks(): Promise<ScheduledTask[]> {\n if (!this.state.previewAgentId) return [];\n return this.options.scheduledTaskClient.listScheduledTasksForAgent(\n this.state.previewAgentId,\n );\n }\n\n async saveScheduledTask(input: CreateScheduledTaskInput): Promise<ScheduledTask> {\n return this.options.scheduledTaskClient.createScheduledTask(input);\n }\n\n async deleteScheduledTask(taskId: string): Promise<void> {\n return this.options.scheduledTaskClient.deleteScheduledTask(taskId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: EditorStateListener): () => void {\n this.listener = listener;\n listener(this.state);\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentDefinitionEditorState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: EditorStateChange): void {\n this.listener?.(change);\n }\n\n private scheduleAutosave(definition: AgentDefinition): void {\n if (this.autosaveTimer !== null) clearTimeout(this.autosaveTimer);\n this.autosaveTimer = setTimeout(() => {\n this.options.definitionRepository.updateAgentDef({\n id: definition.id,\n name: definition.name,\n description: definition.description,\n agentFrameworkConfig: definition.agentFrameworkConfig,\n aiApiConfig: definition.aiApiConfig,\n agentTools: definition.agentTools,\n heartbeat: definition.heartbeat,\n }).catch(() => {});\n }, this.options.autosaveDebounceMs);\n }\n}\n","/**\n * AgentCreationController — headless controller for the \"Create New Agent\" wizard.\n *\n * Manages creation wizard state: current step, template selection, temporary\n * agent definition lifecycle, and preview agent setup.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentCreationState, AgentDefinitionRepository, AgentInstanceClient } from './types.js';\n\n/** Listener for creation state changes. */\nexport type CreationStateListener = (state: AgentCreationState) => void;\n\n/** Options for creating an AgentCreationController. */\nexport interface AgentCreationControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n /** Default framework ID for new agents. */\n defaultFrameworkId?: string;\n}\n\n/**\n * Headless controller for the agent creation wizard.\n *\n * Call {@link start}, {@link selectTemplate}, {@link nextStep}, etc. to drive\n * the wizard. Subscribe via {@link subscribe} for state updates.\n */\nexport class AgentCreationController {\n private readonly options: Required<AgentCreationControllerOptions>;\n private listener: CreationStateListener | null = null;\n private state: AgentCreationState = {\n currentStep: 0,\n agentName: '',\n selectedTemplate: null,\n temporaryAgentDefinition: null,\n previewAgentId: null,\n isLoading: false,\n promptSchema: null,\n };\n\n constructor(options: AgentCreationControllerOptions) {\n this.options = {\n defaultFrameworkId: 'memeloopAgentToolLoop',\n ...options,\n };\n }\n\n /** Initialize the creation wizard, optionally from a saved tab state. */\n async start(definitionId?: string, templateDefinitionId?: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n if (definitionId) {\n // Restore existing temporary definition\n const temporaryDefinition = await this.options.definitionRepository.getAgentDef(definitionId);\n if (temporaryDefinition) {\n this.state = {\n ...this.state,\n temporaryAgentDefinition: temporaryDefinition,\n agentName: temporaryDefinition.name ?? '',\n isLoading: false,\n };\n this.emit(this.state);\n // Load template if available\n if (templateDefinitionId) {\n const template = await this.options.definitionRepository.getAgentDef(templateDefinitionId);\n if (template) {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n }\n return;\n }\n }\n\n this.emit({ isLoading: false });\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Select a template for the new agent. */\n selectTemplate(template: AgentDefinition): void {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n\n /** Update the agent name. */\n setAgentName(name: string): void {\n this.state = { ...this.state, agentName: name };\n this.emit(this.state);\n }\n\n /** Advance to the next wizard step. */\n nextStep(): void {\n this.state = { ...this.state, currentStep: Math.min(this.state.currentStep + 1, 2) };\n this.emit(this.state);\n }\n\n /** Go back to the previous wizard step. */\n previousStep(): void {\n this.state = { ...this.state, currentStep: Math.max(this.state.currentStep - 1, 0) };\n this.emit(this.state);\n }\n\n /** Set the current wizard step directly. */\n setStep(step: number): void {\n this.state = { ...this.state, currentStep: Math.max(0, Math.min(step, 2)) };\n this.emit(this.state);\n }\n\n /** Update the temporary agent definition. */\n updateTemporaryDefinition(change: Partial<AgentDefinition>): void {\n const updated = this.state.temporaryAgentDefinition\n ? { ...this.state.temporaryAgentDefinition, ...change }\n : null;\n this.state = { ...this.state, temporaryAgentDefinition: updated };\n this.emit(this.state);\n }\n\n /** Set the prompt schema for the selected framework. */\n setPromptSchema(schema: Record<string, unknown> | null): void {\n this.state = { ...this.state, promptSchema: schema };\n this.emit(this.state);\n }\n\n /**\n * Create a preview agent instance for the chat-preview step.\n * Should be called when entering step 2 (or the chat preview step).\n */\n async createPreviewAgent(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n this.state = { ...this.state, previewAgentId: result.id, isLoading: false };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /**\n * Finalize creation: persist the temporary definition and create the actual\n * agent instance. Returns the final agent instance ID, or null on failure.\n */\n async finalize(): Promise<string | null> {\n if (!this.state.temporaryAgentDefinition) return null;\n try {\n const definition = await this.options.definitionRepository.createAgentDef(\n this.state.temporaryAgentDefinition,\n );\n const instance = await this.options.agentInstanceClient.createAgent(definition.id);\n return instance.id;\n } catch {\n return null;\n }\n }\n\n /** Clean up temporary resources. */\n async cleanup(): Promise<void> {\n if (this.state.previewAgentId) {\n try {\n await this.options.agentInstanceClient.deleteAgent(this.state.previewAgentId);\n } catch {\n // Best-effort cleanup\n }\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: CreationStateListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentCreationState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: AgentCreationState | Partial<AgentCreationState>): void {\n this.state = { ...this.state, ...change };\n this.listener?.({ ...this.state });\n }\n}\n","/**\n * PromptPreviewController — headless controller for generating prompt previews.\n *\n * Manages preview dialog state, progress tracking, and result accumulation.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { PromptPreviewClient, PromptPreviewDialogState, PromptPreviewResult } from './types.js';\n\n/** Listener for preview dialog state changes. */\nexport type PreviewDialogListener = (state: PromptPreviewDialogState) => void;\n\n/** Options for creating a PromptPreviewController. */\nexport interface PromptPreviewControllerOptions {\n previewClient: PromptPreviewClient;\n}\n\n/**\n * Headless controller for the prompt preview/edit dialog.\n *\n * Call {@link open}, {@link close}, {@link generate} to drive the dialog.\n * Subscribe via {@link subscribe} for state updates.\n */\nexport class PromptPreviewController {\n private readonly options: PromptPreviewControllerOptions;\n private listener: PreviewDialogListener | null = null;\n private state: PromptPreviewDialogState = {\n open: false,\n baseMode: 'preview',\n activeTab: 'tree',\n loading: false,\n progress: 0,\n currentStep: '',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n\n constructor(options: PromptPreviewControllerOptions) {\n this.options = options;\n }\n\n /** Open the dialog with an optional base mode. */\n open(baseMode?: 'preview' | 'edit'): void {\n this.state = {\n ...this.state,\n open: true,\n baseMode: baseMode ?? 'preview',\n loading: false,\n progress: 0,\n currentStep: 'Starting...',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Close the dialog. */\n close(): void {\n this.state = {\n ...this.state,\n open: false,\n baseMode: 'preview',\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Set the active tab in the dialog. */\n setActiveTab(tab: 'flat' | 'tree'): void {\n this.state = { ...this.state, activeTab: tab };\n this.emit();\n }\n\n /** Set form fields to scroll to (for edit mode navigation). */\n setFormFieldsToScrollTo(fieldPaths: string[]): void {\n this.state = { ...this.state, formFieldsToScrollTo: fieldPaths };\n this.emit();\n }\n\n /**\n * Generate a preview of the prompt tree.\n * @param agentFrameworkConfig The agent's framework configuration\n * @param messages Current conversation messages\n * @param inputText Optional input text to include in the preview\n */\n async generate(\n agentFrameworkConfig: AgentFrameworkConfig,\n messages: ChatMessage[],\n inputText?: string,\n ): Promise<PromptPreviewResult | null> {\n this.state = {\n ...this.state,\n loading: true,\n progress: 0,\n currentStep: 'Preparing...',\n };\n this.emit();\n\n try {\n const result = await this.options.previewClient.generatePreview(\n agentFrameworkConfig,\n messages,\n inputText,\n (progress) => {\n this.state = {\n ...this.state,\n progress: progress.progress,\n currentStep: progress.step,\n currentPlugin: progress.currentPlugin ?? null,\n };\n this.emit();\n },\n );\n\n this.state = {\n ...this.state,\n loading: false,\n progress: 1,\n currentStep: 'Complete',\n currentPlugin: null,\n result,\n lastUpdated: new Date(),\n };\n this.emit();\n return result;\n } catch {\n this.state = {\n ...this.state,\n loading: false,\n progress: 0,\n currentStep: 'Error occurred',\n currentPlugin: null,\n result: null,\n };\n this.emit();\n return null;\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: PreviewDialogListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): PromptPreviewDialogState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(): void {\n this.listener?.({ ...this.state });\n }\n}\n","import type {\n AgentOrchestrationCapabilities,\n AgentOrchestrationClient,\n OrchestrationApplyOptions,\n OrchestrationDeleteOptions,\n OrchestrationDeleteResult,\n OrchestrationGetOptions,\n OrchestrationListOptions,\n OrchestrationResource,\n OrchestrationResourceList,\n OrchestrationResourceManifest,\n OrchestrationResourceQuery,\n OrchestrationResourceReference,\n OrchestrationResourceStatus,\n OrchestrationWatchEvent,\n OrchestrationWatchOptions,\n} from './client.js';\nimport { OrchestrationError } from './errors.js';\nimport type { OrchestrationErrorData } from './errors.js';\n\nexport const REMOTE_ORCHESTRATION_PROTOCOL = 'memeloop.resource.v1' as const;\nexport type RemoteOrchestrationOperation =\n | 'capabilities'\n | 'apply'\n | 'get'\n | 'list'\n | 'watch'\n | 'delete';\n\nexport interface RemoteOrchestrationRequest {\n protocol: typeof REMOTE_ORCHESTRATION_PROTOCOL;\n requestId: string;\n operation: RemoteOrchestrationOperation;\n payload: Record<string, unknown>;\n}\n\nexport type RemoteOrchestrationResponse =\n | {\n protocol: typeof REMOTE_ORCHESTRATION_PROTOCOL;\n requestId: string;\n ok: true;\n result: unknown;\n }\n | {\n protocol: typeof REMOTE_ORCHESTRATION_PROTOCOL;\n requestId: string;\n ok: false;\n error: OrchestrationErrorData;\n };\n\nexport interface RemoteOrchestrationTransportOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Portable host boundary. Browser, Electron renderer, React Native, and Tauri\n * WebView clients implement this interface; trusted hosts bind identity and\n * policy behind the server-side AgentOrchestrationClient.\n */\nexport interface RemoteOrchestrationTransport {\n request(\n request: RemoteOrchestrationRequest,\n options?: RemoteOrchestrationTransportOptions,\n ): Promise<RemoteOrchestrationResponse>;\n watch(\n request: RemoteOrchestrationRequest,\n options?: RemoteOrchestrationTransportOptions,\n ): AsyncIterable<RemoteOrchestrationResponse>;\n}\n\nexport interface RemoteOrchestrationClientOptions {\n createRequestId?: () => string;\n}\n\nexport interface ReadOnlyOrchestrationClientOptions {\n /** Resource kinds visible to the remote client. Omit to retain every kind exposed by the source client. */\n allowedResourceKinds?: readonly string[];\n}\n\nexport interface NamespacedOrchestrationClientOptions {\n /** Host-bound namespace. Callers may omit it, but cannot select another namespace. */\n namespace: string;\n /** Resource kinds the caller may access. An empty list denies every resource kind. */\n allowedResourceKinds: readonly string[];\n /**\n * Resource kinds the caller may apply or delete. Defaults to every allowed\n * kind for compatibility; hosts should narrow this when status resources are\n * controller-owned.\n */\n mutableResourceKinds?: readonly string[];\n}\n\nconst REMOTE_OPERATIONS = new Set<RemoteOrchestrationOperation>([\n 'capabilities',\n 'apply',\n 'get',\n 'list',\n 'watch',\n 'delete',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction errorData(error: unknown): OrchestrationErrorData {\n if (error instanceof OrchestrationError) {\n return {\n code: error.code,\n message: error.message,\n retryable: error.retryable,\n ...(error.retryAfterMs !== undefined ? { retryAfterMs: error.retryAfterMs } : {}),\n ...(error.reason !== undefined ? { reason: error.reason } : {}),\n ...(error.details !== undefined ? { details: error.details } : {}),\n };\n }\n return {\n code: 'INTERNAL',\n message: error instanceof Error ? error.message : String(error),\n retryable: false,\n };\n}\n\nfunction throwResponseError(response: Extract<RemoteOrchestrationResponse, { ok: false }>): never {\n throw new OrchestrationError(response.error);\n}\n\nfunction assertResponse(\n request: RemoteOrchestrationRequest,\n response: RemoteOrchestrationResponse,\n): void {\n if (\n !isRecord(response) ||\n response.protocol !== REMOTE_ORCHESTRATION_PROTOCOL ||\n response.requestId !== request.requestId ||\n typeof response.ok !== 'boolean' ||\n (response.ok && !('result' in response)) ||\n (!response.ok &&\n (!isRecord(response.error) ||\n typeof response.error.code !== 'string' ||\n typeof response.error.message !== 'string' ||\n typeof response.error.retryable !== 'boolean'))\n ) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'remote orchestration response correlation or protocol mismatch',\n retryable: false,\n });\n }\n}\n\nlet requestSequence = 0;\n\n/** Build the policy-scoped Agent facade over a browser-safe remote transport. */\nexport function createRemoteOrchestrationClient(\n transport: RemoteOrchestrationTransport,\n options: RemoteOrchestrationClientOptions = {},\n): AgentOrchestrationClient {\n const createRequestId = options.createRequestId ??\n (() => `resource-${Date.now().toString(36)}-${(++requestSequence).toString(36)}`);\n\n function makeRequest(\n operation: RemoteOrchestrationOperation,\n payload: Record<string, unknown>,\n ): RemoteOrchestrationRequest {\n return {\n protocol: REMOTE_ORCHESTRATION_PROTOCOL,\n requestId: createRequestId(),\n operation,\n payload,\n };\n }\n\n async function request<T>(\n operation: RemoteOrchestrationOperation,\n payload: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<T> {\n const envelope = makeRequest(operation, payload);\n const response = await transport.request(envelope, { signal });\n assertResponse(envelope, response);\n if (!response.ok) throwResponseError(response);\n return response.result as T;\n }\n\n return {\n getCapabilities() {\n return request<AgentOrchestrationCapabilities>('capabilities', {});\n },\n apply<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n resource: OrchestrationResourceManifest<TSpec>,\n applyOptions?: OrchestrationApplyOptions,\n ) {\n return request<OrchestrationResource<TSpec, TStatus>>('apply', {\n resource,\n ...(applyOptions ? { options: applyOptions } : {}),\n });\n },\n get<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n reference: OrchestrationResourceReference,\n getOptions?: OrchestrationGetOptions,\n ) {\n return request<OrchestrationResource<TSpec, TStatus> | null>('get', {\n reference,\n ...(getOptions ? { options: getOptions } : {}),\n });\n },\n list<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n query: OrchestrationResourceQuery,\n listOptions?: OrchestrationListOptions,\n ) {\n return request<OrchestrationResourceList<TSpec, TStatus>>('list', {\n query,\n ...(listOptions ? { options: listOptions } : {}),\n });\n },\n async *watch<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n query: OrchestrationResourceQuery,\n watchOptions?: OrchestrationWatchOptions,\n ): AsyncIterable<OrchestrationWatchEvent<TSpec, TStatus>> {\n const envelope = makeRequest('watch', {\n query,\n ...(watchOptions\n ? {\n options: {\n ...watchOptions,\n signal: undefined,\n },\n }\n : {}),\n });\n for await (\n const response of transport.watch(envelope, {\n signal: watchOptions?.signal,\n })\n ) {\n assertResponse(envelope, response);\n if (!response.ok) throwResponseError(response);\n yield response.result as OrchestrationWatchEvent<TSpec, TStatus>;\n }\n },\n delete(reference: OrchestrationResourceReference, deleteOptions?: OrchestrationDeleteOptions) {\n return request<OrchestrationDeleteResult>('delete', {\n reference,\n ...(deleteOptions ? { options: deleteOptions } : {}),\n });\n },\n };\n}\n\n/**\n * Bind a remote/mobile caller to a read-only view of an existing policy-scoped\n * client. This is an enforcement boundary, not only capability advertising:\n * mutations and out-of-scope kinds fail before reaching the source client.\n */\nexport function createReadOnlyOrchestrationClient(\n client: AgentOrchestrationClient,\n options: ReadOnlyOrchestrationClientOptions = {},\n): AgentOrchestrationClient {\n const allowedKinds = options.allowedResourceKinds\n ? new Set(options.allowedResourceKinds)\n : undefined;\n\n function assertAllowedKind(kind: string): void {\n if (!allowedKinds || allowedKinds.has(kind)) return;\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration access to resource kind '${kind}' is forbidden`,\n retryable: false,\n });\n }\n\n function forbidden(operation: 'apply' | 'delete'): never {\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration operation '${operation}' is read-only`,\n retryable: false,\n });\n }\n\n return {\n async getCapabilities() {\n const capabilities = await client.getCapabilities();\n return {\n operations: ['get', 'list', 'watch'],\n resourceKinds: capabilities.resourceKinds.filter((kind) => allowedKinds ? allowedKinds.has(kind) : true),\n interfaces: capabilities.interfaces.includes('resource') ? ['resource'] : [],\n };\n },\n async apply() {\n forbidden('apply');\n },\n async get(reference, getOptions) {\n assertAllowedKind(reference.kind);\n return await client.get(reference, getOptions);\n },\n async list(query, listOptions) {\n assertAllowedKind(query.kind);\n return await client.list(query, listOptions);\n },\n async *watch(query, watchOptions) {\n assertAllowedKind(query.kind);\n yield* client.watch(query, watchOptions);\n },\n async delete() {\n forbidden('delete');\n },\n };\n}\n\n/**\n * Bind a mutable remote caller to one host-selected namespace and an explicit\n * resource-kind allowlist. The wrapper is an authorization boundary: it\n * rejects cross-namespace references before they reach the source client and\n * fills an omitted namespace with the host-bound value.\n */\nexport function createNamespacedOrchestrationClient(\n client: AgentOrchestrationClient,\n options: NamespacedOrchestrationClientOptions,\n): AgentOrchestrationClient {\n const namespace = options.namespace.trim();\n if (!namespace || namespace.length > 253) {\n throw new TypeError('namespace must contain between 1 and 253 characters');\n }\n const allowedKinds = new Set(options.allowedResourceKinds);\n const mutableKinds = new Set(options.mutableResourceKinds ?? options.allowedResourceKinds);\n for (const kind of mutableKinds) {\n if (!allowedKinds.has(kind)) {\n throw new TypeError(`mutable resource kind '${kind}' must also be allowed`);\n }\n }\n\n function assertAllowedKind(kind: string): void {\n if (allowedKinds.has(kind)) return;\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration access to resource kind '${kind}' is forbidden`,\n retryable: false,\n });\n }\n\n function bindNamespace<T extends { namespace?: string }>(metadata: T): T & { namespace: string } {\n if (metadata.namespace !== undefined && metadata.namespace !== namespace) {\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration access outside namespace '${namespace}' is forbidden`,\n retryable: false,\n });\n }\n return { ...metadata, namespace };\n }\n\n function assertMutableKind(kind: string): void {\n assertAllowedKind(kind);\n if (mutableKinds.has(kind)) return;\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration mutation of resource kind '${kind}' is forbidden`,\n retryable: false,\n });\n }\n\n return {\n async getCapabilities() {\n const capabilities = await client.getCapabilities();\n const resourceKinds = capabilities.resourceKinds.filter((kind) => allowedKinds.has(kind));\n const resourceOperations = Object.fromEntries(\n resourceKinds.map((kind) => {\n const sourceOperations = capabilities.resourceOperations?.[kind] ??\n capabilities.operations;\n return [\n kind,\n sourceOperations.filter((operation) => mutableKinds.has(kind) || (operation !== 'apply' && operation !== 'delete')),\n ];\n }),\n );\n return {\n operations: capabilities.operations,\n resourceKinds,\n resourceOperations,\n interfaces: capabilities.interfaces.includes('resource') ? ['resource'] : [],\n };\n },\n async apply(resource, applyOptions) {\n assertMutableKind(resource.kind);\n return await client.apply(\n {\n ...resource,\n metadata: bindNamespace(resource.metadata),\n },\n applyOptions,\n );\n },\n async get(reference, getOptions) {\n assertAllowedKind(reference.kind);\n return await client.get(bindNamespace(reference), getOptions);\n },\n async list(query, listOptions) {\n assertAllowedKind(query.kind);\n return await client.list(bindNamespace(query), listOptions);\n },\n watch(query, watchOptions) {\n assertAllowedKind(query.kind);\n return client.watch(bindNamespace(query), watchOptions);\n },\n async delete(reference, deleteOptions) {\n assertMutableKind(reference.kind);\n return await client.delete(bindNamespace(reference), deleteOptions);\n },\n };\n}\n\nfunction requirePayload(payload: Record<string, unknown>, key: string): unknown {\n if (!(key in payload)) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: `remote orchestration request is missing payload.${key}`,\n retryable: false,\n });\n }\n return payload[key];\n}\n\nfunction success(\n request: RemoteOrchestrationRequest,\n result: unknown,\n): RemoteOrchestrationResponse {\n return {\n protocol: REMOTE_ORCHESTRATION_PROTOCOL,\n requestId: request.requestId,\n ok: true,\n result,\n };\n}\n\nfunction failure(request: unknown, error: unknown): RemoteOrchestrationResponse {\n const requestRecord = isRecord(request) ? request : undefined;\n return {\n protocol: REMOTE_ORCHESTRATION_PROTOCOL,\n requestId: typeof requestRecord?.requestId === 'string' ? requestRecord.requestId : 'invalid',\n ok: false,\n error: errorData(error),\n };\n}\n\n/**\n * Trusted-side protocol adapter. The injected client has already bound actor,\n * admission, quotas, and resource scope; wire callers cannot select an actor.\n */\nexport function createRemoteOrchestrationHandler(client: AgentOrchestrationClient): {\n request(request: RemoteOrchestrationRequest): Promise<RemoteOrchestrationResponse>;\n watch(\n request: RemoteOrchestrationRequest,\n options?: RemoteOrchestrationTransportOptions,\n ): AsyncIterable<RemoteOrchestrationResponse>;\n} {\n function validate(request: RemoteOrchestrationRequest): void {\n if (\n !isRecord(request) ||\n request.protocol !== REMOTE_ORCHESTRATION_PROTOCOL ||\n typeof request.requestId !== 'string' ||\n !request.requestId ||\n request.requestId.length > 256 ||\n !REMOTE_OPERATIONS.has(request.operation) ||\n !isRecord(request.payload)\n ) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'invalid remote orchestration request envelope',\n retryable: false,\n });\n }\n }\n\n return {\n async request(request) {\n try {\n validate(request);\n const payload = request.payload;\n switch (request.operation) {\n case 'capabilities':\n return success(request, await client.getCapabilities());\n case 'apply':\n return success(\n request,\n await client.apply(\n requirePayload(payload, 'resource') as OrchestrationResourceManifest,\n payload.options as OrchestrationApplyOptions | undefined,\n ),\n );\n case 'get':\n return success(\n request,\n await client.get(\n requirePayload(payload, 'reference') as OrchestrationResourceReference,\n payload.options as OrchestrationGetOptions | undefined,\n ),\n );\n case 'list':\n return success(\n request,\n await client.list(\n requirePayload(payload, 'query') as OrchestrationResourceQuery,\n payload.options as OrchestrationListOptions | undefined,\n ),\n );\n case 'delete':\n return success(\n request,\n await client.delete(\n requirePayload(payload, 'reference') as OrchestrationResourceReference,\n payload.options as OrchestrationDeleteOptions | undefined,\n ),\n );\n case 'watch':\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'watch requests require the streaming protocol method',\n retryable: false,\n });\n default:\n throw new OrchestrationError({\n code: 'UNSUPPORTED',\n message: `unsupported remote orchestration operation '${String(request.operation)}'`,\n retryable: false,\n });\n }\n } catch (error) {\n return failure(request, error);\n }\n },\n async *watch(request, options = {}) {\n try {\n validate(request);\n if (request.operation !== 'watch') {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'streaming protocol accepts only watch operations',\n retryable: false,\n });\n }\n const watchOptions = request.payload.options as OrchestrationWatchOptions | undefined;\n for await (\n const event of client.watch(\n requirePayload(request.payload, 'query') as OrchestrationResourceQuery,\n {\n ...watchOptions,\n signal: options.signal,\n },\n )\n ) {\n yield success(request, event);\n }\n } catch (error) {\n yield failure(request, error);\n }\n },\n };\n}\n\nexport interface FetchOrchestrationTransportOptions {\n endpoint: string;\n fetch?: typeof globalThis.fetch;\n headers?: Record<string, string> | (() => Promise<Record<string, string>>);\n credentials?: RequestCredentials;\n maxResponseBytes?: number;\n maxWatchLineBytes?: number;\n}\n\n/** Browser/Tauri/React-Native fetch transport with bounded NDJSON watch. */\nexport function createFetchOrchestrationTransport(\n options: FetchOrchestrationTransportOptions,\n): RemoteOrchestrationTransport {\n const fetch_ = options.fetch ?? globalThis.fetch;\n const maxResponseBytes = options.maxResponseBytes ?? 1024 * 1024;\n const maxWatchLineBytes = options.maxWatchLineBytes ?? 1024 * 1024;\n\n function assertWatchLineSize(line: string): void {\n if (new TextEncoder().encode(line).byteLength > maxWatchLineBytes) {\n throw new OrchestrationError({\n code: 'EXHAUSTED',\n message: `remote orchestration watch line exceeds ${maxWatchLineBytes} bytes`,\n retryable: false,\n });\n }\n }\n\n async function headers(accept: string): Promise<Record<string, string>> {\n const additional = typeof options.headers === 'function' ? await options.headers() : (options.headers ?? {});\n return {\n Accept: accept,\n 'Content-Type': 'application/json',\n ...additional,\n };\n }\n\n async function post(\n request: RemoteOrchestrationRequest,\n accept: string,\n signal?: AbortSignal,\n ): Promise<Response> {\n const response = await fetch_(options.endpoint, {\n method: 'POST',\n headers: await headers(accept),\n body: JSON.stringify(request),\n signal,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n if (!response.ok) {\n throw new OrchestrationError({\n code: response.status === 401 || response.status === 403 ? 'FORBIDDEN' : 'UNAVAILABLE',\n message: `remote orchestration endpoint returned HTTP ${response.status}`,\n retryable: response.status >= 500,\n });\n }\n return response;\n }\n\n async function readBoundedText(response: Response, limit: number): Promise<string> {\n if (!response.body) return '';\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let size = 0;\n let text = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > limit) {\n await reader.cancel();\n throw new OrchestrationError({\n code: 'EXHAUSTED',\n message: `remote orchestration response exceeds ${limit} bytes`,\n retryable: false,\n });\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n }\n\n return {\n async request(request, transportOptions = {}) {\n const response = await post(request, 'application/json', transportOptions.signal);\n const text = await readBoundedText(response, maxResponseBytes);\n return JSON.parse(text) as RemoteOrchestrationResponse;\n },\n async *watch(request, transportOptions = {}) {\n const response = await post(request, 'application/x-ndjson', transportOptions.signal);\n if (!response.body) {\n throw new OrchestrationError({\n code: 'UNAVAILABLE',\n message: 'remote orchestration watch response has no body',\n retryable: true,\n });\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let pending = '';\n let streamCompleted = false;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n streamCompleted = true;\n break;\n }\n pending += decoder.decode(value, { stream: true });\n let newline = pending.indexOf('\\n');\n while (newline >= 0) {\n const line = pending.slice(0, newline).trim();\n pending = pending.slice(newline + 1);\n assertWatchLineSize(line);\n if (line) yield JSON.parse(line) as RemoteOrchestrationResponse;\n newline = pending.indexOf('\\n');\n }\n // UTF-8 is never smaller than the JS code-unit count. This cheap\n // guard avoids repeatedly re-encoding an attacker-controlled partial\n // line; the exact byte check runs once when the line is complete.\n if (pending.length > maxWatchLineBytes) {\n throw new OrchestrationError({\n code: 'EXHAUSTED',\n message: `remote orchestration watch line exceeds ${maxWatchLineBytes} bytes`,\n retryable: false,\n });\n }\n }\n pending += decoder.decode();\n if (pending.trim()) {\n assertWatchLineSize(pending.trim());\n yield JSON.parse(pending) as RemoteOrchestrationResponse;\n }\n } finally {\n if (!streamCompleted) {\n await reader.cancel().catch(() => undefined);\n }\n reader.releaseLock();\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts","../src/orchestration/errors.ts","../src/storage/tiddlyWikiHttpStorage.ts","../src/agent/categories.ts","../src/agent-management/AgentSessionController.ts","../src/agent-management/AgentDefinitionEditorController.ts","../src/agent-management/AgentCreationController.ts","../src/agent-management/PromptPreviewController.ts","../src/orchestration/remoteClient.ts"],"sourcesContent":["/**\n * Browser-safe entry point for memeloop.\n *\n * Bundlers that respect the \"browser\" condition (Vite, webpack, etc.) will\n * resolve `import ... from 'memeloop'` to this file instead of the full Node.js\n * entry, avoiding libp2p, crypto, and other Node.js-specific dependencies.\n *\n * Only type-only re-exports and browser-safe utilities are included.\n * For the full Node.js runtime, import from 'memeloop/node' or use the\n * \"default\"/\"node\" condition.\n */\n\n// ── Types (compile-time only — erased by TypeScript/esbuild) ──────────────\nexport type * from './agent-management/types.js';\nexport type * from './agent/agentProfileRegistry.js';\nexport type * from './agent/agentProfiles.js';\nexport type * from './agent/types.js';\nexport type * from './conversation/types.js';\nexport type * from './device-network/index.js';\nexport type * from './im/index.js';\nexport type * from './llm/providerRegistry.js';\nexport type * from './loopAPI/controlStoreLoopCheckpointStore.js';\nexport type * from './loopAPI/types.js';\nexport type * from './orchestration/index.js';\nexport type * from './permission/index.js';\nexport type * from './plugin/index.js';\nexport type * from './promptUtilities/types.js';\nexport type * from './storage/sessionStorage.js';\nexport { TiddlyWikiHttpStorage } from './storage/tiddlyWikiHttpStorage.js';\nexport type { TiddlyWikiHttpStorageOptions } from './storage/tiddlyWikiHttpStorage.js';\nexport type * from './sync/protocol.js';\nexport type * from './types.js';\n\n// Re-export AgentInstance type (used by UI layer)\nexport type { AgentInstanceModel, AgentInstanceModel as AgentInstance } from './types.js';\n\n// ── Browser-safe runtime values (no libp2p, no Node.js APIs) ─────────────\n\n// Categories — constants with no dependencies\nexport * from './agent/categories.js';\n\n// Agent management contracts — headless, type-only based\nexport * from './agent-management/index.js';\n\n// Remote declarative orchestration — fetch/ReadableStream only, no Node APIs\nexport { OrchestrationError } from './orchestration/errors.js';\nexport * from './orchestration/remoteClient.js';\n","export const ORCHESTRATION_ERROR_CODES = [\n 'UNSUPPORTED',\n 'FORBIDDEN',\n 'CONFLICT',\n 'STALE_EPOCH',\n 'NOT_FOUND',\n 'INVALID',\n 'EXHAUSTED',\n 'UNAVAILABLE',\n 'TIMEOUT',\n 'CANCELLED',\n 'UNKNOWN_EFFECT',\n 'WATCH_COMPACTED',\n 'INTERNAL',\n] as const;\n\nexport type OrchestrationErrorCode = typeof ORCHESTRATION_ERROR_CODES[number];\n\nexport interface OrchestrationErrorData {\n code: OrchestrationErrorCode;\n message: string;\n retryable: boolean;\n retryAfterMs?: number;\n reason?: string;\n details?: Record<string, unknown>;\n}\n\nexport class OrchestrationError extends Error {\n readonly code: OrchestrationErrorCode;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly reason?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(data: OrchestrationErrorData) {\n super(data.message);\n this.name = 'OrchestrationError';\n this.code = data.code;\n this.retryable = data.retryable;\n this.retryAfterMs = data.retryAfterMs;\n this.reason = data.reason;\n this.details = data.details;\n }\n\n toJSON(): OrchestrationErrorData {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n retryAfterMs: this.retryAfterMs,\n reason: this.reason,\n details: this.details,\n };\n }\n}\n\nexport function isOrchestrationError(error: unknown): error is OrchestrationError {\n return error instanceof OrchestrationError;\n}\n\nexport function toOrchestrationErrorData(\n error: unknown,\n fallback: Pick<OrchestrationErrorData, 'code' | 'retryable'> = {\n code: 'INTERNAL',\n retryable: false,\n },\n): OrchestrationErrorData {\n if (isOrchestrationError(error)) return error.toJSON();\n return {\n ...fallback,\n message: error instanceof Error ? error.message : String(error),\n };\n}\n","import type { AgentDefinition, AgentInstanceMeta } from '../agent/types.js';\nimport type { AttachmentReference, ChatMessage } from '../conversation/index.js';\nimport type { IMChannelBinding } from '../im/protocol.js';\nimport { OrchestrationError } from '../orchestration/errors.js';\nimport type { ConversationMeta } from '../sync/protocol.js';\n\nimport type { FullAgentStorage, GetMessagesOptions, ListConversationsOptions } from './ports.js';\n\n/**\n * TiddlyWiki HTTP storage driver (plan 24.44).\n *\n * Portable: depends only on an injectable `fetch` (browser and Node 18+).\n * Every tiddler write is a compare-and-swap: the driver reads the current\n * ETag, writes with `If-Match`, and retries a bounded number of times on\n * 412/409 before failing with CONFLICT. Blobs are stored inline as base64 up\n * to `maxInlineBlobBytes`; larger payloads are rejected with guidance to use\n * an external BlobStore, keeping tiddlers small.\n *\n * Credentials are materialized per request by a trusted resolver from an\n * opaque handle. Raw credentials never enter this portable driver.\n */\n\nexport interface TiddlyWikiCredentialResolver {\n resolveHeaders(handle: string, request: { url: string; method: string }): Promise<Record<string, string>>;\n}\n\nexport interface TiddlyWikiHttpStorageOptions {\n /** Wiki base URL, e.g. `http://localhost:8080`. */\n baseUrl: string;\n /** TiddlyWeb recipe (default `default`). */\n recipe?: string;\n /** Injectable fetch implementation. */\n fetchImpl?: typeof fetch;\n /** Opaque CredentialGrant handle and trusted materialization port. */\n credentialHandle?: string;\n credentialResolver?: TiddlyWikiCredentialResolver;\n /** Maximum inline blob size in bytes (default 256 KiB). */\n maxInlineBlobBytes?: number;\n /** CAS retry budget per write (default 3). */\n maxCasAttempts?: number;\n}\n\nconst PREFIX = '$:/memeloop';\nconst DEFAULT_MAX_INLINE_BLOB = 256 * 1024;\nconst DEFAULT_CAS_ATTEMPTS = 3;\n\ninterface Tiddler {\n title: string;\n text?: string;\n type?: string;\n revision?: string;\n fields?: Record<string, string>;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return bytes;\n}\n\nfunction escapeFilterValue(value: string): string {\n return value.replace(/[\"\\\\[\\]]/g, (character) => `\\\\${character}`);\n}\n\nexport class TiddlyWikiHttpStorage implements FullAgentStorage {\n private readonly baseUrl: string;\n private readonly recipe: string;\n private readonly fetchImpl: typeof fetch;\n private readonly credentialHandle?: string;\n private readonly credentialResolver?: TiddlyWikiCredentialResolver;\n private readonly maxInlineBlobBytes: number;\n private readonly maxCasAttempts: number;\n\n constructor(options: TiddlyWikiHttpStorageOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.recipe = options.recipe ?? 'default';\n this.fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.maxInlineBlobBytes = options.maxInlineBlobBytes ?? DEFAULT_MAX_INLINE_BLOB;\n this.maxCasAttempts = options.maxCasAttempts ?? DEFAULT_CAS_ATTEMPTS;\n if ((options.credentialHandle === undefined) !== (options.credentialResolver === undefined)) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'credentialHandle and credentialResolver must be provided together',\n retryable: false,\n });\n }\n this.credentialHandle = options.credentialHandle;\n this.credentialResolver = options.credentialResolver;\n }\n\n private eventTitle(conversationId: string, messageId: string): string {\n return `${PREFIX}/e/${conversationId}/${messageId}`;\n }\n\n private metaTitle(conversationId: string): string {\n return `${PREFIX}/meta/${conversationId}`;\n }\n\n private blobTitle(contentHash: string): string {\n return `${PREFIX}/blob/${contentHash}`;\n }\n\n private definitionTitle(id: string): string {\n return `${PREFIX}/def/${id}`;\n }\n\n private instanceTitle(id: string): string {\n return `${PREFIX}/inst/${id}`;\n }\n\n private imTitle(channelId: string, imUserId: string): string {\n return `${PREFIX}/im/${channelId}/${imUserId}`;\n }\n\n private tiddlerUrl(title: string): string {\n return `${this.baseUrl}/recipes/${encodeURIComponent(this.recipe)}/tiddlers/${encodeURIComponent(title)}`;\n }\n\n private filterUrl(filter: string): string {\n return `${this.baseUrl}/recipes/${encodeURIComponent(this.recipe)}/tiddlers.json?filter=${encodeURIComponent(filter)}`;\n }\n\n private async headers(url: string, method: string, extra: Record<string, string> = {}): Promise<Record<string, string>> {\n const credentialHeaders = this.credentialHandle && this.credentialResolver\n ? await this.credentialResolver.resolveHeaders(this.credentialHandle, { url, method })\n : {};\n return {\n 'content-type': 'application/json',\n 'x-requested-with': 'TiddlyWiki',\n ...credentialHeaders,\n ...extra,\n };\n }\n\n /** GET a tiddler; returns null on 404. Includes the ETag when the server sends one. */\n private async readTiddler(title: string): Promise<{ tiddler: Tiddler; etag?: string } | null> {\n const url = this.tiddlerUrl(title);\n const response = await this.fetchImpl(url, { headers: await this.headers(url, 'GET') });\n if (response.status === 404) return null;\n if (!response.ok) {\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler read failed: HTTP ${response.status}`, retryable: true });\n }\n const tiddler = (await response.json()) as Tiddler;\n const etag = response.headers.get('etag') ?? undefined;\n return { tiddler, ...(etag ? { etag } : {}) };\n }\n\n /** CAS write: If-Match when an ETag is known; bounded retries on 412/409. */\n private async writeTiddler(title: string, build: (current: Tiddler | null) => Tiddler): Promise<void> {\n for (let attempt = 1; attempt <= this.maxCasAttempts; attempt += 1) {\n const current = await this.readTiddler(title);\n if (current && !current.etag) {\n throw new OrchestrationError({ code: 'CONFLICT', message: `tiddler '${title}' has no ETag for a safe update`, retryable: false });\n }\n const next = build(current?.tiddler ?? null);\n const url = this.tiddlerUrl(title);\n const precondition: Record<string, string> = current ? { 'if-match': current.etag! } : { 'if-none-match': '*' };\n const response = await this.fetchImpl(url, {\n method: 'PUT',\n headers: await this.headers(url, 'PUT', precondition),\n body: JSON.stringify(next),\n });\n if (response.ok) return;\n if (response.status === 412 || response.status === 409) {\n if (attempt === this.maxCasAttempts) {\n throw new OrchestrationError({\n code: 'CONFLICT',\n message: `tiddler '${title}' was modified concurrently after ${attempt} CAS attempts`,\n retryable: true,\n });\n }\n continue;\n }\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler write failed: HTTP ${response.status}`, retryable: true });\n }\n }\n\n private async listByPrefix(prefix: string): Promise<Tiddler[]> {\n const filter = `[prefix[\"${escapeFilterValue(prefix)}\"]]`;\n const url = this.filterUrl(filter);\n const response = await this.fetchImpl(url, { headers: await this.headers(url, 'GET') });\n if (!response.ok) {\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler list failed: HTTP ${response.status}`, retryable: true });\n }\n return (await response.json()) as Tiddler[];\n }\n\n private parsePayload(tiddler: Tiddler): unknown {\n return JSON.parse(tiddler.text ?? '{}');\n }\n\n async listConversations(options: ListConversationsOptions = {}): Promise<ConversationMeta[]> {\n const tiddlers = await this.listByPrefix(`${PREFIX}/meta/`);\n const metas = tiddlers.map((tiddler) => this.parsePayload(tiddler) as ConversationMeta);\n metas.sort((a, b) => (b.lastMessageTimestamp ?? 0) - (a.lastMessageTimestamp ?? 0));\n const offset = options.offset ?? 0;\n const limit = options.limit ?? metas.length;\n return metas.slice(offset, offset + limit);\n }\n\n async getMessages(conversationId: string, _options: GetMessagesOptions = {}): Promise<ChatMessage[]> {\n const tiddlers = await this.listByPrefix(`${PREFIX}/e/${conversationId}/`);\n const messages = tiddlers.map((tiddler) => this.parsePayload(tiddler) as ChatMessage);\n messages.sort((a, b) => (a.lamportClock ?? 0) - (b.lamportClock ?? 0));\n return messages;\n }\n\n async appendMessage(message: ChatMessage): Promise<void> {\n await this.writeTiddler(this.eventTitle(message.conversationId, message.messageId), () => ({\n title: this.eventTitle(message.conversationId, message.messageId),\n text: JSON.stringify(message),\n }));\n }\n\n async insertMessagesIfAbsent(messages: ChatMessage[]): Promise<void> {\n for (const message of messages) {\n const title = this.eventTitle(message.conversationId, message.messageId);\n const existing = await this.readTiddler(title);\n if (!existing) {\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(message) }));\n }\n }\n }\n\n async getMaxLamportClockForConversation(conversationId: string): Promise<number> {\n const messages = await this.getMessages(conversationId);\n return messages.reduce((max, message) => Math.max(max, message.lamportClock ?? 0), 0);\n }\n\n async upsertConversationMetadata(meta: ConversationMeta): Promise<void> {\n const title = this.metaTitle(meta.conversationId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(meta) }));\n }\n\n async getConversationMeta(conversationId: string): Promise<ConversationMeta | null> {\n const result = await this.readTiddler(this.metaTitle(conversationId));\n return result ? this.parsePayload(result.tiddler) as ConversationMeta : null;\n }\n\n async saveAttachment(reference: AttachmentReference, data: Uint8Array): Promise<void> {\n if (data.byteLength > this.maxInlineBlobBytes) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: `blob of ${data.byteLength} bytes exceeds the inline limit ${this.maxInlineBlobBytes}; store it in an external BlobStore and keep the reference`,\n retryable: false,\n details: { maxInlineBlobBytes: this.maxInlineBlobBytes },\n });\n }\n const title = this.blobTitle(reference.contentHash);\n await this.writeTiddler(title, () => ({\n title,\n text: JSON.stringify({ reference, dataBase64: bytesToBase64(data) }),\n }));\n }\n\n async getAttachment(contentHash: string): Promise<AttachmentReference | null> {\n const result = await this.readTiddler(this.blobTitle(contentHash));\n if (!result) return null;\n return (this.parsePayload(result.tiddler) as { reference: AttachmentReference }).reference;\n }\n\n async readAttachmentData(contentHash: string): Promise<Uint8Array | null> {\n const result = await this.readTiddler(this.blobTitle(contentHash));\n if (!result) return null;\n return base64ToBytes((this.parsePayload(result.tiddler) as { dataBase64: string }).dataBase64);\n }\n\n async getAgentDefinition(id: string): Promise<AgentDefinition | null> {\n const result = await this.readTiddler(this.definitionTitle(id));\n return result ? this.parsePayload(result.tiddler) as AgentDefinition : null;\n }\n\n async saveAgentDefinition(definition: AgentDefinition & { id: string }): Promise<void> {\n const title = this.definitionTitle(definition.id);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(definition) }));\n }\n\n async saveAgentInstance(meta: AgentInstanceMeta): Promise<void> {\n const title = this.instanceTitle(meta.instanceId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(meta) }));\n }\n\n async getImBinding(channelId: string, imUserId: string): Promise<IMChannelBinding | null> {\n const result = await this.readTiddler(this.imTitle(channelId, imUserId));\n return result ? this.parsePayload(result.tiddler) as IMChannelBinding : null;\n }\n\n async setImBinding(record: IMChannelBinding): Promise<void> {\n const title = this.imTitle(record.channelId, record.imUserId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(record) }));\n }\n}\n","/**\n * Task category system for routing tasks to appropriate agent configurations.\n * Each category maps to a model, temperature, and description for delegation decisions.\n */\n\nexport type TaskCategory =\n | 'visual-engineering'\n | 'ultrabrain'\n | 'artistry'\n | 'quick'\n | 'unspecified-low'\n | 'unspecified-high'\n | 'writing';\n\nexport interface CategoryConfig {\n /** Model identifier (e.g., \"default\", \"gpt-4o\", \"claude-opus\") */\n model: string;\n /** LLM temperature (0.0 = deterministic, 1.0 = creative) */\n temperature: number;\n /** Human-readable description of the category's purpose */\n description: string;\n}\n\nconst CATEGORY_CONFIGS: Record<TaskCategory, CategoryConfig> = {\n 'visual-engineering': {\n model: 'default',\n temperature: 0.3,\n description: 'UI/UX visual engineering tasks requiring precise rendering and layout',\n },\n ultrabrain: {\n model: 'default',\n temperature: 0.1,\n description: 'Deep logical reasoning, architecture decisions, and complex problem-solving',\n },\n artistry: {\n model: 'default',\n temperature: 0.8,\n description: 'Creative writing, design, and artistic generation tasks',\n },\n quick: {\n model: 'default',\n temperature: 0.2,\n description: 'Fast, straightforward tasks with minimal deliberation needed',\n },\n 'unspecified-low': {\n model: 'default',\n temperature: 0.5,\n description: 'Unclassified tasks of moderate complexity and effort',\n },\n 'unspecified-high': {\n model: 'default',\n temperature: 0.4,\n description: 'Unclassified tasks requiring substantial effort across multiple systems',\n },\n writing: {\n model: 'default',\n temperature: 0.7,\n description: 'Documentation, prose, technical writing, and content generation',\n },\n};\n\n/**\n * Get the configuration for a task category.\n * @throws {Error} if the category is unknown\n */\nexport function getCategoryConfig(category: TaskCategory): CategoryConfig {\n const config = CATEGORY_CONFIGS[category];\n if (!config) {\n throw new Error(`Unknown task category: ${category}`);\n }\n return { ...config };\n}\n\n/**\n * Type guard: check if a string is a valid TaskCategory.\n */\nexport function isTaskCategory(value: string): value is TaskCategory {\n return value in CATEGORY_CONFIGS;\n}\n\n/** All registered category identifiers (read-only). */\nexport const ALL_CATEGORIES = Object.keys(CATEGORY_CONFIGS) as TaskCategory[];\n\n/**\n * Resolve a category string (or fallback to \"unspecified-low\").\n * Never throws; always returns a valid config.\n */\nexport function resolveCategory(category: string): CategoryConfig {\n if (isTaskCategory(category)) {\n return getCategoryConfig(category);\n }\n return getCategoryConfig('unspecified-low');\n}\n","/**\n * AgentSessionController — headless controller for an active agent conversation session.\n *\n * Manages agent runtime state, message sending, streaming, delete/retry turns,\n * and subscription to live agent updates.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentConversationClient, AgentInstanceClient, AgentRuntimeView, WikiTiddlerAttachment } from './types.js';\n\n/** Read-only snapshot of the session state. */\nexport interface AgentSessionSnapshot {\n agent: AgentRuntimeView | null;\n loading: boolean;\n error: Error | null;\n messages: ChatMessage[];\n orderedMessageIds: string[];\n streamingMessageIds: Set<string>;\n}\n\n/** Listener for snapshot changes. */\nexport type AgentSessionListener = (snapshot: AgentSessionSnapshot) => void;\n\n/** Options for creating an AgentSessionController. */\nexport interface AgentSessionControllerOptions {\n agentInstanceClient: AgentInstanceClient;\n conversationClient: AgentConversationClient;\n /** Polling interval in ms for agent status updates. Default 500. */\n pollInterval?: number;\n}\n\n/**\n * Headless controller for an agent conversation session.\n *\n * Call {@link start} to load an agent, then {@link subscribe} to receive snapshot\n * updates. Use {@link sendMessage}, {@link deleteTurn}, {@link retryTurn}, {@link cancel}\n * to drive the conversation.\n *\n * Host UI frameworks (React, Ink) subscribe via {@link subscribe} and render\n * the snapshot.\n */\nexport class AgentSessionController {\n private readonly options: Required<AgentSessionControllerOptions>;\n private listener: AgentSessionListener | null = null;\n private snapshot: AgentSessionSnapshot = {\n agent: null,\n loading: false,\n error: null,\n messages: [],\n orderedMessageIds: [],\n streamingMessageIds: new Set(),\n };\n private unsubAgentUpdates: (() => void) | null = null;\n private unsubMessages: (() => void) | null = null;\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private agentId: string | null = null;\n\n constructor(options: AgentSessionControllerOptions) {\n this.options = {\n pollInterval: 500,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /**\n * Start a session for the given agent ID.\n * Fetches the agent, subscribes to live updates, and loads messages.\n */\n async start(agentId: string): Promise<void> {\n this.agentId = agentId;\n this.emitPartial({ loading: true, error: null });\n\n try {\n const [agent, rawMessages] = await Promise.all([\n this.options.agentInstanceClient.fetchAgent(agentId),\n this.options.conversationClient.getMessages(agentId),\n ]);\n\n const orderedMessageIds = rawMessages.map((m) => m.messageId);\n const messagesMap = new Map<string, ChatMessage>();\n for (const m of rawMessages) messagesMap.set(m.messageId, m);\n\n this.emitPartial({\n agent,\n loading: false,\n messages: rawMessages,\n orderedMessageIds,\n streamingMessageIds: new Set(),\n });\n\n // Subscribe to live agent updates\n this.unsubAgentUpdates = this.options.agentInstanceClient.subscribeToUpdates(\n agentId,\n this.handleAgentUpdate,\n );\n\n // Subscribe to new messages\n this.unsubMessages = this.options.conversationClient.subscribeToMessages(\n agentId,\n this.handleNewMessage,\n );\n\n // Poll for status changes\n this.startPolling(agentId);\n } catch (error_) {\n this.emitPartial({\n loading: false,\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Stop the session and clean up subscriptions. */\n stop(): void {\n this.stopPolling();\n this.unsubAgentUpdates?.();\n this.unsubAgentUpdates = null;\n this.unsubMessages?.();\n this.unsubMessages = null;\n this.agentId = null;\n }\n\n // ── Actions ───────────────────────────────────────────────────\n\n /** Send a user message. */\n async sendMessage(\n content: string,\n file?: File,\n wikiTiddlers?: WikiTiddlerAttachment[],\n ): Promise<void> {\n if (!this.agentId) return;\n this.emitPartial({ error: null });\n try {\n await this.options.conversationClient.sendMessage(this.agentId, content, file, wikiTiddlers);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Cancel the current agent operation. */\n async cancel(): Promise<void> {\n if (!this.agentId) return;\n try {\n await this.options.agentInstanceClient.cancelAgent(this.agentId);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Delete a turn starting at the given user message ID. */\n async deleteTurn(userMessageId: string): Promise<string | undefined> {\n return this.options.conversationClient.deleteTurn(userMessageId);\n }\n\n /** Retry a turn starting at the given user message ID. */\n async retryTurn(userMessageId: string): Promise<void> {\n return this.options.conversationClient.retryTurn(userMessageId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n /** Subscribe to snapshot changes. Returns unsubscribe function. */\n subscribe(listener: AgentSessionListener): () => void {\n this.listener = listener;\n // Immediately emit current state\n listener({ ...this.snapshot, streamingMessageIds: new Set(this.snapshot.streamingMessageIds) });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n /** Get current snapshot without subscribing. */\n getSnapshot(): AgentSessionSnapshot {\n return this.snapshot;\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n private emitPartial(partial: Partial<AgentSessionSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...partial };\n if (this.listener) {\n this.listener({\n ...this.snapshot,\n streamingMessageIds: new Set(this.snapshot.streamingMessageIds),\n });\n }\n }\n\n private handleAgentUpdate = (update: Partial<AgentRuntimeView>): void => {\n if (this.snapshot.agent) {\n this.emitPartial({ agent: { ...this.snapshot.agent, ...update } });\n }\n };\n\n private handleNewMessage = (message: ChatMessage): void => {\n const messages = [...this.snapshot.messages.filter((m) => m.messageId !== message.messageId), message];\n const orderedMessageIds = [...new Set([...this.snapshot.orderedMessageIds, message.messageId])];\n this.emitPartial({ messages, orderedMessageIds });\n };\n\n private startPolling(agentId: string): void {\n this.stopPolling();\n this.pollingTimer = setInterval(async () => {\n try {\n const agent = await this.options.agentInstanceClient.fetchAgent(agentId);\n this.emitPartial({ agent });\n } catch {\n // Silently retry on next poll\n }\n }, this.options.pollInterval);\n }\n\n private stopPolling(): void {\n if (this.pollingTimer !== null) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n}\n","/**\n * AgentDefinitionEditorController — headless controller for editing an agent definition.\n *\n * Manages definition loading, autosave, schema loading, preview agent lifecycle,\n * and scheduled task CRUD.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentDefinitionEditorState, AgentDefinitionRepository, AgentInstanceClient, CreateScheduledTaskInput, ScheduledTask, ScheduledTaskClient } from './types.js';\n\n/** Partial state emitted to the listener. */\nexport type EditorStateChange = Partial<AgentDefinitionEditorState>;\n\n/** Listener for editor state changes. */\nexport type EditorStateListener = (change: EditorStateChange) => void;\n\n/** Schedule editor sub-state for the UI layer. */\nexport interface ScheduleEditorState {\n mode: 'none' | 'interval' | 'daily' | 'cron';\n intervalValue: number;\n intervalUnit: 's' | 'min' | 'h';\n dailyTime: string;\n activeHoursStart: string;\n activeHoursEnd: string;\n cronExpression: string;\n timezone: string;\n message: string;\n existingTaskId?: string;\n}\n\n/** Options for creating an AgentDefinitionEditorController. */\nexport interface AgentDefinitionEditorControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n scheduledTaskClient: ScheduledTaskClient;\n /** Debounce interval for autosave in ms. Default 1000. */\n autosaveDebounceMs?: number;\n}\n\n/**\n * Headless controller for editing an agent definition.\n *\n * Call {@link loadDefinition} to start, then {@link subscribe} for state updates.\n */\nexport class AgentDefinitionEditorController {\n private readonly options: Required<AgentDefinitionEditorControllerOptions>;\n private listener: EditorStateListener | null = null;\n private state: AgentDefinitionEditorState = {\n agentDefinition: null,\n agentName: '',\n previewAgentId: null,\n isLoading: false,\n isSaving: false,\n promptSchema: null,\n };\n private autosaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: AgentDefinitionEditorControllerOptions) {\n this.options = {\n autosaveDebounceMs: 1_000,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /** Load an agent definition and its prompt schema. */\n async loadDefinition(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n const [definition, previewAgentId] = await Promise.all([\n this.options.definitionRepository.getAgentDef(definitionId),\n this.findOrCreatePreviewAgent(definitionId),\n ]);\n\n if (!definition) {\n this.emit({ isLoading: false });\n return;\n }\n\n let promptSchema: Record<string, unknown> | null = null;\n if (definition.agentFrameworkID) {\n try {\n promptSchema = await this.options.agentInstanceClient.getFrameworkConfigSchema(\n definition.agentFrameworkID,\n );\n } catch {\n promptSchema = null;\n }\n }\n\n this.state = {\n agentDefinition: definition,\n agentName: definition.name ?? '',\n previewAgentId,\n isLoading: false,\n isSaving: false,\n promptSchema,\n };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Update the agent definition field. Triggers debounced autosave. */\n updateDefinition(change: Partial<AgentDefinition> & { id: string }): void {\n if (!this.state.agentDefinition) return;\n const updated = { ...this.state.agentDefinition, ...change };\n this.state = { ...this.state, agentDefinition: updated, agentName: updated.name ?? '' };\n this.emit({ agentDefinition: updated, agentName: this.state.agentName });\n this.scheduleAutosave(updated);\n }\n\n /** Force an immediate save to the repository. */\n async saveNow(): Promise<void> {\n if (!this.state.agentDefinition) return;\n this.emit({ isSaving: true });\n try {\n await this.options.definitionRepository.updateAgentDef({\n id: this.state.agentDefinition.id,\n name: this.state.agentName,\n description: this.state.agentDefinition.description,\n agentFrameworkConfig: this.state.agentDefinition.agentFrameworkConfig,\n aiApiConfig: this.state.agentDefinition.aiApiConfig,\n agentTools: this.state.agentDefinition.agentTools,\n heartbeat: this.state.agentDefinition.heartbeat,\n });\n } catch {\n // Host should surface errors via its UI layer\n } finally {\n this.emit({ isSaving: false });\n }\n }\n\n /** Reload the prompt schema for a framework ID. */\n async reloadSchema(frameworkId: string): Promise<void> {\n try {\n const schema = await this.options.agentInstanceClient.getFrameworkConfigSchema(frameworkId);\n this.emit({ promptSchema: schema });\n } catch {\n this.emit({ promptSchema: null });\n }\n }\n\n // ── Preview agent lifecycle ───────────────────────────────────\n\n /** Get or create a preview agent instance tied to this definition. */\n private async findOrCreatePreviewAgent(definitionId: string): Promise<string | null> {\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n return result.id;\n } catch {\n return null;\n }\n }\n\n // ── Scheduled tasks ───────────────────────────────────────────\n\n async loadScheduledTasks(): Promise<ScheduledTask[]> {\n if (!this.state.previewAgentId) return [];\n return this.options.scheduledTaskClient.listScheduledTasksForAgent(\n this.state.previewAgentId,\n );\n }\n\n async saveScheduledTask(input: CreateScheduledTaskInput): Promise<ScheduledTask> {\n return this.options.scheduledTaskClient.createScheduledTask(input);\n }\n\n async deleteScheduledTask(taskId: string): Promise<void> {\n return this.options.scheduledTaskClient.deleteScheduledTask(taskId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: EditorStateListener): () => void {\n this.listener = listener;\n listener(this.state);\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentDefinitionEditorState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: EditorStateChange): void {\n this.listener?.(change);\n }\n\n private scheduleAutosave(definition: AgentDefinition): void {\n if (this.autosaveTimer !== null) clearTimeout(this.autosaveTimer);\n this.autosaveTimer = setTimeout(() => {\n this.options.definitionRepository.updateAgentDef({\n id: definition.id,\n name: definition.name,\n description: definition.description,\n agentFrameworkConfig: definition.agentFrameworkConfig,\n aiApiConfig: definition.aiApiConfig,\n agentTools: definition.agentTools,\n heartbeat: definition.heartbeat,\n }).catch(() => {});\n }, this.options.autosaveDebounceMs);\n }\n}\n","/**\n * AgentCreationController — headless controller for the \"Create New Agent\" wizard.\n *\n * Manages creation wizard state: current step, template selection, temporary\n * agent definition lifecycle, and preview agent setup.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentCreationState, AgentDefinitionRepository, AgentInstanceClient } from './types.js';\n\n/** Listener for creation state changes. */\nexport type CreationStateListener = (state: AgentCreationState) => void;\n\n/** Options for creating an AgentCreationController. */\nexport interface AgentCreationControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n /** Default framework ID for new agents. */\n defaultFrameworkId?: string;\n}\n\n/**\n * Headless controller for the agent creation wizard.\n *\n * Call {@link start}, {@link selectTemplate}, {@link nextStep}, etc. to drive\n * the wizard. Subscribe via {@link subscribe} for state updates.\n */\nexport class AgentCreationController {\n private readonly options: Required<AgentCreationControllerOptions>;\n private listener: CreationStateListener | null = null;\n private state: AgentCreationState = {\n currentStep: 0,\n agentName: '',\n selectedTemplate: null,\n temporaryAgentDefinition: null,\n previewAgentId: null,\n isLoading: false,\n promptSchema: null,\n };\n\n constructor(options: AgentCreationControllerOptions) {\n this.options = {\n defaultFrameworkId: 'memeloopAgentToolLoop',\n ...options,\n };\n }\n\n /** Initialize the creation wizard, optionally from a saved tab state. */\n async start(definitionId?: string, templateDefinitionId?: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n if (definitionId) {\n // Restore existing temporary definition\n const temporaryDefinition = await this.options.definitionRepository.getAgentDef(definitionId);\n if (temporaryDefinition) {\n this.state = {\n ...this.state,\n temporaryAgentDefinition: temporaryDefinition,\n agentName: temporaryDefinition.name ?? '',\n isLoading: false,\n };\n this.emit(this.state);\n // Load template if available\n if (templateDefinitionId) {\n const template = await this.options.definitionRepository.getAgentDef(templateDefinitionId);\n if (template) {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n }\n return;\n }\n }\n\n this.emit({ isLoading: false });\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Select a template for the new agent. */\n selectTemplate(template: AgentDefinition): void {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n\n /** Update the agent name. */\n setAgentName(name: string): void {\n this.state = { ...this.state, agentName: name };\n this.emit(this.state);\n }\n\n /** Advance to the next wizard step. */\n nextStep(): void {\n this.state = { ...this.state, currentStep: Math.min(this.state.currentStep + 1, 2) };\n this.emit(this.state);\n }\n\n /** Go back to the previous wizard step. */\n previousStep(): void {\n this.state = { ...this.state, currentStep: Math.max(this.state.currentStep - 1, 0) };\n this.emit(this.state);\n }\n\n /** Set the current wizard step directly. */\n setStep(step: number): void {\n this.state = { ...this.state, currentStep: Math.max(0, Math.min(step, 2)) };\n this.emit(this.state);\n }\n\n /** Update the temporary agent definition. */\n updateTemporaryDefinition(change: Partial<AgentDefinition>): void {\n const updated = this.state.temporaryAgentDefinition\n ? { ...this.state.temporaryAgentDefinition, ...change }\n : null;\n this.state = { ...this.state, temporaryAgentDefinition: updated };\n this.emit(this.state);\n }\n\n /** Set the prompt schema for the selected framework. */\n setPromptSchema(schema: Record<string, unknown> | null): void {\n this.state = { ...this.state, promptSchema: schema };\n this.emit(this.state);\n }\n\n /**\n * Create a preview agent instance for the chat-preview step.\n * Should be called when entering step 2 (or the chat preview step).\n */\n async createPreviewAgent(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n this.state = { ...this.state, previewAgentId: result.id, isLoading: false };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /**\n * Finalize creation: persist the temporary definition and create the actual\n * agent instance. Returns the final agent instance ID, or null on failure.\n */\n async finalize(): Promise<string | null> {\n if (!this.state.temporaryAgentDefinition) return null;\n try {\n const definition = await this.options.definitionRepository.createAgentDef(\n this.state.temporaryAgentDefinition,\n );\n const instance = await this.options.agentInstanceClient.createAgent(definition.id);\n return instance.id;\n } catch {\n return null;\n }\n }\n\n /** Clean up temporary resources. */\n async cleanup(): Promise<void> {\n if (this.state.previewAgentId) {\n try {\n await this.options.agentInstanceClient.deleteAgent(this.state.previewAgentId);\n } catch {\n // Best-effort cleanup\n }\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: CreationStateListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentCreationState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: AgentCreationState | Partial<AgentCreationState>): void {\n this.state = { ...this.state, ...change };\n this.listener?.({ ...this.state });\n }\n}\n","/**\n * PromptPreviewController — headless controller for generating prompt previews.\n *\n * Manages preview dialog state, progress tracking, and result accumulation.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { PromptPreviewClient, PromptPreviewDialogState, PromptPreviewResult } from './types.js';\n\n/** Listener for preview dialog state changes. */\nexport type PreviewDialogListener = (state: PromptPreviewDialogState) => void;\n\n/** Options for creating a PromptPreviewController. */\nexport interface PromptPreviewControllerOptions {\n previewClient: PromptPreviewClient;\n}\n\n/**\n * Headless controller for the prompt preview/edit dialog.\n *\n * Call {@link open}, {@link close}, {@link generate} to drive the dialog.\n * Subscribe via {@link subscribe} for state updates.\n */\nexport class PromptPreviewController {\n private readonly options: PromptPreviewControllerOptions;\n private listener: PreviewDialogListener | null = null;\n private state: PromptPreviewDialogState = {\n open: false,\n baseMode: 'preview',\n activeTab: 'tree',\n loading: false,\n progress: 0,\n currentStep: '',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n\n constructor(options: PromptPreviewControllerOptions) {\n this.options = options;\n }\n\n /** Open the dialog with an optional base mode. */\n open(baseMode?: 'preview' | 'edit'): void {\n this.state = {\n ...this.state,\n open: true,\n baseMode: baseMode ?? 'preview',\n loading: false,\n progress: 0,\n currentStep: 'Starting...',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Close the dialog. */\n close(): void {\n this.state = {\n ...this.state,\n open: false,\n baseMode: 'preview',\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Set the active tab in the dialog. */\n setActiveTab(tab: 'flat' | 'tree'): void {\n this.state = { ...this.state, activeTab: tab };\n this.emit();\n }\n\n /** Set form fields to scroll to (for edit mode navigation). */\n setFormFieldsToScrollTo(fieldPaths: string[]): void {\n this.state = { ...this.state, formFieldsToScrollTo: fieldPaths };\n this.emit();\n }\n\n /**\n * Generate a preview of the prompt tree.\n * @param agentFrameworkConfig The agent's framework configuration\n * @param messages Current conversation messages\n * @param inputText Optional input text to include in the preview\n */\n async generate(\n agentFrameworkConfig: AgentFrameworkConfig,\n messages: ChatMessage[],\n inputText?: string,\n ): Promise<PromptPreviewResult | null> {\n this.state = {\n ...this.state,\n loading: true,\n progress: 0,\n currentStep: 'Preparing...',\n };\n this.emit();\n\n try {\n const result = await this.options.previewClient.generatePreview(\n agentFrameworkConfig,\n messages,\n inputText,\n (progress) => {\n this.state = {\n ...this.state,\n progress: progress.progress,\n currentStep: progress.step,\n currentPlugin: progress.currentPlugin ?? null,\n };\n this.emit();\n },\n );\n\n this.state = {\n ...this.state,\n loading: false,\n progress: 1,\n currentStep: 'Complete',\n currentPlugin: null,\n result,\n lastUpdated: new Date(),\n };\n this.emit();\n return result;\n } catch {\n this.state = {\n ...this.state,\n loading: false,\n progress: 0,\n currentStep: 'Error occurred',\n currentPlugin: null,\n result: null,\n };\n this.emit();\n return null;\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: PreviewDialogListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): PromptPreviewDialogState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(): void {\n this.listener?.({ ...this.state });\n }\n}\n","import type {\n AgentOrchestrationCapabilities,\n AgentOrchestrationClient,\n OrchestrationApplyOptions,\n OrchestrationDeleteOptions,\n OrchestrationDeleteResult,\n OrchestrationGetOptions,\n OrchestrationListOptions,\n OrchestrationResource,\n OrchestrationResourceList,\n OrchestrationResourceManifest,\n OrchestrationResourceQuery,\n OrchestrationResourceReference,\n OrchestrationResourceStatus,\n OrchestrationWatchEvent,\n OrchestrationWatchOptions,\n} from './client.js';\nimport { OrchestrationError } from './errors.js';\nimport type { OrchestrationErrorData } from './errors.js';\n\nexport const REMOTE_ORCHESTRATION_PROTOCOL = 'memeloop.resource.v2' as const;\nexport type RemoteOrchestrationOperation =\n | 'capabilities'\n | 'apply'\n | 'get'\n | 'list'\n | 'watch'\n | 'delete';\n\nexport interface RemoteOrchestrationRequest {\n protocol: typeof REMOTE_ORCHESTRATION_PROTOCOL;\n requestId: string;\n operation: RemoteOrchestrationOperation;\n payload: Record<string, unknown>;\n}\n\nexport type RemoteOrchestrationResponse =\n | {\n protocol: typeof REMOTE_ORCHESTRATION_PROTOCOL;\n requestId: string;\n ok: true;\n result: unknown;\n }\n | {\n protocol: typeof REMOTE_ORCHESTRATION_PROTOCOL;\n requestId: string;\n ok: false;\n error: OrchestrationErrorData;\n };\n\nexport interface RemoteOrchestrationTransportOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Portable host boundary. Browser, Electron renderer, React Native, and Tauri\n * WebView clients implement this interface; trusted hosts bind identity and\n * policy behind the server-side AgentOrchestrationClient.\n */\nexport interface RemoteOrchestrationTransport {\n request(\n request: RemoteOrchestrationRequest,\n options?: RemoteOrchestrationTransportOptions,\n ): Promise<RemoteOrchestrationResponse>;\n watch(\n request: RemoteOrchestrationRequest,\n options?: RemoteOrchestrationTransportOptions,\n ): AsyncIterable<RemoteOrchestrationResponse>;\n}\n\nexport interface RemoteOrchestrationClientOptions {\n createRequestId?: () => string;\n}\n\nexport interface ReadOnlyOrchestrationClientOptions {\n /** Resource kinds visible to the remote client. Omit to retain every kind exposed by the source client. */\n allowedResourceKinds?: readonly string[];\n}\n\nexport interface NamespacedOrchestrationClientOptions {\n /** Host-bound namespace. Callers may omit it, but cannot select another namespace. */\n namespace: string;\n /** Resource kinds the caller may access. An empty list denies every resource kind. */\n allowedResourceKinds: readonly string[];\n /**\n * Resource kinds the caller may apply or delete. Defaults to every allowed\n * kind for compatibility; hosts should narrow this when status resources are\n * controller-owned.\n */\n mutableResourceKinds?: readonly string[];\n}\n\nconst REMOTE_OPERATIONS = new Set<RemoteOrchestrationOperation>([\n 'capabilities',\n 'apply',\n 'get',\n 'list',\n 'watch',\n 'delete',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction errorData(error: unknown): OrchestrationErrorData {\n if (error instanceof OrchestrationError) {\n return {\n code: error.code,\n message: error.message,\n retryable: error.retryable,\n ...(error.retryAfterMs !== undefined ? { retryAfterMs: error.retryAfterMs } : {}),\n ...(error.reason !== undefined ? { reason: error.reason } : {}),\n ...(error.details !== undefined ? { details: error.details } : {}),\n };\n }\n return {\n code: 'INTERNAL',\n message: error instanceof Error ? error.message : String(error),\n retryable: false,\n };\n}\n\nfunction throwResponseError(response: Extract<RemoteOrchestrationResponse, { ok: false }>): never {\n throw new OrchestrationError(response.error);\n}\n\nfunction assertResponse(\n request: RemoteOrchestrationRequest,\n response: RemoteOrchestrationResponse,\n): void {\n if (\n !isRecord(response) ||\n response.protocol !== REMOTE_ORCHESTRATION_PROTOCOL ||\n response.requestId !== request.requestId ||\n typeof response.ok !== 'boolean' ||\n (response.ok && !('result' in response)) ||\n (!response.ok &&\n (!isRecord(response.error) ||\n typeof response.error.code !== 'string' ||\n typeof response.error.message !== 'string' ||\n typeof response.error.retryable !== 'boolean'))\n ) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'remote orchestration response correlation or protocol mismatch',\n retryable: false,\n });\n }\n}\n\nlet requestSequence = 0;\n\n/** Build the policy-scoped Agent facade over a browser-safe remote transport. */\nexport function createRemoteOrchestrationClient(\n transport: RemoteOrchestrationTransport,\n options: RemoteOrchestrationClientOptions = {},\n): AgentOrchestrationClient {\n const createRequestId = options.createRequestId ??\n (() => `resource-${Date.now().toString(36)}-${(++requestSequence).toString(36)}`);\n\n function makeRequest(\n operation: RemoteOrchestrationOperation,\n payload: Record<string, unknown>,\n ): RemoteOrchestrationRequest {\n return {\n protocol: REMOTE_ORCHESTRATION_PROTOCOL,\n requestId: createRequestId(),\n operation,\n payload,\n };\n }\n\n async function request<T>(\n operation: RemoteOrchestrationOperation,\n payload: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<T> {\n const envelope = makeRequest(operation, payload);\n const response = await transport.request(envelope, { signal });\n assertResponse(envelope, response);\n if (!response.ok) throwResponseError(response);\n return response.result as T;\n }\n\n return {\n getCapabilities() {\n return request<AgentOrchestrationCapabilities>('capabilities', {});\n },\n apply<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n resource: OrchestrationResourceManifest<TSpec>,\n applyOptions?: OrchestrationApplyOptions,\n ) {\n return request<OrchestrationResource<TSpec, TStatus>>('apply', {\n resource,\n ...(applyOptions ? { options: applyOptions } : {}),\n });\n },\n get<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n reference: OrchestrationResourceReference,\n getOptions?: OrchestrationGetOptions,\n ) {\n return request<OrchestrationResource<TSpec, TStatus> | null>('get', {\n reference,\n ...(getOptions ? { options: getOptions } : {}),\n });\n },\n list<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n query: OrchestrationResourceQuery,\n listOptions?: OrchestrationListOptions,\n ) {\n return request<OrchestrationResourceList<TSpec, TStatus>>('list', {\n query,\n ...(listOptions ? { options: listOptions } : {}),\n });\n },\n async *watch<TSpec = Record<string, unknown>, TStatus = OrchestrationResourceStatus>(\n query: OrchestrationResourceQuery,\n watchOptions?: OrchestrationWatchOptions,\n ): AsyncIterable<OrchestrationWatchEvent<TSpec, TStatus>> {\n const envelope = makeRequest('watch', {\n query,\n ...(watchOptions\n ? {\n options: {\n ...watchOptions,\n signal: undefined,\n },\n }\n : {}),\n });\n for await (\n const response of transport.watch(envelope, {\n signal: watchOptions?.signal,\n })\n ) {\n assertResponse(envelope, response);\n if (!response.ok) throwResponseError(response);\n yield response.result as OrchestrationWatchEvent<TSpec, TStatus>;\n }\n },\n delete(reference: OrchestrationResourceReference, deleteOptions?: OrchestrationDeleteOptions) {\n return request<OrchestrationDeleteResult>('delete', {\n reference,\n ...(deleteOptions ? { options: deleteOptions } : {}),\n });\n },\n };\n}\n\n/**\n * Bind a remote/mobile caller to a read-only view of an existing policy-scoped\n * client. This is an enforcement boundary, not only capability advertising:\n * mutations and out-of-scope kinds fail before reaching the source client.\n */\nexport function createReadOnlyOrchestrationClient(\n client: AgentOrchestrationClient,\n options: ReadOnlyOrchestrationClientOptions = {},\n): AgentOrchestrationClient {\n const allowedKinds = options.allowedResourceKinds\n ? new Set(options.allowedResourceKinds)\n : undefined;\n\n function assertAllowedKind(kind: string): void {\n if (!allowedKinds || allowedKinds.has(kind)) return;\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration access to resource kind '${kind}' is forbidden`,\n retryable: false,\n });\n }\n\n function forbidden(operation: 'apply' | 'delete'): never {\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration operation '${operation}' is read-only`,\n retryable: false,\n });\n }\n\n return {\n async getCapabilities() {\n const capabilities = await client.getCapabilities();\n return {\n operations: ['get', 'list', 'watch'],\n resourceKinds: capabilities.resourceKinds.filter((kind) => allowedKinds ? allowedKinds.has(kind) : true),\n interfaces: capabilities.interfaces.includes('resource') ? ['resource'] : [],\n };\n },\n async apply() {\n forbidden('apply');\n },\n async get(reference, getOptions) {\n assertAllowedKind(reference.kind);\n return await client.get(reference, getOptions);\n },\n async list(query, listOptions) {\n assertAllowedKind(query.kind);\n return await client.list(query, listOptions);\n },\n async *watch(query, watchOptions) {\n assertAllowedKind(query.kind);\n yield* client.watch(query, watchOptions);\n },\n async delete() {\n forbidden('delete');\n },\n };\n}\n\n/**\n * Bind a mutable remote caller to one host-selected namespace and an explicit\n * resource-kind allowlist. The wrapper is an authorization boundary: it\n * rejects cross-namespace references before they reach the source client and\n * fills an omitted namespace with the host-bound value.\n */\nexport function createNamespacedOrchestrationClient(\n client: AgentOrchestrationClient,\n options: NamespacedOrchestrationClientOptions,\n): AgentOrchestrationClient {\n const namespace = options.namespace.trim();\n if (!namespace || namespace.length > 253) {\n throw new TypeError('namespace must contain between 1 and 253 characters');\n }\n const allowedKinds = new Set(options.allowedResourceKinds);\n const mutableKinds = new Set(options.mutableResourceKinds ?? options.allowedResourceKinds);\n for (const kind of mutableKinds) {\n if (!allowedKinds.has(kind)) {\n throw new TypeError(`mutable resource kind '${kind}' must also be allowed`);\n }\n }\n\n function assertAllowedKind(kind: string): void {\n if (allowedKinds.has(kind)) return;\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration access to resource kind '${kind}' is forbidden`,\n retryable: false,\n });\n }\n\n function bindNamespace<T extends { namespace?: string }>(metadata: T): T & { namespace: string } {\n if (metadata.namespace !== undefined && metadata.namespace !== namespace) {\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration access outside namespace '${namespace}' is forbidden`,\n retryable: false,\n });\n }\n return { ...metadata, namespace };\n }\n\n function assertMutableKind(kind: string): void {\n assertAllowedKind(kind);\n if (mutableKinds.has(kind)) return;\n throw new OrchestrationError({\n code: 'FORBIDDEN',\n message: `remote orchestration mutation of resource kind '${kind}' is forbidden`,\n retryable: false,\n });\n }\n\n return {\n async getCapabilities() {\n const capabilities = await client.getCapabilities();\n const resourceKinds = capabilities.resourceKinds.filter((kind) => allowedKinds.has(kind));\n const resourceOperations = Object.fromEntries(\n resourceKinds.map((kind) => {\n const sourceOperations = capabilities.resourceOperations?.[kind] ??\n capabilities.operations;\n return [\n kind,\n sourceOperations.filter((operation) => mutableKinds.has(kind) || (operation !== 'apply' && operation !== 'delete')),\n ];\n }),\n );\n return {\n operations: capabilities.operations,\n resourceKinds,\n resourceOperations,\n interfaces: capabilities.interfaces.includes('resource') ? ['resource'] : [],\n };\n },\n async apply(resource, applyOptions) {\n assertMutableKind(resource.kind);\n return await client.apply(\n {\n ...resource,\n metadata: bindNamespace(resource.metadata),\n },\n applyOptions,\n );\n },\n async get(reference, getOptions) {\n assertAllowedKind(reference.kind);\n return await client.get(bindNamespace(reference), getOptions);\n },\n async list(query, listOptions) {\n assertAllowedKind(query.kind);\n return await client.list(bindNamespace(query), listOptions);\n },\n watch(query, watchOptions) {\n assertAllowedKind(query.kind);\n return client.watch(bindNamespace(query), watchOptions);\n },\n async delete(reference, deleteOptions) {\n assertMutableKind(reference.kind);\n return await client.delete(bindNamespace(reference), deleteOptions);\n },\n };\n}\n\nfunction requirePayload(payload: Record<string, unknown>, key: string): unknown {\n if (!(key in payload)) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: `remote orchestration request is missing payload.${key}`,\n retryable: false,\n });\n }\n return payload[key];\n}\n\nfunction success(\n request: RemoteOrchestrationRequest,\n result: unknown,\n): RemoteOrchestrationResponse {\n return {\n protocol: REMOTE_ORCHESTRATION_PROTOCOL,\n requestId: request.requestId,\n ok: true,\n result,\n };\n}\n\nfunction failure(request: unknown, error: unknown): RemoteOrchestrationResponse {\n const requestRecord = isRecord(request) ? request : undefined;\n return {\n protocol: REMOTE_ORCHESTRATION_PROTOCOL,\n requestId: typeof requestRecord?.requestId === 'string' ? requestRecord.requestId : 'invalid',\n ok: false,\n error: errorData(error),\n };\n}\n\n/**\n * Trusted-side protocol adapter. The injected client has already bound actor,\n * admission, quotas, and resource scope; wire callers cannot select an actor.\n */\nexport function createRemoteOrchestrationHandler(client: AgentOrchestrationClient): {\n request(request: RemoteOrchestrationRequest): Promise<RemoteOrchestrationResponse>;\n watch(\n request: RemoteOrchestrationRequest,\n options?: RemoteOrchestrationTransportOptions,\n ): AsyncIterable<RemoteOrchestrationResponse>;\n} {\n function validate(request: RemoteOrchestrationRequest): void {\n if (\n !isRecord(request) ||\n request.protocol !== REMOTE_ORCHESTRATION_PROTOCOL ||\n typeof request.requestId !== 'string' ||\n !request.requestId ||\n request.requestId.length > 256 ||\n !REMOTE_OPERATIONS.has(request.operation) ||\n !isRecord(request.payload)\n ) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'invalid remote orchestration request envelope',\n retryable: false,\n });\n }\n }\n\n return {\n async request(request) {\n try {\n validate(request);\n const payload = request.payload;\n switch (request.operation) {\n case 'capabilities':\n return success(request, await client.getCapabilities());\n case 'apply':\n return success(\n request,\n await client.apply(\n requirePayload(payload, 'resource') as OrchestrationResourceManifest,\n payload.options as OrchestrationApplyOptions | undefined,\n ),\n );\n case 'get':\n return success(\n request,\n await client.get(\n requirePayload(payload, 'reference') as OrchestrationResourceReference,\n payload.options as OrchestrationGetOptions | undefined,\n ),\n );\n case 'list':\n return success(\n request,\n await client.list(\n requirePayload(payload, 'query') as OrchestrationResourceQuery,\n payload.options as OrchestrationListOptions | undefined,\n ),\n );\n case 'delete':\n return success(\n request,\n await client.delete(\n requirePayload(payload, 'reference') as OrchestrationResourceReference,\n payload.options as OrchestrationDeleteOptions | undefined,\n ),\n );\n case 'watch':\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'watch requests require the streaming protocol method',\n retryable: false,\n });\n default:\n throw new OrchestrationError({\n code: 'UNSUPPORTED',\n message: `unsupported remote orchestration operation '${String(request.operation)}'`,\n retryable: false,\n });\n }\n } catch (error) {\n return failure(request, error);\n }\n },\n async *watch(request, options = {}) {\n try {\n validate(request);\n if (request.operation !== 'watch') {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'streaming protocol accepts only watch operations',\n retryable: false,\n });\n }\n const watchOptions = request.payload.options as OrchestrationWatchOptions | undefined;\n for await (\n const event of client.watch(\n requirePayload(request.payload, 'query') as OrchestrationResourceQuery,\n {\n ...watchOptions,\n signal: options.signal,\n },\n )\n ) {\n yield success(request, event);\n }\n } catch (error) {\n yield failure(request, error);\n }\n },\n };\n}\n\nexport interface FetchOrchestrationTransportOptions {\n endpoint: string;\n fetch?: typeof globalThis.fetch;\n headers?: Record<string, string> | (() => Promise<Record<string, string>>);\n credentials?: RequestCredentials;\n maxResponseBytes?: number;\n maxWatchLineBytes?: number;\n}\n\n/** Browser/Tauri/React-Native fetch transport with bounded NDJSON watch. */\nexport function createFetchOrchestrationTransport(\n options: FetchOrchestrationTransportOptions,\n): RemoteOrchestrationTransport {\n const fetch_ = options.fetch ?? globalThis.fetch;\n const maxResponseBytes = options.maxResponseBytes ?? 1024 * 1024;\n const maxWatchLineBytes = options.maxWatchLineBytes ?? 1024 * 1024;\n\n function assertWatchLineSize(line: string): void {\n if (new TextEncoder().encode(line).byteLength > maxWatchLineBytes) {\n throw new OrchestrationError({\n code: 'EXHAUSTED',\n message: `remote orchestration watch line exceeds ${maxWatchLineBytes} bytes`,\n retryable: false,\n });\n }\n }\n\n async function headers(accept: string): Promise<Record<string, string>> {\n const additional = typeof options.headers === 'function' ? await options.headers() : (options.headers ?? {});\n return {\n Accept: accept,\n 'Content-Type': 'application/json',\n ...additional,\n };\n }\n\n async function post(\n request: RemoteOrchestrationRequest,\n accept: string,\n signal?: AbortSignal,\n ): Promise<Response> {\n const response = await fetch_(options.endpoint, {\n method: 'POST',\n headers: await headers(accept),\n body: JSON.stringify(request),\n signal,\n ...(options.credentials ? { credentials: options.credentials } : {}),\n });\n if (!response.ok) {\n throw new OrchestrationError({\n code: response.status === 401 || response.status === 403 ? 'FORBIDDEN' : 'UNAVAILABLE',\n message: `remote orchestration endpoint returned HTTP ${response.status}`,\n retryable: response.status >= 500,\n });\n }\n return response;\n }\n\n async function readBoundedText(response: Response, limit: number): Promise<string> {\n if (!response.body) return '';\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let size = 0;\n let text = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > limit) {\n await reader.cancel();\n throw new OrchestrationError({\n code: 'EXHAUSTED',\n message: `remote orchestration response exceeds ${limit} bytes`,\n retryable: false,\n });\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n }\n\n return {\n async request(request, transportOptions = {}) {\n const response = await post(request, 'application/json', transportOptions.signal);\n const text = await readBoundedText(response, maxResponseBytes);\n return JSON.parse(text) as RemoteOrchestrationResponse;\n },\n async *watch(request, transportOptions = {}) {\n const response = await post(request, 'application/x-ndjson', transportOptions.signal);\n if (!response.body) {\n throw new OrchestrationError({\n code: 'UNAVAILABLE',\n message: 'remote orchestration watch response has no body',\n retryable: true,\n });\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let pending = '';\n let streamCompleted = false;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n streamCompleted = true;\n break;\n }\n pending += decoder.decode(value, { stream: true });\n let newline = pending.indexOf('\\n');\n while (newline >= 0) {\n const line = pending.slice(0, newline).trim();\n pending = pending.slice(newline + 1);\n assertWatchLineSize(line);\n if (line) yield JSON.parse(line) as RemoteOrchestrationResponse;\n newline = pending.indexOf('\\n');\n }\n // UTF-8 is never smaller than the JS code-unit count. This cheap\n // guard avoids repeatedly re-encoding an attacker-controlled partial\n // line; the exact byte check runs once when the line is complete.\n if (pending.length > maxWatchLineBytes) {\n throw new OrchestrationError({\n code: 'EXHAUSTED',\n message: `remote orchestration watch line exceeds ${maxWatchLineBytes} bytes`,\n retryable: false,\n });\n }\n }\n pending += decoder.decode();\n if (pending.trim()) {\n assertWatchLineSize(pending.trim());\n yield JSON.parse(pending) as RemoteOrchestrationResponse;\n }\n } finally {\n if (!streamCompleted) {\n await reader.cancel().catch(() => undefined);\n }\n reader.releaseLock();\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|