@agimon-ai/po-codemode 0.0.1-alpha.32 → 0.0.1-alpha.34

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.
@@ -332,7 +332,7 @@ function sleep(ms, signal) {
332
332
  }
333
333
  /**
334
334
  * A view of `target` whose gated member paths ask before calling the original on its own receiver.
335
- * The view inherits from a shadow, so frozen targets keep their proxy invariants.
335
+ * An empty null-prototype shadow keeps frozen targets' proxy invariants and stays JSON-shaped.
336
336
  */
337
337
  function gateMembers(target, policies, prefix, gate) {
338
338
  if (typeof target !== "object" || target === null) throw new Error(`Code-mode member ${prefix} declares approval but is not an object.`);
@@ -353,7 +353,7 @@ function gateMembers(target, policies, prefix, gate) {
353
353
  }
354
354
  }
355
355
  for (const [key, children] of nested) overrides.set(key, gateMembers(Reflect.get(target, key, target), children, `${prefix}.${key}`, gate));
356
- return new Proxy(Object.create(target), {
356
+ return new Proxy(Object.create(null), {
357
357
  get: (_shadow, key) => overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target),
358
358
  has: (_shadow, key) => overrides.has(key) || Reflect.has(target, key),
359
359
  ownKeys: () => Reflect.ownKeys(target),
@@ -832,4 +832,4 @@ Object.defineProperty(exports, "createCodemodeTools", {
832
832
  }
833
833
  });
834
834
 
835
- //# sourceMappingURL=codemodeTools-DrdEw_bA.cjs.map
835
+ //# sourceMappingURL=codemodeTools-CkXEL8R5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemodeTools-CkXEL8R5.cjs","names":["Type","invalidImageReason","isUnattended","gateApproval","ApprovalPendingError"],"sources":["../src/services/codemodeRegistry/index.ts","../src/schemas/codemodeTools.ts","../src/services/codemodeTools/index.ts"],"sourcesContent":["import {\n assertCodemodeNamespaceName,\n type PoCodemodeNamespace,\n type PoCodemodeRegistration,\n type PoCodemodeScriptSource,\n type PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\n\nconst MEMBER_PATH = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*$/u;\n\n/** A gated member that cannot be gated must fail at registration, not run ungated. */\nfunction assertApproval(source: string, namespace: PoCodemodeNamespace): void {\n for (const [path, policy] of Object.entries(namespace.approval ?? {})) {\n const valid =\n MEMBER_PATH.test(path) &&\n (policy?.requirement === 'ask' || policy?.requirement === 'human') &&\n typeof policy.describe === 'function';\n if (!valid) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} declares an invalid approval for \"${path}\": ` +\n 'use a dotted member path with requirement \"ask\" or \"human\" and a describe function.',\n );\n }\n }\n}\n/** The session's namespaces and script folders, in registration order. One name per session. */\nexport function createCodemodeRegistry(options?: { isActive?: (source: string) => boolean }): PoCodemodeService {\n const entries = new Map<string, { source: string; namespace: PoCodemodeNamespace }>();\n const scripts = new Set<PoCodemodeScriptSource>();\n const listeners = new Set<() => void>();\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n return {\n register(source: string, namespace: PoCodemodeNamespace): PoCodemodeRegistration {\n assertCodemodeNamespaceName(namespace.name);\n assertApproval(source, namespace);\n const taken = entries.get(namespace.name);\n if (taken) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} is already registered by ${taken.source}.`,\n );\n }\n const entry = { source, namespace };\n entries.set(namespace.name, entry);\n notify();\n return {\n dispose: () => {\n if (entries.get(namespace.name) !== entry) return;\n entries.delete(namespace.name);\n notify();\n },\n };\n },\n // ponytail: selection gates new bindings only; check each bound call if running execs must be revoked too.\n list: () =>\n [...entries.values()]\n .filter((entry) => options?.isActive?.(entry.source) ?? true)\n .map((entry) => entry.namespace),\n registerScripts(_source: string, entry: PoCodemodeScriptSource): PoCodemodeRegistration {\n const owned = { domain: entry.domain, directory: entry.directory };\n scripts.add(owned);\n notify();\n return { dispose: () => void (scripts.delete(owned) && notify()) };\n },\n listScripts: () => [...scripts],\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import { Type, type Static } from 'typebox';\n\nexport const DiscoverToolSchema = Type.Object({\n namespace: Type.Optional(Type.String({ description: 'Show the full TypeScript declarations of one namespace.' })),\n query: Type.Optional(Type.String({ description: 'Find matching members across every namespace.' })),\n});\nexport type DiscoverToolParams = Static<typeof DiscoverToolSchema>;\n\nexport const ExecToolSchema = Type.Object({\n code: Type.String({\n description:\n 'TypeScript body of an async function. Top-level await and return work. The returned value, console output and image() calls come back.',\n }),\n timeoutMs: Type.Optional(\n Type.Integer({ minimum: 1_000, maximum: 120_000, description: 'Deadline in milliseconds. Default 30000.' }),\n ),\n});\nexport type ExecToolParams = Static<typeof ExecToolSchema>;\n\nexport const ExecBackgroundToolSchema = Type.Object({\n code: ExecToolSchema.properties.code,\n timeoutMs: Type.Optional(\n Type.Integer({\n minimum: 1_000,\n maximum: 7_200_000,\n description: 'Deadline in milliseconds. Default 1800000 (30 minutes), maximum 2 hours.',\n }),\n ),\n});\nexport type ExecBackgroundToolParams = Static<typeof ExecBackgroundToolSchema>;\n\nexport const ExecCancelToolSchema = Type.Object({\n id: Type.String({ minLength: 1, description: 'The background exec ID returned by exec_background.' }),\n reason: Type.Optional(Type.String({ maxLength: 256 })),\n});\nexport type ExecCancelToolParams = Static<typeof ExecCancelToolSchema>;\n","import {\n ApprovalPendingError,\n gateApproval,\n isUnattended,\n type PoApprovalPolicy,\n type PoApprovalService,\n type PoApprovedCall,\n} from '@agimon-ai/po-core/approval';\nimport type { BackgroundWorkProvider } from '@agimon-ai/po-core/backgroundWork';\nimport type {\n PoCodemodeCall,\n PoCodemodeNamespace,\n PoCodemodeRun,\n PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\nimport {\n invalidImageReason,\n type PoHeadlessContent,\n type PoHeadlessExecutionContext,\n type PoHeadlessTool,\n type PoHeadlessToolResult,\n} from '@agimon-ai/po-core/headless';\nimport type { PoIsolateResult, PoIsolateService, PoNpm } from '@agimon-ai/po-core/platform';\n\nimport {\n DiscoverToolSchema,\n ExecToolSchema,\n ExecBackgroundToolSchema,\n ExecCancelToolSchema,\n type DiscoverToolParams,\n type ExecToolParams,\n type ExecBackgroundToolParams,\n type ExecCancelToolParams,\n} from '../../schemas/codemodeTools';\nimport type { CodemodeScriptsPort } from '../codemodeScripts/type';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst MIN_TIMEOUT_MS = 1_000;\nconst BACKGROUND_DEFAULT_TIMEOUT_MS = 30 * 60_000;\nconst BACKGROUND_MAX_TIMEOUT_MS = 2 * 60 * 60_000;\nconst MAX_LOG_CHARS = 10_000;\nconst MAX_VALUE_CHARS = 64 * 1024;\nconst MAX_DECLARATION_CHARS = 24_000;\nconst MAX_QUERY_LINES = 40;\n// The main agent and its subagents share one exec tool, so several runs can overlap.\nconst MAX_CONCURRENT_RUNS = 8;\n// Recorded calls ride the result's details into the transcript, so they are few and small.\nconst MAX_RECORDED_CALLS = 50;\nconst MAX_RECORDED_TEXT = 8_000;\nconst MAX_RECORDED_JSON = 16_000;\nconst MAX_LISTED_SCRIPTS = 20;\nconst MAX_IMAGES = 4;\nconst MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_IMAGE_MIME = 'image/png';\nconst MEMBER_LINE = /^\\s{2}(?:readonly\\s+)?(\\w+)\\s*[(?:<]/u;\n\nconst GLOBALS_HELP =\n 'Globals: console.log/info/warn/error, image(data, mimeType?) to return a screenshot, sleep(ms). ' +\n 'Return a value with `return`.';\nconst SCRIPTS_HELP =\n 'Every exec run is saved. Call a saved script with `await (await import(specifier))(args)`; ' +\n 'inside it, `args` is the argument and its `return` is the result.';\n\nexport interface CodemodeToolsOptions {\n readonly registry: PoCodemodeService;\n /** Resolved per call, so a host that binds the isolate late still works. */\n readonly isolate: () => PoIsolateService | undefined;\n /** Saves every exec body and backs `import()`; without it nothing is saved or importable. */\n readonly scripts?: CodemodeScriptsPort;\n readonly npm?: () => PoNpm | undefined;\n readonly signal?: AbortSignal;\n readonly onBackgroundChange?: () => void;\n /** The session's `po/approval`; without it `ask` members run and `human` members refuse. */\n readonly approval?: () => PoApprovalService | undefined;\n}\n\nexport interface CodemodeTools {\n readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;\n readonly exec: PoHeadlessTool<typeof ExecToolSchema>;\n readonly execBackground: PoHeadlessTool<typeof ExecBackgroundToolSchema>;\n readonly execCancel: PoHeadlessTool<typeof ExecCancelToolSchema>;\n readonly backgroundWork: BackgroundWorkProvider;\n /** Replays an approved gated member, ungated, in `sessionId`; the `codemode` approval executor. */\n runApproved(call: PoApprovedCall, signal: AbortSignal, sessionId: string): Promise<unknown>;\n dispose(): Promise<void>;\n}\n\ninterface BackgroundExec {\n readonly id: string;\n readonly sessionId: string;\n readonly controller: AbortController;\n status: 'running' | 'reporting';\n done: Promise<void>;\n}\n\nfunction text(value: string, isError = false): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: value }], ...(isError ? { isError: true } : {}) };\n}\n\nfunction truncate(value: string, limit: number): string {\n return value.length <= limit ? value : `${value.slice(0, limit)}\\n[truncated ${value.length - limit} chars]`;\n}\n\nfunction format(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n const json = JSON.stringify(value, null, 2);\n if (json !== undefined) return json;\n } catch {\n // Cyclic or exotic values fall back to their string form.\n }\n return String(value);\n}\n\nfunction memberNames(namespace: PoCodemodeNamespace): string[] {\n const names = new Set<string>();\n const declaration =\n new RegExp(`^declare const ${namespace.name}: \\\\{([\\\\s\\\\S]*?)^\\\\};`, 'mu').exec(namespace.declarations)?.[1] ?? '';\n for (const line of declaration.split('\\n')) {\n const name = MEMBER_LINE.exec(line)?.[1];\n if (name) names.add(name);\n }\n return [...names];\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000));\n }\n return btoa(binary);\n}\n\n/** Collects what a script prints and the images it returns, within the output caps. */\nfunction createOutput() {\n const lines: string[] = [];\n const images: { data: string; mimeType: string }[] = [];\n let imageBytes = 0;\n const log =\n (level: string) =>\n (...args: unknown[]) => {\n const line = args.map(format).join(' ');\n lines.push(level === 'log' || level === 'info' ? line : `[${level}] ${line}`);\n };\n const note = (message: string): void => void lines.push(`[note] ${message}`);\n /** Why an image cannot join this run's output, checked before anything is counted, so a refusal costs nothing. */\n const refusal = (data: string, mime: string): Error | undefined => {\n if (images.length >= MAX_IMAGES) return new RangeError(`An exec run returns at most ${MAX_IMAGES} images.`);\n if (imageBytes + Math.ceil((data.length * 3) / 4) > MAX_IMAGE_BYTES)\n return new RangeError('Images from one exec run exceed 5 MB.');\n const invalid = invalidImageReason(data, mime);\n return invalid === undefined ? undefined : new TypeError(`image() rejected an undecodable image: ${invalid}.`);\n };\n const push = (data: string, mimeType: string): void => {\n imageBytes += Math.ceil((data.length * 3) / 4);\n images.push({ data, mimeType });\n };\n const addImage = (input: unknown, mimeType?: unknown): void => {\n if (typeof input === 'object' && input !== null && 'images' in input && Array.isArray(input.images)) {\n for (const image of input.images) addImage(image);\n return;\n }\n let data: string;\n let mime = typeof mimeType === 'string' ? mimeType : DEFAULT_IMAGE_MIME;\n if (typeof input === 'string')\n data = input.replace(/^data:([^;]+);base64,/u, (_match, type: string) => ((mime = type), ''));\n else if (ArrayBuffer.isView(input))\n data = bytesToBase64(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n else if (typeof input === 'object' && input !== null && 'data' in input && typeof input.data === 'string') {\n data = input.data;\n if ('mimeType' in input && typeof input.mimeType === 'string') mime = input.mimeType;\n } else throw new TypeError('image() takes base64 text, bytes, or { data, mimeType }.');\n const error = refusal(data, mime);\n if (error !== undefined) throw error;\n push(data, mime);\n };\n /** A namespace's image for the model: the same limits as image(), but a refusal is a note and a warning, not a throw. */\n const emitImage = ({ data, mimeType }: { readonly data: string; readonly mimeType: string }) => {\n const error = refusal(data, mimeType);\n if (error === undefined) {\n push(data, mimeType);\n return { emitted: true } as const;\n }\n const warning = `Image not shown to the model: ${error.message}`;\n note(warning);\n return { emitted: false, warning } as const;\n };\n const console = { log: log('log'), info: log('info'), warn: log('warn'), error: log('error'), debug: log('debug') };\n return { console, note, addImage, emitImage, lines, images };\n}\n\n/** The session's active domains; every registered domain when the host reports none. */\nfunction activeDomains(execution: PoHeadlessExecutionContext | undefined): readonly string[] | undefined {\n return execution?.selection?.domains;\n}\n\n/** A JSON copy of `value`, or undefined when it does not serialise or is larger than `limit` characters. */\nfunction bounded<T>(value: T, limit: number): T | undefined {\n try {\n const json = JSON.stringify(value);\n return json !== undefined && json.length <= limit ? (JSON.parse(json) as T) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** What the recorded pictures of one run may still take, under the same limits as image(). */\ninterface ImageBudget {\n count: number;\n bytes: number;\n}\n\n/**\n * The call as it is kept in the transcript: text clipped, pictures kept while the run's\n * budget lasts (a note says when one was not), args and details dropped when large.\n */\nfunction recordedCall(call: PoCodemodeCall, budget: ImageBudget): PoCodemodeCall {\n const content = (call.result?.content ?? []).flatMap((block): PoHeadlessContent[] => {\n const { type, text, data, mimeType } = (block ?? {}) as Record<string, unknown>;\n if (type === 'text' && typeof text === 'string') return [{ type: 'text', text: truncate(text, MAX_RECORDED_TEXT) }];\n if (type !== 'image' || typeof data !== 'string' || typeof mimeType !== 'string') return [];\n const bytes = Math.ceil((data.length * 3) / 4);\n if (budget.count >= MAX_IMAGES || budget.bytes + bytes > MAX_IMAGE_BYTES) {\n return [{ type: 'text', text: `[picture not kept: one exec run keeps at most ${MAX_IMAGES} pictures, 5 MB]` }];\n }\n budget.count += 1;\n budget.bytes += bytes;\n return [{ type: 'image', data, mimeType }];\n });\n const details = bounded(call.result?.details, MAX_RECORDED_JSON);\n if (call.result?.details !== undefined && details === undefined)\n content.push({ type: 'text', text: `[details not kept: larger than ${MAX_RECORDED_JSON} characters]` });\n return {\n name: call.name,\n tool: call.tool,\n args: bounded(call.args, MAX_RECORDED_JSON) ?? {},\n ok: call.ok,\n ms: Math.max(0, Math.round(call.ms)),\n ...(call.error === undefined ? {} : { error: truncate(call.error, MAX_RECORDED_TEXT) }),\n ...(call.result === undefined ? {} : { result: { content, ...(details === undefined ? {} : { details }) } }),\n };\n}\n\n/** A gated member call recorded for the person's approval during one exec run. */\ninterface PendingApproval {\n readonly approvalId: string;\n readonly name: string;\n}\n\nfunction toResult(\n result: PoIsolateResult,\n output: ReturnType<typeof createOutput>,\n saved: string | undefined,\n calls: readonly PoCodemodeCall[],\n approvals: readonly PendingApproval[] = [],\n): PoHeadlessToolResult {\n const pending =\n !result.ok && result.error.kind === 'error' && result.error.name === 'ApprovalPendingError' && approvals.length > 0;\n const content: PoHeadlessContent[] = [];\n if (output.lines.length > 0) content.push({ type: 'text', text: truncate(output.lines.join('\\n'), MAX_LOG_CHARS) });\n if (result.ok) {\n if (ArrayBuffer.isView(result.value)) {\n content.push({ type: 'text', text: 'The script returned bytes. Pass them to image(data, mimeType) instead.' });\n } else if (result.value !== undefined) {\n content.push({ type: 'text', text: truncate(format(result.value), MAX_VALUE_CHARS) });\n }\n } else if (!pending) {\n const { kind, name, message } = result.error;\n const hint = kind === 'timeout' ? ' Raise timeoutMs or split the work into smaller exec calls.' : '';\n content.push({ type: 'text', text: `${name}: ${message}${hint}` });\n }\n if (approvals.length > 0)\n content.push({\n type: 'text',\n text:\n `Waiting for the person's approval: ${approvals.map((entry) => `${entry.name} (approval ${entry.approvalId})`).join(', ')}. ` +\n 'Each runs once approved, and its outcome arrives as a message. Keep working meanwhile.',\n });\n if (content.length === 0) content.push({ type: 'text', text: '(no return value)' });\n if (saved !== undefined) content.push({ type: 'text', text: saved });\n for (const image of output.images) content.push({ type: 'image', data: image.data, mimeType: image.mimeType });\n const details = {\n ...(calls.length > 0 ? { calls } : {}),\n ...(approvals.length > 0 ? { approvals } : {}),\n };\n return {\n content: content.map((part, index) =>\n part.type === 'text' && index > 0 ? { ...part, text: `\\n${part.text}` } : part,\n ),\n ...(Object.keys(details).length > 0 ? { details } : {}),\n ...(result.ok || pending ? {} : { isError: true }),\n };\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) return reject(new Error('Run ended.'));\n const stop = () => {\n clearTimeout(timer);\n reject(new Error('Run ended.'));\n };\n const timer = setTimeout(\n () => {\n signal.removeEventListener('abort', stop);\n resolve();\n },\n Math.max(0, ms),\n );\n signal.addEventListener('abort', stop, { once: true });\n });\n}\n\ntype MemberGate = (\n name: string,\n policy: PoApprovalPolicy,\n call: (args: unknown[]) => unknown,\n) => (...args: unknown[]) => Promise<unknown>;\n\n/**\n * A view of `target` whose gated member paths ask before calling the original on its own receiver.\n * An empty null-prototype shadow keeps frozen targets' proxy invariants and stays JSON-shaped.\n */\nfunction gateMembers(\n target: unknown,\n policies: Readonly<Record<string, PoApprovalPolicy>>,\n prefix: string,\n gate: MemberGate,\n): object {\n if (typeof target !== 'object' || target === null) {\n throw new Error(`Code-mode member ${prefix} declares approval but is not an object.`);\n }\n const overrides = new Map<PropertyKey, unknown>();\n const nested = new Map<string, Record<string, PoApprovalPolicy>>();\n for (const [path, policy] of Object.entries(policies)) {\n const dot = path.indexOf('.');\n if (dot === -1) {\n const original: unknown = Reflect.get(target, path, target);\n if (typeof original !== 'function') {\n throw new Error(`Code-mode member ${prefix}.${path} declares approval but is not a function.`);\n }\n overrides.set(\n path,\n gate(`${prefix}.${path}`, policy, (args) => Reflect.apply(original, target, args)),\n );\n } else {\n const head = path.slice(0, dot);\n nested.set(head, { ...nested.get(head), [path.slice(dot + 1)]: policy });\n }\n }\n for (const [key, children] of nested) {\n overrides.set(key, gateMembers(Reflect.get(target, key, target), children, `${prefix}.${key}`, gate));\n }\n // ponytail: ungated methods run with the view as `this`; a class using #private fields breaks, bind such methods if one appears.\n return new Proxy(Object.create(null) as object, {\n get: (_shadow, key) => (overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target)),\n has: (_shadow, key) => overrides.has(key) || Reflect.has(target, key),\n ownKeys: () => Reflect.ownKeys(target),\n getOwnPropertyDescriptor: (_shadow, key) => {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, key);\n if (!descriptor) return undefined;\n return {\n configurable: true,\n enumerable: descriptor.enumerable ?? false,\n writable: false,\n value: overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target),\n };\n },\n set: () => false,\n defineProperty: () => false,\n deleteProperty: () => false,\n });\n}\n\n/** `name (asks first)` for each gated top-level member, so discover shows which calls wait for the person. */\nfunction gatedLabel(namespace: PoCodemodeNamespace, member: string): string {\n const policies = Object.entries(namespace.approval ?? {}).filter(\n ([path]) => path === member || path.startsWith(`${member}.`),\n );\n if (policies.length === 0) return member;\n return policies.some(([, policy]) => policy.requirement === 'human')\n ? `${member} (needs the person)`\n : `${member} (asks first)`;\n}\n/** `discover` and `exec` for one session, over the namespaces its packages contributed. */\nexport function createCodemodeTools({\n registry,\n isolate,\n scripts,\n npm,\n signal: lifecycleSignal,\n onBackgroundChange,\n approval,\n}: CodemodeToolsOptions): CodemodeTools {\n let running = 0;\n let closing = false;\n const lifecycle = new AbortController();\n const ownerSignal = lifecycleSignal ? AbortSignal.any([lifecycle.signal, lifecycleSignal]) : lifecycle.signal;\n const jobs = new Map<string, BackgroundExec>();\n const backgroundWork: BackgroundWorkProvider = {\n provider: 'po-codemode-background',\n listActiveWork: () =>\n [...jobs.values()].map(({ id, sessionId, status }) => ({ id, sessionId, status, label: 'Background exec' })),\n };\n\n const visible = (service: PoIsolateService): PoCodemodeNamespace[] =>\n registry.list().filter((namespace) => service.liveObjects || namespace.portable === true);\n\n // The exec description is read synchronously, so domain script names are cached on registry changes.\n // ponytail: lists every registered folder, not the turn's active domains; filter here if selection changes mid-session.\n let domainScripts: string[] = [];\n let refreshes = 0;\n const refreshScripts = (): void => {\n if (!scripts) return;\n const turn = ++refreshes;\n scripts.list().then(\n (entries) => {\n if (turn !== refreshes) return;\n domainScripts = entries.flatMap((entry) => (entry.specifier.startsWith('session:') ? [] : [entry.specifier]));\n },\n // A failed listing keeps the last names; discover reports the folder error when called.\n () => undefined,\n );\n };\n refreshScripts();\n const unsubscribe = registry.subscribe(refreshScripts);\n const domainScriptsHelp = (): string[] => {\n if (domainScripts.length === 0) return [];\n const shown = domainScripts.slice(0, MAX_LISTED_SCRIPTS).join(', ');\n const more =\n domainScripts.length > MAX_LISTED_SCRIPTS ? ` and ${domainScripts.length - MAX_LISTED_SCRIPTS} more` : '';\n return [`Domain scripts: ${shown}${more}. Use discover({ query }) to see what one does before importing it.`];\n };\n\n const executeCode = async (\n parameters: ExecToolParams,\n signal: AbortSignal | undefined,\n execution: PoHeadlessExecutionContext,\n deadlineMs: number,\n toolCallId: string,\n background = false,\n ): Promise<PoHeadlessToolResult> => {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n running += 1;\n const controller = new AbortController();\n const runSignal = AbortSignal.any([ownerSignal, controller.signal, ...(signal ? [signal] : [])]);\n const cleanups: (() => void | Promise<void>)[] = [];\n const calls: PoCodemodeCall[] = [];\n const imageBudget: ImageBudget = { count: 0, bytes: 0 };\n const output = createOutput();\n const presence = execution.interaction === 'unattended' ? 'unattended' : execution.sessionContext?.interaction;\n const interaction = isUnattended({\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n background,\n ...(presence === undefined ? {} : { interaction: presence }),\n })\n ? 'unattended'\n : 'interactive';\n const run: PoCodemodeRun = {\n source: parameters.code,\n sessionId: execution.sessionId,\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n toolCallId,\n ...(background ? { background } : {}),\n interaction,\n signal: runSignal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: (call) => {\n if (calls.length < MAX_RECORDED_CALLS) calls.push(recordedCall(call, imageBudget));\n },\n emitImage: (image) =>\n runSignal.aborted ? { emitted: false, warning: 'The exec run has ended.' } : output.emitImage(image),\n };\n const approvals: PendingApproval[] = [];\n // A gated member never pauses the script: a pending request or a refusal is an error the script can catch.\n const gateFor =\n (namespace: PoCodemodeNamespace): MemberGate =>\n (name, policy, call) =>\n async (...args) => {\n const gate = await gateApproval({\n policy,\n operation: { kind: 'codemode', name },\n input: args[0],\n arguments: args,\n argumentFormat: 'positional',\n sessionId: run.sessionId,\n toolCallId,\n ...(run.caller === undefined ? {} : { caller: run.caller }),\n background,\n interaction,\n service: approval?.(),\n signal: runSignal,\n });\n if (!gate.ok && gate.pending === true) {\n approvals.push({ approvalId: gate.approvalId, name });\n throw new ApprovalPendingError(gate.approvalId, gate.reason);\n }\n if (!gate.ok) throw new Error(gate.reason);\n if (!registry.list().includes(namespace)) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n if (runSignal.aborted) throw new Error(`'${name}' was cancelled. Nothing ran.`);\n return call(args);\n };\n let saved: string | undefined;\n let result: PoIsolateResult = { ok: true, value: undefined };\n try {\n runSignal.throwIfAborted();\n try {\n const file = await scripts?.save(parameters.code);\n if (file) saved = `Saved as ${file.specifier} (${file.path})`;\n } catch (error) {\n output.note(`Could not save the script: ${error instanceof Error ? error.message : String(error)}`);\n }\n runSignal.throwIfAborted();\n const globals: Record<string, unknown> = {\n console: output.console,\n image: output.addImage,\n sleep: (ms: number) => sleep(ms, runSignal),\n };\n const deny = new Set<string>();\n for (const namespace of visible(service)) {\n const bound = namespace.bind(run);\n if (namespace.approval === undefined || Object.keys(namespace.approval).length === 0) {\n globals[namespace.name] = bound;\n } else {\n try {\n globals[namespace.name] = gateMembers(bound, namespace.approval, namespace.name, gateFor(namespace));\n } catch (error) {\n // Fail closed: a namespace whose gate cannot be applied is left out of this run.\n output.note(`${namespace.name} is unavailable: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n }\n for (const member of namespace.deny ?? []) deny.add(member);\n }\n result = await service.run({\n source: parameters.code,\n globals,\n deadlineMs,\n signal: runSignal,\n deny: [...deny],\n onDiagnostic: output.note,\n resolveImport: async (specifier) => {\n if (specifier.startsWith('node:')) {\n throw new Error(\n `Code mode is sandboxed, so \"${specifier}\" cannot be imported. Use the shell namespace or an npm: import.`,\n );\n }\n if (!specifier.startsWith('npm:')) {\n if (!scripts) throw new Error('Script imports are not available on this host.');\n return scripts.resolve(specifier, activeDomains(execution));\n }\n const loader = npm?.();\n if (!loader) throw new Error('npm imports are not available on this host.');\n run.signal.throwIfAborted();\n const started = Date.now();\n try {\n const exports = await loader.import(specifier, { sessionId: run.sessionId, signal: run.signal });\n run.signal.throwIfAborted();\n run.record?.({ name: 'npm.import', tool: 'npm', args: { specifier }, ms: Date.now() - started, ok: true });\n return { kind: 'module', id: specifier, exports };\n } catch (error) {\n run.record?.({\n name: 'npm.import',\n tool: 'npm',\n args: { specifier },\n ms: Date.now() - started,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n },\n });\n } catch (error) {\n result = {\n ok: false,\n error: {\n kind: 'error',\n name: 'Error',\n message: `Code mode could not run the script: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n } finally {\n controller.abort();\n for (const cleanup of cleanups.reverse()) {\n await Promise.resolve()\n .then(cleanup)\n .catch((error: unknown) => {\n const message = `Code mode cleanup failed: ${String(error)}`;\n output.note(message);\n result = { ok: false, error: { kind: 'error', name: 'CleanupError', message } };\n });\n }\n running -= 1;\n }\n return toResult(result, output, saved, calls, approvals);\n };\n\n // ponytail: the cockpit's generic tool item renders both for now; add a poWeb renderer for exec code and images when it earns one.\n // web-plugin-tool-renderers: ignore discover, plain text result\n const discover: CodemodeTools['discover'] = {\n name: 'discover',\n label: 'Discover',\n description:\n 'List the code-mode namespaces and reusable scripts you can use from `exec`, show one namespace in full, ' +\n 'or search members and scripts. ' +\n 'Not required before exec: its description already names the namespaces.',\n parameters: DiscoverToolSchema,\n promptSnippet: 'List code-mode namespaces and their TypeScript declarations',\n executionMode: 'parallel',\n async execute(_toolCallId, parameters: DiscoverToolParams, _signal, _onUpdate, execution) {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n const namespaces = visible(service);\n // Imports need a host with live objects; the edge saves scripts but cannot chain them.\n const listed = scripts && service.liveObjects ? await scripts.list(activeDomains(execution)) : [];\n if (parameters.namespace !== undefined) {\n const found = namespaces.find((namespace) => namespace.name === parameters.namespace);\n if (!found) {\n const names = namespaces.map((namespace) => namespace.name).join(', ') || 'none';\n return text(`Unknown namespace \"${parameters.namespace}\". Registered: ${names}.`, true);\n }\n return text(truncate(found.declarations, MAX_DECLARATION_CHARS));\n }\n if (parameters.query !== undefined) {\n const needle = parameters.query.toLowerCase();\n const hits: string[] = [];\n for (const namespace of namespaces) {\n const lines = namespace.declarations.split('\\n');\n lines.forEach((line, index) => {\n if (!line.toLowerCase().includes(needle) || hits.length >= MAX_QUERY_LINES) return;\n const doc = lines[index - 1]?.trim().startsWith('/**') ? `${lines[index - 1]?.trim()} ` : '';\n hits.push(`${namespace.name}: ${doc}${line.trim()}`);\n });\n }\n for (const script of listed) {\n if (hits.length >= MAX_QUERY_LINES) break;\n if (`${script.specifier} ${script.description}`.toLowerCase().includes(needle)) {\n hits.push(`script ${script.specifier}: ${script.description}`);\n }\n }\n return text(hits.length > 0 ? hits.join('\\n') : `No members or scripts match \"${parameters.query}\".`);\n }\n const sections: string[] = [];\n if (namespaces.length === 0) sections.push('No namespaces are registered in this session.');\n for (const namespace of namespaces) {\n const members = memberNames(namespace).map((member) => gatedLabel(namespace, member));\n sections.push(`- ${namespace.name}: ${namespace.summary}\\n members: ${members.join(', ')}`);\n }\n sections.push(GLOBALS_HELP);\n if (!service.liveObjects) sections.push('This host runs plain JavaScript with JSON-only functions.');\n if (listed.length > 0) {\n sections.push(`Scripts. ${SCRIPTS_HELP}`);\n for (const script of listed.slice(0, MAX_LISTED_SCRIPTS)) {\n sections.push(`- ${script.specifier}${script.description ? `: ${script.description}` : ''}`);\n }\n if (listed.length > MAX_LISTED_SCRIPTS) {\n sections.push(`...and ${listed.length - MAX_LISTED_SCRIPTS} more; use discover({ query }) to search.`);\n }\n }\n if (namespaces.length > 0) sections.push('Call discover({ namespace }) for full types.');\n return text(sections.join('\\n'));\n },\n };\n\n // web-plugin-tool-renderers: ignore exec, generic item until a code and image renderer exists\n const exec: CodemodeTools['exec'] = {\n name: 'exec',\n label: 'Exec',\n get description(): string {\n const service = isolate();\n const namespaces = service ? visible(service) : [];\n const listed = namespaces.map((namespace) => `- ${namespace.name}: ${namespace.summary}`).join('\\n');\n return [\n 'Run a TypeScript script inside the Po server with live objects from the namespaces below in scope.',\n 'It runs with full server trust, like bash. Keep each call to one logical step.',\n listed || '(no namespaces registered yet; call discover to check)',\n GLOBALS_HELP,\n ...(scripts && service?.liveObjects\n ? [`${SCRIPTS_HELP} discover lists saved and domain scripts.`, ...domainScriptsHelp()]\n : []),\n 'Use discover({ namespace }) for full signatures when needed.',\n ].join('\\n');\n },\n parameters: ExecToolSchema,\n promptSnippet: 'Run a TypeScript script against live Po objects (browser and other namespaces)',\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecToolParams, signal, _onUpdate, execution) {\n return executeCode(\n parameters,\n signal,\n execution,\n Math.min(MAX_TIMEOUT_MS, Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? DEFAULT_TIMEOUT_MS)),\n toolCallId,\n );\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_background, immediate job identity only\n const execBackground: CodemodeTools['execBackground'] = {\n name: 'exec_background',\n label: 'Background Exec',\n description:\n 'Run a long-lived Node code-mode script. Returns its ID immediately; one completion message arrives after execution and cleanup. End the turn rather than polling. Full server trust, like exec.',\n parameters: ExecBackgroundToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecBackgroundToolParams, signal, _onUpdate, execution) {\n if (signal?.aborted) return text('Background exec launch was aborted.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (!isolate()?.liveObjects) return text('Background exec requires a Node host with live objects.', true);\n if (!execution.session?.admitMessage)\n return text('This session cannot admit background exec completion messages.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n const deadlineMs = Math.min(\n BACKGROUND_MAX_TIMEOUT_MS,\n Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? BACKGROUND_DEFAULT_TIMEOUT_MS),\n );\n const id = crypto.randomUUID();\n const controller = new AbortController();\n const job: BackgroundExec = {\n id,\n sessionId: execution.sessionId,\n controller,\n status: 'running',\n done: Promise.resolve(),\n };\n jobs.set(id, job);\n onBackgroundChange?.();\n job.done = (async () => {\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, deadlineMs);\n try {\n const result = await executeCode(parameters, controller.signal, execution, deadlineMs, toolCallId, true);\n clearTimeout(timer);\n job.status = 'reporting';\n onBackgroundChange?.();\n const status = timedOut\n ? 'timed-out'\n : controller.signal.aborted\n ? 'stopped'\n : result.isError\n ? 'failed'\n : 'completed';\n const message = {\n type: 'po-codemode-finished',\n text: `Background exec ${id} ${status}.\\n${result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n')}`,\n display: true,\n details: { id, status, result },\n };\n let warned = false;\n while (!ownerSignal.aborted) {\n let stopAdmission: (() => void) | undefined;\n try {\n const stopped = new Promise<void>((resolve) => {\n stopAdmission = resolve;\n ownerSignal.addEventListener('abort', stopAdmission, { once: true });\n if (ownerSignal.aborted) resolve();\n });\n await Promise.race([\n execution.session.admitMessage!(message, 'steer', `po-codemode-finished:${execution.sessionId}:${id}`),\n stopped,\n ]);\n break;\n } catch (error) {\n if (ownerSignal.aborted) break;\n if (!warned) {\n warned = true;\n await Promise.resolve()\n .then(() =>\n execution.client.notify({\n body: `Background exec completion admission failed; retrying: ${String(error)}`,\n level: 'warning',\n }),\n )\n .catch(() => undefined);\n }\n await sleep(250, ownerSignal).catch(() => undefined);\n } finally {\n if (stopAdmission) ownerSignal.removeEventListener('abort', stopAdmission);\n }\n }\n } finally {\n clearTimeout(timer);\n jobs.delete(id);\n onBackgroundChange?.();\n }\n })();\n return { ...text(JSON.stringify({ id })), details: { id } };\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_cancel, immediate cancellation acknowledgement\n const execCancel: CodemodeTools['execCancel'] = {\n name: 'exec_cancel',\n label: 'Cancel Exec',\n description: 'Cancel a background exec in this session. Its terminal message follows child cleanup.',\n parameters: ExecCancelToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(_toolCallId, parameters: ExecCancelToolParams, _signal, _onUpdate, execution) {\n const job = jobs.get(parameters.id);\n if (job && job.sessionId !== execution.sessionId)\n return text('Background exec belongs to another session.', true);\n if (job?.status === 'running') job.controller.abort(parameters.reason ? new Error(parameters.reason) : undefined);\n return text(JSON.stringify({ id: parameters.id, status: job?.status === 'running' ? 'stopping' : 'finished' }));\n },\n };\n\n const runApproved: CodemodeTools['runApproved'] = async (call, signal, sessionId) => {\n const name = call.operation.name;\n const [namespaceName, ...path] = name.split('.');\n const namespace = registry.list().find((entry) => entry.name === namespaceName);\n if (namespace === undefined || path.length === 0) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n // Only a member that still declares approval is replayed, so a changed namespace cannot widen what runs.\n if (namespace.approval?.[path.join('.')] === undefined)\n throw new Error(`'${name}' no longer asks for approval, so it was not replayed. Nothing ran.`);\n signal.throwIfAborted();\n // Old receipts contain one input, including when that input itself is an array.\n const args = call.argumentFormat === 'positional' ? call.input : [call.input];\n if (!Array.isArray(args)) throw new Error(`'${name}' has an invalid saved argument list. Nothing ran.`);\n const cleanups: (() => void | Promise<void>)[] = [];\n const bound = namespace.bind({\n source: '',\n sessionId,\n caller: 'main',\n toolCallId: `approval:${call.approvalId}`,\n interaction: 'interactive',\n signal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: () => undefined,\n emitImage: () => ({ emitted: false, warning: 'An approved call cannot show images.' }),\n });\n try {\n let receiver: unknown = bound;\n let member: unknown = bound;\n for (const key of path) {\n receiver = member;\n member = typeof member === 'object' && member !== null ? Reflect.get(member, key, member) : undefined;\n }\n if (typeof member !== 'function') throw new Error(`'${name}' is no longer active. Nothing ran.`);\n return await Reflect.apply(member, receiver, args);\n } finally {\n for (const cleanup of cleanups.reverse()) await cleanup();\n }\n };\n\n return {\n discover,\n exec,\n execBackground,\n execCancel,\n backgroundWork,\n runApproved,\n async dispose() {\n closing = true;\n unsubscribe();\n lifecycle.abort();\n await Promise.all([...jobs.values()].map((job) => job.done));\n },\n };\n}\n"],"mappings":"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"}
@@ -332,7 +332,7 @@ function sleep(ms, signal) {
332
332
  }
333
333
  /**
334
334
  * A view of `target` whose gated member paths ask before calling the original on its own receiver.
335
- * The view inherits from a shadow, so frozen targets keep their proxy invariants.
335
+ * An empty null-prototype shadow keeps frozen targets' proxy invariants and stays JSON-shaped.
336
336
  */
337
337
  function gateMembers(target, policies, prefix, gate) {
338
338
  if (typeof target !== "object" || target === null) throw new Error(`Code-mode member ${prefix} declares approval but is not an object.`);
@@ -353,7 +353,7 @@ function gateMembers(target, policies, prefix, gate) {
353
353
  }
354
354
  }
355
355
  for (const [key, children] of nested) overrides.set(key, gateMembers(Reflect.get(target, key, target), children, `${prefix}.${key}`, gate));
356
- return new Proxy(Object.create(target), {
356
+ return new Proxy(Object.create(null), {
357
357
  get: (_shadow, key) => overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target),
358
358
  has: (_shadow, key) => overrides.has(key) || Reflect.has(target, key),
359
359
  ownKeys: () => Reflect.ownKeys(target),
@@ -821,4 +821,4 @@ function createCodemodeTools({ registry, isolate, scripts, npm, signal: lifecycl
821
821
  //#endregion
822
822
  export { createCodemodeRegistry as n, createCodemodeTools as t };
823
823
 
824
- //# sourceMappingURL=codemodeTools-BFLlRq4y.mjs.map
824
+ //# sourceMappingURL=codemodeTools-D6sT2inu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemodeTools-D6sT2inu.mjs","names":[],"sources":["../src/services/codemodeRegistry/index.ts","../src/schemas/codemodeTools.ts","../src/services/codemodeTools/index.ts"],"sourcesContent":["import {\n assertCodemodeNamespaceName,\n type PoCodemodeNamespace,\n type PoCodemodeRegistration,\n type PoCodemodeScriptSource,\n type PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\n\nconst MEMBER_PATH = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*$/u;\n\n/** A gated member that cannot be gated must fail at registration, not run ungated. */\nfunction assertApproval(source: string, namespace: PoCodemodeNamespace): void {\n for (const [path, policy] of Object.entries(namespace.approval ?? {})) {\n const valid =\n MEMBER_PATH.test(path) &&\n (policy?.requirement === 'ask' || policy?.requirement === 'human') &&\n typeof policy.describe === 'function';\n if (!valid) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} declares an invalid approval for \"${path}\": ` +\n 'use a dotted member path with requirement \"ask\" or \"human\" and a describe function.',\n );\n }\n }\n}\n/** The session's namespaces and script folders, in registration order. One name per session. */\nexport function createCodemodeRegistry(options?: { isActive?: (source: string) => boolean }): PoCodemodeService {\n const entries = new Map<string, { source: string; namespace: PoCodemodeNamespace }>();\n const scripts = new Set<PoCodemodeScriptSource>();\n const listeners = new Set<() => void>();\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n return {\n register(source: string, namespace: PoCodemodeNamespace): PoCodemodeRegistration {\n assertCodemodeNamespaceName(namespace.name);\n assertApproval(source, namespace);\n const taken = entries.get(namespace.name);\n if (taken) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} is already registered by ${taken.source}.`,\n );\n }\n const entry = { source, namespace };\n entries.set(namespace.name, entry);\n notify();\n return {\n dispose: () => {\n if (entries.get(namespace.name) !== entry) return;\n entries.delete(namespace.name);\n notify();\n },\n };\n },\n // ponytail: selection gates new bindings only; check each bound call if running execs must be revoked too.\n list: () =>\n [...entries.values()]\n .filter((entry) => options?.isActive?.(entry.source) ?? true)\n .map((entry) => entry.namespace),\n registerScripts(_source: string, entry: PoCodemodeScriptSource): PoCodemodeRegistration {\n const owned = { domain: entry.domain, directory: entry.directory };\n scripts.add(owned);\n notify();\n return { dispose: () => void (scripts.delete(owned) && notify()) };\n },\n listScripts: () => [...scripts],\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import { Type, type Static } from 'typebox';\n\nexport const DiscoverToolSchema = Type.Object({\n namespace: Type.Optional(Type.String({ description: 'Show the full TypeScript declarations of one namespace.' })),\n query: Type.Optional(Type.String({ description: 'Find matching members across every namespace.' })),\n});\nexport type DiscoverToolParams = Static<typeof DiscoverToolSchema>;\n\nexport const ExecToolSchema = Type.Object({\n code: Type.String({\n description:\n 'TypeScript body of an async function. Top-level await and return work. The returned value, console output and image() calls come back.',\n }),\n timeoutMs: Type.Optional(\n Type.Integer({ minimum: 1_000, maximum: 120_000, description: 'Deadline in milliseconds. Default 30000.' }),\n ),\n});\nexport type ExecToolParams = Static<typeof ExecToolSchema>;\n\nexport const ExecBackgroundToolSchema = Type.Object({\n code: ExecToolSchema.properties.code,\n timeoutMs: Type.Optional(\n Type.Integer({\n minimum: 1_000,\n maximum: 7_200_000,\n description: 'Deadline in milliseconds. Default 1800000 (30 minutes), maximum 2 hours.',\n }),\n ),\n});\nexport type ExecBackgroundToolParams = Static<typeof ExecBackgroundToolSchema>;\n\nexport const ExecCancelToolSchema = Type.Object({\n id: Type.String({ minLength: 1, description: 'The background exec ID returned by exec_background.' }),\n reason: Type.Optional(Type.String({ maxLength: 256 })),\n});\nexport type ExecCancelToolParams = Static<typeof ExecCancelToolSchema>;\n","import {\n ApprovalPendingError,\n gateApproval,\n isUnattended,\n type PoApprovalPolicy,\n type PoApprovalService,\n type PoApprovedCall,\n} from '@agimon-ai/po-core/approval';\nimport type { BackgroundWorkProvider } from '@agimon-ai/po-core/backgroundWork';\nimport type {\n PoCodemodeCall,\n PoCodemodeNamespace,\n PoCodemodeRun,\n PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\nimport {\n invalidImageReason,\n type PoHeadlessContent,\n type PoHeadlessExecutionContext,\n type PoHeadlessTool,\n type PoHeadlessToolResult,\n} from '@agimon-ai/po-core/headless';\nimport type { PoIsolateResult, PoIsolateService, PoNpm } from '@agimon-ai/po-core/platform';\n\nimport {\n DiscoverToolSchema,\n ExecToolSchema,\n ExecBackgroundToolSchema,\n ExecCancelToolSchema,\n type DiscoverToolParams,\n type ExecToolParams,\n type ExecBackgroundToolParams,\n type ExecCancelToolParams,\n} from '../../schemas/codemodeTools';\nimport type { CodemodeScriptsPort } from '../codemodeScripts/type';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst MIN_TIMEOUT_MS = 1_000;\nconst BACKGROUND_DEFAULT_TIMEOUT_MS = 30 * 60_000;\nconst BACKGROUND_MAX_TIMEOUT_MS = 2 * 60 * 60_000;\nconst MAX_LOG_CHARS = 10_000;\nconst MAX_VALUE_CHARS = 64 * 1024;\nconst MAX_DECLARATION_CHARS = 24_000;\nconst MAX_QUERY_LINES = 40;\n// The main agent and its subagents share one exec tool, so several runs can overlap.\nconst MAX_CONCURRENT_RUNS = 8;\n// Recorded calls ride the result's details into the transcript, so they are few and small.\nconst MAX_RECORDED_CALLS = 50;\nconst MAX_RECORDED_TEXT = 8_000;\nconst MAX_RECORDED_JSON = 16_000;\nconst MAX_LISTED_SCRIPTS = 20;\nconst MAX_IMAGES = 4;\nconst MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_IMAGE_MIME = 'image/png';\nconst MEMBER_LINE = /^\\s{2}(?:readonly\\s+)?(\\w+)\\s*[(?:<]/u;\n\nconst GLOBALS_HELP =\n 'Globals: console.log/info/warn/error, image(data, mimeType?) to return a screenshot, sleep(ms). ' +\n 'Return a value with `return`.';\nconst SCRIPTS_HELP =\n 'Every exec run is saved. Call a saved script with `await (await import(specifier))(args)`; ' +\n 'inside it, `args` is the argument and its `return` is the result.';\n\nexport interface CodemodeToolsOptions {\n readonly registry: PoCodemodeService;\n /** Resolved per call, so a host that binds the isolate late still works. */\n readonly isolate: () => PoIsolateService | undefined;\n /** Saves every exec body and backs `import()`; without it nothing is saved or importable. */\n readonly scripts?: CodemodeScriptsPort;\n readonly npm?: () => PoNpm | undefined;\n readonly signal?: AbortSignal;\n readonly onBackgroundChange?: () => void;\n /** The session's `po/approval`; without it `ask` members run and `human` members refuse. */\n readonly approval?: () => PoApprovalService | undefined;\n}\n\nexport interface CodemodeTools {\n readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;\n readonly exec: PoHeadlessTool<typeof ExecToolSchema>;\n readonly execBackground: PoHeadlessTool<typeof ExecBackgroundToolSchema>;\n readonly execCancel: PoHeadlessTool<typeof ExecCancelToolSchema>;\n readonly backgroundWork: BackgroundWorkProvider;\n /** Replays an approved gated member, ungated, in `sessionId`; the `codemode` approval executor. */\n runApproved(call: PoApprovedCall, signal: AbortSignal, sessionId: string): Promise<unknown>;\n dispose(): Promise<void>;\n}\n\ninterface BackgroundExec {\n readonly id: string;\n readonly sessionId: string;\n readonly controller: AbortController;\n status: 'running' | 'reporting';\n done: Promise<void>;\n}\n\nfunction text(value: string, isError = false): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: value }], ...(isError ? { isError: true } : {}) };\n}\n\nfunction truncate(value: string, limit: number): string {\n return value.length <= limit ? value : `${value.slice(0, limit)}\\n[truncated ${value.length - limit} chars]`;\n}\n\nfunction format(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n const json = JSON.stringify(value, null, 2);\n if (json !== undefined) return json;\n } catch {\n // Cyclic or exotic values fall back to their string form.\n }\n return String(value);\n}\n\nfunction memberNames(namespace: PoCodemodeNamespace): string[] {\n const names = new Set<string>();\n const declaration =\n new RegExp(`^declare const ${namespace.name}: \\\\{([\\\\s\\\\S]*?)^\\\\};`, 'mu').exec(namespace.declarations)?.[1] ?? '';\n for (const line of declaration.split('\\n')) {\n const name = MEMBER_LINE.exec(line)?.[1];\n if (name) names.add(name);\n }\n return [...names];\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000));\n }\n return btoa(binary);\n}\n\n/** Collects what a script prints and the images it returns, within the output caps. */\nfunction createOutput() {\n const lines: string[] = [];\n const images: { data: string; mimeType: string }[] = [];\n let imageBytes = 0;\n const log =\n (level: string) =>\n (...args: unknown[]) => {\n const line = args.map(format).join(' ');\n lines.push(level === 'log' || level === 'info' ? line : `[${level}] ${line}`);\n };\n const note = (message: string): void => void lines.push(`[note] ${message}`);\n /** Why an image cannot join this run's output, checked before anything is counted, so a refusal costs nothing. */\n const refusal = (data: string, mime: string): Error | undefined => {\n if (images.length >= MAX_IMAGES) return new RangeError(`An exec run returns at most ${MAX_IMAGES} images.`);\n if (imageBytes + Math.ceil((data.length * 3) / 4) > MAX_IMAGE_BYTES)\n return new RangeError('Images from one exec run exceed 5 MB.');\n const invalid = invalidImageReason(data, mime);\n return invalid === undefined ? undefined : new TypeError(`image() rejected an undecodable image: ${invalid}.`);\n };\n const push = (data: string, mimeType: string): void => {\n imageBytes += Math.ceil((data.length * 3) / 4);\n images.push({ data, mimeType });\n };\n const addImage = (input: unknown, mimeType?: unknown): void => {\n if (typeof input === 'object' && input !== null && 'images' in input && Array.isArray(input.images)) {\n for (const image of input.images) addImage(image);\n return;\n }\n let data: string;\n let mime = typeof mimeType === 'string' ? mimeType : DEFAULT_IMAGE_MIME;\n if (typeof input === 'string')\n data = input.replace(/^data:([^;]+);base64,/u, (_match, type: string) => ((mime = type), ''));\n else if (ArrayBuffer.isView(input))\n data = bytesToBase64(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n else if (typeof input === 'object' && input !== null && 'data' in input && typeof input.data === 'string') {\n data = input.data;\n if ('mimeType' in input && typeof input.mimeType === 'string') mime = input.mimeType;\n } else throw new TypeError('image() takes base64 text, bytes, or { data, mimeType }.');\n const error = refusal(data, mime);\n if (error !== undefined) throw error;\n push(data, mime);\n };\n /** A namespace's image for the model: the same limits as image(), but a refusal is a note and a warning, not a throw. */\n const emitImage = ({ data, mimeType }: { readonly data: string; readonly mimeType: string }) => {\n const error = refusal(data, mimeType);\n if (error === undefined) {\n push(data, mimeType);\n return { emitted: true } as const;\n }\n const warning = `Image not shown to the model: ${error.message}`;\n note(warning);\n return { emitted: false, warning } as const;\n };\n const console = { log: log('log'), info: log('info'), warn: log('warn'), error: log('error'), debug: log('debug') };\n return { console, note, addImage, emitImage, lines, images };\n}\n\n/** The session's active domains; every registered domain when the host reports none. */\nfunction activeDomains(execution: PoHeadlessExecutionContext | undefined): readonly string[] | undefined {\n return execution?.selection?.domains;\n}\n\n/** A JSON copy of `value`, or undefined when it does not serialise or is larger than `limit` characters. */\nfunction bounded<T>(value: T, limit: number): T | undefined {\n try {\n const json = JSON.stringify(value);\n return json !== undefined && json.length <= limit ? (JSON.parse(json) as T) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** What the recorded pictures of one run may still take, under the same limits as image(). */\ninterface ImageBudget {\n count: number;\n bytes: number;\n}\n\n/**\n * The call as it is kept in the transcript: text clipped, pictures kept while the run's\n * budget lasts (a note says when one was not), args and details dropped when large.\n */\nfunction recordedCall(call: PoCodemodeCall, budget: ImageBudget): PoCodemodeCall {\n const content = (call.result?.content ?? []).flatMap((block): PoHeadlessContent[] => {\n const { type, text, data, mimeType } = (block ?? {}) as Record<string, unknown>;\n if (type === 'text' && typeof text === 'string') return [{ type: 'text', text: truncate(text, MAX_RECORDED_TEXT) }];\n if (type !== 'image' || typeof data !== 'string' || typeof mimeType !== 'string') return [];\n const bytes = Math.ceil((data.length * 3) / 4);\n if (budget.count >= MAX_IMAGES || budget.bytes + bytes > MAX_IMAGE_BYTES) {\n return [{ type: 'text', text: `[picture not kept: one exec run keeps at most ${MAX_IMAGES} pictures, 5 MB]` }];\n }\n budget.count += 1;\n budget.bytes += bytes;\n return [{ type: 'image', data, mimeType }];\n });\n const details = bounded(call.result?.details, MAX_RECORDED_JSON);\n if (call.result?.details !== undefined && details === undefined)\n content.push({ type: 'text', text: `[details not kept: larger than ${MAX_RECORDED_JSON} characters]` });\n return {\n name: call.name,\n tool: call.tool,\n args: bounded(call.args, MAX_RECORDED_JSON) ?? {},\n ok: call.ok,\n ms: Math.max(0, Math.round(call.ms)),\n ...(call.error === undefined ? {} : { error: truncate(call.error, MAX_RECORDED_TEXT) }),\n ...(call.result === undefined ? {} : { result: { content, ...(details === undefined ? {} : { details }) } }),\n };\n}\n\n/** A gated member call recorded for the person's approval during one exec run. */\ninterface PendingApproval {\n readonly approvalId: string;\n readonly name: string;\n}\n\nfunction toResult(\n result: PoIsolateResult,\n output: ReturnType<typeof createOutput>,\n saved: string | undefined,\n calls: readonly PoCodemodeCall[],\n approvals: readonly PendingApproval[] = [],\n): PoHeadlessToolResult {\n const pending =\n !result.ok && result.error.kind === 'error' && result.error.name === 'ApprovalPendingError' && approvals.length > 0;\n const content: PoHeadlessContent[] = [];\n if (output.lines.length > 0) content.push({ type: 'text', text: truncate(output.lines.join('\\n'), MAX_LOG_CHARS) });\n if (result.ok) {\n if (ArrayBuffer.isView(result.value)) {\n content.push({ type: 'text', text: 'The script returned bytes. Pass them to image(data, mimeType) instead.' });\n } else if (result.value !== undefined) {\n content.push({ type: 'text', text: truncate(format(result.value), MAX_VALUE_CHARS) });\n }\n } else if (!pending) {\n const { kind, name, message } = result.error;\n const hint = kind === 'timeout' ? ' Raise timeoutMs or split the work into smaller exec calls.' : '';\n content.push({ type: 'text', text: `${name}: ${message}${hint}` });\n }\n if (approvals.length > 0)\n content.push({\n type: 'text',\n text:\n `Waiting for the person's approval: ${approvals.map((entry) => `${entry.name} (approval ${entry.approvalId})`).join(', ')}. ` +\n 'Each runs once approved, and its outcome arrives as a message. Keep working meanwhile.',\n });\n if (content.length === 0) content.push({ type: 'text', text: '(no return value)' });\n if (saved !== undefined) content.push({ type: 'text', text: saved });\n for (const image of output.images) content.push({ type: 'image', data: image.data, mimeType: image.mimeType });\n const details = {\n ...(calls.length > 0 ? { calls } : {}),\n ...(approvals.length > 0 ? { approvals } : {}),\n };\n return {\n content: content.map((part, index) =>\n part.type === 'text' && index > 0 ? { ...part, text: `\\n${part.text}` } : part,\n ),\n ...(Object.keys(details).length > 0 ? { details } : {}),\n ...(result.ok || pending ? {} : { isError: true }),\n };\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) return reject(new Error('Run ended.'));\n const stop = () => {\n clearTimeout(timer);\n reject(new Error('Run ended.'));\n };\n const timer = setTimeout(\n () => {\n signal.removeEventListener('abort', stop);\n resolve();\n },\n Math.max(0, ms),\n );\n signal.addEventListener('abort', stop, { once: true });\n });\n}\n\ntype MemberGate = (\n name: string,\n policy: PoApprovalPolicy,\n call: (args: unknown[]) => unknown,\n) => (...args: unknown[]) => Promise<unknown>;\n\n/**\n * A view of `target` whose gated member paths ask before calling the original on its own receiver.\n * An empty null-prototype shadow keeps frozen targets' proxy invariants and stays JSON-shaped.\n */\nfunction gateMembers(\n target: unknown,\n policies: Readonly<Record<string, PoApprovalPolicy>>,\n prefix: string,\n gate: MemberGate,\n): object {\n if (typeof target !== 'object' || target === null) {\n throw new Error(`Code-mode member ${prefix} declares approval but is not an object.`);\n }\n const overrides = new Map<PropertyKey, unknown>();\n const nested = new Map<string, Record<string, PoApprovalPolicy>>();\n for (const [path, policy] of Object.entries(policies)) {\n const dot = path.indexOf('.');\n if (dot === -1) {\n const original: unknown = Reflect.get(target, path, target);\n if (typeof original !== 'function') {\n throw new Error(`Code-mode member ${prefix}.${path} declares approval but is not a function.`);\n }\n overrides.set(\n path,\n gate(`${prefix}.${path}`, policy, (args) => Reflect.apply(original, target, args)),\n );\n } else {\n const head = path.slice(0, dot);\n nested.set(head, { ...nested.get(head), [path.slice(dot + 1)]: policy });\n }\n }\n for (const [key, children] of nested) {\n overrides.set(key, gateMembers(Reflect.get(target, key, target), children, `${prefix}.${key}`, gate));\n }\n // ponytail: ungated methods run with the view as `this`; a class using #private fields breaks, bind such methods if one appears.\n return new Proxy(Object.create(null) as object, {\n get: (_shadow, key) => (overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target)),\n has: (_shadow, key) => overrides.has(key) || Reflect.has(target, key),\n ownKeys: () => Reflect.ownKeys(target),\n getOwnPropertyDescriptor: (_shadow, key) => {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, key);\n if (!descriptor) return undefined;\n return {\n configurable: true,\n enumerable: descriptor.enumerable ?? false,\n writable: false,\n value: overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target),\n };\n },\n set: () => false,\n defineProperty: () => false,\n deleteProperty: () => false,\n });\n}\n\n/** `name (asks first)` for each gated top-level member, so discover shows which calls wait for the person. */\nfunction gatedLabel(namespace: PoCodemodeNamespace, member: string): string {\n const policies = Object.entries(namespace.approval ?? {}).filter(\n ([path]) => path === member || path.startsWith(`${member}.`),\n );\n if (policies.length === 0) return member;\n return policies.some(([, policy]) => policy.requirement === 'human')\n ? `${member} (needs the person)`\n : `${member} (asks first)`;\n}\n/** `discover` and `exec` for one session, over the namespaces its packages contributed. */\nexport function createCodemodeTools({\n registry,\n isolate,\n scripts,\n npm,\n signal: lifecycleSignal,\n onBackgroundChange,\n approval,\n}: CodemodeToolsOptions): CodemodeTools {\n let running = 0;\n let closing = false;\n const lifecycle = new AbortController();\n const ownerSignal = lifecycleSignal ? AbortSignal.any([lifecycle.signal, lifecycleSignal]) : lifecycle.signal;\n const jobs = new Map<string, BackgroundExec>();\n const backgroundWork: BackgroundWorkProvider = {\n provider: 'po-codemode-background',\n listActiveWork: () =>\n [...jobs.values()].map(({ id, sessionId, status }) => ({ id, sessionId, status, label: 'Background exec' })),\n };\n\n const visible = (service: PoIsolateService): PoCodemodeNamespace[] =>\n registry.list().filter((namespace) => service.liveObjects || namespace.portable === true);\n\n // The exec description is read synchronously, so domain script names are cached on registry changes.\n // ponytail: lists every registered folder, not the turn's active domains; filter here if selection changes mid-session.\n let domainScripts: string[] = [];\n let refreshes = 0;\n const refreshScripts = (): void => {\n if (!scripts) return;\n const turn = ++refreshes;\n scripts.list().then(\n (entries) => {\n if (turn !== refreshes) return;\n domainScripts = entries.flatMap((entry) => (entry.specifier.startsWith('session:') ? [] : [entry.specifier]));\n },\n // A failed listing keeps the last names; discover reports the folder error when called.\n () => undefined,\n );\n };\n refreshScripts();\n const unsubscribe = registry.subscribe(refreshScripts);\n const domainScriptsHelp = (): string[] => {\n if (domainScripts.length === 0) return [];\n const shown = domainScripts.slice(0, MAX_LISTED_SCRIPTS).join(', ');\n const more =\n domainScripts.length > MAX_LISTED_SCRIPTS ? ` and ${domainScripts.length - MAX_LISTED_SCRIPTS} more` : '';\n return [`Domain scripts: ${shown}${more}. Use discover({ query }) to see what one does before importing it.`];\n };\n\n const executeCode = async (\n parameters: ExecToolParams,\n signal: AbortSignal | undefined,\n execution: PoHeadlessExecutionContext,\n deadlineMs: number,\n toolCallId: string,\n background = false,\n ): Promise<PoHeadlessToolResult> => {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n running += 1;\n const controller = new AbortController();\n const runSignal = AbortSignal.any([ownerSignal, controller.signal, ...(signal ? [signal] : [])]);\n const cleanups: (() => void | Promise<void>)[] = [];\n const calls: PoCodemodeCall[] = [];\n const imageBudget: ImageBudget = { count: 0, bytes: 0 };\n const output = createOutput();\n const presence = execution.interaction === 'unattended' ? 'unattended' : execution.sessionContext?.interaction;\n const interaction = isUnattended({\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n background,\n ...(presence === undefined ? {} : { interaction: presence }),\n })\n ? 'unattended'\n : 'interactive';\n const run: PoCodemodeRun = {\n source: parameters.code,\n sessionId: execution.sessionId,\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n toolCallId,\n ...(background ? { background } : {}),\n interaction,\n signal: runSignal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: (call) => {\n if (calls.length < MAX_RECORDED_CALLS) calls.push(recordedCall(call, imageBudget));\n },\n emitImage: (image) =>\n runSignal.aborted ? { emitted: false, warning: 'The exec run has ended.' } : output.emitImage(image),\n };\n const approvals: PendingApproval[] = [];\n // A gated member never pauses the script: a pending request or a refusal is an error the script can catch.\n const gateFor =\n (namespace: PoCodemodeNamespace): MemberGate =>\n (name, policy, call) =>\n async (...args) => {\n const gate = await gateApproval({\n policy,\n operation: { kind: 'codemode', name },\n input: args[0],\n arguments: args,\n argumentFormat: 'positional',\n sessionId: run.sessionId,\n toolCallId,\n ...(run.caller === undefined ? {} : { caller: run.caller }),\n background,\n interaction,\n service: approval?.(),\n signal: runSignal,\n });\n if (!gate.ok && gate.pending === true) {\n approvals.push({ approvalId: gate.approvalId, name });\n throw new ApprovalPendingError(gate.approvalId, gate.reason);\n }\n if (!gate.ok) throw new Error(gate.reason);\n if (!registry.list().includes(namespace)) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n if (runSignal.aborted) throw new Error(`'${name}' was cancelled. Nothing ran.`);\n return call(args);\n };\n let saved: string | undefined;\n let result: PoIsolateResult = { ok: true, value: undefined };\n try {\n runSignal.throwIfAborted();\n try {\n const file = await scripts?.save(parameters.code);\n if (file) saved = `Saved as ${file.specifier} (${file.path})`;\n } catch (error) {\n output.note(`Could not save the script: ${error instanceof Error ? error.message : String(error)}`);\n }\n runSignal.throwIfAborted();\n const globals: Record<string, unknown> = {\n console: output.console,\n image: output.addImage,\n sleep: (ms: number) => sleep(ms, runSignal),\n };\n const deny = new Set<string>();\n for (const namespace of visible(service)) {\n const bound = namespace.bind(run);\n if (namespace.approval === undefined || Object.keys(namespace.approval).length === 0) {\n globals[namespace.name] = bound;\n } else {\n try {\n globals[namespace.name] = gateMembers(bound, namespace.approval, namespace.name, gateFor(namespace));\n } catch (error) {\n // Fail closed: a namespace whose gate cannot be applied is left out of this run.\n output.note(`${namespace.name} is unavailable: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n }\n for (const member of namespace.deny ?? []) deny.add(member);\n }\n result = await service.run({\n source: parameters.code,\n globals,\n deadlineMs,\n signal: runSignal,\n deny: [...deny],\n onDiagnostic: output.note,\n resolveImport: async (specifier) => {\n if (specifier.startsWith('node:')) {\n throw new Error(\n `Code mode is sandboxed, so \"${specifier}\" cannot be imported. Use the shell namespace or an npm: import.`,\n );\n }\n if (!specifier.startsWith('npm:')) {\n if (!scripts) throw new Error('Script imports are not available on this host.');\n return scripts.resolve(specifier, activeDomains(execution));\n }\n const loader = npm?.();\n if (!loader) throw new Error('npm imports are not available on this host.');\n run.signal.throwIfAborted();\n const started = Date.now();\n try {\n const exports = await loader.import(specifier, { sessionId: run.sessionId, signal: run.signal });\n run.signal.throwIfAborted();\n run.record?.({ name: 'npm.import', tool: 'npm', args: { specifier }, ms: Date.now() - started, ok: true });\n return { kind: 'module', id: specifier, exports };\n } catch (error) {\n run.record?.({\n name: 'npm.import',\n tool: 'npm',\n args: { specifier },\n ms: Date.now() - started,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n },\n });\n } catch (error) {\n result = {\n ok: false,\n error: {\n kind: 'error',\n name: 'Error',\n message: `Code mode could not run the script: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n } finally {\n controller.abort();\n for (const cleanup of cleanups.reverse()) {\n await Promise.resolve()\n .then(cleanup)\n .catch((error: unknown) => {\n const message = `Code mode cleanup failed: ${String(error)}`;\n output.note(message);\n result = { ok: false, error: { kind: 'error', name: 'CleanupError', message } };\n });\n }\n running -= 1;\n }\n return toResult(result, output, saved, calls, approvals);\n };\n\n // ponytail: the cockpit's generic tool item renders both for now; add a poWeb renderer for exec code and images when it earns one.\n // web-plugin-tool-renderers: ignore discover, plain text result\n const discover: CodemodeTools['discover'] = {\n name: 'discover',\n label: 'Discover',\n description:\n 'List the code-mode namespaces and reusable scripts you can use from `exec`, show one namespace in full, ' +\n 'or search members and scripts. ' +\n 'Not required before exec: its description already names the namespaces.',\n parameters: DiscoverToolSchema,\n promptSnippet: 'List code-mode namespaces and their TypeScript declarations',\n executionMode: 'parallel',\n async execute(_toolCallId, parameters: DiscoverToolParams, _signal, _onUpdate, execution) {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n const namespaces = visible(service);\n // Imports need a host with live objects; the edge saves scripts but cannot chain them.\n const listed = scripts && service.liveObjects ? await scripts.list(activeDomains(execution)) : [];\n if (parameters.namespace !== undefined) {\n const found = namespaces.find((namespace) => namespace.name === parameters.namespace);\n if (!found) {\n const names = namespaces.map((namespace) => namespace.name).join(', ') || 'none';\n return text(`Unknown namespace \"${parameters.namespace}\". Registered: ${names}.`, true);\n }\n return text(truncate(found.declarations, MAX_DECLARATION_CHARS));\n }\n if (parameters.query !== undefined) {\n const needle = parameters.query.toLowerCase();\n const hits: string[] = [];\n for (const namespace of namespaces) {\n const lines = namespace.declarations.split('\\n');\n lines.forEach((line, index) => {\n if (!line.toLowerCase().includes(needle) || hits.length >= MAX_QUERY_LINES) return;\n const doc = lines[index - 1]?.trim().startsWith('/**') ? `${lines[index - 1]?.trim()} ` : '';\n hits.push(`${namespace.name}: ${doc}${line.trim()}`);\n });\n }\n for (const script of listed) {\n if (hits.length >= MAX_QUERY_LINES) break;\n if (`${script.specifier} ${script.description}`.toLowerCase().includes(needle)) {\n hits.push(`script ${script.specifier}: ${script.description}`);\n }\n }\n return text(hits.length > 0 ? hits.join('\\n') : `No members or scripts match \"${parameters.query}\".`);\n }\n const sections: string[] = [];\n if (namespaces.length === 0) sections.push('No namespaces are registered in this session.');\n for (const namespace of namespaces) {\n const members = memberNames(namespace).map((member) => gatedLabel(namespace, member));\n sections.push(`- ${namespace.name}: ${namespace.summary}\\n members: ${members.join(', ')}`);\n }\n sections.push(GLOBALS_HELP);\n if (!service.liveObjects) sections.push('This host runs plain JavaScript with JSON-only functions.');\n if (listed.length > 0) {\n sections.push(`Scripts. ${SCRIPTS_HELP}`);\n for (const script of listed.slice(0, MAX_LISTED_SCRIPTS)) {\n sections.push(`- ${script.specifier}${script.description ? `: ${script.description}` : ''}`);\n }\n if (listed.length > MAX_LISTED_SCRIPTS) {\n sections.push(`...and ${listed.length - MAX_LISTED_SCRIPTS} more; use discover({ query }) to search.`);\n }\n }\n if (namespaces.length > 0) sections.push('Call discover({ namespace }) for full types.');\n return text(sections.join('\\n'));\n },\n };\n\n // web-plugin-tool-renderers: ignore exec, generic item until a code and image renderer exists\n const exec: CodemodeTools['exec'] = {\n name: 'exec',\n label: 'Exec',\n get description(): string {\n const service = isolate();\n const namespaces = service ? visible(service) : [];\n const listed = namespaces.map((namespace) => `- ${namespace.name}: ${namespace.summary}`).join('\\n');\n return [\n 'Run a TypeScript script inside the Po server with live objects from the namespaces below in scope.',\n 'It runs with full server trust, like bash. Keep each call to one logical step.',\n listed || '(no namespaces registered yet; call discover to check)',\n GLOBALS_HELP,\n ...(scripts && service?.liveObjects\n ? [`${SCRIPTS_HELP} discover lists saved and domain scripts.`, ...domainScriptsHelp()]\n : []),\n 'Use discover({ namespace }) for full signatures when needed.',\n ].join('\\n');\n },\n parameters: ExecToolSchema,\n promptSnippet: 'Run a TypeScript script against live Po objects (browser and other namespaces)',\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecToolParams, signal, _onUpdate, execution) {\n return executeCode(\n parameters,\n signal,\n execution,\n Math.min(MAX_TIMEOUT_MS, Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? DEFAULT_TIMEOUT_MS)),\n toolCallId,\n );\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_background, immediate job identity only\n const execBackground: CodemodeTools['execBackground'] = {\n name: 'exec_background',\n label: 'Background Exec',\n description:\n 'Run a long-lived Node code-mode script. Returns its ID immediately; one completion message arrives after execution and cleanup. End the turn rather than polling. Full server trust, like exec.',\n parameters: ExecBackgroundToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecBackgroundToolParams, signal, _onUpdate, execution) {\n if (signal?.aborted) return text('Background exec launch was aborted.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (!isolate()?.liveObjects) return text('Background exec requires a Node host with live objects.', true);\n if (!execution.session?.admitMessage)\n return text('This session cannot admit background exec completion messages.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n const deadlineMs = Math.min(\n BACKGROUND_MAX_TIMEOUT_MS,\n Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? BACKGROUND_DEFAULT_TIMEOUT_MS),\n );\n const id = crypto.randomUUID();\n const controller = new AbortController();\n const job: BackgroundExec = {\n id,\n sessionId: execution.sessionId,\n controller,\n status: 'running',\n done: Promise.resolve(),\n };\n jobs.set(id, job);\n onBackgroundChange?.();\n job.done = (async () => {\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, deadlineMs);\n try {\n const result = await executeCode(parameters, controller.signal, execution, deadlineMs, toolCallId, true);\n clearTimeout(timer);\n job.status = 'reporting';\n onBackgroundChange?.();\n const status = timedOut\n ? 'timed-out'\n : controller.signal.aborted\n ? 'stopped'\n : result.isError\n ? 'failed'\n : 'completed';\n const message = {\n type: 'po-codemode-finished',\n text: `Background exec ${id} ${status}.\\n${result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n')}`,\n display: true,\n details: { id, status, result },\n };\n let warned = false;\n while (!ownerSignal.aborted) {\n let stopAdmission: (() => void) | undefined;\n try {\n const stopped = new Promise<void>((resolve) => {\n stopAdmission = resolve;\n ownerSignal.addEventListener('abort', stopAdmission, { once: true });\n if (ownerSignal.aborted) resolve();\n });\n await Promise.race([\n execution.session.admitMessage!(message, 'steer', `po-codemode-finished:${execution.sessionId}:${id}`),\n stopped,\n ]);\n break;\n } catch (error) {\n if (ownerSignal.aborted) break;\n if (!warned) {\n warned = true;\n await Promise.resolve()\n .then(() =>\n execution.client.notify({\n body: `Background exec completion admission failed; retrying: ${String(error)}`,\n level: 'warning',\n }),\n )\n .catch(() => undefined);\n }\n await sleep(250, ownerSignal).catch(() => undefined);\n } finally {\n if (stopAdmission) ownerSignal.removeEventListener('abort', stopAdmission);\n }\n }\n } finally {\n clearTimeout(timer);\n jobs.delete(id);\n onBackgroundChange?.();\n }\n })();\n return { ...text(JSON.stringify({ id })), details: { id } };\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_cancel, immediate cancellation acknowledgement\n const execCancel: CodemodeTools['execCancel'] = {\n name: 'exec_cancel',\n label: 'Cancel Exec',\n description: 'Cancel a background exec in this session. Its terminal message follows child cleanup.',\n parameters: ExecCancelToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(_toolCallId, parameters: ExecCancelToolParams, _signal, _onUpdate, execution) {\n const job = jobs.get(parameters.id);\n if (job && job.sessionId !== execution.sessionId)\n return text('Background exec belongs to another session.', true);\n if (job?.status === 'running') job.controller.abort(parameters.reason ? new Error(parameters.reason) : undefined);\n return text(JSON.stringify({ id: parameters.id, status: job?.status === 'running' ? 'stopping' : 'finished' }));\n },\n };\n\n const runApproved: CodemodeTools['runApproved'] = async (call, signal, sessionId) => {\n const name = call.operation.name;\n const [namespaceName, ...path] = name.split('.');\n const namespace = registry.list().find((entry) => entry.name === namespaceName);\n if (namespace === undefined || path.length === 0) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n // Only a member that still declares approval is replayed, so a changed namespace cannot widen what runs.\n if (namespace.approval?.[path.join('.')] === undefined)\n throw new Error(`'${name}' no longer asks for approval, so it was not replayed. Nothing ran.`);\n signal.throwIfAborted();\n // Old receipts contain one input, including when that input itself is an array.\n const args = call.argumentFormat === 'positional' ? call.input : [call.input];\n if (!Array.isArray(args)) throw new Error(`'${name}' has an invalid saved argument list. Nothing ran.`);\n const cleanups: (() => void | Promise<void>)[] = [];\n const bound = namespace.bind({\n source: '',\n sessionId,\n caller: 'main',\n toolCallId: `approval:${call.approvalId}`,\n interaction: 'interactive',\n signal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: () => undefined,\n emitImage: () => ({ emitted: false, warning: 'An approved call cannot show images.' }),\n });\n try {\n let receiver: unknown = bound;\n let member: unknown = bound;\n for (const key of path) {\n receiver = member;\n member = typeof member === 'object' && member !== null ? Reflect.get(member, key, member) : undefined;\n }\n if (typeof member !== 'function') throw new Error(`'${name}' is no longer active. Nothing ran.`);\n return await Reflect.apply(member, receiver, args);\n } finally {\n for (const cleanup of cleanups.reverse()) await cleanup();\n }\n };\n\n return {\n discover,\n exec,\n execBackground,\n execCancel,\n backgroundWork,\n runApproved,\n async dispose() {\n closing = true;\n unsubscribe();\n lifecycle.abort();\n await Promise.all([...jobs.values()].map((job) => job.done));\n },\n };\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_codemodeTools = require("../codemodeTools-DrdEw_bA.cjs");
5
+ const require_codemodeTools = require("../codemodeTools-CkXEL8R5.cjs");
6
6
  let _agimon_ai_po_core_codemode = require("@agimon-ai/po-core/codemode");
7
7
  let _agimon_ai_po_core_approval = require("@agimon-ai/po-core/approval");
8
8
  let _agimon_ai_po_core_headless = require("@agimon-ai/po-core/headless");
@@ -1,4 +1,4 @@
1
- import { n as createCodemodeRegistry, t as createCodemodeTools } from "../codemodeTools-BFLlRq4y.mjs";
1
+ import { n as createCodemodeRegistry, t as createCodemodeTools } from "../codemodeTools-D6sT2inu.mjs";
2
2
  import { PO_CODEMODE_CONTRACT, PO_CODEMODE_SERVICE } from "@agimon-ai/po-core/codemode";
3
3
  import { PO_APPROVAL_SERVICE, readPoApproval } from "@agimon-ai/po-core/approval";
4
4
  import { readPoHeadlessHost } from "@agimon-ai/po-core/headless";
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_codemodeTools = require("./codemodeTools-DrdEw_bA.cjs");
2
+ const require_codemodeTools = require("./codemodeTools-CkXEL8R5.cjs");
3
3
  exports.createCodemodeRegistry = require_codemodeTools.createCodemodeRegistry;
4
4
  exports.createCodemodeTools = require_codemodeTools.createCodemodeTools;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- export { n as createCodemodeRegistry, t as createCodemodeTools } from "./codemodeTools-BFLlRq4y.mjs";
1
+ export { n as createCodemodeRegistry, t as createCodemodeTools } from "./codemodeTools-D6sT2inu.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-codemode",
3
- "version": "0.0.1-alpha.32",
3
+ "version": "0.0.1-alpha.34",
4
4
  "description": "Code mode for Po sessions: discover and exec over namespaces other packages contribute",
5
5
  "keywords": [
6
6
  "ai",
@@ -55,18 +55,18 @@
55
55
  "access": "public"
56
56
  },
57
57
  "dependencies": {
58
- "@agimon-ai/po-config": "0.0.0-alpha.59",
59
- "@agimon-ai/po-core": "0.0.0-alpha.59",
60
- "@agimon-ai/po-web-components": "0.0.0-alpha.59",
58
+ "@agimon-ai/po-config": "0.0.0-alpha.61",
59
+ "@agimon-ai/po-core": "0.0.0-alpha.61",
60
+ "@agimon-ai/po-web-components": "0.0.0-alpha.61",
61
61
  "@deepseek-ai/cordis": "4.0.5",
62
62
  "react": "19.3.1",
63
63
  "typebox": "1.4.2"
64
64
  },
65
65
  "devDependencies": {
66
- "@agimon-ai/po-build": "0.0.0-alpha.59",
67
- "@agimon-ai/po-native-components": "0.0.0-alpha.59",
68
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.59",
69
- "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.59",
66
+ "@agimon-ai/po-build": "0.0.0-alpha.61",
67
+ "@agimon-ai/po-native-components": "0.0.0-alpha.61",
68
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.61",
69
+ "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.61",
70
70
  "@earendil-works/pi-coding-agent": "1.4.0",
71
71
  "@types/node": "26.6.5",
72
72
  "@types/react": "19.3.0",
@@ -80,7 +80,7 @@
80
80
  "vitest": "5.0.4"
81
81
  },
82
82
  "peerDependencies": {
83
- "@agimon-ai/po-native-components": "0.0.0-alpha.59",
83
+ "@agimon-ai/po-native-components": "0.0.0-alpha.61",
84
84
  "@earendil-works/pi-coding-agent": "1.4.0",
85
85
  "react-native": "0.88.0",
86
86
  "react-native-unistyles": "^3.5.3"
@@ -137,7 +137,7 @@
137
137
  "scripts": {
138
138
  "build": "tsdown",
139
139
  "test": "vitest --run",
140
- "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json && tsc --noEmit -p tsconfig.native.json",
140
+ "typecheck": "tsrs --noEmit && tsrs --noEmit -p tsconfig.web.json && tsrs --noEmit -p tsconfig.native.json",
141
141
  "lint": "oxlint . && oxfmt . --check",
142
142
  "fixcode": "oxlint . --fix && oxfmt ."
143
143
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemodeTools-BFLlRq4y.mjs","names":[],"sources":["../src/services/codemodeRegistry/index.ts","../src/schemas/codemodeTools.ts","../src/services/codemodeTools/index.ts"],"sourcesContent":["import {\n assertCodemodeNamespaceName,\n type PoCodemodeNamespace,\n type PoCodemodeRegistration,\n type PoCodemodeScriptSource,\n type PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\n\nconst MEMBER_PATH = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*$/u;\n\n/** A gated member that cannot be gated must fail at registration, not run ungated. */\nfunction assertApproval(source: string, namespace: PoCodemodeNamespace): void {\n for (const [path, policy] of Object.entries(namespace.approval ?? {})) {\n const valid =\n MEMBER_PATH.test(path) &&\n (policy?.requirement === 'ask' || policy?.requirement === 'human') &&\n typeof policy.describe === 'function';\n if (!valid) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} declares an invalid approval for \"${path}\": ` +\n 'use a dotted member path with requirement \"ask\" or \"human\" and a describe function.',\n );\n }\n }\n}\n/** The session's namespaces and script folders, in registration order. One name per session. */\nexport function createCodemodeRegistry(options?: { isActive?: (source: string) => boolean }): PoCodemodeService {\n const entries = new Map<string, { source: string; namespace: PoCodemodeNamespace }>();\n const scripts = new Set<PoCodemodeScriptSource>();\n const listeners = new Set<() => void>();\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n return {\n register(source: string, namespace: PoCodemodeNamespace): PoCodemodeRegistration {\n assertCodemodeNamespaceName(namespace.name);\n assertApproval(source, namespace);\n const taken = entries.get(namespace.name);\n if (taken) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} is already registered by ${taken.source}.`,\n );\n }\n const entry = { source, namespace };\n entries.set(namespace.name, entry);\n notify();\n return {\n dispose: () => {\n if (entries.get(namespace.name) !== entry) return;\n entries.delete(namespace.name);\n notify();\n },\n };\n },\n // ponytail: selection gates new bindings only; check each bound call if running execs must be revoked too.\n list: () =>\n [...entries.values()]\n .filter((entry) => options?.isActive?.(entry.source) ?? true)\n .map((entry) => entry.namespace),\n registerScripts(_source: string, entry: PoCodemodeScriptSource): PoCodemodeRegistration {\n const owned = { domain: entry.domain, directory: entry.directory };\n scripts.add(owned);\n notify();\n return { dispose: () => void (scripts.delete(owned) && notify()) };\n },\n listScripts: () => [...scripts],\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import { Type, type Static } from 'typebox';\n\nexport const DiscoverToolSchema = Type.Object({\n namespace: Type.Optional(Type.String({ description: 'Show the full TypeScript declarations of one namespace.' })),\n query: Type.Optional(Type.String({ description: 'Find matching members across every namespace.' })),\n});\nexport type DiscoverToolParams = Static<typeof DiscoverToolSchema>;\n\nexport const ExecToolSchema = Type.Object({\n code: Type.String({\n description:\n 'TypeScript body of an async function. Top-level await and return work. The returned value, console output and image() calls come back.',\n }),\n timeoutMs: Type.Optional(\n Type.Integer({ minimum: 1_000, maximum: 120_000, description: 'Deadline in milliseconds. Default 30000.' }),\n ),\n});\nexport type ExecToolParams = Static<typeof ExecToolSchema>;\n\nexport const ExecBackgroundToolSchema = Type.Object({\n code: ExecToolSchema.properties.code,\n timeoutMs: Type.Optional(\n Type.Integer({\n minimum: 1_000,\n maximum: 7_200_000,\n description: 'Deadline in milliseconds. Default 1800000 (30 minutes), maximum 2 hours.',\n }),\n ),\n});\nexport type ExecBackgroundToolParams = Static<typeof ExecBackgroundToolSchema>;\n\nexport const ExecCancelToolSchema = Type.Object({\n id: Type.String({ minLength: 1, description: 'The background exec ID returned by exec_background.' }),\n reason: Type.Optional(Type.String({ maxLength: 256 })),\n});\nexport type ExecCancelToolParams = Static<typeof ExecCancelToolSchema>;\n","import {\n ApprovalPendingError,\n gateApproval,\n isUnattended,\n type PoApprovalPolicy,\n type PoApprovalService,\n type PoApprovedCall,\n} from '@agimon-ai/po-core/approval';\nimport type { BackgroundWorkProvider } from '@agimon-ai/po-core/backgroundWork';\nimport type {\n PoCodemodeCall,\n PoCodemodeNamespace,\n PoCodemodeRun,\n PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\nimport {\n invalidImageReason,\n type PoHeadlessContent,\n type PoHeadlessExecutionContext,\n type PoHeadlessTool,\n type PoHeadlessToolResult,\n} from '@agimon-ai/po-core/headless';\nimport type { PoIsolateResult, PoIsolateService, PoNpm } from '@agimon-ai/po-core/platform';\n\nimport {\n DiscoverToolSchema,\n ExecToolSchema,\n ExecBackgroundToolSchema,\n ExecCancelToolSchema,\n type DiscoverToolParams,\n type ExecToolParams,\n type ExecBackgroundToolParams,\n type ExecCancelToolParams,\n} from '../../schemas/codemodeTools';\nimport type { CodemodeScriptsPort } from '../codemodeScripts/type';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst MIN_TIMEOUT_MS = 1_000;\nconst BACKGROUND_DEFAULT_TIMEOUT_MS = 30 * 60_000;\nconst BACKGROUND_MAX_TIMEOUT_MS = 2 * 60 * 60_000;\nconst MAX_LOG_CHARS = 10_000;\nconst MAX_VALUE_CHARS = 64 * 1024;\nconst MAX_DECLARATION_CHARS = 24_000;\nconst MAX_QUERY_LINES = 40;\n// The main agent and its subagents share one exec tool, so several runs can overlap.\nconst MAX_CONCURRENT_RUNS = 8;\n// Recorded calls ride the result's details into the transcript, so they are few and small.\nconst MAX_RECORDED_CALLS = 50;\nconst MAX_RECORDED_TEXT = 8_000;\nconst MAX_RECORDED_JSON = 16_000;\nconst MAX_LISTED_SCRIPTS = 20;\nconst MAX_IMAGES = 4;\nconst MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_IMAGE_MIME = 'image/png';\nconst MEMBER_LINE = /^\\s{2}(?:readonly\\s+)?(\\w+)\\s*[(?:<]/u;\n\nconst GLOBALS_HELP =\n 'Globals: console.log/info/warn/error, image(data, mimeType?) to return a screenshot, sleep(ms). ' +\n 'Return a value with `return`.';\nconst SCRIPTS_HELP =\n 'Every exec run is saved. Call a saved script with `await (await import(specifier))(args)`; ' +\n 'inside it, `args` is the argument and its `return` is the result.';\n\nexport interface CodemodeToolsOptions {\n readonly registry: PoCodemodeService;\n /** Resolved per call, so a host that binds the isolate late still works. */\n readonly isolate: () => PoIsolateService | undefined;\n /** Saves every exec body and backs `import()`; without it nothing is saved or importable. */\n readonly scripts?: CodemodeScriptsPort;\n readonly npm?: () => PoNpm | undefined;\n readonly signal?: AbortSignal;\n readonly onBackgroundChange?: () => void;\n /** The session's `po/approval`; without it `ask` members run and `human` members refuse. */\n readonly approval?: () => PoApprovalService | undefined;\n}\n\nexport interface CodemodeTools {\n readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;\n readonly exec: PoHeadlessTool<typeof ExecToolSchema>;\n readonly execBackground: PoHeadlessTool<typeof ExecBackgroundToolSchema>;\n readonly execCancel: PoHeadlessTool<typeof ExecCancelToolSchema>;\n readonly backgroundWork: BackgroundWorkProvider;\n /** Replays an approved gated member, ungated, in `sessionId`; the `codemode` approval executor. */\n runApproved(call: PoApprovedCall, signal: AbortSignal, sessionId: string): Promise<unknown>;\n dispose(): Promise<void>;\n}\n\ninterface BackgroundExec {\n readonly id: string;\n readonly sessionId: string;\n readonly controller: AbortController;\n status: 'running' | 'reporting';\n done: Promise<void>;\n}\n\nfunction text(value: string, isError = false): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: value }], ...(isError ? { isError: true } : {}) };\n}\n\nfunction truncate(value: string, limit: number): string {\n return value.length <= limit ? value : `${value.slice(0, limit)}\\n[truncated ${value.length - limit} chars]`;\n}\n\nfunction format(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n const json = JSON.stringify(value, null, 2);\n if (json !== undefined) return json;\n } catch {\n // Cyclic or exotic values fall back to their string form.\n }\n return String(value);\n}\n\nfunction memberNames(namespace: PoCodemodeNamespace): string[] {\n const names = new Set<string>();\n const declaration =\n new RegExp(`^declare const ${namespace.name}: \\\\{([\\\\s\\\\S]*?)^\\\\};`, 'mu').exec(namespace.declarations)?.[1] ?? '';\n for (const line of declaration.split('\\n')) {\n const name = MEMBER_LINE.exec(line)?.[1];\n if (name) names.add(name);\n }\n return [...names];\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000));\n }\n return btoa(binary);\n}\n\n/** Collects what a script prints and the images it returns, within the output caps. */\nfunction createOutput() {\n const lines: string[] = [];\n const images: { data: string; mimeType: string }[] = [];\n let imageBytes = 0;\n const log =\n (level: string) =>\n (...args: unknown[]) => {\n const line = args.map(format).join(' ');\n lines.push(level === 'log' || level === 'info' ? line : `[${level}] ${line}`);\n };\n const note = (message: string): void => void lines.push(`[note] ${message}`);\n /** Why an image cannot join this run's output, checked before anything is counted, so a refusal costs nothing. */\n const refusal = (data: string, mime: string): Error | undefined => {\n if (images.length >= MAX_IMAGES) return new RangeError(`An exec run returns at most ${MAX_IMAGES} images.`);\n if (imageBytes + Math.ceil((data.length * 3) / 4) > MAX_IMAGE_BYTES)\n return new RangeError('Images from one exec run exceed 5 MB.');\n const invalid = invalidImageReason(data, mime);\n return invalid === undefined ? undefined : new TypeError(`image() rejected an undecodable image: ${invalid}.`);\n };\n const push = (data: string, mimeType: string): void => {\n imageBytes += Math.ceil((data.length * 3) / 4);\n images.push({ data, mimeType });\n };\n const addImage = (input: unknown, mimeType?: unknown): void => {\n if (typeof input === 'object' && input !== null && 'images' in input && Array.isArray(input.images)) {\n for (const image of input.images) addImage(image);\n return;\n }\n let data: string;\n let mime = typeof mimeType === 'string' ? mimeType : DEFAULT_IMAGE_MIME;\n if (typeof input === 'string')\n data = input.replace(/^data:([^;]+);base64,/u, (_match, type: string) => ((mime = type), ''));\n else if (ArrayBuffer.isView(input))\n data = bytesToBase64(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n else if (typeof input === 'object' && input !== null && 'data' in input && typeof input.data === 'string') {\n data = input.data;\n if ('mimeType' in input && typeof input.mimeType === 'string') mime = input.mimeType;\n } else throw new TypeError('image() takes base64 text, bytes, or { data, mimeType }.');\n const error = refusal(data, mime);\n if (error !== undefined) throw error;\n push(data, mime);\n };\n /** A namespace's image for the model: the same limits as image(), but a refusal is a note and a warning, not a throw. */\n const emitImage = ({ data, mimeType }: { readonly data: string; readonly mimeType: string }) => {\n const error = refusal(data, mimeType);\n if (error === undefined) {\n push(data, mimeType);\n return { emitted: true } as const;\n }\n const warning = `Image not shown to the model: ${error.message}`;\n note(warning);\n return { emitted: false, warning } as const;\n };\n const console = { log: log('log'), info: log('info'), warn: log('warn'), error: log('error'), debug: log('debug') };\n return { console, note, addImage, emitImage, lines, images };\n}\n\n/** The session's active domains; every registered domain when the host reports none. */\nfunction activeDomains(execution: PoHeadlessExecutionContext | undefined): readonly string[] | undefined {\n return execution?.selection?.domains;\n}\n\n/** A JSON copy of `value`, or undefined when it does not serialise or is larger than `limit` characters. */\nfunction bounded<T>(value: T, limit: number): T | undefined {\n try {\n const json = JSON.stringify(value);\n return json !== undefined && json.length <= limit ? (JSON.parse(json) as T) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** What the recorded pictures of one run may still take, under the same limits as image(). */\ninterface ImageBudget {\n count: number;\n bytes: number;\n}\n\n/**\n * The call as it is kept in the transcript: text clipped, pictures kept while the run's\n * budget lasts (a note says when one was not), args and details dropped when large.\n */\nfunction recordedCall(call: PoCodemodeCall, budget: ImageBudget): PoCodemodeCall {\n const content = (call.result?.content ?? []).flatMap((block): PoHeadlessContent[] => {\n const { type, text, data, mimeType } = (block ?? {}) as Record<string, unknown>;\n if (type === 'text' && typeof text === 'string') return [{ type: 'text', text: truncate(text, MAX_RECORDED_TEXT) }];\n if (type !== 'image' || typeof data !== 'string' || typeof mimeType !== 'string') return [];\n const bytes = Math.ceil((data.length * 3) / 4);\n if (budget.count >= MAX_IMAGES || budget.bytes + bytes > MAX_IMAGE_BYTES) {\n return [{ type: 'text', text: `[picture not kept: one exec run keeps at most ${MAX_IMAGES} pictures, 5 MB]` }];\n }\n budget.count += 1;\n budget.bytes += bytes;\n return [{ type: 'image', data, mimeType }];\n });\n const details = bounded(call.result?.details, MAX_RECORDED_JSON);\n if (call.result?.details !== undefined && details === undefined)\n content.push({ type: 'text', text: `[details not kept: larger than ${MAX_RECORDED_JSON} characters]` });\n return {\n name: call.name,\n tool: call.tool,\n args: bounded(call.args, MAX_RECORDED_JSON) ?? {},\n ok: call.ok,\n ms: Math.max(0, Math.round(call.ms)),\n ...(call.error === undefined ? {} : { error: truncate(call.error, MAX_RECORDED_TEXT) }),\n ...(call.result === undefined ? {} : { result: { content, ...(details === undefined ? {} : { details }) } }),\n };\n}\n\n/** A gated member call recorded for the person's approval during one exec run. */\ninterface PendingApproval {\n readonly approvalId: string;\n readonly name: string;\n}\n\nfunction toResult(\n result: PoIsolateResult,\n output: ReturnType<typeof createOutput>,\n saved: string | undefined,\n calls: readonly PoCodemodeCall[],\n approvals: readonly PendingApproval[] = [],\n): PoHeadlessToolResult {\n const pending =\n !result.ok && result.error.kind === 'error' && result.error.name === 'ApprovalPendingError' && approvals.length > 0;\n const content: PoHeadlessContent[] = [];\n if (output.lines.length > 0) content.push({ type: 'text', text: truncate(output.lines.join('\\n'), MAX_LOG_CHARS) });\n if (result.ok) {\n if (ArrayBuffer.isView(result.value)) {\n content.push({ type: 'text', text: 'The script returned bytes. Pass them to image(data, mimeType) instead.' });\n } else if (result.value !== undefined) {\n content.push({ type: 'text', text: truncate(format(result.value), MAX_VALUE_CHARS) });\n }\n } else if (!pending) {\n const { kind, name, message } = result.error;\n const hint = kind === 'timeout' ? ' Raise timeoutMs or split the work into smaller exec calls.' : '';\n content.push({ type: 'text', text: `${name}: ${message}${hint}` });\n }\n if (approvals.length > 0)\n content.push({\n type: 'text',\n text:\n `Waiting for the person's approval: ${approvals.map((entry) => `${entry.name} (approval ${entry.approvalId})`).join(', ')}. ` +\n 'Each runs once approved, and its outcome arrives as a message. Keep working meanwhile.',\n });\n if (content.length === 0) content.push({ type: 'text', text: '(no return value)' });\n if (saved !== undefined) content.push({ type: 'text', text: saved });\n for (const image of output.images) content.push({ type: 'image', data: image.data, mimeType: image.mimeType });\n const details = {\n ...(calls.length > 0 ? { calls } : {}),\n ...(approvals.length > 0 ? { approvals } : {}),\n };\n return {\n content: content.map((part, index) =>\n part.type === 'text' && index > 0 ? { ...part, text: `\\n${part.text}` } : part,\n ),\n ...(Object.keys(details).length > 0 ? { details } : {}),\n ...(result.ok || pending ? {} : { isError: true }),\n };\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) return reject(new Error('Run ended.'));\n const stop = () => {\n clearTimeout(timer);\n reject(new Error('Run ended.'));\n };\n const timer = setTimeout(\n () => {\n signal.removeEventListener('abort', stop);\n resolve();\n },\n Math.max(0, ms),\n );\n signal.addEventListener('abort', stop, { once: true });\n });\n}\n\ntype MemberGate = (\n name: string,\n policy: PoApprovalPolicy,\n call: (args: unknown[]) => unknown,\n) => (...args: unknown[]) => Promise<unknown>;\n\n/**\n * A view of `target` whose gated member paths ask before calling the original on its own receiver.\n * The view inherits from a shadow, so frozen targets keep their proxy invariants.\n */\nfunction gateMembers(\n target: unknown,\n policies: Readonly<Record<string, PoApprovalPolicy>>,\n prefix: string,\n gate: MemberGate,\n): object {\n if (typeof target !== 'object' || target === null) {\n throw new Error(`Code-mode member ${prefix} declares approval but is not an object.`);\n }\n const overrides = new Map<PropertyKey, unknown>();\n const nested = new Map<string, Record<string, PoApprovalPolicy>>();\n for (const [path, policy] of Object.entries(policies)) {\n const dot = path.indexOf('.');\n if (dot === -1) {\n const original: unknown = Reflect.get(target, path, target);\n if (typeof original !== 'function') {\n throw new Error(`Code-mode member ${prefix}.${path} declares approval but is not a function.`);\n }\n overrides.set(\n path,\n gate(`${prefix}.${path}`, policy, (args) => Reflect.apply(original, target, args)),\n );\n } else {\n const head = path.slice(0, dot);\n nested.set(head, { ...nested.get(head), [path.slice(dot + 1)]: policy });\n }\n }\n for (const [key, children] of nested) {\n overrides.set(key, gateMembers(Reflect.get(target, key, target), children, `${prefix}.${key}`, gate));\n }\n // ponytail: ungated methods run with the view as `this`; a class using #private fields breaks, bind such methods if one appears.\n return new Proxy(Object.create(target) as object, {\n get: (_shadow, key) => (overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target)),\n has: (_shadow, key) => overrides.has(key) || Reflect.has(target, key),\n ownKeys: () => Reflect.ownKeys(target),\n getOwnPropertyDescriptor: (_shadow, key) => {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, key);\n if (!descriptor) return undefined;\n return {\n configurable: true,\n enumerable: descriptor.enumerable ?? false,\n writable: false,\n value: overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target),\n };\n },\n set: () => false,\n defineProperty: () => false,\n deleteProperty: () => false,\n });\n}\n\n/** `name (asks first)` for each gated top-level member, so discover shows which calls wait for the person. */\nfunction gatedLabel(namespace: PoCodemodeNamespace, member: string): string {\n const policies = Object.entries(namespace.approval ?? {}).filter(\n ([path]) => path === member || path.startsWith(`${member}.`),\n );\n if (policies.length === 0) return member;\n return policies.some(([, policy]) => policy.requirement === 'human')\n ? `${member} (needs the person)`\n : `${member} (asks first)`;\n}\n/** `discover` and `exec` for one session, over the namespaces its packages contributed. */\nexport function createCodemodeTools({\n registry,\n isolate,\n scripts,\n npm,\n signal: lifecycleSignal,\n onBackgroundChange,\n approval,\n}: CodemodeToolsOptions): CodemodeTools {\n let running = 0;\n let closing = false;\n const lifecycle = new AbortController();\n const ownerSignal = lifecycleSignal ? AbortSignal.any([lifecycle.signal, lifecycleSignal]) : lifecycle.signal;\n const jobs = new Map<string, BackgroundExec>();\n const backgroundWork: BackgroundWorkProvider = {\n provider: 'po-codemode-background',\n listActiveWork: () =>\n [...jobs.values()].map(({ id, sessionId, status }) => ({ id, sessionId, status, label: 'Background exec' })),\n };\n\n const visible = (service: PoIsolateService): PoCodemodeNamespace[] =>\n registry.list().filter((namespace) => service.liveObjects || namespace.portable === true);\n\n // The exec description is read synchronously, so domain script names are cached on registry changes.\n // ponytail: lists every registered folder, not the turn's active domains; filter here if selection changes mid-session.\n let domainScripts: string[] = [];\n let refreshes = 0;\n const refreshScripts = (): void => {\n if (!scripts) return;\n const turn = ++refreshes;\n scripts.list().then(\n (entries) => {\n if (turn !== refreshes) return;\n domainScripts = entries.flatMap((entry) => (entry.specifier.startsWith('session:') ? [] : [entry.specifier]));\n },\n // A failed listing keeps the last names; discover reports the folder error when called.\n () => undefined,\n );\n };\n refreshScripts();\n const unsubscribe = registry.subscribe(refreshScripts);\n const domainScriptsHelp = (): string[] => {\n if (domainScripts.length === 0) return [];\n const shown = domainScripts.slice(0, MAX_LISTED_SCRIPTS).join(', ');\n const more =\n domainScripts.length > MAX_LISTED_SCRIPTS ? ` and ${domainScripts.length - MAX_LISTED_SCRIPTS} more` : '';\n return [`Domain scripts: ${shown}${more}. Use discover({ query }) to see what one does before importing it.`];\n };\n\n const executeCode = async (\n parameters: ExecToolParams,\n signal: AbortSignal | undefined,\n execution: PoHeadlessExecutionContext,\n deadlineMs: number,\n toolCallId: string,\n background = false,\n ): Promise<PoHeadlessToolResult> => {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n running += 1;\n const controller = new AbortController();\n const runSignal = AbortSignal.any([ownerSignal, controller.signal, ...(signal ? [signal] : [])]);\n const cleanups: (() => void | Promise<void>)[] = [];\n const calls: PoCodemodeCall[] = [];\n const imageBudget: ImageBudget = { count: 0, bytes: 0 };\n const output = createOutput();\n const presence = execution.interaction === 'unattended' ? 'unattended' : execution.sessionContext?.interaction;\n const interaction = isUnattended({\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n background,\n ...(presence === undefined ? {} : { interaction: presence }),\n })\n ? 'unattended'\n : 'interactive';\n const run: PoCodemodeRun = {\n source: parameters.code,\n sessionId: execution.sessionId,\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n toolCallId,\n ...(background ? { background } : {}),\n interaction,\n signal: runSignal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: (call) => {\n if (calls.length < MAX_RECORDED_CALLS) calls.push(recordedCall(call, imageBudget));\n },\n emitImage: (image) =>\n runSignal.aborted ? { emitted: false, warning: 'The exec run has ended.' } : output.emitImage(image),\n };\n const approvals: PendingApproval[] = [];\n // A gated member never pauses the script: a pending request or a refusal is an error the script can catch.\n const gateFor =\n (namespace: PoCodemodeNamespace): MemberGate =>\n (name, policy, call) =>\n async (...args) => {\n const gate = await gateApproval({\n policy,\n operation: { kind: 'codemode', name },\n input: args[0],\n arguments: args,\n argumentFormat: 'positional',\n sessionId: run.sessionId,\n toolCallId,\n ...(run.caller === undefined ? {} : { caller: run.caller }),\n background,\n interaction,\n service: approval?.(),\n signal: runSignal,\n });\n if (!gate.ok && gate.pending === true) {\n approvals.push({ approvalId: gate.approvalId, name });\n throw new ApprovalPendingError(gate.approvalId, gate.reason);\n }\n if (!gate.ok) throw new Error(gate.reason);\n if (!registry.list().includes(namespace)) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n if (runSignal.aborted) throw new Error(`'${name}' was cancelled. Nothing ran.`);\n return call(args);\n };\n let saved: string | undefined;\n let result: PoIsolateResult = { ok: true, value: undefined };\n try {\n runSignal.throwIfAborted();\n try {\n const file = await scripts?.save(parameters.code);\n if (file) saved = `Saved as ${file.specifier} (${file.path})`;\n } catch (error) {\n output.note(`Could not save the script: ${error instanceof Error ? error.message : String(error)}`);\n }\n runSignal.throwIfAborted();\n const globals: Record<string, unknown> = {\n console: output.console,\n image: output.addImage,\n sleep: (ms: number) => sleep(ms, runSignal),\n };\n const deny = new Set<string>();\n for (const namespace of visible(service)) {\n const bound = namespace.bind(run);\n if (namespace.approval === undefined || Object.keys(namespace.approval).length === 0) {\n globals[namespace.name] = bound;\n } else {\n try {\n globals[namespace.name] = gateMembers(bound, namespace.approval, namespace.name, gateFor(namespace));\n } catch (error) {\n // Fail closed: a namespace whose gate cannot be applied is left out of this run.\n output.note(`${namespace.name} is unavailable: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n }\n for (const member of namespace.deny ?? []) deny.add(member);\n }\n result = await service.run({\n source: parameters.code,\n globals,\n deadlineMs,\n signal: runSignal,\n deny: [...deny],\n onDiagnostic: output.note,\n resolveImport: async (specifier) => {\n if (specifier.startsWith('node:')) {\n throw new Error(\n `Code mode is sandboxed, so \"${specifier}\" cannot be imported. Use the shell namespace or an npm: import.`,\n );\n }\n if (!specifier.startsWith('npm:')) {\n if (!scripts) throw new Error('Script imports are not available on this host.');\n return scripts.resolve(specifier, activeDomains(execution));\n }\n const loader = npm?.();\n if (!loader) throw new Error('npm imports are not available on this host.');\n run.signal.throwIfAborted();\n const started = Date.now();\n try {\n const exports = await loader.import(specifier, { sessionId: run.sessionId, signal: run.signal });\n run.signal.throwIfAborted();\n run.record?.({ name: 'npm.import', tool: 'npm', args: { specifier }, ms: Date.now() - started, ok: true });\n return { kind: 'module', id: specifier, exports };\n } catch (error) {\n run.record?.({\n name: 'npm.import',\n tool: 'npm',\n args: { specifier },\n ms: Date.now() - started,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n },\n });\n } catch (error) {\n result = {\n ok: false,\n error: {\n kind: 'error',\n name: 'Error',\n message: `Code mode could not run the script: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n } finally {\n controller.abort();\n for (const cleanup of cleanups.reverse()) {\n await Promise.resolve()\n .then(cleanup)\n .catch((error: unknown) => {\n const message = `Code mode cleanup failed: ${String(error)}`;\n output.note(message);\n result = { ok: false, error: { kind: 'error', name: 'CleanupError', message } };\n });\n }\n running -= 1;\n }\n return toResult(result, output, saved, calls, approvals);\n };\n\n // ponytail: the cockpit's generic tool item renders both for now; add a poWeb renderer for exec code and images when it earns one.\n // web-plugin-tool-renderers: ignore discover, plain text result\n const discover: CodemodeTools['discover'] = {\n name: 'discover',\n label: 'Discover',\n description:\n 'List the code-mode namespaces and reusable scripts you can use from `exec`, show one namespace in full, ' +\n 'or search members and scripts. ' +\n 'Not required before exec: its description already names the namespaces.',\n parameters: DiscoverToolSchema,\n promptSnippet: 'List code-mode namespaces and their TypeScript declarations',\n executionMode: 'parallel',\n async execute(_toolCallId, parameters: DiscoverToolParams, _signal, _onUpdate, execution) {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n const namespaces = visible(service);\n // Imports need a host with live objects; the edge saves scripts but cannot chain them.\n const listed = scripts && service.liveObjects ? await scripts.list(activeDomains(execution)) : [];\n if (parameters.namespace !== undefined) {\n const found = namespaces.find((namespace) => namespace.name === parameters.namespace);\n if (!found) {\n const names = namespaces.map((namespace) => namespace.name).join(', ') || 'none';\n return text(`Unknown namespace \"${parameters.namespace}\". Registered: ${names}.`, true);\n }\n return text(truncate(found.declarations, MAX_DECLARATION_CHARS));\n }\n if (parameters.query !== undefined) {\n const needle = parameters.query.toLowerCase();\n const hits: string[] = [];\n for (const namespace of namespaces) {\n const lines = namespace.declarations.split('\\n');\n lines.forEach((line, index) => {\n if (!line.toLowerCase().includes(needle) || hits.length >= MAX_QUERY_LINES) return;\n const doc = lines[index - 1]?.trim().startsWith('/**') ? `${lines[index - 1]?.trim()} ` : '';\n hits.push(`${namespace.name}: ${doc}${line.trim()}`);\n });\n }\n for (const script of listed) {\n if (hits.length >= MAX_QUERY_LINES) break;\n if (`${script.specifier} ${script.description}`.toLowerCase().includes(needle)) {\n hits.push(`script ${script.specifier}: ${script.description}`);\n }\n }\n return text(hits.length > 0 ? hits.join('\\n') : `No members or scripts match \"${parameters.query}\".`);\n }\n const sections: string[] = [];\n if (namespaces.length === 0) sections.push('No namespaces are registered in this session.');\n for (const namespace of namespaces) {\n const members = memberNames(namespace).map((member) => gatedLabel(namespace, member));\n sections.push(`- ${namespace.name}: ${namespace.summary}\\n members: ${members.join(', ')}`);\n }\n sections.push(GLOBALS_HELP);\n if (!service.liveObjects) sections.push('This host runs plain JavaScript with JSON-only functions.');\n if (listed.length > 0) {\n sections.push(`Scripts. ${SCRIPTS_HELP}`);\n for (const script of listed.slice(0, MAX_LISTED_SCRIPTS)) {\n sections.push(`- ${script.specifier}${script.description ? `: ${script.description}` : ''}`);\n }\n if (listed.length > MAX_LISTED_SCRIPTS) {\n sections.push(`...and ${listed.length - MAX_LISTED_SCRIPTS} more; use discover({ query }) to search.`);\n }\n }\n if (namespaces.length > 0) sections.push('Call discover({ namespace }) for full types.');\n return text(sections.join('\\n'));\n },\n };\n\n // web-plugin-tool-renderers: ignore exec, generic item until a code and image renderer exists\n const exec: CodemodeTools['exec'] = {\n name: 'exec',\n label: 'Exec',\n get description(): string {\n const service = isolate();\n const namespaces = service ? visible(service) : [];\n const listed = namespaces.map((namespace) => `- ${namespace.name}: ${namespace.summary}`).join('\\n');\n return [\n 'Run a TypeScript script inside the Po server with live objects from the namespaces below in scope.',\n 'It runs with full server trust, like bash. Keep each call to one logical step.',\n listed || '(no namespaces registered yet; call discover to check)',\n GLOBALS_HELP,\n ...(scripts && service?.liveObjects\n ? [`${SCRIPTS_HELP} discover lists saved and domain scripts.`, ...domainScriptsHelp()]\n : []),\n 'Use discover({ namespace }) for full signatures when needed.',\n ].join('\\n');\n },\n parameters: ExecToolSchema,\n promptSnippet: 'Run a TypeScript script against live Po objects (browser and other namespaces)',\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecToolParams, signal, _onUpdate, execution) {\n return executeCode(\n parameters,\n signal,\n execution,\n Math.min(MAX_TIMEOUT_MS, Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? DEFAULT_TIMEOUT_MS)),\n toolCallId,\n );\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_background, immediate job identity only\n const execBackground: CodemodeTools['execBackground'] = {\n name: 'exec_background',\n label: 'Background Exec',\n description:\n 'Run a long-lived Node code-mode script. Returns its ID immediately; one completion message arrives after execution and cleanup. End the turn rather than polling. Full server trust, like exec.',\n parameters: ExecBackgroundToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecBackgroundToolParams, signal, _onUpdate, execution) {\n if (signal?.aborted) return text('Background exec launch was aborted.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (!isolate()?.liveObjects) return text('Background exec requires a Node host with live objects.', true);\n if (!execution.session?.admitMessage)\n return text('This session cannot admit background exec completion messages.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n const deadlineMs = Math.min(\n BACKGROUND_MAX_TIMEOUT_MS,\n Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? BACKGROUND_DEFAULT_TIMEOUT_MS),\n );\n const id = crypto.randomUUID();\n const controller = new AbortController();\n const job: BackgroundExec = {\n id,\n sessionId: execution.sessionId,\n controller,\n status: 'running',\n done: Promise.resolve(),\n };\n jobs.set(id, job);\n onBackgroundChange?.();\n job.done = (async () => {\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, deadlineMs);\n try {\n const result = await executeCode(parameters, controller.signal, execution, deadlineMs, toolCallId, true);\n clearTimeout(timer);\n job.status = 'reporting';\n onBackgroundChange?.();\n const status = timedOut\n ? 'timed-out'\n : controller.signal.aborted\n ? 'stopped'\n : result.isError\n ? 'failed'\n : 'completed';\n const message = {\n type: 'po-codemode-finished',\n text: `Background exec ${id} ${status}.\\n${result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n')}`,\n display: true,\n details: { id, status, result },\n };\n let warned = false;\n while (!ownerSignal.aborted) {\n let stopAdmission: (() => void) | undefined;\n try {\n const stopped = new Promise<void>((resolve) => {\n stopAdmission = resolve;\n ownerSignal.addEventListener('abort', stopAdmission, { once: true });\n if (ownerSignal.aborted) resolve();\n });\n await Promise.race([\n execution.session.admitMessage!(message, 'steer', `po-codemode-finished:${execution.sessionId}:${id}`),\n stopped,\n ]);\n break;\n } catch (error) {\n if (ownerSignal.aborted) break;\n if (!warned) {\n warned = true;\n await Promise.resolve()\n .then(() =>\n execution.client.notify({\n body: `Background exec completion admission failed; retrying: ${String(error)}`,\n level: 'warning',\n }),\n )\n .catch(() => undefined);\n }\n await sleep(250, ownerSignal).catch(() => undefined);\n } finally {\n if (stopAdmission) ownerSignal.removeEventListener('abort', stopAdmission);\n }\n }\n } finally {\n clearTimeout(timer);\n jobs.delete(id);\n onBackgroundChange?.();\n }\n })();\n return { ...text(JSON.stringify({ id })), details: { id } };\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_cancel, immediate cancellation acknowledgement\n const execCancel: CodemodeTools['execCancel'] = {\n name: 'exec_cancel',\n label: 'Cancel Exec',\n description: 'Cancel a background exec in this session. Its terminal message follows child cleanup.',\n parameters: ExecCancelToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(_toolCallId, parameters: ExecCancelToolParams, _signal, _onUpdate, execution) {\n const job = jobs.get(parameters.id);\n if (job && job.sessionId !== execution.sessionId)\n return text('Background exec belongs to another session.', true);\n if (job?.status === 'running') job.controller.abort(parameters.reason ? new Error(parameters.reason) : undefined);\n return text(JSON.stringify({ id: parameters.id, status: job?.status === 'running' ? 'stopping' : 'finished' }));\n },\n };\n\n const runApproved: CodemodeTools['runApproved'] = async (call, signal, sessionId) => {\n const name = call.operation.name;\n const [namespaceName, ...path] = name.split('.');\n const namespace = registry.list().find((entry) => entry.name === namespaceName);\n if (namespace === undefined || path.length === 0) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n // Only a member that still declares approval is replayed, so a changed namespace cannot widen what runs.\n if (namespace.approval?.[path.join('.')] === undefined)\n throw new Error(`'${name}' no longer asks for approval, so it was not replayed. Nothing ran.`);\n signal.throwIfAborted();\n // Old receipts contain one input, including when that input itself is an array.\n const args = call.argumentFormat === 'positional' ? call.input : [call.input];\n if (!Array.isArray(args)) throw new Error(`'${name}' has an invalid saved argument list. Nothing ran.`);\n const cleanups: (() => void | Promise<void>)[] = [];\n const bound = namespace.bind({\n source: '',\n sessionId,\n caller: 'main',\n toolCallId: `approval:${call.approvalId}`,\n interaction: 'interactive',\n signal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: () => undefined,\n emitImage: () => ({ emitted: false, warning: 'An approved call cannot show images.' }),\n });\n try {\n let receiver: unknown = bound;\n let member: unknown = bound;\n for (const key of path) {\n receiver = member;\n member = typeof member === 'object' && member !== null ? Reflect.get(member, key, member) : undefined;\n }\n if (typeof member !== 'function') throw new Error(`'${name}' is no longer active. Nothing ran.`);\n return await Reflect.apply(member, receiver, args);\n } finally {\n for (const cleanup of cleanups.reverse()) await cleanup();\n }\n };\n\n return {\n discover,\n exec,\n execBackground,\n execCancel,\n backgroundWork,\n runApproved,\n async dispose() {\n closing = true;\n unsubscribe();\n lifecycle.abort();\n await Promise.all([...jobs.values()].map((job) => job.done));\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemodeTools-DrdEw_bA.cjs","names":["Type","invalidImageReason","isUnattended","gateApproval","ApprovalPendingError"],"sources":["../src/services/codemodeRegistry/index.ts","../src/schemas/codemodeTools.ts","../src/services/codemodeTools/index.ts"],"sourcesContent":["import {\n assertCodemodeNamespaceName,\n type PoCodemodeNamespace,\n type PoCodemodeRegistration,\n type PoCodemodeScriptSource,\n type PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\n\nconst MEMBER_PATH = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*$/u;\n\n/** A gated member that cannot be gated must fail at registration, not run ungated. */\nfunction assertApproval(source: string, namespace: PoCodemodeNamespace): void {\n for (const [path, policy] of Object.entries(namespace.approval ?? {})) {\n const valid =\n MEMBER_PATH.test(path) &&\n (policy?.requirement === 'ask' || policy?.requirement === 'human') &&\n typeof policy.describe === 'function';\n if (!valid) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} declares an invalid approval for \"${path}\": ` +\n 'use a dotted member path with requirement \"ask\" or \"human\" and a describe function.',\n );\n }\n }\n}\n/** The session's namespaces and script folders, in registration order. One name per session. */\nexport function createCodemodeRegistry(options?: { isActive?: (source: string) => boolean }): PoCodemodeService {\n const entries = new Map<string, { source: string; namespace: PoCodemodeNamespace }>();\n const scripts = new Set<PoCodemodeScriptSource>();\n const listeners = new Set<() => void>();\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n return {\n register(source: string, namespace: PoCodemodeNamespace): PoCodemodeRegistration {\n assertCodemodeNamespaceName(namespace.name);\n assertApproval(source, namespace);\n const taken = entries.get(namespace.name);\n if (taken) {\n throw new Error(\n `Code-mode namespace \"${namespace.name}\" from ${source} is already registered by ${taken.source}.`,\n );\n }\n const entry = { source, namespace };\n entries.set(namespace.name, entry);\n notify();\n return {\n dispose: () => {\n if (entries.get(namespace.name) !== entry) return;\n entries.delete(namespace.name);\n notify();\n },\n };\n },\n // ponytail: selection gates new bindings only; check each bound call if running execs must be revoked too.\n list: () =>\n [...entries.values()]\n .filter((entry) => options?.isActive?.(entry.source) ?? true)\n .map((entry) => entry.namespace),\n registerScripts(_source: string, entry: PoCodemodeScriptSource): PoCodemodeRegistration {\n const owned = { domain: entry.domain, directory: entry.directory };\n scripts.add(owned);\n notify();\n return { dispose: () => void (scripts.delete(owned) && notify()) };\n },\n listScripts: () => [...scripts],\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import { Type, type Static } from 'typebox';\n\nexport const DiscoverToolSchema = Type.Object({\n namespace: Type.Optional(Type.String({ description: 'Show the full TypeScript declarations of one namespace.' })),\n query: Type.Optional(Type.String({ description: 'Find matching members across every namespace.' })),\n});\nexport type DiscoverToolParams = Static<typeof DiscoverToolSchema>;\n\nexport const ExecToolSchema = Type.Object({\n code: Type.String({\n description:\n 'TypeScript body of an async function. Top-level await and return work. The returned value, console output and image() calls come back.',\n }),\n timeoutMs: Type.Optional(\n Type.Integer({ minimum: 1_000, maximum: 120_000, description: 'Deadline in milliseconds. Default 30000.' }),\n ),\n});\nexport type ExecToolParams = Static<typeof ExecToolSchema>;\n\nexport const ExecBackgroundToolSchema = Type.Object({\n code: ExecToolSchema.properties.code,\n timeoutMs: Type.Optional(\n Type.Integer({\n minimum: 1_000,\n maximum: 7_200_000,\n description: 'Deadline in milliseconds. Default 1800000 (30 minutes), maximum 2 hours.',\n }),\n ),\n});\nexport type ExecBackgroundToolParams = Static<typeof ExecBackgroundToolSchema>;\n\nexport const ExecCancelToolSchema = Type.Object({\n id: Type.String({ minLength: 1, description: 'The background exec ID returned by exec_background.' }),\n reason: Type.Optional(Type.String({ maxLength: 256 })),\n});\nexport type ExecCancelToolParams = Static<typeof ExecCancelToolSchema>;\n","import {\n ApprovalPendingError,\n gateApproval,\n isUnattended,\n type PoApprovalPolicy,\n type PoApprovalService,\n type PoApprovedCall,\n} from '@agimon-ai/po-core/approval';\nimport type { BackgroundWorkProvider } from '@agimon-ai/po-core/backgroundWork';\nimport type {\n PoCodemodeCall,\n PoCodemodeNamespace,\n PoCodemodeRun,\n PoCodemodeService,\n} from '@agimon-ai/po-core/codemode';\nimport {\n invalidImageReason,\n type PoHeadlessContent,\n type PoHeadlessExecutionContext,\n type PoHeadlessTool,\n type PoHeadlessToolResult,\n} from '@agimon-ai/po-core/headless';\nimport type { PoIsolateResult, PoIsolateService, PoNpm } from '@agimon-ai/po-core/platform';\n\nimport {\n DiscoverToolSchema,\n ExecToolSchema,\n ExecBackgroundToolSchema,\n ExecCancelToolSchema,\n type DiscoverToolParams,\n type ExecToolParams,\n type ExecBackgroundToolParams,\n type ExecCancelToolParams,\n} from '../../schemas/codemodeTools';\nimport type { CodemodeScriptsPort } from '../codemodeScripts/type';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst MIN_TIMEOUT_MS = 1_000;\nconst BACKGROUND_DEFAULT_TIMEOUT_MS = 30 * 60_000;\nconst BACKGROUND_MAX_TIMEOUT_MS = 2 * 60 * 60_000;\nconst MAX_LOG_CHARS = 10_000;\nconst MAX_VALUE_CHARS = 64 * 1024;\nconst MAX_DECLARATION_CHARS = 24_000;\nconst MAX_QUERY_LINES = 40;\n// The main agent and its subagents share one exec tool, so several runs can overlap.\nconst MAX_CONCURRENT_RUNS = 8;\n// Recorded calls ride the result's details into the transcript, so they are few and small.\nconst MAX_RECORDED_CALLS = 50;\nconst MAX_RECORDED_TEXT = 8_000;\nconst MAX_RECORDED_JSON = 16_000;\nconst MAX_LISTED_SCRIPTS = 20;\nconst MAX_IMAGES = 4;\nconst MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_IMAGE_MIME = 'image/png';\nconst MEMBER_LINE = /^\\s{2}(?:readonly\\s+)?(\\w+)\\s*[(?:<]/u;\n\nconst GLOBALS_HELP =\n 'Globals: console.log/info/warn/error, image(data, mimeType?) to return a screenshot, sleep(ms). ' +\n 'Return a value with `return`.';\nconst SCRIPTS_HELP =\n 'Every exec run is saved. Call a saved script with `await (await import(specifier))(args)`; ' +\n 'inside it, `args` is the argument and its `return` is the result.';\n\nexport interface CodemodeToolsOptions {\n readonly registry: PoCodemodeService;\n /** Resolved per call, so a host that binds the isolate late still works. */\n readonly isolate: () => PoIsolateService | undefined;\n /** Saves every exec body and backs `import()`; without it nothing is saved or importable. */\n readonly scripts?: CodemodeScriptsPort;\n readonly npm?: () => PoNpm | undefined;\n readonly signal?: AbortSignal;\n readonly onBackgroundChange?: () => void;\n /** The session's `po/approval`; without it `ask` members run and `human` members refuse. */\n readonly approval?: () => PoApprovalService | undefined;\n}\n\nexport interface CodemodeTools {\n readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;\n readonly exec: PoHeadlessTool<typeof ExecToolSchema>;\n readonly execBackground: PoHeadlessTool<typeof ExecBackgroundToolSchema>;\n readonly execCancel: PoHeadlessTool<typeof ExecCancelToolSchema>;\n readonly backgroundWork: BackgroundWorkProvider;\n /** Replays an approved gated member, ungated, in `sessionId`; the `codemode` approval executor. */\n runApproved(call: PoApprovedCall, signal: AbortSignal, sessionId: string): Promise<unknown>;\n dispose(): Promise<void>;\n}\n\ninterface BackgroundExec {\n readonly id: string;\n readonly sessionId: string;\n readonly controller: AbortController;\n status: 'running' | 'reporting';\n done: Promise<void>;\n}\n\nfunction text(value: string, isError = false): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: value }], ...(isError ? { isError: true } : {}) };\n}\n\nfunction truncate(value: string, limit: number): string {\n return value.length <= limit ? value : `${value.slice(0, limit)}\\n[truncated ${value.length - limit} chars]`;\n}\n\nfunction format(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n const json = JSON.stringify(value, null, 2);\n if (json !== undefined) return json;\n } catch {\n // Cyclic or exotic values fall back to their string form.\n }\n return String(value);\n}\n\nfunction memberNames(namespace: PoCodemodeNamespace): string[] {\n const names = new Set<string>();\n const declaration =\n new RegExp(`^declare const ${namespace.name}: \\\\{([\\\\s\\\\S]*?)^\\\\};`, 'mu').exec(namespace.declarations)?.[1] ?? '';\n for (const line of declaration.split('\\n')) {\n const name = MEMBER_LINE.exec(line)?.[1];\n if (name) names.add(name);\n }\n return [...names];\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000));\n }\n return btoa(binary);\n}\n\n/** Collects what a script prints and the images it returns, within the output caps. */\nfunction createOutput() {\n const lines: string[] = [];\n const images: { data: string; mimeType: string }[] = [];\n let imageBytes = 0;\n const log =\n (level: string) =>\n (...args: unknown[]) => {\n const line = args.map(format).join(' ');\n lines.push(level === 'log' || level === 'info' ? line : `[${level}] ${line}`);\n };\n const note = (message: string): void => void lines.push(`[note] ${message}`);\n /** Why an image cannot join this run's output, checked before anything is counted, so a refusal costs nothing. */\n const refusal = (data: string, mime: string): Error | undefined => {\n if (images.length >= MAX_IMAGES) return new RangeError(`An exec run returns at most ${MAX_IMAGES} images.`);\n if (imageBytes + Math.ceil((data.length * 3) / 4) > MAX_IMAGE_BYTES)\n return new RangeError('Images from one exec run exceed 5 MB.');\n const invalid = invalidImageReason(data, mime);\n return invalid === undefined ? undefined : new TypeError(`image() rejected an undecodable image: ${invalid}.`);\n };\n const push = (data: string, mimeType: string): void => {\n imageBytes += Math.ceil((data.length * 3) / 4);\n images.push({ data, mimeType });\n };\n const addImage = (input: unknown, mimeType?: unknown): void => {\n if (typeof input === 'object' && input !== null && 'images' in input && Array.isArray(input.images)) {\n for (const image of input.images) addImage(image);\n return;\n }\n let data: string;\n let mime = typeof mimeType === 'string' ? mimeType : DEFAULT_IMAGE_MIME;\n if (typeof input === 'string')\n data = input.replace(/^data:([^;]+);base64,/u, (_match, type: string) => ((mime = type), ''));\n else if (ArrayBuffer.isView(input))\n data = bytesToBase64(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n else if (typeof input === 'object' && input !== null && 'data' in input && typeof input.data === 'string') {\n data = input.data;\n if ('mimeType' in input && typeof input.mimeType === 'string') mime = input.mimeType;\n } else throw new TypeError('image() takes base64 text, bytes, or { data, mimeType }.');\n const error = refusal(data, mime);\n if (error !== undefined) throw error;\n push(data, mime);\n };\n /** A namespace's image for the model: the same limits as image(), but a refusal is a note and a warning, not a throw. */\n const emitImage = ({ data, mimeType }: { readonly data: string; readonly mimeType: string }) => {\n const error = refusal(data, mimeType);\n if (error === undefined) {\n push(data, mimeType);\n return { emitted: true } as const;\n }\n const warning = `Image not shown to the model: ${error.message}`;\n note(warning);\n return { emitted: false, warning } as const;\n };\n const console = { log: log('log'), info: log('info'), warn: log('warn'), error: log('error'), debug: log('debug') };\n return { console, note, addImage, emitImage, lines, images };\n}\n\n/** The session's active domains; every registered domain when the host reports none. */\nfunction activeDomains(execution: PoHeadlessExecutionContext | undefined): readonly string[] | undefined {\n return execution?.selection?.domains;\n}\n\n/** A JSON copy of `value`, or undefined when it does not serialise or is larger than `limit` characters. */\nfunction bounded<T>(value: T, limit: number): T | undefined {\n try {\n const json = JSON.stringify(value);\n return json !== undefined && json.length <= limit ? (JSON.parse(json) as T) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** What the recorded pictures of one run may still take, under the same limits as image(). */\ninterface ImageBudget {\n count: number;\n bytes: number;\n}\n\n/**\n * The call as it is kept in the transcript: text clipped, pictures kept while the run's\n * budget lasts (a note says when one was not), args and details dropped when large.\n */\nfunction recordedCall(call: PoCodemodeCall, budget: ImageBudget): PoCodemodeCall {\n const content = (call.result?.content ?? []).flatMap((block): PoHeadlessContent[] => {\n const { type, text, data, mimeType } = (block ?? {}) as Record<string, unknown>;\n if (type === 'text' && typeof text === 'string') return [{ type: 'text', text: truncate(text, MAX_RECORDED_TEXT) }];\n if (type !== 'image' || typeof data !== 'string' || typeof mimeType !== 'string') return [];\n const bytes = Math.ceil((data.length * 3) / 4);\n if (budget.count >= MAX_IMAGES || budget.bytes + bytes > MAX_IMAGE_BYTES) {\n return [{ type: 'text', text: `[picture not kept: one exec run keeps at most ${MAX_IMAGES} pictures, 5 MB]` }];\n }\n budget.count += 1;\n budget.bytes += bytes;\n return [{ type: 'image', data, mimeType }];\n });\n const details = bounded(call.result?.details, MAX_RECORDED_JSON);\n if (call.result?.details !== undefined && details === undefined)\n content.push({ type: 'text', text: `[details not kept: larger than ${MAX_RECORDED_JSON} characters]` });\n return {\n name: call.name,\n tool: call.tool,\n args: bounded(call.args, MAX_RECORDED_JSON) ?? {},\n ok: call.ok,\n ms: Math.max(0, Math.round(call.ms)),\n ...(call.error === undefined ? {} : { error: truncate(call.error, MAX_RECORDED_TEXT) }),\n ...(call.result === undefined ? {} : { result: { content, ...(details === undefined ? {} : { details }) } }),\n };\n}\n\n/** A gated member call recorded for the person's approval during one exec run. */\ninterface PendingApproval {\n readonly approvalId: string;\n readonly name: string;\n}\n\nfunction toResult(\n result: PoIsolateResult,\n output: ReturnType<typeof createOutput>,\n saved: string | undefined,\n calls: readonly PoCodemodeCall[],\n approvals: readonly PendingApproval[] = [],\n): PoHeadlessToolResult {\n const pending =\n !result.ok && result.error.kind === 'error' && result.error.name === 'ApprovalPendingError' && approvals.length > 0;\n const content: PoHeadlessContent[] = [];\n if (output.lines.length > 0) content.push({ type: 'text', text: truncate(output.lines.join('\\n'), MAX_LOG_CHARS) });\n if (result.ok) {\n if (ArrayBuffer.isView(result.value)) {\n content.push({ type: 'text', text: 'The script returned bytes. Pass them to image(data, mimeType) instead.' });\n } else if (result.value !== undefined) {\n content.push({ type: 'text', text: truncate(format(result.value), MAX_VALUE_CHARS) });\n }\n } else if (!pending) {\n const { kind, name, message } = result.error;\n const hint = kind === 'timeout' ? ' Raise timeoutMs or split the work into smaller exec calls.' : '';\n content.push({ type: 'text', text: `${name}: ${message}${hint}` });\n }\n if (approvals.length > 0)\n content.push({\n type: 'text',\n text:\n `Waiting for the person's approval: ${approvals.map((entry) => `${entry.name} (approval ${entry.approvalId})`).join(', ')}. ` +\n 'Each runs once approved, and its outcome arrives as a message. Keep working meanwhile.',\n });\n if (content.length === 0) content.push({ type: 'text', text: '(no return value)' });\n if (saved !== undefined) content.push({ type: 'text', text: saved });\n for (const image of output.images) content.push({ type: 'image', data: image.data, mimeType: image.mimeType });\n const details = {\n ...(calls.length > 0 ? { calls } : {}),\n ...(approvals.length > 0 ? { approvals } : {}),\n };\n return {\n content: content.map((part, index) =>\n part.type === 'text' && index > 0 ? { ...part, text: `\\n${part.text}` } : part,\n ),\n ...(Object.keys(details).length > 0 ? { details } : {}),\n ...(result.ok || pending ? {} : { isError: true }),\n };\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) return reject(new Error('Run ended.'));\n const stop = () => {\n clearTimeout(timer);\n reject(new Error('Run ended.'));\n };\n const timer = setTimeout(\n () => {\n signal.removeEventListener('abort', stop);\n resolve();\n },\n Math.max(0, ms),\n );\n signal.addEventListener('abort', stop, { once: true });\n });\n}\n\ntype MemberGate = (\n name: string,\n policy: PoApprovalPolicy,\n call: (args: unknown[]) => unknown,\n) => (...args: unknown[]) => Promise<unknown>;\n\n/**\n * A view of `target` whose gated member paths ask before calling the original on its own receiver.\n * The view inherits from a shadow, so frozen targets keep their proxy invariants.\n */\nfunction gateMembers(\n target: unknown,\n policies: Readonly<Record<string, PoApprovalPolicy>>,\n prefix: string,\n gate: MemberGate,\n): object {\n if (typeof target !== 'object' || target === null) {\n throw new Error(`Code-mode member ${prefix} declares approval but is not an object.`);\n }\n const overrides = new Map<PropertyKey, unknown>();\n const nested = new Map<string, Record<string, PoApprovalPolicy>>();\n for (const [path, policy] of Object.entries(policies)) {\n const dot = path.indexOf('.');\n if (dot === -1) {\n const original: unknown = Reflect.get(target, path, target);\n if (typeof original !== 'function') {\n throw new Error(`Code-mode member ${prefix}.${path} declares approval but is not a function.`);\n }\n overrides.set(\n path,\n gate(`${prefix}.${path}`, policy, (args) => Reflect.apply(original, target, args)),\n );\n } else {\n const head = path.slice(0, dot);\n nested.set(head, { ...nested.get(head), [path.slice(dot + 1)]: policy });\n }\n }\n for (const [key, children] of nested) {\n overrides.set(key, gateMembers(Reflect.get(target, key, target), children, `${prefix}.${key}`, gate));\n }\n // ponytail: ungated methods run with the view as `this`; a class using #private fields breaks, bind such methods if one appears.\n return new Proxy(Object.create(target) as object, {\n get: (_shadow, key) => (overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target)),\n has: (_shadow, key) => overrides.has(key) || Reflect.has(target, key),\n ownKeys: () => Reflect.ownKeys(target),\n getOwnPropertyDescriptor: (_shadow, key) => {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, key);\n if (!descriptor) return undefined;\n return {\n configurable: true,\n enumerable: descriptor.enumerable ?? false,\n writable: false,\n value: overrides.has(key) ? overrides.get(key) : Reflect.get(target, key, target),\n };\n },\n set: () => false,\n defineProperty: () => false,\n deleteProperty: () => false,\n });\n}\n\n/** `name (asks first)` for each gated top-level member, so discover shows which calls wait for the person. */\nfunction gatedLabel(namespace: PoCodemodeNamespace, member: string): string {\n const policies = Object.entries(namespace.approval ?? {}).filter(\n ([path]) => path === member || path.startsWith(`${member}.`),\n );\n if (policies.length === 0) return member;\n return policies.some(([, policy]) => policy.requirement === 'human')\n ? `${member} (needs the person)`\n : `${member} (asks first)`;\n}\n/** `discover` and `exec` for one session, over the namespaces its packages contributed. */\nexport function createCodemodeTools({\n registry,\n isolate,\n scripts,\n npm,\n signal: lifecycleSignal,\n onBackgroundChange,\n approval,\n}: CodemodeToolsOptions): CodemodeTools {\n let running = 0;\n let closing = false;\n const lifecycle = new AbortController();\n const ownerSignal = lifecycleSignal ? AbortSignal.any([lifecycle.signal, lifecycleSignal]) : lifecycle.signal;\n const jobs = new Map<string, BackgroundExec>();\n const backgroundWork: BackgroundWorkProvider = {\n provider: 'po-codemode-background',\n listActiveWork: () =>\n [...jobs.values()].map(({ id, sessionId, status }) => ({ id, sessionId, status, label: 'Background exec' })),\n };\n\n const visible = (service: PoIsolateService): PoCodemodeNamespace[] =>\n registry.list().filter((namespace) => service.liveObjects || namespace.portable === true);\n\n // The exec description is read synchronously, so domain script names are cached on registry changes.\n // ponytail: lists every registered folder, not the turn's active domains; filter here if selection changes mid-session.\n let domainScripts: string[] = [];\n let refreshes = 0;\n const refreshScripts = (): void => {\n if (!scripts) return;\n const turn = ++refreshes;\n scripts.list().then(\n (entries) => {\n if (turn !== refreshes) return;\n domainScripts = entries.flatMap((entry) => (entry.specifier.startsWith('session:') ? [] : [entry.specifier]));\n },\n // A failed listing keeps the last names; discover reports the folder error when called.\n () => undefined,\n );\n };\n refreshScripts();\n const unsubscribe = registry.subscribe(refreshScripts);\n const domainScriptsHelp = (): string[] => {\n if (domainScripts.length === 0) return [];\n const shown = domainScripts.slice(0, MAX_LISTED_SCRIPTS).join(', ');\n const more =\n domainScripts.length > MAX_LISTED_SCRIPTS ? ` and ${domainScripts.length - MAX_LISTED_SCRIPTS} more` : '';\n return [`Domain scripts: ${shown}${more}. Use discover({ query }) to see what one does before importing it.`];\n };\n\n const executeCode = async (\n parameters: ExecToolParams,\n signal: AbortSignal | undefined,\n execution: PoHeadlessExecutionContext,\n deadlineMs: number,\n toolCallId: string,\n background = false,\n ): Promise<PoHeadlessToolResult> => {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n running += 1;\n const controller = new AbortController();\n const runSignal = AbortSignal.any([ownerSignal, controller.signal, ...(signal ? [signal] : [])]);\n const cleanups: (() => void | Promise<void>)[] = [];\n const calls: PoCodemodeCall[] = [];\n const imageBudget: ImageBudget = { count: 0, bytes: 0 };\n const output = createOutput();\n const presence = execution.interaction === 'unattended' ? 'unattended' : execution.sessionContext?.interaction;\n const interaction = isUnattended({\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n background,\n ...(presence === undefined ? {} : { interaction: presence }),\n })\n ? 'unattended'\n : 'interactive';\n const run: PoCodemodeRun = {\n source: parameters.code,\n sessionId: execution.sessionId,\n ...(execution.caller === undefined ? {} : { caller: execution.caller }),\n toolCallId,\n ...(background ? { background } : {}),\n interaction,\n signal: runSignal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: (call) => {\n if (calls.length < MAX_RECORDED_CALLS) calls.push(recordedCall(call, imageBudget));\n },\n emitImage: (image) =>\n runSignal.aborted ? { emitted: false, warning: 'The exec run has ended.' } : output.emitImage(image),\n };\n const approvals: PendingApproval[] = [];\n // A gated member never pauses the script: a pending request or a refusal is an error the script can catch.\n const gateFor =\n (namespace: PoCodemodeNamespace): MemberGate =>\n (name, policy, call) =>\n async (...args) => {\n const gate = await gateApproval({\n policy,\n operation: { kind: 'codemode', name },\n input: args[0],\n arguments: args,\n argumentFormat: 'positional',\n sessionId: run.sessionId,\n toolCallId,\n ...(run.caller === undefined ? {} : { caller: run.caller }),\n background,\n interaction,\n service: approval?.(),\n signal: runSignal,\n });\n if (!gate.ok && gate.pending === true) {\n approvals.push({ approvalId: gate.approvalId, name });\n throw new ApprovalPendingError(gate.approvalId, gate.reason);\n }\n if (!gate.ok) throw new Error(gate.reason);\n if (!registry.list().includes(namespace)) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n if (runSignal.aborted) throw new Error(`'${name}' was cancelled. Nothing ran.`);\n return call(args);\n };\n let saved: string | undefined;\n let result: PoIsolateResult = { ok: true, value: undefined };\n try {\n runSignal.throwIfAborted();\n try {\n const file = await scripts?.save(parameters.code);\n if (file) saved = `Saved as ${file.specifier} (${file.path})`;\n } catch (error) {\n output.note(`Could not save the script: ${error instanceof Error ? error.message : String(error)}`);\n }\n runSignal.throwIfAborted();\n const globals: Record<string, unknown> = {\n console: output.console,\n image: output.addImage,\n sleep: (ms: number) => sleep(ms, runSignal),\n };\n const deny = new Set<string>();\n for (const namespace of visible(service)) {\n const bound = namespace.bind(run);\n if (namespace.approval === undefined || Object.keys(namespace.approval).length === 0) {\n globals[namespace.name] = bound;\n } else {\n try {\n globals[namespace.name] = gateMembers(bound, namespace.approval, namespace.name, gateFor(namespace));\n } catch (error) {\n // Fail closed: a namespace whose gate cannot be applied is left out of this run.\n output.note(`${namespace.name} is unavailable: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n }\n for (const member of namespace.deny ?? []) deny.add(member);\n }\n result = await service.run({\n source: parameters.code,\n globals,\n deadlineMs,\n signal: runSignal,\n deny: [...deny],\n onDiagnostic: output.note,\n resolveImport: async (specifier) => {\n if (specifier.startsWith('node:')) {\n throw new Error(\n `Code mode is sandboxed, so \"${specifier}\" cannot be imported. Use the shell namespace or an npm: import.`,\n );\n }\n if (!specifier.startsWith('npm:')) {\n if (!scripts) throw new Error('Script imports are not available on this host.');\n return scripts.resolve(specifier, activeDomains(execution));\n }\n const loader = npm?.();\n if (!loader) throw new Error('npm imports are not available on this host.');\n run.signal.throwIfAborted();\n const started = Date.now();\n try {\n const exports = await loader.import(specifier, { sessionId: run.sessionId, signal: run.signal });\n run.signal.throwIfAborted();\n run.record?.({ name: 'npm.import', tool: 'npm', args: { specifier }, ms: Date.now() - started, ok: true });\n return { kind: 'module', id: specifier, exports };\n } catch (error) {\n run.record?.({\n name: 'npm.import',\n tool: 'npm',\n args: { specifier },\n ms: Date.now() - started,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n },\n });\n } catch (error) {\n result = {\n ok: false,\n error: {\n kind: 'error',\n name: 'Error',\n message: `Code mode could not run the script: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n } finally {\n controller.abort();\n for (const cleanup of cleanups.reverse()) {\n await Promise.resolve()\n .then(cleanup)\n .catch((error: unknown) => {\n const message = `Code mode cleanup failed: ${String(error)}`;\n output.note(message);\n result = { ok: false, error: { kind: 'error', name: 'CleanupError', message } };\n });\n }\n running -= 1;\n }\n return toResult(result, output, saved, calls, approvals);\n };\n\n // ponytail: the cockpit's generic tool item renders both for now; add a poWeb renderer for exec code and images when it earns one.\n // web-plugin-tool-renderers: ignore discover, plain text result\n const discover: CodemodeTools['discover'] = {\n name: 'discover',\n label: 'Discover',\n description:\n 'List the code-mode namespaces and reusable scripts you can use from `exec`, show one namespace in full, ' +\n 'or search members and scripts. ' +\n 'Not required before exec: its description already names the namespaces.',\n parameters: DiscoverToolSchema,\n promptSnippet: 'List code-mode namespaces and their TypeScript declarations',\n executionMode: 'parallel',\n async execute(_toolCallId, parameters: DiscoverToolParams, _signal, _onUpdate, execution) {\n const service = isolate();\n if (!service) return text('Code mode is not available on this host.', true);\n const namespaces = visible(service);\n // Imports need a host with live objects; the edge saves scripts but cannot chain them.\n const listed = scripts && service.liveObjects ? await scripts.list(activeDomains(execution)) : [];\n if (parameters.namespace !== undefined) {\n const found = namespaces.find((namespace) => namespace.name === parameters.namespace);\n if (!found) {\n const names = namespaces.map((namespace) => namespace.name).join(', ') || 'none';\n return text(`Unknown namespace \"${parameters.namespace}\". Registered: ${names}.`, true);\n }\n return text(truncate(found.declarations, MAX_DECLARATION_CHARS));\n }\n if (parameters.query !== undefined) {\n const needle = parameters.query.toLowerCase();\n const hits: string[] = [];\n for (const namespace of namespaces) {\n const lines = namespace.declarations.split('\\n');\n lines.forEach((line, index) => {\n if (!line.toLowerCase().includes(needle) || hits.length >= MAX_QUERY_LINES) return;\n const doc = lines[index - 1]?.trim().startsWith('/**') ? `${lines[index - 1]?.trim()} ` : '';\n hits.push(`${namespace.name}: ${doc}${line.trim()}`);\n });\n }\n for (const script of listed) {\n if (hits.length >= MAX_QUERY_LINES) break;\n if (`${script.specifier} ${script.description}`.toLowerCase().includes(needle)) {\n hits.push(`script ${script.specifier}: ${script.description}`);\n }\n }\n return text(hits.length > 0 ? hits.join('\\n') : `No members or scripts match \"${parameters.query}\".`);\n }\n const sections: string[] = [];\n if (namespaces.length === 0) sections.push('No namespaces are registered in this session.');\n for (const namespace of namespaces) {\n const members = memberNames(namespace).map((member) => gatedLabel(namespace, member));\n sections.push(`- ${namespace.name}: ${namespace.summary}\\n members: ${members.join(', ')}`);\n }\n sections.push(GLOBALS_HELP);\n if (!service.liveObjects) sections.push('This host runs plain JavaScript with JSON-only functions.');\n if (listed.length > 0) {\n sections.push(`Scripts. ${SCRIPTS_HELP}`);\n for (const script of listed.slice(0, MAX_LISTED_SCRIPTS)) {\n sections.push(`- ${script.specifier}${script.description ? `: ${script.description}` : ''}`);\n }\n if (listed.length > MAX_LISTED_SCRIPTS) {\n sections.push(`...and ${listed.length - MAX_LISTED_SCRIPTS} more; use discover({ query }) to search.`);\n }\n }\n if (namespaces.length > 0) sections.push('Call discover({ namespace }) for full types.');\n return text(sections.join('\\n'));\n },\n };\n\n // web-plugin-tool-renderers: ignore exec, generic item until a code and image renderer exists\n const exec: CodemodeTools['exec'] = {\n name: 'exec',\n label: 'Exec',\n get description(): string {\n const service = isolate();\n const namespaces = service ? visible(service) : [];\n const listed = namespaces.map((namespace) => `- ${namespace.name}: ${namespace.summary}`).join('\\n');\n return [\n 'Run a TypeScript script inside the Po server with live objects from the namespaces below in scope.',\n 'It runs with full server trust, like bash. Keep each call to one logical step.',\n listed || '(no namespaces registered yet; call discover to check)',\n GLOBALS_HELP,\n ...(scripts && service?.liveObjects\n ? [`${SCRIPTS_HELP} discover lists saved and domain scripts.`, ...domainScriptsHelp()]\n : []),\n 'Use discover({ namespace }) for full signatures when needed.',\n ].join('\\n');\n },\n parameters: ExecToolSchema,\n promptSnippet: 'Run a TypeScript script against live Po objects (browser and other namespaces)',\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecToolParams, signal, _onUpdate, execution) {\n return executeCode(\n parameters,\n signal,\n execution,\n Math.min(MAX_TIMEOUT_MS, Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? DEFAULT_TIMEOUT_MS)),\n toolCallId,\n );\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_background, immediate job identity only\n const execBackground: CodemodeTools['execBackground'] = {\n name: 'exec_background',\n label: 'Background Exec',\n description:\n 'Run a long-lived Node code-mode script. Returns its ID immediately; one completion message arrives after execution and cleanup. End the turn rather than polling. Full server trust, like exec.',\n parameters: ExecBackgroundToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(toolCallId, parameters: ExecBackgroundToolParams, signal, _onUpdate, execution) {\n if (signal?.aborted) return text('Background exec launch was aborted.', true);\n if (closing || ownerSignal.aborted) return text('Code mode session is disposing.', true);\n if (!isolate()?.liveObjects) return text('Background exec requires a Node host with live objects.', true);\n if (!execution.session?.admitMessage)\n return text('This session cannot admit background exec completion messages.', true);\n if (running >= MAX_CONCURRENT_RUNS)\n return text(`This session already has ${MAX_CONCURRENT_RUNS} exec runs active. Wait for one to finish.`, true);\n const deadlineMs = Math.min(\n BACKGROUND_MAX_TIMEOUT_MS,\n Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? BACKGROUND_DEFAULT_TIMEOUT_MS),\n );\n const id = crypto.randomUUID();\n const controller = new AbortController();\n const job: BackgroundExec = {\n id,\n sessionId: execution.sessionId,\n controller,\n status: 'running',\n done: Promise.resolve(),\n };\n jobs.set(id, job);\n onBackgroundChange?.();\n job.done = (async () => {\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, deadlineMs);\n try {\n const result = await executeCode(parameters, controller.signal, execution, deadlineMs, toolCallId, true);\n clearTimeout(timer);\n job.status = 'reporting';\n onBackgroundChange?.();\n const status = timedOut\n ? 'timed-out'\n : controller.signal.aborted\n ? 'stopped'\n : result.isError\n ? 'failed'\n : 'completed';\n const message = {\n type: 'po-codemode-finished',\n text: `Background exec ${id} ${status}.\\n${result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n')}`,\n display: true,\n details: { id, status, result },\n };\n let warned = false;\n while (!ownerSignal.aborted) {\n let stopAdmission: (() => void) | undefined;\n try {\n const stopped = new Promise<void>((resolve) => {\n stopAdmission = resolve;\n ownerSignal.addEventListener('abort', stopAdmission, { once: true });\n if (ownerSignal.aborted) resolve();\n });\n await Promise.race([\n execution.session.admitMessage!(message, 'steer', `po-codemode-finished:${execution.sessionId}:${id}`),\n stopped,\n ]);\n break;\n } catch (error) {\n if (ownerSignal.aborted) break;\n if (!warned) {\n warned = true;\n await Promise.resolve()\n .then(() =>\n execution.client.notify({\n body: `Background exec completion admission failed; retrying: ${String(error)}`,\n level: 'warning',\n }),\n )\n .catch(() => undefined);\n }\n await sleep(250, ownerSignal).catch(() => undefined);\n } finally {\n if (stopAdmission) ownerSignal.removeEventListener('abort', stopAdmission);\n }\n }\n } finally {\n clearTimeout(timer);\n jobs.delete(id);\n onBackgroundChange?.();\n }\n })();\n return { ...text(JSON.stringify({ id })), details: { id } };\n },\n };\n\n // web-plugin-tool-renderers: ignore exec_cancel, immediate cancellation acknowledgement\n const execCancel: CodemodeTools['execCancel'] = {\n name: 'exec_cancel',\n label: 'Cancel Exec',\n description: 'Cancel a background exec in this session. Its terminal message follows child cleanup.',\n parameters: ExecCancelToolSchema,\n mainAgentOnly: true,\n executionMode: 'serial',\n async execute(_toolCallId, parameters: ExecCancelToolParams, _signal, _onUpdate, execution) {\n const job = jobs.get(parameters.id);\n if (job && job.sessionId !== execution.sessionId)\n return text('Background exec belongs to another session.', true);\n if (job?.status === 'running') job.controller.abort(parameters.reason ? new Error(parameters.reason) : undefined);\n return text(JSON.stringify({ id: parameters.id, status: job?.status === 'running' ? 'stopping' : 'finished' }));\n },\n };\n\n const runApproved: CodemodeTools['runApproved'] = async (call, signal, sessionId) => {\n const name = call.operation.name;\n const [namespaceName, ...path] = name.split('.');\n const namespace = registry.list().find((entry) => entry.name === namespaceName);\n if (namespace === undefined || path.length === 0) throw new Error(`'${name}' is no longer active. Nothing ran.`);\n // Only a member that still declares approval is replayed, so a changed namespace cannot widen what runs.\n if (namespace.approval?.[path.join('.')] === undefined)\n throw new Error(`'${name}' no longer asks for approval, so it was not replayed. Nothing ran.`);\n signal.throwIfAborted();\n // Old receipts contain one input, including when that input itself is an array.\n const args = call.argumentFormat === 'positional' ? call.input : [call.input];\n if (!Array.isArray(args)) throw new Error(`'${name}' has an invalid saved argument list. Nothing ran.`);\n const cleanups: (() => void | Promise<void>)[] = [];\n const bound = namespace.bind({\n source: '',\n sessionId,\n caller: 'main',\n toolCallId: `approval:${call.approvalId}`,\n interaction: 'interactive',\n signal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: () => undefined,\n emitImage: () => ({ emitted: false, warning: 'An approved call cannot show images.' }),\n });\n try {\n let receiver: unknown = bound;\n let member: unknown = bound;\n for (const key of path) {\n receiver = member;\n member = typeof member === 'object' && member !== null ? Reflect.get(member, key, member) : undefined;\n }\n if (typeof member !== 'function') throw new Error(`'${name}' is no longer active. Nothing ran.`);\n return await Reflect.apply(member, receiver, args);\n } finally {\n for (const cleanup of cleanups.reverse()) await cleanup();\n }\n };\n\n return {\n discover,\n exec,\n execBackground,\n execCancel,\n backgroundWork,\n runApproved,\n async dispose() {\n closing = true;\n unsubscribe();\n lifecycle.abort();\n await Promise.all([...jobs.values()].map((job) => job.done));\n },\n };\n}\n"],"mappings":"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"}