@agimon-ai/po-codemode 0.0.1-alpha.2 → 0.0.1-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,11 +29,11 @@ Show code mode namespaces
29
29
 
30
30
  ## Package behavior
31
31
 
32
- > Before publishing, replace this paragraph with one concrete, copy-pasteable example of the package-specific input, output, configuration, or workflow that is not already demonstrated by the generated command.
32
+ Call `discover({ namespace: 'browser' })` for current types, then `exec({ code: 'return await browser.snapshot({});' })`. Namespace plugins supply their own `codemode-how-to-<plugin>` guides. Their summaries and the base `how-to-codemode` guide stay in the system prompt, outside skill search; `load_skill` still reads their full instructions by exact name.
33
33
 
34
- ## Help
34
+ ## How-to guide
35
35
 
36
- The published package includes `llms.txt` and `src/prompts/po-use-codemode/SKILL.md`. Link additional prompts from `llms.txt` and declare them through named `resource/*.server.ts` routes using `defineResource`. Server lifecycle registration owns their disposal. Publish prompts under `src/prompts`, never export Markdown or copy it into `dist`.
36
+ The published package includes `llms.txt` and `src/prompts/how-to-codemode/SKILL.md`. Link additional prompts from `llms.txt` and declare them through named `resource/*.server.ts` routes using `defineResource`. Server lifecycle registration owns their disposal. Publish prompts under `src/prompts`, never export Markdown or copy it into `dist`.
37
37
 
38
38
  ## Public API
39
39
 
@@ -7,7 +7,6 @@ let _agimon_ai_po_core_codemode = require("@agimon-ai/po-core/codemode");
7
7
  let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
8
8
  let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
9
9
  let _agimon_ai_po_core_platform = require("@agimon-ai/po-core/platform");
10
- let _agimon_ai_po_core_help = require("@agimon-ai/po-core/help");
11
10
  //#region src/services/codemodeScripts/index.ts
12
11
  const SESSION_FOLDER = "codemode";
13
12
  const SESSION_PREFIX = "session:";
@@ -151,14 +150,14 @@ var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(root)
151
150
  //#region src/extensions/workspaces/sessions/(backend)/contract/codemode.server.ts
152
151
  var codemode_server_default = (0, _agimon_ai_po_core_extensionFile.defineServiceContract)(_agimon_ai_po_core_codemode.PO_CODEMODE_SERVICE, { scope: "session" });
153
152
  //#endregion
154
- //#region src/extensions/workspaces/sessions/(backend)/resource/po-use-codemode.server.ts
155
- var po_use_codemode_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
156
- name: "po-use-codemode",
153
+ //#region src/extensions/workspaces/sessions/(backend)/resource/how-to-codemode.server.ts
154
+ var how_to_codemode_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
155
+ name: "how-to-codemode",
157
156
  description: "Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute",
158
- when: _agimon_ai_po_core_help.PO_HELP_WHEN,
157
+ pinned: true,
159
158
  kind: "skill",
160
- path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-codemode/SKILL.md"),
161
- read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-codemode/SKILL.md")
159
+ path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/how-to-codemode/SKILL.md"),
160
+ read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/how-to-codemode/SKILL.md")
162
161
  });
163
162
  //#endregion
164
163
  //#region src/extensions/workspaces/sessions/(backend)/tool/discover.server.ts
