@agimon-ai/po-codemode 0.0.1-alpha.4 → 0.0.1-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["DECLARATIONS","Check","request","contribution","rootSession","contractCodemode","resourceCodemodeHowToLlm","resourceCodemodeHowToShell","resourceHowToCodemode","toolDiscover","toolExec"],"sources":["../../src/services/codemodeScripts/index.ts","../../src/schemas/packageConfig.ts","../../src/services/llmConfig/index.ts","../../src/services/llmNamespace/index.ts","../../src/services/shellNamespace/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/contract/codemode.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-llm.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-shell.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/how-to-codemode.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/discover.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/exec.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoCodemodeService } from '@agimon-ai/po-core/codemode';\nimport { BACKGROUND_CONTEXT, getOrThrow, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport type { CodemodeScriptEntry, CodemodeScriptsPort } from './type';\n\nconst SESSION_FOLDER = 'codemode';\nconst SESSION_PREFIX = 'session:';\nconst EXTENSION = '.ts';\nconst EXEC_FILE = /^exec-(\\d+)\\.ts$/u;\nconst DOC_COMMENT = /^\\s*\\/\\*\\*([\\s\\S]*?)\\*\\//u;\nconst MAX_DESCRIPTION_CHARS = 160;\nconst DEFAULT_LIST_LIMIT = 200;\n\nexport interface CodemodeScriptsOptions {\n readonly registry: PoCodemodeService;\n /** Resolved per call, so services bound after the root still work. */\n readonly fs: () => FileSystem | undefined;\n /** The session's `po/session-files` temporary directory. */\n readonly temporaryDirectory: () => string | undefined;\n}\n\nconst withExtension = (name: string): string => (name.endsWith(EXTENSION) ? name : `${name}${EXTENSION}`);\n\n/** First paragraph of a leading `/** ... *\\/` comment, else the first line of code, on one line. */\nexport function describeScript(source: string): string {\n const doc = DOC_COMMENT.exec(source)?.[1];\n const lines = doc === undefined ? source.split('\\n') : doc.split('\\n').map((line) => line.replace(/^\\s*\\*\\s?/u, ''));\n const paragraph: string[] = [];\n for (const line of lines.map((item) => item.trim())) {\n if (line) paragraph.push(line);\n else if (paragraph.length > 0) break;\n if (doc === undefined && paragraph.length > 0) break;\n }\n const text = paragraph.join(' ');\n return text.length <= MAX_DESCRIPTION_CHARS ? text : `${text.slice(0, MAX_DESCRIPTION_CHARS - 3)}...`;\n}\n\n/** Session scripts live in `<temporaryDirectory>/codemode`; domain scripts in registered folders. */\nexport class FileSystemCodemodeScriptsService implements CodemodeScriptsPort {\n constructor(private readonly options: CodemodeScriptsOptions) {}\n\n private sessionDirectory(): string | undefined {\n const base = this.options.temporaryDirectory();\n return base === undefined ? undefined : `${base}/${SESSION_FOLDER}`;\n }\n\n private requireFs(): FileSystem {\n const fs = this.options.fs();\n if (!fs) throw new Error('Saved scripts need a file system, which this host does not provide.');\n return fs;\n }\n\n private sources(domains?: readonly string[]) {\n return this.options.registry.listScripts().filter((source) => !domains || domains.includes(source.domain));\n }\n\n /** `.ts` file names in a folder; a missing folder has none. */\n private async names(fs: FileSystem, directory: string): Promise<string[]> {\n const listed = await fs.listDir(directory, BACKGROUND_CONTEXT);\n if (!listed.ok && listed.error.code === 'not_found') return [];\n return getOrThrow(listed)\n .filter((info) => info.kind === 'file' && info.name.endsWith(EXTENSION))\n .map((info) => info.name)\n .sort((left, right) => left.localeCompare(right, undefined, { numeric: true }));\n }\n\n async save(code: string) {\n const fs = this.options.fs();\n const directory = this.sessionDirectory();\n if (!fs || directory === undefined) return undefined;\n getOrThrow(await fs.createDir(directory, { recursive: true }, BACKGROUND_CONTEXT));\n const taken = (await this.names(fs, directory)).map((name) => Number(EXEC_FILE.exec(name)?.[1] ?? 0));\n const name = `exec-${Math.max(0, ...taken) + 1}`;\n const path = `${directory}/${name}${EXTENSION}`;\n getOrThrow(await fs.writeFile(path, code, BACKGROUND_CONTEXT));\n return { specifier: `${SESSION_PREFIX}${name}`, path };\n }\n\n private candidates(specifier: string, domains?: readonly string[]): string[] {\n if (specifier.startsWith('/')) return [specifier];\n const session = this.sessionDirectory();\n if (specifier.startsWith(SESSION_PREFIX)) {\n return session === undefined ? [] : [`${session}/${withExtension(specifier.slice(SESSION_PREFIX.length))}`];\n }\n const slash = specifier.indexOf('/');\n const domain = slash > 0 ? specifier.slice(0, slash) : undefined;\n const folders = this.sources(domains).filter((source) => source.domain === domain);\n if (folders.length > 0) {\n return folders.map((source) => `${source.directory}/${withExtension(specifier.slice(slash + 1))}`);\n }\n if (session !== undefined && (specifier.startsWith('.') || specifier.endsWith(EXTENSION))) {\n return [`${session}/${withExtension(specifier.replace(/^\\.\\//u, ''))}`];\n }\n return [];\n }\n\n async resolve(specifier: string, domains?: readonly string[]) {\n const fs = this.requireFs();\n for (const path of this.candidates(specifier, domains)) {\n const read = await fs.readTextFile(path, BACKGROUND_CONTEXT);\n if (read.ok) return { id: path, source: read.value };\n if (read.error.code !== 'not_found') getOrThrow(read);\n }\n const available = (await this.list(domains)).map((entry) => entry.specifier).join(', ') || 'none';\n throw new Error(`Unknown script \"${specifier}\". Available: ${available}.`);\n }\n\n async list(domains?: readonly string[], limit = DEFAULT_LIST_LIMIT): Promise<CodemodeScriptEntry[]> {\n const fs = this.options.fs();\n if (!fs) return [];\n const found: { specifier: string; path: string }[] = [];\n for (const source of this.sources(domains)) {\n for (const name of await this.names(fs, source.directory)) {\n found.push({\n specifier: `${source.domain}/${name.slice(0, -EXTENSION.length)}`,\n path: `${source.directory}/${name}`,\n });\n }\n }\n const session = this.sessionDirectory();\n if (session !== undefined) {\n for (const name of (await this.names(fs, session)).reverse()) {\n found.push({ specifier: `${SESSION_PREFIX}${name.slice(0, -EXTENSION.length)}`, path: `${session}/${name}` });\n }\n }\n const entries: CodemodeScriptEntry[] = [];\n for (const entry of found.slice(0, limit)) {\n const read = await fs.readTextFile(entry.path, BACKGROUND_CONTEXT);\n entries.push({ ...entry, description: read.ok ? describeScript(read.value) : '' });\n }\n return entries;\n }\n}\n","import { Type, type Static } from 'typebox';\n\nexport const CODEMODE_PACKAGE = '@agimon-ai/po-codemode';\nexport const CodemodePackageConfigSchema = Type.Object(\n { llmModel: Type.Optional(Type.String({ pattern: '^[^/\\\\s]+/\\\\S+$', maxLength: 256 })) },\n { additionalProperties: false },\n);\nexport type CodemodePackageConfig = Static<typeof CodemodePackageConfigSchema>;\n","import type { PoConfigContext } from '@agimon-ai/po-config';\nimport { readMajorModesConfig, readPackageConfigurations } from '@agimon-ai/po-config/majorModes';\nimport { BACKGROUND_CONTEXT } from '@agimon-ai/po-core/platform';\nimport { Check } from 'typebox/value';\n\nimport { CODEMODE_PACKAGE, CodemodePackageConfigSchema, type CodemodePackageConfig } from '../../schemas/packageConfig';\nimport type { LlmConfigOptions } from './type';\n\nexport const PO_CODEMODE_LLM_CONFIG_SERVICE = 'po/codemode-llm-config';\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'po/codemode-llm-config': LlmConfigService;\n }\n}\n\n/** Session policy is loaded once per immutable Po config snapshot, including failed loads. */\nexport class LlmConfigService {\n private snapshot?: () => PoConfigContext;\n private readonly loads = new WeakMap<PoConfigContext, Promise<CodemodePackageConfig>>();\n\n constructor(private readonly io: LlmConfigOptions) {}\n\n bind(snapshot: () => PoConfigContext): () => void {\n this.snapshot = snapshot;\n return () => {\n if (this.snapshot === snapshot) this.snapshot = undefined;\n };\n }\n\n current(): Promise<CodemodePackageConfig> {\n if (!this.snapshot) return Promise.resolve({});\n const snapshot = this.snapshot();\n let load = this.loads.get(snapshot);\n if (!load) {\n load = this.load(snapshot);\n this.loads.set(snapshot, load);\n }\n return load;\n }\n\n private async load(snapshot: PoConfigContext): Promise<CodemodePackageConfig> {\n if (!snapshot.harness.root) return {};\n const { environment, homeDirectory } = this.io;\n const fs = this.io.fs();\n if (!fs || !homeDirectory) throw new Error('Code mode LLM configuration requires host filesystem and home.');\n const modes = await readMajorModesConfig(fs, snapshot.harness.root, BACKGROUND_CONTEXT, {\n environment,\n homeDirectory,\n });\n const configurations = await readPackageConfigurations(\n fs,\n modes,\n [...snapshot.harness.layers],\n CODEMODE_PACKAGE,\n BACKGROUND_CONTEXT,\n );\n let merged: CodemodePackageConfig = {};\n for (const entry of configurations) {\n if (!Check(CodemodePackageConfigSchema, entry.config)) {\n throw new TypeError('Invalid code mode package configuration: llmModel must be provider/modelId.');\n }\n merged = { ...merged, ...entry.config };\n }\n return merged;\n }\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\nimport type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { Check, Errors, Meta } from 'typebox/schema';\n\nimport type { LlmNamespace, LlmNamespaceOptions, LlmRequest } from './type';\n\nconst MAX_INPUT_BYTES = 64 * 1024;\nconst MAX_SCHEMA_BYTES = 16 * 1024;\nconst MAX_OUTPUT_BYTES = 64 * 1024;\nconst MAX_CALLS = 8;\nconst MAX_CONCURRENT = 2;\nconst DEFAULT_TOKENS = 1024;\nconst MAX_TOKENS = 4096;\nconst RESULT_TOOL = 'return_result';\nconst MODEL = /^[^/\\s]+\\/\\S+$/u;\nconst META = Meta['http://json-schema.org/draft-07/schema#'];\nconst DECLARATIONS = `interface LlmRequest {\n prompt: string;\n /** Explicit JSON input only, never the surrounding conversation. */\n input?: unknown;\n system?: string;\n /** provider/modelId; overrides llmModel config and the live session model. */\n model?: string;\n /** Defaults to 1024, maximum 4096. */\n maxTokens?: number;\n}\ndeclare const llm: {\n /** One-shot text transform. At most 8 calls per exec, 2 concurrently. */\n complete(request: LlmRequest): Promise<{ text: string; model: string }>;\n /** Object-root JSON Schema (draft 7), local nonrecursive refs only. Invalid output rejects without retry. */\n json(request: LlmRequest & { schema: Record<string, unknown> }): Promise<{ value: unknown; model: string }>;\n};`;\n\nfunction jsonText(value: unknown, limit: number, label: string): string {\n const json = JSON.stringify(value, (_key, item: unknown) => {\n if (\n item === undefined ||\n typeof item === 'function' ||\n typeof item === 'symbol' ||\n typeof item === 'bigint' ||\n (typeof item === 'number' && !Number.isFinite(item))\n ) {\n throw new TypeError(`${label} must be JSON serializable.`);\n }\n return item;\n });\n if (json === undefined) throw new TypeError(`${label} must be JSON serializable.`);\n if (new TextEncoder().encode(json).length > limit) throw new RangeError(`${label} exceeds ${limit} bytes.`);\n return json;\n}\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// ponytail: draft-7 object schemas and nonrecursive local refs only; broaden after provider/validator coverage exists.\n/** Reject unsupported references and recursive schemas before spending tokens or entering the validator. */\nfunction checkedSchema(value: unknown): Record<string, unknown> {\n const schema: unknown = JSON.parse(jsonText(value, MAX_SCHEMA_BYTES, 'LLM schema'));\n if (!object(schema) || schema.type !== 'object') throw new TypeError('LLM schema must have type: object.');\n if (schema.$schema !== undefined && schema.$schema !== 'http://json-schema.org/draft-07/schema#') {\n throw new TypeError('LLM schema supports JSON Schema draft 7 only.');\n }\n if (!Check(META, schema)) throw new TypeError('Invalid LLM JSON Schema.');\n let expanded = 0;\n const visit = (node: unknown, ancestors: readonly object[]): void => {\n if (!object(node)) return;\n // Count expanded paths, not unique nodes: the result validator also follows every reference.\n if (++expanded > 1024) throw new TypeError('LLM schema exceeds 1024 expanded schema nodes.');\n if (ancestors.length > 32 || ancestors.includes(node)) {\n throw new TypeError('LLM schema references must be nonrecursive and at most 32 levels deep.');\n }\n const stack = [...ancestors, node];\n if (node.$dynamicRef !== undefined || node.$recursiveRef !== undefined || node.$id !== undefined) {\n throw new TypeError('LLM schema supports local $ref only, without $id.');\n }\n if (node.$ref !== undefined) {\n if (typeof node.$ref !== 'string' || !node.$ref.startsWith('#/')) {\n throw new TypeError('LLM schema supports local JSON-pointer $ref only.');\n }\n let resolved: unknown = schema;\n for (const segment of node.$ref.slice(2).split('/')) {\n const key = segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n resolved =\n resolved !== null && typeof resolved === 'object' && Object.hasOwn(resolved, key)\n ? Reflect.get(resolved, key)\n : undefined;\n }\n if (!object(resolved) && typeof resolved !== 'boolean') throw new TypeError('Unresolved LLM schema $ref.');\n visit(resolved, stack);\n }\n for (const key of ['properties', 'patternProperties', 'definitions', '$defs', 'dependencies']) {\n if (object(node[key])) for (const child of Object.values(node[key])) visit(child, stack);\n }\n for (const key of [\n 'items',\n 'additionalItems',\n 'additionalProperties',\n 'contains',\n 'propertyNames',\n 'not',\n 'if',\n 'then',\n 'else',\n 'allOf',\n 'anyOf',\n 'oneOf',\n ]) {\n const child = node[key];\n if (Array.isArray(child)) for (const item of child) visit(item, stack);\n else visit(child, stack);\n }\n };\n visit(schema, []);\n return schema;\n}\n\nfunction request(value: unknown, structured: boolean): LlmRequest & { schema?: Record<string, unknown> } {\n if (!object(value)) throw new TypeError('LLM request must be an object.');\n const allowed = ['prompt', 'input', 'system', 'model', 'maxTokens', ...(structured ? ['schema'] : [])];\n if (Object.keys(value).some((key) => !allowed.includes(key))) throw new TypeError('Unknown LLM request field.');\n if (typeof value.prompt !== 'string' || !value.prompt.trim())\n throw new TypeError('LLM prompt must be nonempty text.');\n if (value.system !== undefined && typeof value.system !== 'string') throw new TypeError('LLM system must be text.');\n if (\n value.model !== undefined &&\n (typeof value.model !== 'string' || !MODEL.test(value.model) || value.model.length > 256)\n ) {\n throw new TypeError('LLM model must be provider/modelId.');\n }\n if (\n value.maxTokens !== undefined &&\n (!Number.isInteger(value.maxTokens) || Number(value.maxTokens) < 1 || Number(value.maxTokens) > MAX_TOKENS)\n ) {\n throw new RangeError(`LLM maxTokens must be an integer from 1 to ${MAX_TOKENS}.`);\n }\n return {\n prompt: value.prompt,\n ...(value.input === undefined ? {} : { input: value.input }),\n ...(value.system === undefined ? {} : { system: value.system as string }),\n ...(value.model === undefined ? {} : { model: value.model as string }),\n ...(value.maxTokens === undefined ? {} : { maxTokens: value.maxTokens as number }),\n ...(structured ? { schema: checkedSchema(value.schema) } : {}),\n };\n}\n\n/** Explicit data transforms over the host's guarded completions, never a tool-using agent. */\nexport function createLlmNamespace(options: LlmNamespaceOptions): PoCodemodeNamespace {\n const { context } = options;\n return {\n name: 'llm',\n summary:\n 'One-shot LLM text and schema-validated JSON transforms. Explicit input only, bounded calls, no tools or retries.',\n declarations: DECLARATIONS,\n portable: true,\n bind(run) {\n if (run.sessionId !== context.sessionId) throw new Error('LLM namespace belongs to another session.');\n let disposed = false;\n let calls = 0;\n let active = 0;\n run.onDispose(() => {\n disposed = true;\n });\n const available = (): void => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('LLM namespace run is disposed.');\n };\n const call = async (\n input: unknown,\n structured: boolean,\n ): Promise<{ text: string; model: string } | { value: unknown; model: string }> => {\n available();\n if (calls >= MAX_CALLS) throw new RangeError(`At most ${MAX_CALLS} LLM calls per exec.`);\n if (active >= MAX_CONCURRENT) throw new RangeError(`At most ${MAX_CONCURRENT} concurrent LLM calls per exec.`);\n const params = request(input, structured);\n const userInput =\n params.input === undefined\n ? params.prompt\n : `${params.prompt}\\n\\nInput (JSON):\\n${jsonText(params.input, MAX_INPUT_BYTES, 'LLM input')}`;\n const systemPrompt = `${params.system ?? 'Transform only the explicit input according to the request.'}${structured ? '\\nCall return_result exactly once with the result. Do not call other tools.' : ''}`;\n if (new TextEncoder().encode(systemPrompt + userInput).length > MAX_INPUT_BYTES)\n throw new RangeError('LLM prompt and input exceed 65536 bytes.');\n active += 1;\n const started = Date.now();\n let model: string | undefined;\n let tokens: number | undefined;\n const record = (ok: boolean, error?: string): void =>\n run.record?.({\n name: structured ? 'llm.json' : 'llm.complete',\n tool: 'llm',\n args: { ...(model ? { model } : {}), maxTokens: params.maxTokens ?? DEFAULT_TOKENS },\n ok,\n ms: Date.now() - started,\n ...(error === undefined ? {} : { error }),\n ...(tokens === undefined ? {} : { result: { content: [], details: { totalTokens: tokens } } }),\n });\n try {\n const config = await options.config();\n const current =\n params.model || config.llmModel\n ? undefined\n : ((await context.session.readModelSettings?.())?.model ?? context.model);\n model = params.model ?? config.llmModel ?? (current ? `${current.provider}/${current.id}` : undefined);\n available();\n if (!model || !context.textCompletion?.available(model))\n throw new Error(`LLM model is unavailable${model ? `: ${model}` : ''}.`);\n if (structured ? !context.toolCompletion : !context.textCompletion)\n throw new Error('LLM completion is unavailable on this host.');\n if (calls >= MAX_CALLS) throw new RangeError(`At most ${MAX_CALLS} LLM calls per exec.`);\n calls += 1;\n const completion = {\n systemPrompt,\n input: userInput,\n maxTokens: params.maxTokens ?? DEFAULT_TOKENS,\n signal: run.signal,\n recordUsage: true,\n };\n if (!structured) {\n const text = await context.textCompletion.complete(model, completion);\n available();\n jsonText(text, MAX_OUTPUT_BYTES, 'LLM output');\n record(true);\n return { text, model };\n }\n const schema = params.schema!;\n const response = await context.toolCompletion!.complete(model, {\n ...completion,\n tools: [\n {\n name: RESULT_TOOL,\n description: 'Return the requested structured result.',\n parameters: schema as PoHeadlessTool['parameters'],\n },\n ],\n });\n tokens = response.usage.totalTokens;\n available();\n if (response.toolCalls.length !== 1 || response.toolCalls[0]?.name !== RESULT_TOOL)\n throw new Error('LLM must return exactly one return_result call.');\n const value: unknown = JSON.parse(jsonText(response.toolCalls[0].arguments, MAX_OUTPUT_BYTES, 'LLM output'));\n if (!Check(schema, value)) {\n const [, errors] = Errors(schema, value);\n throw new TypeError(`LLM result failed schema validation: ${errors[0]?.message ?? 'invalid result'}`);\n }\n record(true);\n return { value, model };\n } catch (error) {\n record(false, error instanceof Error ? error.message : String(error));\n throw error;\n } finally {\n active -= 1;\n }\n };\n return {\n complete: (input) => call(input, false) as Promise<{ text: string; model: string }>,\n json: (input) => call(input, true) as Promise<{ value: unknown; model: string }>,\n } satisfies LlmNamespace;\n },\n };\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\nimport { BACKGROUND_CONTEXT, getOrThrow, withAbortSignal } from '@agimon-ai/po-core/platform';\n\nimport type { ShellBashRequest, ShellBashResult, ShellNamespaceOptions } from './type';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst MAX_COMMAND_CHARS = 64 * 1024;\nconst MAX_OUTPUT_CHARS = 32 * 1024;\nconst TRUNCATED = '\\n[truncated]';\nconst DECLARATIONS = `declare const shell: {\n /** Short foreground Bash command in the session cwd/environment. Nonzero exits are returned; cancellation and timeout reject. */\n bash(input: { command: string; timeoutMs?: number }): Promise<{ stdout: string; stderr: string; exitCode: number }>;\n};`;\n\nfunction request(input: unknown): ShellBashRequest {\n if (input === null || typeof input !== 'object' || Array.isArray(input))\n throw new TypeError('shell.bash expects an object.');\n const value = input as Record<string, unknown>;\n if (Object.keys(value).some((key) => key !== 'command' && key !== 'timeoutMs'))\n throw new TypeError('shell.bash accepts only command and timeoutMs.');\n if (typeof value.command !== 'string' || !value.command.trim() || value.command.length > MAX_COMMAND_CHARS)\n throw new TypeError(`shell.bash command must be nonempty text of at most ${MAX_COMMAND_CHARS} characters.`);\n if (\n value.timeoutMs !== undefined &&\n (!Number.isInteger(value.timeoutMs) || Number(value.timeoutMs) < 1 || Number(value.timeoutMs) > MAX_TIMEOUT_MS)\n )\n throw new RangeError(`shell.bash timeoutMs must be an integer from 1 to ${MAX_TIMEOUT_MS}.`);\n return { command: value.command, timeoutMs: value.timeoutMs as number | undefined };\n}\n\n/** Deadline-bound commands for post-processing, separate from Runner's supervised processes. */\nexport function createShellNamespace(options: ShellNamespaceOptions): PoCodemodeNamespace {\n return {\n name: 'shell',\n summary:\n 'Run short foreground Bash commands with bounded stdout/stderr and a deadline. No background or interactive mode.',\n declarations: DECLARATIONS,\n portable: true,\n bind(run) {\n if (run.sessionId !== options.context.sessionId) throw new Error('Shell namespace belongs to another session.');\n const disposal = new AbortController();\n const lifetime = AbortSignal.any([run.signal, disposal.signal]);\n run.onDispose(() => disposal.abort(new Error('Shell namespace run is disposed.')));\n return {\n async bash(input: unknown): Promise<ShellBashResult> {\n lifetime.throwIfAborted();\n const params = request(input);\n const shell = options.shell();\n if (!shell) throw new Error('Shell commands are not available on this host.');\n const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const signal = AbortSignal.any([lifetime, AbortSignal.timeout(timeoutMs)]);\n const output = { stdout: '', stderr: '' };\n const truncated = { stdout: false, stderr: false };\n const started = Date.now();\n let ok = false;\n let failure: string | undefined;\n try {\n const result = await shell.exec(\n params.command,\n {\n cwd: options.context.cwd,\n env: Object.fromEntries(\n Object.entries(options.context.environment).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n ),\n inheritEnv: false,\n onOutput: (text, _context, { stream }) => {\n const remaining = MAX_OUTPUT_CHARS - output[stream].length;\n output[stream] += text.slice(0, remaining);\n if (text.length > remaining) truncated[stream] = true;\n },\n },\n withAbortSignal(signal, BACKGROUND_CONTEXT),\n );\n signal.throwIfAborted();\n const { exitCode } = getOrThrow(result);\n ok = exitCode === 0;\n return {\n stdout: output.stdout + (truncated.stdout ? TRUNCATED : ''),\n stderr: output.stderr + (truncated.stderr ? TRUNCATED : ''),\n exitCode,\n };\n } catch (error) {\n failure = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n run.record?.({\n name: 'shell.bash',\n tool: 'shell',\n args: { timeoutMs },\n ok,\n ms: Date.now() - started,\n ...(failure === undefined ? {} : { error: failure }),\n });\n }\n },\n };\n },\n };\n}\n","import { PO_CONFIG_SERVICE } from '@agimon-ai/po-config';\nimport { PO_CODEMODE_CONTRACT } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport {\n PO_SESSION_FILES_SERVICE,\n PO_SHELL_SERVICE,\n readPoFs,\n readPoIsolate,\n readPoNpm,\n} from '@agimon-ai/po-core/platform';\nimport {\n PO_SERVER_SCOPE_SERVICE,\n requirePoServerScope,\n type PoServerPluginContext,\n} from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createCodemodeRegistry } from '../../../../../services/codemodeRegistry';\nimport { FileSystemCodemodeScriptsService } from '../../../../../services/codemodeScripts';\nimport { createCodemodeTools } from '../../../../../services/codemodeTools';\nimport { LlmConfigService, PO_CODEMODE_LLM_CONFIG_SERVICE } from '../../../../../services/llmConfig';\nimport { createLlmNamespace } from '../../../../../services/llmNamespace';\nimport { createShellNamespace } from '../../../../../services/shellNamespace';\n\n/** One registry per session: contributors register into it, `discover` and `exec` read it. */\nexport function createCodemodeSession({ context, agent, host }: PoServerPluginContext) {\n const registry = createCodemodeRegistry();\n // The binding unwinds with this injected fiber, so the root needs no withdraw of its own.\n context.inject([PO_SERVER_SCOPE_SERVICE], (scoped) =>\n requirePoServerScope(scoped).provide(PO_CODEMODE_CONTRACT, registry),\n );\n let temporaryDirectory: string | undefined;\n context.inject([PO_SESSION_FILES_SERVICE], (scoped) => {\n temporaryDirectory = scoped.get(PO_SESSION_FILES_SERVICE)?.temporaryDirectory;\n return () => {\n temporaryDirectory = undefined;\n };\n });\n const scripts = new FileSystemCodemodeScriptsService({\n registry,\n fs: () => readPoFs(context),\n temporaryDirectory: () => temporaryDirectory,\n });\n const execution = agent?.context;\n const config = execution\n ? new LlmConfigService({\n fs: () => readPoFs(context),\n environment: execution.environment,\n homeDirectory: host.context.homeDirectory,\n })\n : undefined;\n let disposeNamespaces: (() => void) | undefined;\n if (execution && config) {\n context.inject([PO_CONFIG_SERVICE], (scoped) => {\n const service = scoped.get(PO_CONFIG_SERVICE);\n return service ? config.bind(() => service.getSnapshot()) : undefined;\n });\n const registration = registry.register(\n '@agimon-ai/po-codemode',\n createLlmNamespace({ context: execution, config: () => config.current() }),\n );\n const shellRegistration = registry.register(\n '@agimon-ai/po-codemode',\n createShellNamespace({\n context: execution,\n shell: () => context.get(PO_SHELL_SERVICE),\n }),\n );\n disposeNamespaces = () => {\n registration.dispose();\n shellRegistration.dispose();\n };\n }\n const tools = createCodemodeTools({\n registry,\n isolate: () => readPoIsolate(context),\n npm: () => readPoNpm(context),\n scripts,\n });\n return {\n value: { registry, ...tools },\n services: [\n (scoped: Context) => {\n if (config) scoped.provide(PO_CODEMODE_LLM_CONFIG_SERVICE, config);\n },\n ],\n onDispose: () => disposeNamespaces?.(),\n };\n}\n\nconst root = defineRoot(createCodemodeSession);\nexport type CodemodeServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { PO_CODEMODE_SERVICE, type PoCodemodeService } from '@agimon-ai/po-core/codemode';\nimport { defineServiceContract } from '@agimon-ai/po-core/extensionFile';\n\nexport default defineServiceContract<PoCodemodeService>(PO_CODEMODE_SERVICE, { scope: 'session' });\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-llm',\n description: 'Use the llm namespace for one-shot text and schema-checked JSON transformations inside exec.',\n pinned: true,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-llm/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-llm/SKILL.md'),\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-shell',\n description: 'Use shell.bash for short deadline-bound Bash commands and code-side output post-processing.',\n pinned: true,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-shell/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-shell/SKILL.md'),\n});\n","// @scaffold-generated\nimport { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'how-to-codemode',\n description:\n 'Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute',\n pinned: true,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/how-to-codemode/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/how-to-codemode/SKILL.md'),\n});\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { CodemodeServerScope } from '../_lib/root.server';\n\nexport default defineServerTool(\n (context: WithRoot<PoServerPluginContext, CodemodeServerScope>) => context.root.discover,\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { CodemodeServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<PoServerPluginContext, CodemodeServerScope>) => context.root.exec);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport contractCodemode from '../src/extensions/workspaces/sessions/(backend)/contract/codemode.server';\nimport resourceCodemodeHowToLlm from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-llm.server';\nimport resourceCodemodeHowToShell from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-shell.server';\nimport resourceHowToCodemode from '../src/extensions/workspaces/sessions/(backend)/resource/how-to-codemode.server';\nimport toolDiscover from '../src/extensions/workspaces/sessions/(backend)/tool/discover.server';\nimport toolExec from '../src/extensions/workspaces/sessions/(backend)/tool/exec.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-codemode',\n providerOverrides: composeServerProviderOverrides(rootSession),\n provides: {\n session: [contractCodemode],\n },\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToLlm, contextSession), at(resourceCodemodeHowToShell, contextSession), at(resourceHowToCodemode, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'discover' }, at(toolDiscover, contextSession)), via({ name: 'exec' }, at(toolExec, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":["DECLARATIONS","Check","request","contribution","rootSession","contractCodemode","resourceCodemodeHowToLlm","resourceCodemodeHowToShell","resourceHowToCodemode","toolDiscover","toolExecBackground","toolExecCancel","toolExec"],"sources":["../../src/services/codemodeScripts/index.ts","../../src/schemas/packageConfig.ts","../../src/services/llmConfig/index.ts","../../src/services/llmNamespace/index.ts","../../src/services/shellNamespace/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/contract/codemode.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-llm.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-shell.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/how-to-codemode.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/discover.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/exec_background.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/exec_cancel.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/exec.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoCodemodeService } from '@agimon-ai/po-core/codemode';\nimport { BACKGROUND_CONTEXT, getOrThrow, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport type { CodemodeScriptEntry, CodemodeScriptsPort } from './type';\n\nconst SESSION_FOLDER = 'codemode';\nconst SESSION_PREFIX = 'session:';\nconst EXTENSION = '.ts';\nconst EXEC_FILE = /^exec-(\\d+)\\.ts$/u;\nconst DOC_COMMENT = /^\\s*\\/\\*\\*([\\s\\S]*?)\\*\\//u;\nconst MAX_DESCRIPTION_CHARS = 160;\nconst DEFAULT_LIST_LIMIT = 200;\n\nexport interface CodemodeScriptsOptions {\n readonly registry: PoCodemodeService;\n /** Resolved per call, so services bound after the root still work. */\n readonly fs: () => FileSystem | undefined;\n /** The session's `po/session-files` temporary directory. */\n readonly temporaryDirectory: () => string | undefined;\n}\n\nconst withExtension = (name: string): string => (name.endsWith(EXTENSION) ? name : `${name}${EXTENSION}`);\n\n/** First paragraph of a leading `/** ... *\\/` comment, else the first line of code, on one line. */\nexport function describeScript(source: string): string {\n const doc = DOC_COMMENT.exec(source)?.[1];\n const lines = doc === undefined ? source.split('\\n') : doc.split('\\n').map((line) => line.replace(/^\\s*\\*\\s?/u, ''));\n const paragraph: string[] = [];\n for (const line of lines.map((item) => item.trim())) {\n if (line) paragraph.push(line);\n else if (paragraph.length > 0) break;\n if (doc === undefined && paragraph.length > 0) break;\n }\n const text = paragraph.join(' ');\n return text.length <= MAX_DESCRIPTION_CHARS ? text : `${text.slice(0, MAX_DESCRIPTION_CHARS - 3)}...`;\n}\n\n/** Session scripts live in `<temporaryDirectory>/codemode`; domain scripts in registered folders. */\nexport class FileSystemCodemodeScriptsService implements CodemodeScriptsPort {\n constructor(private readonly options: CodemodeScriptsOptions) {}\n\n private sessionDirectory(): string | undefined {\n const base = this.options.temporaryDirectory();\n return base === undefined ? undefined : `${base}/${SESSION_FOLDER}`;\n }\n\n private requireFs(): FileSystem {\n const fs = this.options.fs();\n if (!fs) throw new Error('Saved scripts need a file system, which this host does not provide.');\n return fs;\n }\n\n private sources(domains?: readonly string[]) {\n return this.options.registry.listScripts().filter((source) => !domains || domains.includes(source.domain));\n }\n\n /** `.ts` file names in a folder; a missing folder has none. */\n private async names(fs: FileSystem, directory: string): Promise<string[]> {\n const listed = await fs.listDir(directory, BACKGROUND_CONTEXT);\n if (!listed.ok && listed.error.code === 'not_found') return [];\n return getOrThrow(listed)\n .filter((info) => info.kind === 'file' && info.name.endsWith(EXTENSION))\n .map((info) => info.name)\n .sort((left, right) => left.localeCompare(right, undefined, { numeric: true }));\n }\n\n async save(code: string) {\n const fs = this.options.fs();\n const directory = this.sessionDirectory();\n if (!fs || directory === undefined) return undefined;\n getOrThrow(await fs.createDir(directory, { recursive: true }, BACKGROUND_CONTEXT));\n const taken = (await this.names(fs, directory)).map((name) => Number(EXEC_FILE.exec(name)?.[1] ?? 0));\n const name = `exec-${Math.max(0, ...taken) + 1}`;\n const path = `${directory}/${name}${EXTENSION}`;\n getOrThrow(await fs.writeFile(path, code, BACKGROUND_CONTEXT));\n return { specifier: `${SESSION_PREFIX}${name}`, path };\n }\n\n private candidates(specifier: string, domains?: readonly string[]): string[] {\n if (specifier.startsWith('/')) return [specifier];\n const session = this.sessionDirectory();\n if (specifier.startsWith(SESSION_PREFIX)) {\n return session === undefined ? [] : [`${session}/${withExtension(specifier.slice(SESSION_PREFIX.length))}`];\n }\n const slash = specifier.indexOf('/');\n const domain = slash > 0 ? specifier.slice(0, slash) : undefined;\n const folders = this.sources(domains).filter((source) => source.domain === domain);\n if (folders.length > 0) {\n return folders.map((source) => `${source.directory}/${withExtension(specifier.slice(slash + 1))}`);\n }\n if (session !== undefined && (specifier.startsWith('.') || specifier.endsWith(EXTENSION))) {\n return [`${session}/${withExtension(specifier.replace(/^\\.\\//u, ''))}`];\n }\n return [];\n }\n\n async resolve(specifier: string, domains?: readonly string[]) {\n const fs = this.requireFs();\n for (const path of this.candidates(specifier, domains)) {\n const read = await fs.readTextFile(path, BACKGROUND_CONTEXT);\n if (read.ok) return { id: path, source: read.value };\n if (read.error.code !== 'not_found') getOrThrow(read);\n }\n const available = (await this.list(domains)).map((entry) => entry.specifier).join(', ') || 'none';\n throw new Error(`Unknown script \"${specifier}\". Available: ${available}.`);\n }\n\n async list(domains?: readonly string[], limit = DEFAULT_LIST_LIMIT): Promise<CodemodeScriptEntry[]> {\n const fs = this.options.fs();\n if (!fs) return [];\n const found: { specifier: string; path: string }[] = [];\n for (const source of this.sources(domains)) {\n for (const name of await this.names(fs, source.directory)) {\n found.push({\n specifier: `${source.domain}/${name.slice(0, -EXTENSION.length)}`,\n path: `${source.directory}/${name}`,\n });\n }\n }\n const session = this.sessionDirectory();\n if (session !== undefined) {\n for (const name of (await this.names(fs, session)).reverse()) {\n found.push({ specifier: `${SESSION_PREFIX}${name.slice(0, -EXTENSION.length)}`, path: `${session}/${name}` });\n }\n }\n const entries: CodemodeScriptEntry[] = [];\n for (const entry of found.slice(0, limit)) {\n const read = await fs.readTextFile(entry.path, BACKGROUND_CONTEXT);\n entries.push({ ...entry, description: read.ok ? describeScript(read.value) : '' });\n }\n return entries;\n }\n}\n","import { Type, type Static } from 'typebox';\n\nexport const CODEMODE_PACKAGE = '@agimon-ai/po-codemode';\nexport const CodemodePackageConfigSchema = Type.Object(\n { llmModel: Type.Optional(Type.String({ pattern: '^[^/\\\\s]+/\\\\S+$', maxLength: 256 })) },\n { additionalProperties: false },\n);\nexport type CodemodePackageConfig = Static<typeof CodemodePackageConfigSchema>;\n","import type { PoConfigContext } from '@agimon-ai/po-config';\nimport { readMajorModesConfig, readPackageConfigurations } from '@agimon-ai/po-config/majorModes';\nimport { BACKGROUND_CONTEXT } from '@agimon-ai/po-core/platform';\nimport { Check } from 'typebox/value';\n\nimport { CODEMODE_PACKAGE, CodemodePackageConfigSchema, type CodemodePackageConfig } from '../../schemas/packageConfig';\nimport type { LlmConfigOptions } from './type';\n\nexport const PO_CODEMODE_LLM_CONFIG_SERVICE = 'po/codemode-llm-config';\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'po/codemode-llm-config': LlmConfigService;\n }\n}\n\n/** Session policy is loaded once per immutable Po config snapshot, including failed loads. */\nexport class LlmConfigService {\n private snapshot?: () => PoConfigContext;\n private readonly loads = new WeakMap<PoConfigContext, Promise<CodemodePackageConfig>>();\n\n constructor(private readonly io: LlmConfigOptions) {}\n\n bind(snapshot: () => PoConfigContext): () => void {\n this.snapshot = snapshot;\n return () => {\n if (this.snapshot === snapshot) this.snapshot = undefined;\n };\n }\n\n current(): Promise<CodemodePackageConfig> {\n if (!this.snapshot) return Promise.resolve({});\n const snapshot = this.snapshot();\n let load = this.loads.get(snapshot);\n if (!load) {\n load = this.load(snapshot);\n this.loads.set(snapshot, load);\n }\n return load;\n }\n\n private async load(snapshot: PoConfigContext): Promise<CodemodePackageConfig> {\n if (!snapshot.harness.root) return {};\n const { environment, homeDirectory } = this.io;\n const fs = this.io.fs();\n if (!fs || !homeDirectory) throw new Error('Code mode LLM configuration requires host filesystem and home.');\n const modes = await readMajorModesConfig(fs, snapshot.harness.root, BACKGROUND_CONTEXT, {\n environment,\n homeDirectory,\n });\n const configurations = await readPackageConfigurations(\n fs,\n modes,\n [...snapshot.harness.layers],\n CODEMODE_PACKAGE,\n BACKGROUND_CONTEXT,\n );\n let merged: CodemodePackageConfig = {};\n for (const entry of configurations) {\n if (!Check(CodemodePackageConfigSchema, entry.config)) {\n throw new TypeError('Invalid code mode package configuration: llmModel must be provider/modelId.');\n }\n merged = { ...merged, ...entry.config };\n }\n return merged;\n }\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\nimport type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { Check, Errors, Meta } from 'typebox/schema';\n\nimport type { LlmNamespace, LlmNamespaceOptions, LlmRequest } from './type';\n\nconst MAX_INPUT_BYTES = 64 * 1024;\nconst MAX_SCHEMA_BYTES = 16 * 1024;\nconst MAX_OUTPUT_BYTES = 64 * 1024;\nconst MAX_CALLS = 8;\nconst MAX_CONCURRENT = 2;\nconst DEFAULT_TOKENS = 1024;\nconst MAX_TOKENS = 4096;\nconst RESULT_TOOL = 'return_result';\nconst MODEL = /^[^/\\s]+\\/\\S+$/u;\nconst META = Meta['http://json-schema.org/draft-07/schema#'];\nconst DECLARATIONS = `interface LlmRequest {\n prompt: string;\n /** Explicit JSON input only, never the surrounding conversation. */\n input?: unknown;\n system?: string;\n /** provider/modelId; overrides llmModel config and the live session model. */\n model?: string;\n /** Defaults to 1024, maximum 4096. */\n maxTokens?: number;\n}\ndeclare const llm: {\n /** One-shot text transform. At most 8 calls per exec, 2 concurrently. */\n complete(request: LlmRequest): Promise<{ text: string; model: string }>;\n /** Object-root JSON Schema (draft 7), local nonrecursive refs only. Invalid output rejects without retry. */\n json(request: LlmRequest & { schema: Record<string, unknown> }): Promise<{ value: unknown; model: string }>;\n};`;\n\nfunction jsonText(value: unknown, limit: number, label: string): string {\n const json = JSON.stringify(value, (_key, item: unknown) => {\n if (\n item === undefined ||\n typeof item === 'function' ||\n typeof item === 'symbol' ||\n typeof item === 'bigint' ||\n (typeof item === 'number' && !Number.isFinite(item))\n ) {\n throw new TypeError(`${label} must be JSON serializable.`);\n }\n return item;\n });\n if (json === undefined) throw new TypeError(`${label} must be JSON serializable.`);\n if (new TextEncoder().encode(json).length > limit) throw new RangeError(`${label} exceeds ${limit} bytes.`);\n return json;\n}\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// ponytail: draft-7 object schemas and nonrecursive local refs only; broaden after provider/validator coverage exists.\n/** Reject unsupported references and recursive schemas before spending tokens or entering the validator. */\nfunction checkedSchema(value: unknown): Record<string, unknown> {\n const schema: unknown = JSON.parse(jsonText(value, MAX_SCHEMA_BYTES, 'LLM schema'));\n if (!object(schema) || schema.type !== 'object') throw new TypeError('LLM schema must have type: object.');\n if (schema.$schema !== undefined && schema.$schema !== 'http://json-schema.org/draft-07/schema#') {\n throw new TypeError('LLM schema supports JSON Schema draft 7 only.');\n }\n if (!Check(META, schema)) throw new TypeError('Invalid LLM JSON Schema.');\n let expanded = 0;\n const visit = (node: unknown, ancestors: readonly object[]): void => {\n if (!object(node)) return;\n // Count expanded paths, not unique nodes: the result validator also follows every reference.\n if (++expanded > 1024) throw new TypeError('LLM schema exceeds 1024 expanded schema nodes.');\n if (ancestors.length > 32 || ancestors.includes(node)) {\n throw new TypeError('LLM schema references must be nonrecursive and at most 32 levels deep.');\n }\n const stack = [...ancestors, node];\n if (node.$dynamicRef !== undefined || node.$recursiveRef !== undefined || node.$id !== undefined) {\n throw new TypeError('LLM schema supports local $ref only, without $id.');\n }\n if (node.$ref !== undefined) {\n if (typeof node.$ref !== 'string' || !node.$ref.startsWith('#/')) {\n throw new TypeError('LLM schema supports local JSON-pointer $ref only.');\n }\n let resolved: unknown = schema;\n for (const segment of node.$ref.slice(2).split('/')) {\n const key = segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n resolved =\n resolved !== null && typeof resolved === 'object' && Object.hasOwn(resolved, key)\n ? Reflect.get(resolved, key)\n : undefined;\n }\n if (!object(resolved) && typeof resolved !== 'boolean') throw new TypeError('Unresolved LLM schema $ref.');\n visit(resolved, stack);\n }\n for (const key of ['properties', 'patternProperties', 'definitions', '$defs', 'dependencies']) {\n if (object(node[key])) for (const child of Object.values(node[key])) visit(child, stack);\n }\n for (const key of [\n 'items',\n 'additionalItems',\n 'additionalProperties',\n 'contains',\n 'propertyNames',\n 'not',\n 'if',\n 'then',\n 'else',\n 'allOf',\n 'anyOf',\n 'oneOf',\n ]) {\n const child = node[key];\n if (Array.isArray(child)) for (const item of child) visit(item, stack);\n else visit(child, stack);\n }\n };\n visit(schema, []);\n return schema;\n}\n\nfunction request(value: unknown, structured: boolean): LlmRequest & { schema?: Record<string, unknown> } {\n if (!object(value)) throw new TypeError('LLM request must be an object.');\n const allowed = ['prompt', 'input', 'system', 'model', 'maxTokens', ...(structured ? ['schema'] : [])];\n if (Object.keys(value).some((key) => !allowed.includes(key))) throw new TypeError('Unknown LLM request field.');\n if (typeof value.prompt !== 'string' || !value.prompt.trim())\n throw new TypeError('LLM prompt must be nonempty text.');\n if (value.system !== undefined && typeof value.system !== 'string') throw new TypeError('LLM system must be text.');\n if (\n value.model !== undefined &&\n (typeof value.model !== 'string' || !MODEL.test(value.model) || value.model.length > 256)\n ) {\n throw new TypeError('LLM model must be provider/modelId.');\n }\n if (\n value.maxTokens !== undefined &&\n (!Number.isInteger(value.maxTokens) || Number(value.maxTokens) < 1 || Number(value.maxTokens) > MAX_TOKENS)\n ) {\n throw new RangeError(`LLM maxTokens must be an integer from 1 to ${MAX_TOKENS}.`);\n }\n return {\n prompt: value.prompt,\n ...(value.input === undefined ? {} : { input: value.input }),\n ...(value.system === undefined ? {} : { system: value.system as string }),\n ...(value.model === undefined ? {} : { model: value.model as string }),\n ...(value.maxTokens === undefined ? {} : { maxTokens: value.maxTokens as number }),\n ...(structured ? { schema: checkedSchema(value.schema) } : {}),\n };\n}\n\n/** Explicit data transforms over the host's guarded completions, never a tool-using agent. */\nexport function createLlmNamespace(options: LlmNamespaceOptions): PoCodemodeNamespace {\n const { context } = options;\n return {\n name: 'llm',\n summary:\n 'One-shot LLM text and schema-validated JSON transforms. Explicit input only, bounded calls, no tools or retries.',\n declarations: DECLARATIONS,\n portable: true,\n bind(run) {\n if (run.sessionId !== context.sessionId) throw new Error('LLM namespace belongs to another session.');\n let disposed = false;\n let calls = 0;\n let active = 0;\n run.onDispose(() => {\n disposed = true;\n });\n const available = (): void => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('LLM namespace run is disposed.');\n };\n const call = async (\n input: unknown,\n structured: boolean,\n ): Promise<{ text: string; model: string } | { value: unknown; model: string }> => {\n available();\n if (calls >= MAX_CALLS) throw new RangeError(`At most ${MAX_CALLS} LLM calls per exec.`);\n if (active >= MAX_CONCURRENT) throw new RangeError(`At most ${MAX_CONCURRENT} concurrent LLM calls per exec.`);\n const params = request(input, structured);\n const userInput =\n params.input === undefined\n ? params.prompt\n : `${params.prompt}\\n\\nInput (JSON):\\n${jsonText(params.input, MAX_INPUT_BYTES, 'LLM input')}`;\n const systemPrompt = `${params.system ?? 'Transform only the explicit input according to the request.'}${structured ? '\\nCall return_result exactly once with the result. Do not call other tools.' : ''}`;\n if (new TextEncoder().encode(systemPrompt + userInput).length > MAX_INPUT_BYTES)\n throw new RangeError('LLM prompt and input exceed 65536 bytes.');\n active += 1;\n const started = Date.now();\n let model: string | undefined;\n let tokens: number | undefined;\n const record = (ok: boolean, error?: string): void =>\n run.record?.({\n name: structured ? 'llm.json' : 'llm.complete',\n tool: 'llm',\n args: { ...(model ? { model } : {}), maxTokens: params.maxTokens ?? DEFAULT_TOKENS },\n ok,\n ms: Date.now() - started,\n ...(error === undefined ? {} : { error }),\n ...(tokens === undefined ? {} : { result: { content: [], details: { totalTokens: tokens } } }),\n });\n try {\n const config = await options.config();\n const current =\n params.model || config.llmModel\n ? undefined\n : ((await context.session.readModelSettings?.())?.model ?? context.model);\n model = params.model ?? config.llmModel ?? (current ? `${current.provider}/${current.id}` : undefined);\n available();\n if (!model || !context.textCompletion?.available(model))\n throw new Error(`LLM model is unavailable${model ? `: ${model}` : ''}.`);\n if (structured ? !context.toolCompletion : !context.textCompletion)\n throw new Error('LLM completion is unavailable on this host.');\n if (calls >= MAX_CALLS) throw new RangeError(`At most ${MAX_CALLS} LLM calls per exec.`);\n calls += 1;\n const completion = {\n systemPrompt,\n input: userInput,\n maxTokens: params.maxTokens ?? DEFAULT_TOKENS,\n signal: run.signal,\n recordUsage: true,\n };\n if (!structured) {\n const text = await context.textCompletion.complete(model, completion);\n available();\n jsonText(text, MAX_OUTPUT_BYTES, 'LLM output');\n record(true);\n return { text, model };\n }\n const schema = params.schema!;\n const response = await context.toolCompletion!.complete(model, {\n ...completion,\n tools: [\n {\n name: RESULT_TOOL,\n description: 'Return the requested structured result.',\n parameters: schema as PoHeadlessTool['parameters'],\n },\n ],\n });\n tokens = response.usage.totalTokens;\n available();\n if (response.toolCalls.length !== 1 || response.toolCalls[0]?.name !== RESULT_TOOL)\n throw new Error('LLM must return exactly one return_result call.');\n const value: unknown = JSON.parse(jsonText(response.toolCalls[0].arguments, MAX_OUTPUT_BYTES, 'LLM output'));\n if (!Check(schema, value)) {\n const [, errors] = Errors(schema, value);\n throw new TypeError(`LLM result failed schema validation: ${errors[0]?.message ?? 'invalid result'}`);\n }\n record(true);\n return { value, model };\n } catch (error) {\n record(false, error instanceof Error ? error.message : String(error));\n throw error;\n } finally {\n active -= 1;\n }\n };\n return {\n complete: (input) => call(input, false) as Promise<{ text: string; model: string }>,\n json: (input) => call(input, true) as Promise<{ value: unknown; model: string }>,\n } satisfies LlmNamespace;\n },\n };\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\nimport { BACKGROUND_CONTEXT, getOrThrow, withAbortSignal } from '@agimon-ai/po-core/platform';\n\nimport type { ShellBashRequest, ShellBashResult, ShellNamespaceOptions } from './type';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst MAX_COMMAND_CHARS = 64 * 1024;\nconst MAX_OUTPUT_CHARS = 32 * 1024;\nconst TRUNCATED = '\\n[truncated]';\nconst DECLARATIONS = `declare const shell: {\n /** Short foreground Bash command in the session cwd/environment. Nonzero exits are returned; cancellation and timeout reject. */\n bash(input: { command: string; timeoutMs?: number }): Promise<{ stdout: string; stderr: string; exitCode: number }>;\n};`;\n\nfunction request(input: unknown): ShellBashRequest {\n if (input === null || typeof input !== 'object' || Array.isArray(input))\n throw new TypeError('shell.bash expects an object.');\n const value = input as Record<string, unknown>;\n if (Object.keys(value).some((key) => key !== 'command' && key !== 'timeoutMs'))\n throw new TypeError('shell.bash accepts only command and timeoutMs.');\n if (typeof value.command !== 'string' || !value.command.trim() || value.command.length > MAX_COMMAND_CHARS)\n throw new TypeError(`shell.bash command must be nonempty text of at most ${MAX_COMMAND_CHARS} characters.`);\n if (\n value.timeoutMs !== undefined &&\n (!Number.isInteger(value.timeoutMs) || Number(value.timeoutMs) < 1 || Number(value.timeoutMs) > MAX_TIMEOUT_MS)\n )\n throw new RangeError(`shell.bash timeoutMs must be an integer from 1 to ${MAX_TIMEOUT_MS}.`);\n return { command: value.command, timeoutMs: value.timeoutMs as number | undefined };\n}\n\n/** Deadline-bound commands for post-processing, separate from Runner's supervised processes. */\nexport function createShellNamespace(options: ShellNamespaceOptions): PoCodemodeNamespace {\n return {\n name: 'shell',\n summary:\n 'Run short foreground Bash commands with bounded stdout/stderr and a deadline. No background or interactive mode.',\n declarations: DECLARATIONS,\n portable: true,\n bind(run) {\n if (run.sessionId !== options.context.sessionId) throw new Error('Shell namespace belongs to another session.');\n const disposal = new AbortController();\n const lifetime = AbortSignal.any([run.signal, disposal.signal]);\n run.onDispose(() => disposal.abort(new Error('Shell namespace run is disposed.')));\n return {\n async bash(input: unknown): Promise<ShellBashResult> {\n lifetime.throwIfAborted();\n const params = request(input);\n const shell = options.shell();\n if (!shell) throw new Error('Shell commands are not available on this host.');\n const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const signal = AbortSignal.any([lifetime, AbortSignal.timeout(timeoutMs)]);\n const output = { stdout: '', stderr: '' };\n const truncated = { stdout: false, stderr: false };\n const started = Date.now();\n let ok = false;\n let failure: string | undefined;\n try {\n const result = await shell.exec(\n params.command,\n {\n cwd: options.context.cwd,\n env: Object.fromEntries(\n Object.entries(options.context.environment).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n ),\n inheritEnv: false,\n onOutput: (text, _context, { stream }) => {\n const remaining = MAX_OUTPUT_CHARS - output[stream].length;\n output[stream] += text.slice(0, remaining);\n if (text.length > remaining) truncated[stream] = true;\n },\n },\n withAbortSignal(signal, BACKGROUND_CONTEXT),\n );\n signal.throwIfAborted();\n const { exitCode } = getOrThrow(result);\n ok = exitCode === 0;\n return {\n stdout: output.stdout + (truncated.stdout ? TRUNCATED : ''),\n stderr: output.stderr + (truncated.stderr ? TRUNCATED : ''),\n exitCode,\n };\n } catch (error) {\n failure = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n run.record?.({\n name: 'shell.bash',\n tool: 'shell',\n args: { timeoutMs },\n ok,\n ms: Date.now() - started,\n ...(failure === undefined ? {} : { error: failure }),\n });\n }\n },\n };\n },\n };\n}\n","import { PO_CONFIG_SERVICE } from '@agimon-ai/po-config';\nimport {\n PO_BACKGROUND_WORK_SERVICE,\n readPoBackgroundWorkService,\n type BackgroundWorkProviderHandle,\n} from '@agimon-ai/po-core/backgroundWork';\nimport { PO_CODEMODE_CONTRACT } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport {\n PO_SESSION_FILES_SERVICE,\n PO_SHELL_SERVICE,\n readPoFs,\n readPoIsolate,\n readPoNpm,\n} from '@agimon-ai/po-core/platform';\nimport {\n PO_SERVER_SCOPE_SERVICE,\n requirePoServerScope,\n type PoServerPluginContext,\n} from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createCodemodeRegistry } from '../../../../../services/codemodeRegistry';\nimport { FileSystemCodemodeScriptsService } from '../../../../../services/codemodeScripts';\nimport { createCodemodeTools } from '../../../../../services/codemodeTools';\nimport { LlmConfigService, PO_CODEMODE_LLM_CONFIG_SERVICE } from '../../../../../services/llmConfig';\nimport { createLlmNamespace } from '../../../../../services/llmNamespace';\nimport { createShellNamespace } from '../../../../../services/shellNamespace';\n\n/** One registry per session: contributors register into it, `discover` and `exec` read it. */\nexport function createCodemodeSession({ context, agent, host, signal }: PoServerPluginContext) {\n const registry = createCodemodeRegistry();\n // The binding unwinds with this injected fiber, so the root needs no withdraw of its own.\n context.inject([PO_SERVER_SCOPE_SERVICE], (scoped) =>\n requirePoServerScope(scoped).provide(PO_CODEMODE_CONTRACT, registry),\n );\n let temporaryDirectory: string | undefined;\n context.inject([PO_SESSION_FILES_SERVICE], (scoped) => {\n temporaryDirectory = scoped.get(PO_SESSION_FILES_SERVICE)?.temporaryDirectory;\n return () => {\n temporaryDirectory = undefined;\n };\n });\n const scripts = new FileSystemCodemodeScriptsService({\n registry,\n fs: () => readPoFs(context),\n temporaryDirectory: () => temporaryDirectory,\n });\n const execution = agent?.context;\n const config = execution\n ? new LlmConfigService({\n fs: () => readPoFs(context),\n environment: execution.environment,\n homeDirectory: host.context.homeDirectory,\n })\n : undefined;\n let disposeNamespaces: (() => void) | undefined;\n if (execution && config) {\n context.inject([PO_CONFIG_SERVICE], (scoped) => {\n const service = scoped.get(PO_CONFIG_SERVICE);\n return service ? config.bind(() => service.getSnapshot()) : undefined;\n });\n const registration = registry.register(\n '@agimon-ai/po-codemode',\n createLlmNamespace({ context: execution, config: () => config.current() }),\n );\n const shellRegistration = registry.register(\n '@agimon-ai/po-codemode',\n createShellNamespace({\n context: execution,\n shell: () => context.get(PO_SHELL_SERVICE),\n }),\n );\n disposeNamespaces = () => {\n registration.dispose();\n shellRegistration.dispose();\n };\n }\n let background: BackgroundWorkProviderHandle | undefined;\n const tools = createCodemodeTools({\n registry,\n isolate: () => readPoIsolate(context),\n npm: () => readPoNpm(context),\n scripts,\n signal,\n onBackgroundChange: () => background?.update(),\n });\n context.inject([PO_BACKGROUND_WORK_SERVICE], (scoped) => {\n const registration = readPoBackgroundWorkService(scoped)?.register(tools.backgroundWork);\n background = registration;\n return () => {\n if (background === registration) background = undefined;\n registration?.dispose();\n };\n });\n return {\n value: { registry, ...tools },\n services: [\n (scoped: Context) => {\n if (config) scoped.provide(PO_CODEMODE_LLM_CONFIG_SERVICE, config);\n },\n ],\n onDispose: async () => {\n await tools.dispose();\n disposeNamespaces?.();\n },\n };\n}\n\nconst root = defineRoot(createCodemodeSession);\nexport type CodemodeServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { PO_CODEMODE_SERVICE, type PoCodemodeService } from '@agimon-ai/po-core/codemode';\nimport { defineServiceContract } from '@agimon-ai/po-core/extensionFile';\n\nexport default defineServiceContract<PoCodemodeService>(PO_CODEMODE_SERVICE, { scope: 'session' });\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-llm',\n description: 'Use the llm namespace for one-shot text and schema-checked JSON transformations inside exec.',\n pinned: true,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-llm/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-llm/SKILL.md'),\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-shell',\n description: 'Use shell.bash for short deadline-bound Bash commands and code-side output post-processing.',\n pinned: true,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-shell/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-shell/SKILL.md'),\n});\n","// @scaffold-generated\nimport { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'how-to-codemode',\n description:\n 'Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute',\n pinned: true,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/how-to-codemode/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/how-to-codemode/SKILL.md'),\n});\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { CodemodeServerScope } from '../_lib/root.server';\n\nexport default defineServerTool(\n (context: WithRoot<PoServerPluginContext, CodemodeServerScope>) => context.root.discover,\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { CodemodeServerScope } from '../_lib/root.server';\n\nexport default defineServerTool(\n (context: WithRoot<PoServerPluginContext, CodemodeServerScope>) => context.root.execBackground,\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { CodemodeServerScope } from '../_lib/root.server';\n\nexport default defineServerTool(\n (context: WithRoot<PoServerPluginContext, CodemodeServerScope>) => context.root.execCancel,\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { CodemodeServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<PoServerPluginContext, CodemodeServerScope>) => context.root.exec);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport contractCodemode from '../src/extensions/workspaces/sessions/(backend)/contract/codemode.server';\nimport resourceCodemodeHowToLlm from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-llm.server';\nimport resourceCodemodeHowToShell from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-shell.server';\nimport resourceHowToCodemode from '../src/extensions/workspaces/sessions/(backend)/resource/how-to-codemode.server';\nimport toolDiscover from '../src/extensions/workspaces/sessions/(backend)/tool/discover.server';\nimport toolExecBackground from '../src/extensions/workspaces/sessions/(backend)/tool/exec_background.server';\nimport toolExecCancel from '../src/extensions/workspaces/sessions/(backend)/tool/exec_cancel.server';\nimport toolExec from '../src/extensions/workspaces/sessions/(backend)/tool/exec.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-codemode',\n providerOverrides: composeServerProviderOverrides(rootSession),\n provides: {\n session: [contractCodemode],\n },\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToLlm, contextSession), at(resourceCodemodeHowToShell, contextSession), at(resourceHowToCodemode, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'discover' }, at(toolDiscover, contextSession)), via({ name: 'exec_background' }, at(toolExecBackground, contextSession)), via({ name: 'exec_cancel' }, at(toolExecCancel, contextSession)), via({ name: 'exec' }, at(toolExec, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_codemodeTools = require("./codemodeTools-BQDVk-4P.cjs");
2
+ const require_codemodeTools = require("./codemodeTools-B3n6iodq.cjs");
3
3
  exports.createCodemodeRegistry = require_codemodeTools.createCodemodeRegistry;
4
4
  exports.createCodemodeTools = require_codemodeTools.createCodemodeTools;
package/dist/index.d.mts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { PoCodemodeService } from "@agimon-ai/po-core/codemode";
2
2
  import { PoHeadlessTool } from "@agimon-ai/po-core/headless";
3
3
  import { Type } from "typebox";
4
+ import { BackgroundWorkProvider } from "@agimon-ai/po-core/backgroundWork";
4
5
  import { PoIsolateService, PoNpm } from "@agimon-ai/po-core/platform";
5
6
  //#region src/services/codemodeRegistry/index.d.ts
6
7
  /** The session's namespaces and script folders, in registration order. One name per session. */
@@ -15,6 +16,14 @@ declare const ExecToolSchema: Type.TObject<{
15
16
  code: Type.TString;
16
17
  timeoutMs: Type.TOptional<Type.TInteger>;
17
18
  }>;
19
+ declare const ExecBackgroundToolSchema: Type.TObject<{
20
+ code: Type.TString;
21
+ timeoutMs: Type.TOptional<Type.TInteger>;
22
+ }>;
23
+ declare const ExecCancelToolSchema: Type.TObject<{
24
+ id: Type.TString;
25
+ reason: Type.TOptional<Type.TString>;
26
+ }>;
18
27
  //#endregion
19
28
  //#region src/services/codemodeScripts/type.d.ts
20
29
  /** A reusable script as `discover` lists it. */
@@ -49,13 +58,19 @@ interface CodemodeToolsOptions {
49
58
  /** Saves every exec body and backs `import()`; without it nothing is saved or importable. */
50
59
  readonly scripts?: CodemodeScriptsPort;
51
60
  readonly npm?: () => PoNpm | undefined;
61
+ readonly signal?: AbortSignal;
62
+ readonly onBackgroundChange?: () => void;
52
63
  }
53
64
  interface CodemodeTools {
54
65
  readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;
55
66
  readonly exec: PoHeadlessTool<typeof ExecToolSchema>;
67
+ readonly execBackground: PoHeadlessTool<typeof ExecBackgroundToolSchema>;
68
+ readonly execCancel: PoHeadlessTool<typeof ExecCancelToolSchema>;
69
+ readonly backgroundWork: BackgroundWorkProvider;
70
+ dispose(): Promise<void>;
56
71
  }
57
72
  /** `discover` and `exec` for one session, over the namespaces its packages contributed. */
58
- export declare function createCodemodeTools({ registry, isolate, scripts, npm }: CodemodeToolsOptions): CodemodeTools;
73
+ export declare function createCodemodeTools({ registry, isolate, scripts, npm, signal: lifecycleSignal, onBackgroundChange }: CodemodeToolsOptions): CodemodeTools;
59
74
  //#endregion
60
75
  export {};
61
76
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/services/codemodeRegistry/index.ts","../src/schemas/codemodeTools.ts","../src/services/codemodeScripts/type.ts","../src/services/codemodeTools/index.ts"],"mappings":";;;;;;wBASgB,0BAA0B;;;cCP7B,oBAAkB,KAAA;;;;cAMlB,gBAAc,KAAA;;;;;;;UCPV;;WAEN;WACA;;WAEA;;;UAIM;;EAEf,KAAK,eAAe;aAAmB;aAA4B;;;EAEnE,QAAQ,mBAAmB,8BAA8B;aAAmB;aAAqB;;;EAEjG,KAAK,6BAA6B,iBAAiB,QAAQ;;;;UCiC5C;WACN,UAAU;;WAEV,eAAe;;WAEf,UAAU;WACV,YAAY;;UAGN;WACN,UAAU,sBAAsB;WAChC,MAAM,sBAAsB;;;wBA+JvB,sBAAsB,UAAU,SAAS,SAAS,OAAO,uBAAuB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/services/codemodeRegistry/index.ts","../src/schemas/codemodeTools.ts","../src/services/codemodeScripts/type.ts","../src/services/codemodeTools/index.ts"],"mappings":";;;;;;;wBASgB,0BAA0B;;;cCP7B,oBAAkB,KAAA;;;;cAMlB,gBAAc,KAAA;;;;cAWd,0BAAwB,KAAA;;;;cAYxB,sBAAoB,KAAA;;;;;;;UC9BhB;;WAEN;WACA;;WAEA;;;UAIM;;EAEf,KAAK,eAAe;aAAmB;aAA4B;;;EAEnE,QAAQ,mBAAmB,8BAA8B;aAAmB;aAAqB;;;EAEjG,KAAK,6BAA6B,iBAAiB,QAAQ;;;;UCwC5C;WACN,UAAU;;WAEV,eAAe;;WAEf,UAAU;WACV,YAAY;WACZ,SAAS;WACT;;UAGM;WACN,UAAU,sBAAsB;WAChC,MAAM,sBAAsB;WAC5B,gBAAgB,sBAAsB;WACtC,YAAY,sBAAsB;WAClC,gBAAgB;EACzB,WAAW;;;wBA0KG,sBACd,UACA,SACA,SACA,KACA,QAAQ,iBACR,sBACC,uBAAuB"}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- export { n as createCodemodeRegistry, t as createCodemodeTools } from "./codemodeTools-D7CcAB18.mjs";
1
+ export { n as createCodemodeRegistry, t as createCodemodeTools } from "./codemodeTools-Dl-IEjBr.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-codemode",
3
- "version": "0.0.1-alpha.4",
3
+ "version": "0.0.1-alpha.6",
4
4
  "description": "Code mode for Po sessions: discover and exec over namespaces other packages contribute",
5
5
  "keywords": [
6
6
  "ai",
@@ -52,17 +52,17 @@
52
52
  "access": "public"
53
53
  },
54
54
  "dependencies": {
55
- "@agimon-ai/po-config": "0.0.0-alpha.31",
56
- "@agimon-ai/po-core": "0.0.0-alpha.31",
57
- "@agimon-ai/po-web-components": "0.0.0-alpha.31",
55
+ "@agimon-ai/po-config": "0.0.0-alpha.33",
56
+ "@agimon-ai/po-core": "0.0.0-alpha.33",
57
+ "@agimon-ai/po-web-components": "0.0.0-alpha.33",
58
58
  "@deepseek-ai/cordis": "4.0.5",
59
59
  "react": "19.3.0",
60
60
  "typebox": "1.3.37"
61
61
  },
62
62
  "devDependencies": {
63
- "@agimon-ai/po-build": "0.0.0-alpha.31",
64
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.31",
65
- "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.31",
63
+ "@agimon-ai/po-build": "0.0.0-alpha.33",
64
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.33",
65
+ "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.33",
66
66
  "@earendil-works/pi-coding-agent": "1.3.0",
67
67
  "@types/node": "26.6.5",
68
68
  "@types/react": "19.3.0",
@@ -5,7 +5,7 @@ description: 'Use @agimon-ai/po-codemode: run TypeScript against live Po objects
5
5
 
6
6
  # Use code mode
7
7
 
8
- Code mode gives you two tools.
8
+ Code mode gives you two foreground tools, plus background execution on Node hosts.
9
9
 
10
10
  - `discover`: with no arguments, lists the namespaces this session has (for example `browser`) and their members, plus reusable scripts from the active domains and this session's saved scripts (capped, newest first). `discover({ namespace })` shows full TypeScript declarations; `discover({ query })` finds members, script names and script descriptions.
11
11
  - `exec`: runs a TypeScript async function body. Namespaces are in scope as globals. `return` a value, use `console.log` for notes, `image(data, mimeType)` to send back a screenshot, and `sleep(ms)` to wait.
@@ -39,12 +39,24 @@ const { default: isNumber } = await import('npm:is-number@7');
39
39
  return isNumber(42);
40
40
  ```
41
41
 
42
- Packages auto-install through upm on first use with no approval prompt. Registry names, scoped names, versions, ranges, tags and package subpaths are supported. URLs, git, file dependencies, aliases and traversal are rejected. Use a larger `timeoutMs` for the first install. The shared store follows the existing two-day release-age policy; exact or locked versions bypass it. Lifecycle scripts are skipped.
42
+ Packages auto-install through upm on first use with no approval prompt. Every session uses the hub's single install project, `<PO_HOME>/runtime`, and its shared store. One selector per package name is allowed: a conflicting version or a Po-managed dependency is refused rather than replaced. Imports serialize with `po sync`; if sync removes an import, the next import restores it from the store. Registry names, scoped names, versions, ranges, tags and package subpaths are supported. URLs, git, file dependencies, aliases and traversal are rejected. Use a larger `timeoutMs` for the first install. The shared store follows the existing two-day release-age policy; exact or locked versions bypass it. Lifecycle scripts are skipped.
43
43
 
44
44
  npm modules retain their real namespace exports, including `.default`. Constructors work with `new`; subclassing and `instanceof` are unsupported. Package code has full Node authority, even though `require`, `process` and `fetch` are absent from script globals. It is not a security boundary: synchronous package code cannot be preempted and opened resources are not automatically closed. Cancellation cannot stop an upm install, but prevents importing its result. Edge hosts do not support imports.
45
45
 
46
46
  For model transformations inside scripts, discover `llm` and load `codemode-how-to-llm`.
47
47
 
48
+ ## Background execution (Node only)
49
+
50
+ Use `exec_background({ code, timeoutMs? })` for orchestration that outlives foreground exec, such as Mastra workflows awaiting `team.run`. It returns `{ id }` immediately. End the turn: one `po-codemode-finished` message will contain the bounded result and logs after namespace and child cleanup. Do not poll. Images and recorded calls remain in the message's result details.
51
+
52
+ - Default deadline: 30 minutes. Maximum: 2 hours. Foreground and background share eight execution slots.
53
+ - `exec_cancel({ id, reason? })` stops an owned job; its terminal message follows cleanup.
54
+ - The job survives the launching tool's signal, but stops on deadline, explicit cancellation or session close. The workflow step stays open through child cleanup and completion-message admission.
55
+ - Background scripts are in memory, not resumable. After restart, retry from prepared artifacts; their awaited children are interrupted, not resumed.
56
+ - Both background tools are main-agent-only. `team.run` children also lack `exec` and `discover`.
57
+ - Catch errors **inside callbacks** passed to imported packages and return explicit failure objects. The membrane logs callback throws/rejections and returns `undefined`, so throwing is not a reliable workflow failure channel. Check child statuses and artifact results rather than trusting only the workflow engine's success flag.
58
+ - Mastra `npm:@mastra/core@1.78.0/workflows` with `npm:zod@3.25.76` passed the compatibility spike. Use `await workflow.createRun()`, then `run.start(...)`. Bound live children with `.foreach(step, { concurrency: 3 })`, awaiting each `team.run` and each sequential phase.
59
+
48
60
  ## Promote a script
49
61
 
50
62
  To keep a useful script, copy the saved file with normal file tools to `plugins/<domain>/codemode/<name>.ts`. Start it with a `/** ... */` comment whose first paragraph says what it does and what `args` it takes; `discover` shows that paragraph. Sessions with that domain active then call it as `<domain>/<name>`.
@@ -52,8 +64,8 @@ To keep a useful script, copy the saved file with normal file tools to `plugins/
52
64
  ## Rules
53
65
 
54
66
  - Keep each `exec` call to one logical step, then look at the result before the next.
55
- - Script code stops at its deadline (30 s by default, `timeoutMs` up to 120 s), including its loops and recursion. Native npm code is not preemptible.
67
+ - Foreground script code stops at its deadline (30 s by default, `timeoutMs` up to 120 s), including its loops and recursion. Background scripts have a longer asynchronous deadline, not a longer synchronous budget. Native npm code is not preemptible.
56
68
  - Objects you get from a namespace are live. Listeners you add and the objects themselves stop working when the run ends; keep state in the namespace, not in script variables.
57
69
  - `exec` runs inside the Po server with full trust, like `bash`. Do not use it to bypass a blocked tool.
58
70
  - There is no `eval`, `Function`, `setTimeout`, `fetch`, `require` or `process` inside a script.
59
- - Subagents have `exec` too, and up to 8 runs can overlap across you and them. Namespaces are shared, so a run sees the pages and tasks another agent made.
71
+ - Ordinary subagents may have `exec`, subject to their restrictions. Awaited `team.run` children do not. Up to 8 foreground/background runs can overlap. Namespaces are shared, so a run sees the pages and tasks another agent made.
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemodeTools-BQDVk-4P.cjs","names":["Type","invalidImageReason"],"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\n/** The session's namespaces and script folders, in registration order. One name per session. */\nexport function createCodemodeRegistry(): 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 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 list: () => [...entries.values()].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","import 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 type DiscoverToolParams,\n type ExecToolParams,\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 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}\n\nexport interface CodemodeTools {\n readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;\n readonly exec: PoHeadlessTool<typeof ExecToolSchema>;\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 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 if (images.length >= MAX_IMAGES) throw new RangeError(`An exec run returns at most ${MAX_IMAGES} images.`);\n imageBytes += Math.ceil((data.length * 3) / 4);\n if (imageBytes > MAX_IMAGE_BYTES) throw new RangeError('Images from one exec run exceed 5 MB.');\n const invalid = invalidImageReason(data, mime);\n if (invalid !== undefined) throw new TypeError(`image() rejected an undecodable image: ${invalid}.`);\n images.push({ data, mimeType: mime });\n };\n const console = { log: log('log'), info: log('info'), warn: log('warn'), error: log('error'), debug: log('debug') };\n return { console, note, addImage, 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/** The call as it is kept in the transcript: text blocks only, clipped, with args and details dropped when large. */\nfunction recordedCall(call: PoCodemodeCall): PoCodemodeCall {\n const content = (call.result?.content ?? []).flatMap((block) => {\n const { type, text } = (block ?? {}) as { type?: unknown; text?: unknown };\n return type === 'text' && typeof text === 'string'\n ? [{ type: 'text', text: truncate(text, MAX_RECORDED_TEXT) }]\n : [];\n });\n const details = bounded(call.result?.details, MAX_RECORDED_JSON);\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\nfunction toResult(\n result: PoIsolateResult,\n output: ReturnType<typeof createOutput>,\n saved: string | undefined,\n calls: readonly PoCodemodeCall[],\n): PoHeadlessToolResult {\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 {\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 (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 return {\n content,\n ...(calls.length > 0 ? { details: { calls } } : {}),\n ...(result.ok ? {} : { 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 timer = setTimeout(resolve, Math.max(0, ms));\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(new Error('Run ended.'));\n },\n { once: true },\n );\n });\n}\n\n/** `discover` and `exec` for one session, over the namespaces its packages contributed. */\nexport function createCodemodeTools({ registry, isolate, scripts, npm }: CodemodeToolsOptions): CodemodeTools {\n let running = 0;\n\n const visible = (service: PoIsolateService): PoCodemodeNamespace[] =>\n registry.list().filter((namespace) => service.liveObjects || namespace.portable === true);\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 sections.push(`- ${namespace.name}: ${namespace.summary}\\n members: ${memberNames(namespace).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 ? [`${SCRIPTS_HELP} discover lists saved and domain scripts.`] : []),\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 const service = isolate();\n if (!service) return text('Code mode is not available on this host.', 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 = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;\n const cleanups: (() => void | Promise<void>)[] = [];\n const calls: PoCodemodeCall[] = [];\n const output = createOutput();\n const run: PoCodemodeRun = {\n sessionId: execution.sessionId,\n signal: runSignal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: (call) => {\n if (calls.length < MAX_RECORDED_CALLS) calls.push(recordedCall(call));\n },\n };\n try {\n let saved: string | undefined;\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 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 globals[namespace.name] = namespace.bind(run);\n for (const member of namespace.deny ?? []) deny.add(member);\n }\n const deadlineMs = Math.min(\n MAX_TIMEOUT_MS,\n Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n );\n const 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('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?.({\n name: 'npm.import',\n tool: 'npm',\n args: { specifier },\n ms: Date.now() - started,\n ok: true,\n });\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 return toResult(result, output, saved, calls);\n } catch (error) {\n return text(\n `Code mode could not run the script: ${error instanceof Error ? error.message : String(error)}`,\n true,\n );\n } finally {\n controller.abort();\n for (const cleanup of cleanups.reverse()) {\n await Promise.resolve()\n .then(cleanup)\n .catch((error: unknown) => output.note(`cleanup failed: ${String(error)}`));\n }\n running -= 1;\n }\n },\n };\n\n return { discover, exec };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemodeTools-D7CcAB18.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\n/** The session's namespaces and script folders, in registration order. One name per session. */\nexport function createCodemodeRegistry(): 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 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 list: () => [...entries.values()].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","import 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 type DiscoverToolParams,\n type ExecToolParams,\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 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}\n\nexport interface CodemodeTools {\n readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;\n readonly exec: PoHeadlessTool<typeof ExecToolSchema>;\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 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 if (images.length >= MAX_IMAGES) throw new RangeError(`An exec run returns at most ${MAX_IMAGES} images.`);\n imageBytes += Math.ceil((data.length * 3) / 4);\n if (imageBytes > MAX_IMAGE_BYTES) throw new RangeError('Images from one exec run exceed 5 MB.');\n const invalid = invalidImageReason(data, mime);\n if (invalid !== undefined) throw new TypeError(`image() rejected an undecodable image: ${invalid}.`);\n images.push({ data, mimeType: mime });\n };\n const console = { log: log('log'), info: log('info'), warn: log('warn'), error: log('error'), debug: log('debug') };\n return { console, note, addImage, 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/** The call as it is kept in the transcript: text blocks only, clipped, with args and details dropped when large. */\nfunction recordedCall(call: PoCodemodeCall): PoCodemodeCall {\n const content = (call.result?.content ?? []).flatMap((block) => {\n const { type, text } = (block ?? {}) as { type?: unknown; text?: unknown };\n return type === 'text' && typeof text === 'string'\n ? [{ type: 'text', text: truncate(text, MAX_RECORDED_TEXT) }]\n : [];\n });\n const details = bounded(call.result?.details, MAX_RECORDED_JSON);\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\nfunction toResult(\n result: PoIsolateResult,\n output: ReturnType<typeof createOutput>,\n saved: string | undefined,\n calls: readonly PoCodemodeCall[],\n): PoHeadlessToolResult {\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 {\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 (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 return {\n content,\n ...(calls.length > 0 ? { details: { calls } } : {}),\n ...(result.ok ? {} : { 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 timer = setTimeout(resolve, Math.max(0, ms));\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(new Error('Run ended.'));\n },\n { once: true },\n );\n });\n}\n\n/** `discover` and `exec` for one session, over the namespaces its packages contributed. */\nexport function createCodemodeTools({ registry, isolate, scripts, npm }: CodemodeToolsOptions): CodemodeTools {\n let running = 0;\n\n const visible = (service: PoIsolateService): PoCodemodeNamespace[] =>\n registry.list().filter((namespace) => service.liveObjects || namespace.portable === true);\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 sections.push(`- ${namespace.name}: ${namespace.summary}\\n members: ${memberNames(namespace).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 ? [`${SCRIPTS_HELP} discover lists saved and domain scripts.`] : []),\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 const service = isolate();\n if (!service) return text('Code mode is not available on this host.', 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 = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;\n const cleanups: (() => void | Promise<void>)[] = [];\n const calls: PoCodemodeCall[] = [];\n const output = createOutput();\n const run: PoCodemodeRun = {\n sessionId: execution.sessionId,\n signal: runSignal,\n onDispose: (cleanup) => void cleanups.push(cleanup),\n record: (call) => {\n if (calls.length < MAX_RECORDED_CALLS) calls.push(recordedCall(call));\n },\n };\n try {\n let saved: string | undefined;\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 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 globals[namespace.name] = namespace.bind(run);\n for (const member of namespace.deny ?? []) deny.add(member);\n }\n const deadlineMs = Math.min(\n MAX_TIMEOUT_MS,\n Math.max(MIN_TIMEOUT_MS, parameters.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n );\n const 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('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?.({\n name: 'npm.import',\n tool: 'npm',\n args: { specifier },\n ms: Date.now() - started,\n ok: true,\n });\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 return toResult(result, output, saved, calls);\n } catch (error) {\n return text(\n `Code mode could not run the script: ${error instanceof Error ? error.message : String(error)}`,\n true,\n );\n } finally {\n controller.abort();\n for (const cleanup of cleanups.reverse()) {\n await Promise.resolve()\n .then(cleanup)\n .catch((error: unknown) => output.note(`cleanup failed: ${String(error)}`));\n }\n running -= 1;\n }\n },\n };\n\n return { discover, exec };\n}\n"],"mappings":"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"}