@@ -187,7 +186,7 @@ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
187
186
  return {
188
187
  ...(0, _agimon_ai_po_core_extensionFile.composeRootHooks)(scopeSession),
189
188
  get resources() {
190
- return [at(po_use_codemode_server_default, contextSession)];
189
+ return [at(how_to_codemode_server_default, contextSession)];
191
190
  },
192
191
  get tools() {
193
192
  return [via({ name: "discover" }, at(discover_server_default, contextSession)), via({ name: "exec" }, at(exec_server_default, contextSession))];
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["BACKGROUND_CONTEXT","getOrThrow","createCodemodeRegistry","PO_SERVER_SCOPE_SERVICE","requirePoServerScope","PO_CODEMODE_CONTRACT","PO_SESSION_FILES_SERVICE","readPoFs","createCodemodeTools","readPoIsolate","defineRoot","defineRoot","contribution","defineServiceContract","PO_CODEMODE_SERVICE","defineResource","PO_HELP_WHEN","packageResourcePath","readPackageResource","defineServerTool","defineServerTool","defineServerPlugin","composeServerProviderOverrides","rootSession","contractCodemode","composeRootInjects","composeRootHooks","resourcePoUseCodemode","toolDiscover","toolExec"],"sources":["../../src/services/codemodeScripts/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/po-use-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 { PO_CODEMODE_CONTRACT } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { PO_SESSION_FILES_SERVICE, readPoFs, readPoIsolate } from '@agimon-ai/po-core/platform';\nimport {\n PO_SERVER_SCOPE_SERVICE,\n requirePoServerScope,\n type PoServerPluginContext,\n} from '@agimon-ai/po-core/serverPlugin';\n\nimport { createCodemodeRegistry } from '../../../../../services/codemodeRegistry';\nimport { FileSystemCodemodeScriptsService } from '../../../../../services/codemodeScripts';\nimport { createCodemodeTools } from '../../../../../services/codemodeTools';\n\n/** One registry per session: contributors register into it, `discover` and `exec` read it. */\nexport function createCodemodeSession({ context }: 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 tools = createCodemodeTools({ registry, isolate: () => readPoIsolate(context), scripts });\n return { value: { registry, ...tools } };\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","// @scaffold-generated\nimport { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { PO_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'po-use-codemode',\n description:\n 'Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute',\n when: PO_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-use-codemode/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-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 resourcePoUseCodemode from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-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(resourcePoUseCodemode, 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.cjs","names":["BACKGROUND_CONTEXT","getOrThrow","createCodemodeRegistry","PO_SERVER_SCOPE_SERVICE","requirePoServerScope","PO_CODEMODE_CONTRACT","PO_SESSION_FILES_SERVICE","readPoFs","createCodemodeTools","readPoIsolate","defineRoot","defineRoot","contribution","defineServiceContract","PO_CODEMODE_SERVICE","defineResource","packageResourcePath","readPackageResource","defineServerTool","defineServerTool","defineServerPlugin","composeServerProviderOverrides","rootSession","contractCodemode","composeRootInjects","composeRootHooks","resourceHowToCodemode","toolDiscover","toolExec"],"sources":["../../src/services/codemodeScripts/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/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 { PO_CODEMODE_CONTRACT } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { PO_SESSION_FILES_SERVICE, readPoFs, readPoIsolate } from '@agimon-ai/po-core/platform';\nimport {\n PO_SERVER_SCOPE_SERVICE,\n requirePoServerScope,\n type PoServerPluginContext,\n} from '@agimon-ai/po-core/serverPlugin';\n\nimport { createCodemodeRegistry } from '../../../../../services/codemodeRegistry';\nimport { FileSystemCodemodeScriptsService } from '../../../../../services/codemodeScripts';\nimport { createCodemodeTools } from '../../../../../services/codemodeTools';\n\n/** One registry per session: contributors register into it, `discover` and `exec` read it. */\nexport function createCodemodeSession({ context }: 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 tools = createCodemodeTools({ registry, isolate: () => readPoIsolate(context), scripts });\n return { value: { registry, ...tools } };\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","// @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 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(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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"}
@@ -3,7 +3,6 @@ import { PO_CODEMODE_CONTRACT, PO_CODEMODE_SERVICE } from "@agimon-ai/po-core/co
3
3
  import { PO_SERVER_SCOPE_SERVICE, composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource, requirePoServerScope } from "@agimon-ai/po-core/serverPlugin";
4
4
  import { composeRootHooks, composeRootInjects, defineResource, defineRoot, defineServerTool, defineServiceContract } from "@agimon-ai/po-core/extensionFile";
5
5
  import { BACKGROUND_CONTEXT, PO_SESSION_FILES_SERVICE, getOrThrow, readPoFs, readPoIsolate } from "@agimon-ai/po-core/platform";
6
- import { PO_HELP_WHEN } from "@agimon-ai/po-core/help";
7
6
  //#region src/services/codemodeScripts/index.ts
8
7
  const SESSION_FOLDER = "codemode";
9
8
  const SESSION_PREFIX = "session:";
@@ -147,14 +146,14 @@ var root_server_default = defineRoot(root);
147
146
  //#region src/extensions/workspaces/sessions/(backend)/contract/codemode.server.ts
148
147
  var codemode_server_default = defineServiceContract(PO_CODEMODE_SERVICE, { scope: "session" });
149
148
  //#endregion
150
- //#region src/extensions/workspaces/sessions/(backend)/resource/po-use-codemode.server.ts
151
- var po_use_codemode_server_default = defineResource({
152
- name: "po-use-codemode",
149
+ //#region src/extensions/workspaces/sessions/(backend)/resource/how-to-codemode.server.ts
150
+ var how_to_codemode_server_default = defineResource({
151
+ name: "how-to-codemode",
153
152
  description: "Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute",
154
- when: PO_HELP_WHEN,
153
+ pinned: true,
155
154
  kind: "skill",
156
- path: packageResourcePath(import.meta.url, "src/prompts/po-use-codemode/SKILL.md"),
157
- read: () => readPackageResource(import.meta.url, "src/prompts/po-use-codemode/SKILL.md")
155
+ path: packageResourcePath(import.meta.url, "src/prompts/how-to-codemode/SKILL.md"),
156
+ read: () => readPackageResource(import.meta.url, "src/prompts/how-to-codemode/SKILL.md")
158
157
  });
159
158
  //#endregion
160
159
  //#region src/extensions/workspaces/sessions/(backend)/tool/discover.server.ts
@@ -183,7 +182,7 @@ const serverPlugin = defineServerPlugin({
183
182
  return {
184
183
  ...composeRootHooks(scopeSession),
185
184
  get resources() {
186
- return [at(po_use_codemode_server_default, contextSession)];
185
+ return [at(how_to_codemode_server_default, contextSession)];
187
186
  },
188
187
  get tools() {
189
188
  return [via({ name: "discover" }, at(discover_server_default, contextSession)), via({ name: "exec" }, at(exec_server_default, contextSession))];
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["contribution","rootSession","contractCodemode","resourcePoUseCodemode","toolDiscover","toolExec"],"sources":["../../src/services/codemodeScripts/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/po-use-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 { PO_CODEMODE_CONTRACT } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { PO_SESSION_FILES_SERVICE, readPoFs, readPoIsolate } from '@agimon-ai/po-core/platform';\nimport {\n PO_SERVER_SCOPE_SERVICE,\n requirePoServerScope,\n type PoServerPluginContext,\n} from '@agimon-ai/po-core/serverPlugin';\n\nimport { createCodemodeRegistry } from '../../../../../services/codemodeRegistry';\nimport { FileSystemCodemodeScriptsService } from '../../../../../services/codemodeScripts';\nimport { createCodemodeTools } from '../../../../../services/codemodeTools';\n\n/** One registry per session: contributors register into it, `discover` and `exec` read it. */\nexport function createCodemodeSession({ context }: 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 tools = createCodemodeTools({ registry, isolate: () => readPoIsolate(context), scripts });\n return { value: { registry, ...tools } };\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","// @scaffold-generated\nimport { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { PO_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'po-use-codemode',\n description:\n 'Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute',\n when: PO_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-use-codemode/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-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 resourcePoUseCodemode from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-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(resourcePoUseCodemode, 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":["contribution","rootSession","contractCodemode","resourceHowToCodemode","toolDiscover","toolExec"],"sources":["../../src/services/codemodeScripts/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/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 { PO_CODEMODE_CONTRACT } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { PO_SESSION_FILES_SERVICE, readPoFs, readPoIsolate } from '@agimon-ai/po-core/platform';\nimport {\n PO_SERVER_SCOPE_SERVICE,\n requirePoServerScope,\n type PoServerPluginContext,\n} from '@agimon-ai/po-core/serverPlugin';\n\nimport { createCodemodeRegistry } from '../../../../../services/codemodeRegistry';\nimport { FileSystemCodemodeScriptsService } from '../../../../../services/codemodeScripts';\nimport { createCodemodeTools } from '../../../../../services/codemodeTools';\n\n/** One registry per session: contributors register into it, `discover` and `exec` read it. */\nexport function createCodemodeSession({ context }: 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 tools = createCodemodeTools({ registry, isolate: () => readPoIsolate(context), scripts });\n return { value: { registry, ...tools } };\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","// @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 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(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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"}
package/llms.txt CHANGED
@@ -4,7 +4,7 @@ Package-owned guidance for Code mode for Po sessions: discover and exec over nam
4
4
 
5
5
  ## How to use
6
6
 
7
- - [Use code mode](./src/prompts/po-use-codemode/SKILL.md): The discover and exec tools, script globals, limits and trust.
7
+ - [Use code mode](./src/prompts/how-to-codemode/SKILL.md): The discover and exec tools, script globals, limits and trust.
8
8
 
9
9
  ## Resources
10
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-codemode",
3
- "version": "0.0.1-alpha.2",
3
+ "version": "0.0.1-alpha.3",
4
4
  "description": "Code mode for Po sessions: discover and exec over namespaces other packages contribute",
5
5
  "keywords": [
6
6
  "ai",
@@ -52,16 +52,16 @@
52
52
  "access": "public"
53
53
  },
54
54
  "dependencies": {
55
- "@agimon-ai/po-core": "0.0.0-alpha.29",
56
- "@agimon-ai/po-web-components": "0.0.0-alpha.29",
55
+ "@agimon-ai/po-core": "0.0.0-alpha.30",
56
+ "@agimon-ai/po-web-components": "0.0.0-alpha.30",
57
57
  "@deepseek-ai/cordis": "4.0.5",
58
58
  "react": "19.3.0",
59
59
  "typebox": "1.3.37"
60
60
  },
61
61
  "devDependencies": {
62
- "@agimon-ai/po-build": "0.0.0-alpha.29",
63
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.29",
64
- "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.29",
62
+ "@agimon-ai/po-build": "0.0.0-alpha.30",
63
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.30",
64
+ "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.30",
65
65
  "@earendil-works/pi-coding-agent": "1.3.0",
66
66
  "@types/node": "26.6.5",
67
67
  "@types/react": "19.3.0",
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: po-use-codemode
2
+ name: how-to-codemode
3
3
  description: 'Use @agimon-ai/po-codemode: run TypeScript against live Po objects with the discover and exec tools. Use when a task needs several steps on a namespace such as browser in one call.'
4
4
  ---
5
5