@agimon-ai/po-codemode 0.0.0-stage → 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,206 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_codemodeTools = require("../codemodeTools-BX2qieCR.cjs");
6
+ let _agimon_ai_po_core_codemode = require("@agimon-ai/po-core/codemode");
7
+ let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
8
+ let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
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
+ //#region src/services/codemodeScripts/index.ts
12
+ const SESSION_FOLDER = "codemode";
13
+ const SESSION_PREFIX = "session:";
14
+ const EXTENSION = ".ts";
15
+ const EXEC_FILE = /^exec-(\d+)\.ts$/u;
16
+ const DOC_COMMENT = /^\s*\/\*\*([\s\S]*?)\*\//u;
17
+ const MAX_DESCRIPTION_CHARS = 160;
18
+ const DEFAULT_LIST_LIMIT = 200;
19
+ const withExtension = (name) => name.endsWith(EXTENSION) ? name : `${name}${EXTENSION}`;
20
+ /** First paragraph of a leading `/** ... *\/` comment, else the first line of code, on one line. */
21
+ function describeScript(source) {
22
+ const doc = DOC_COMMENT.exec(source)?.[1];
23
+ const lines = doc === void 0 ? source.split("\n") : doc.split("\n").map((line) => line.replace(/^\s*\*\s?/u, ""));
24
+ const paragraph = [];
25
+ for (const line of lines.map((item) => item.trim())) {
26
+ if (line) paragraph.push(line);
27
+ else if (paragraph.length > 0) break;
28
+ if (doc === void 0 && paragraph.length > 0) break;
29
+ }
30
+ const text = paragraph.join(" ");
31
+ return text.length <= MAX_DESCRIPTION_CHARS ? text : `${text.slice(0, 157)}...`;
32
+ }
33
+ /** Session scripts live in `<temporaryDirectory>/codemode`; domain scripts in registered folders. */
34
+ var FileSystemCodemodeScriptsService = class {
35
+ options;
36
+ constructor(options) {
37
+ this.options = options;
38
+ }
39
+ sessionDirectory() {
40
+ const base = this.options.temporaryDirectory();
41
+ return base === void 0 ? void 0 : `${base}/${SESSION_FOLDER}`;
42
+ }
43
+ requireFs() {
44
+ const fs = this.options.fs();
45
+ if (!fs) throw new Error("Saved scripts need a file system, which this host does not provide.");
46
+ return fs;
47
+ }
48
+ sources(domains) {
49
+ return this.options.registry.listScripts().filter((source) => !domains || domains.includes(source.domain));
50
+ }
51
+ /** `.ts` file names in a folder; a missing folder has none. */
52
+ async names(fs, directory) {
53
+ const listed = await fs.listDir(directory, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT);
54
+ if (!listed.ok && listed.error.code === "not_found") return [];
55
+ return (0, _agimon_ai_po_core_platform.getOrThrow)(listed).filter((info) => info.kind === "file" && info.name.endsWith(EXTENSION)).map((info) => info.name).sort((left, right) => left.localeCompare(right, void 0, { numeric: true }));
56
+ }
57
+ async save(code) {
58
+ const fs = this.options.fs();
59
+ const directory = this.sessionDirectory();
60
+ if (!fs || directory === void 0) return void 0;
61
+ (0, _agimon_ai_po_core_platform.getOrThrow)(await fs.createDir(directory, { recursive: true }, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT));
62
+ const taken = (await this.names(fs, directory)).map((name) => Number(EXEC_FILE.exec(name)?.[1] ?? 0));
63
+ const name = `exec-${Math.max(0, ...taken) + 1}`;
64
+ const path = `${directory}/${name}${EXTENSION}`;
65
+ (0, _agimon_ai_po_core_platform.getOrThrow)(await fs.writeFile(path, code, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT));
66
+ return {
67
+ specifier: `${SESSION_PREFIX}${name}`,
68
+ path
69
+ };
70
+ }
71
+ candidates(specifier, domains) {
72
+ if (specifier.startsWith("/")) return [specifier];
73
+ const session = this.sessionDirectory();
74
+ if (specifier.startsWith(SESSION_PREFIX)) return session === void 0 ? [] : [`${session}/${withExtension(specifier.slice(8))}`];
75
+ const slash = specifier.indexOf("/");
76
+ const domain = slash > 0 ? specifier.slice(0, slash) : void 0;
77
+ const folders = this.sources(domains).filter((source) => source.domain === domain);
78
+ if (folders.length > 0) return folders.map((source) => `${source.directory}/${withExtension(specifier.slice(slash + 1))}`);
79
+ if (session !== void 0 && (specifier.startsWith(".") || specifier.endsWith(EXTENSION))) return [`${session}/${withExtension(specifier.replace(/^\.\//u, ""))}`];
80
+ return [];
81
+ }
82
+ async resolve(specifier, domains) {
83
+ const fs = this.requireFs();
84
+ for (const path of this.candidates(specifier, domains)) {
85
+ const read = await fs.readTextFile(path, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT);
86
+ if (read.ok) return {
87
+ id: path,
88
+ source: read.value
89
+ };
90
+ if (read.error.code !== "not_found") (0, _agimon_ai_po_core_platform.getOrThrow)(read);
91
+ }
92
+ const available = (await this.list(domains)).map((entry) => entry.specifier).join(", ") || "none";
93
+ throw new Error(`Unknown script "${specifier}". Available: ${available}.`);
94
+ }
95
+ async list(domains, limit = DEFAULT_LIST_LIMIT) {
96
+ const fs = this.options.fs();
97
+ if (!fs) return [];
98
+ const found = [];
99
+ for (const source of this.sources(domains)) for (const name of await this.names(fs, source.directory)) found.push({
100
+ specifier: `${source.domain}/${name.slice(0, -3)}`,
101
+ path: `${source.directory}/${name}`
102
+ });
103
+ const session = this.sessionDirectory();
104
+ if (session !== void 0) for (const name of (await this.names(fs, session)).reverse()) found.push({
105
+ specifier: `${SESSION_PREFIX}${name.slice(0, -3)}`,
106
+ path: `${session}/${name}`
107
+ });
108
+ const entries = [];
109
+ for (const entry of found.slice(0, limit)) {
110
+ const read = await fs.readTextFile(entry.path, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT);
111
+ entries.push({
112
+ ...entry,
113
+ description: read.ok ? describeScript(read.value) : ""
114
+ });
115
+ }
116
+ return entries;
117
+ }
118
+ };
119
+ //#endregion
120
+ //#region src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts
121
+ /** One registry per session: contributors register into it, `discover` and `exec` read it. */
122
+ function createCodemodeSession({ context }) {
123
+ const registry = require_codemodeTools.createCodemodeRegistry();
124
+ context.inject([_agimon_ai_po_core_serverPlugin.PO_SERVER_SCOPE_SERVICE], (scoped) => (0, _agimon_ai_po_core_serverPlugin.requirePoServerScope)(scoped).provide(_agimon_ai_po_core_codemode.PO_CODEMODE_CONTRACT, registry));
125
+ let temporaryDirectory;
126
+ context.inject([_agimon_ai_po_core_platform.PO_SESSION_FILES_SERVICE], (scoped) => {
127
+ temporaryDirectory = scoped.get(_agimon_ai_po_core_platform.PO_SESSION_FILES_SERVICE)?.temporaryDirectory;
128
+ return () => {
129
+ temporaryDirectory = void 0;
130
+ };
131
+ });
132
+ const scripts = new FileSystemCodemodeScriptsService({
133
+ registry,
134
+ fs: () => (0, _agimon_ai_po_core_platform.readPoFs)(context),
135
+ temporaryDirectory: () => temporaryDirectory
136
+ });
137
+ return { value: {
138
+ registry,
139
+ ...require_codemodeTools.createCodemodeTools({
140
+ registry,
141
+ isolate: () => (0, _agimon_ai_po_core_platform.readPoIsolate)(context),
142
+ scripts
143
+ })
144
+ } };
145
+ }
146
+ const root = (0, _agimon_ai_po_core_extensionFile.defineRoot)(createCodemodeSession);
147
+ //#endregion
148
+ //#region src/extensions/workspaces/sessions/(backend)/root.server.ts
149
+ var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(root);
150
+ //#endregion
151
+ //#region src/extensions/workspaces/sessions/(backend)/contract/codemode.server.ts
152
+ var codemode_server_default = (0, _agimon_ai_po_core_extensionFile.defineServiceContract)(_agimon_ai_po_core_codemode.PO_CODEMODE_SERVICE, { scope: "session" });
153
+ //#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",
157
+ 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,
159
+ 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")
162
+ });
163
+ //#endregion
164
+ //#region src/extensions/workspaces/sessions/(backend)/tool/discover.server.ts
165
+ var discover_server_default = (0, _agimon_ai_po_core_extensionFile.defineServerTool)((context) => context.root.discover);
166
+ //#endregion
167
+ //#region src/extensions/workspaces/sessions/(backend)/tool/exec.server.ts
168
+ var exec_server_default = (0, _agimon_ai_po_core_extensionFile.defineServerTool)((context) => context.root.exec);
169
+ //#endregion
170
+ //#region generated/server.ts
171
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
172
+ const via = (identity, value) => value === void 0 ? void 0 : {
173
+ ...identity,
174
+ ...value
175
+ };
176
+ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
177
+ name: "@agimon-ai/po-codemode",
178
+ providerOverrides: (0, _agimon_ai_po_core_serverPlugin.composeServerProviderOverrides)(root_server_default),
179
+ provides: { session: [codemode_server_default] },
180
+ injects: (0, _agimon_ai_po_core_extensionFile.composeRootInjects)({ session: [root_server_default] }),
181
+ session: async (context) => {
182
+ const scopeSession = await context.scopeRoot("session", root_server_default, context);
183
+ const contextSession = {
184
+ ...context,
185
+ root: scopeSession.value
186
+ };
187
+ return {
188
+ ...(0, _agimon_ai_po_core_extensionFile.composeRootHooks)(scopeSession),
189
+ get resources() {
190
+ return [at(po_use_codemode_server_default, contextSession)];
191
+ },
192
+ get tools() {
193
+ return [via({ name: "discover" }, at(discover_server_default, contextSession)), via({ name: "exec" }, at(exec_server_default, contextSession))];
194
+ },
195
+ services: [...scopeSession.services ?? []],
196
+ get activities() {
197
+ return [...scopeSession.activities ?? []];
198
+ }
199
+ };
200
+ }
201
+ });
202
+ //#endregion
203
+ exports.default = serverPlugin;
204
+ exports.serverPlugin = serverPlugin;
205
+
206
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,5 @@
1
+ //#region generated/server.d.ts
2
+ export declare const serverPlugin: import("@agimon-ai/po-core/serverPlugin").PoServerPlugin;
3
+ //#endregion
4
+ export { serverPlugin as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAiBa,wDAAY"}
@@ -0,0 +1,201 @@
1
+ import { n as createCodemodeRegistry, t as createCodemodeTools } from "../codemodeTools-CSYUxIeA.mjs";
2
+ import { PO_CODEMODE_CONTRACT, PO_CODEMODE_SERVICE } from "@agimon-ai/po-core/codemode";
3
+ import { PO_SERVER_SCOPE_SERVICE, composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource, requirePoServerScope } from "@agimon-ai/po-core/serverPlugin";
4
+ import { composeRootHooks, composeRootInjects, defineResource, defineRoot, defineServerTool, defineServiceContract } from "@agimon-ai/po-core/extensionFile";
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
+ //#region src/services/codemodeScripts/index.ts
8
+ const SESSION_FOLDER = "codemode";
9
+ const SESSION_PREFIX = "session:";
10
+ const EXTENSION = ".ts";
11
+ const EXEC_FILE = /^exec-(\d+)\.ts$/u;
12
+ const DOC_COMMENT = /^\s*\/\*\*([\s\S]*?)\*\//u;
13
+ const MAX_DESCRIPTION_CHARS = 160;
14
+ const DEFAULT_LIST_LIMIT = 200;
15
+ const withExtension = (name) => name.endsWith(EXTENSION) ? name : `${name}${EXTENSION}`;
16
+ /** First paragraph of a leading `/** ... *\/` comment, else the first line of code, on one line. */
17
+ function describeScript(source) {
18
+ const doc = DOC_COMMENT.exec(source)?.[1];
19
+ const lines = doc === void 0 ? source.split("\n") : doc.split("\n").map((line) => line.replace(/^\s*\*\s?/u, ""));
20
+ const paragraph = [];
21
+ for (const line of lines.map((item) => item.trim())) {
22
+ if (line) paragraph.push(line);
23
+ else if (paragraph.length > 0) break;
24
+ if (doc === void 0 && paragraph.length > 0) break;
25
+ }
26
+ const text = paragraph.join(" ");
27
+ return text.length <= MAX_DESCRIPTION_CHARS ? text : `${text.slice(0, 157)}...`;
28
+ }
29
+ /** Session scripts live in `<temporaryDirectory>/codemode`; domain scripts in registered folders. */
30
+ var FileSystemCodemodeScriptsService = class {
31
+ options;
32
+ constructor(options) {
33
+ this.options = options;
34
+ }
35
+ sessionDirectory() {
36
+ const base = this.options.temporaryDirectory();
37
+ return base === void 0 ? void 0 : `${base}/${SESSION_FOLDER}`;
38
+ }
39
+ requireFs() {
40
+ const fs = this.options.fs();
41
+ if (!fs) throw new Error("Saved scripts need a file system, which this host does not provide.");
42
+ return fs;
43
+ }
44
+ sources(domains) {
45
+ return this.options.registry.listScripts().filter((source) => !domains || domains.includes(source.domain));
46
+ }
47
+ /** `.ts` file names in a folder; a missing folder has none. */
48
+ async names(fs, directory) {
49
+ const listed = await fs.listDir(directory, BACKGROUND_CONTEXT);
50
+ if (!listed.ok && listed.error.code === "not_found") return [];
51
+ return getOrThrow(listed).filter((info) => info.kind === "file" && info.name.endsWith(EXTENSION)).map((info) => info.name).sort((left, right) => left.localeCompare(right, void 0, { numeric: true }));
52
+ }
53
+ async save(code) {
54
+ const fs = this.options.fs();
55
+ const directory = this.sessionDirectory();
56
+ if (!fs || directory === void 0) return void 0;
57
+ getOrThrow(await fs.createDir(directory, { recursive: true }, BACKGROUND_CONTEXT));
58
+ const taken = (await this.names(fs, directory)).map((name) => Number(EXEC_FILE.exec(name)?.[1] ?? 0));
59
+ const name = `exec-${Math.max(0, ...taken) + 1}`;
60
+ const path = `${directory}/${name}${EXTENSION}`;
61
+ getOrThrow(await fs.writeFile(path, code, BACKGROUND_CONTEXT));
62
+ return {
63
+ specifier: `${SESSION_PREFIX}${name}`,
64
+ path
65
+ };
66
+ }
67
+ candidates(specifier, domains) {
68
+ if (specifier.startsWith("/")) return [specifier];
69
+ const session = this.sessionDirectory();
70
+ if (specifier.startsWith(SESSION_PREFIX)) return session === void 0 ? [] : [`${session}/${withExtension(specifier.slice(8))}`];
71
+ const slash = specifier.indexOf("/");
72
+ const domain = slash > 0 ? specifier.slice(0, slash) : void 0;
73
+ const folders = this.sources(domains).filter((source) => source.domain === domain);
74
+ if (folders.length > 0) return folders.map((source) => `${source.directory}/${withExtension(specifier.slice(slash + 1))}`);
75
+ if (session !== void 0 && (specifier.startsWith(".") || specifier.endsWith(EXTENSION))) return [`${session}/${withExtension(specifier.replace(/^\.\//u, ""))}`];
76
+ return [];
77
+ }
78
+ async resolve(specifier, domains) {
79
+ const fs = this.requireFs();
80
+ for (const path of this.candidates(specifier, domains)) {
81
+ const read = await fs.readTextFile(path, BACKGROUND_CONTEXT);
82
+ if (read.ok) return {
83
+ id: path,
84
+ source: read.value
85
+ };
86
+ if (read.error.code !== "not_found") getOrThrow(read);
87
+ }
88
+ const available = (await this.list(domains)).map((entry) => entry.specifier).join(", ") || "none";
89
+ throw new Error(`Unknown script "${specifier}". Available: ${available}.`);
90
+ }
91
+ async list(domains, limit = DEFAULT_LIST_LIMIT) {
92
+ const fs = this.options.fs();
93
+ if (!fs) return [];
94
+ const found = [];
95
+ for (const source of this.sources(domains)) for (const name of await this.names(fs, source.directory)) found.push({
96
+ specifier: `${source.domain}/${name.slice(0, -3)}`,
97
+ path: `${source.directory}/${name}`
98
+ });
99
+ const session = this.sessionDirectory();
100
+ if (session !== void 0) for (const name of (await this.names(fs, session)).reverse()) found.push({
101
+ specifier: `${SESSION_PREFIX}${name.slice(0, -3)}`,
102
+ path: `${session}/${name}`
103
+ });
104
+ const entries = [];
105
+ for (const entry of found.slice(0, limit)) {
106
+ const read = await fs.readTextFile(entry.path, BACKGROUND_CONTEXT);
107
+ entries.push({
108
+ ...entry,
109
+ description: read.ok ? describeScript(read.value) : ""
110
+ });
111
+ }
112
+ return entries;
113
+ }
114
+ };
115
+ //#endregion
116
+ //#region src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts
117
+ /** One registry per session: contributors register into it, `discover` and `exec` read it. */
118
+ function createCodemodeSession({ context }) {
119
+ const registry = createCodemodeRegistry();
120
+ context.inject([PO_SERVER_SCOPE_SERVICE], (scoped) => requirePoServerScope(scoped).provide(PO_CODEMODE_CONTRACT, registry));
121
+ let temporaryDirectory;
122
+ context.inject([PO_SESSION_FILES_SERVICE], (scoped) => {
123
+ temporaryDirectory = scoped.get(PO_SESSION_FILES_SERVICE)?.temporaryDirectory;
124
+ return () => {
125
+ temporaryDirectory = void 0;
126
+ };
127
+ });
128
+ const scripts = new FileSystemCodemodeScriptsService({
129
+ registry,
130
+ fs: () => readPoFs(context),
131
+ temporaryDirectory: () => temporaryDirectory
132
+ });
133
+ return { value: {
134
+ registry,
135
+ ...createCodemodeTools({
136
+ registry,
137
+ isolate: () => readPoIsolate(context),
138
+ scripts
139
+ })
140
+ } };
141
+ }
142
+ const root = defineRoot(createCodemodeSession);
143
+ //#endregion
144
+ //#region src/extensions/workspaces/sessions/(backend)/root.server.ts
145
+ var root_server_default = defineRoot(root);
146
+ //#endregion
147
+ //#region src/extensions/workspaces/sessions/(backend)/contract/codemode.server.ts
148
+ var codemode_server_default = defineServiceContract(PO_CODEMODE_SERVICE, { scope: "session" });
149
+ //#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",
153
+ description: "Use @agimon-ai/po-codemode: Code mode for Po sessions: discover and exec over namespaces other packages contribute",
154
+ when: PO_HELP_WHEN,
155
+ 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")
158
+ });
159
+ //#endregion
160
+ //#region src/extensions/workspaces/sessions/(backend)/tool/discover.server.ts
161
+ var discover_server_default = defineServerTool((context) => context.root.discover);
162
+ //#endregion
163
+ //#region src/extensions/workspaces/sessions/(backend)/tool/exec.server.ts
164
+ var exec_server_default = defineServerTool((context) => context.root.exec);
165
+ //#endregion
166
+ //#region generated/server.ts
167
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
168
+ const via = (identity, value) => value === void 0 ? void 0 : {
169
+ ...identity,
170
+ ...value
171
+ };
172
+ const serverPlugin = defineServerPlugin({
173
+ name: "@agimon-ai/po-codemode",
174
+ providerOverrides: composeServerProviderOverrides(root_server_default),
175
+ provides: { session: [codemode_server_default] },
176
+ injects: composeRootInjects({ session: [root_server_default] }),
177
+ session: async (context) => {
178
+ const scopeSession = await context.scopeRoot("session", root_server_default, context);
179
+ const contextSession = {
180
+ ...context,
181
+ root: scopeSession.value
182
+ };
183
+ return {
184
+ ...composeRootHooks(scopeSession),
185
+ get resources() {
186
+ return [at(po_use_codemode_server_default, contextSession)];
187
+ },
188
+ get tools() {
189
+ return [via({ name: "discover" }, at(discover_server_default, contextSession)), via({ name: "exec" }, at(exec_server_default, contextSession))];
190
+ },
191
+ services: [...scopeSession.services ?? []],
192
+ get activities() {
193
+ return [...scopeSession.activities ?? []];
194
+ }
195
+ };
196
+ }
197
+ });
198
+ //#endregion
199
+ export { serverPlugin as default, serverPlugin };
200
+
201
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +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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"}
package/dist/index.cjs ADDED
@@ -0,0 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_codemodeTools = require("./codemodeTools-BX2qieCR.cjs");
3
+ exports.createCodemodeRegistry = require_codemodeTools.createCodemodeRegistry;
4
+ exports.createCodemodeTools = require_codemodeTools.createCodemodeTools;
@@ -0,0 +1,60 @@
1
+ import { PoCodemodeService } from "@agimon-ai/po-core/codemode";
2
+ import { Type } from "typebox";
3
+ import { PoIsolateService } from "@agimon-ai/po-core/platform";
4
+ import { PoHeadlessTool } from "@agimon-ai/po-core/headless";
5
+ //#region src/services/codemodeRegistry/index.d.ts
6
+ /** The session's namespaces and script folders, in registration order. One name per session. */
7
+ export declare function createCodemodeRegistry(): PoCodemodeService;
8
+ //#endregion
9
+ //#region src/schemas/codemodeTools.d.ts
10
+ declare const DiscoverToolSchema: Type.TObject<{
11
+ namespace: Type.TOptional<Type.TString>;
12
+ query: Type.TOptional<Type.TString>;
13
+ }>;
14
+ declare const ExecToolSchema: Type.TObject<{
15
+ code: Type.TString;
16
+ timeoutMs: Type.TOptional<Type.TInteger>;
17
+ }>;
18
+ //#endregion
19
+ //#region src/services/codemodeScripts/type.d.ts
20
+ /** A reusable script as `discover` lists it. */
21
+ interface CodemodeScriptEntry {
22
+ /** What `await import(specifier)` takes, such as `session:exec-3` or `<domain>/<name>`. */
23
+ readonly specifier: string;
24
+ readonly path: string;
25
+ /** First paragraph of the leading block comment, or the first line of code. */
26
+ readonly description: string;
27
+ }
28
+ /** Saves exec scripts in the session folder, resolves import specifiers and lists reusable scripts. */
29
+ interface CodemodeScriptsPort {
30
+ /** Saves an exec body as the session's next `exec-<n>.ts`; undefined when the session has no folder. */
31
+ save(code: string): Promise<{
32
+ readonly specifier: string;
33
+ readonly path: string;
34
+ } | undefined>;
35
+ /** Loads the body behind an import specifier, restricted to `domains` when given. */
36
+ resolve(specifier: string, domains?: readonly string[]): Promise<{
37
+ readonly id: string;
38
+ readonly source: string;
39
+ }>;
40
+ /** Domain scripts first, then this session's, newest first; at most `limit` entries. */
41
+ list(domains?: readonly string[], limit?: number): Promise<CodemodeScriptEntry[]>;
42
+ }
43
+ //#endregion
44
+ //#region src/services/codemodeTools/index.d.ts
45
+ interface CodemodeToolsOptions {
46
+ readonly registry: PoCodemodeService;
47
+ /** Resolved per call, so a host that binds the isolate late still works. */
48
+ readonly isolate: () => PoIsolateService | undefined;
49
+ /** Saves every exec body and backs `import()`; without it nothing is saved or importable. */
50
+ readonly scripts?: CodemodeScriptsPort;
51
+ }
52
+ interface CodemodeTools {
53
+ readonly discover: PoHeadlessTool<typeof DiscoverToolSchema>;
54
+ readonly exec: PoHeadlessTool<typeof ExecToolSchema>;
55
+ }
56
+ /** `discover` and `exec` for one session, over the namespaces its packages contributed. */
57
+ export declare function createCodemodeTools({ registry, isolate, scripts }: CodemodeToolsOptions): CodemodeTools;
58
+ //#endregion
59
+ export {};
60
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +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;;;;UCqB5C;WACN,UAAU;;WAEV,eAAe;;WAEf,UAAU;;UAGJ;WACN,UAAU,sBAAsB;WAChC,MAAM,sBAAsB;;;wBAwHvB,sBAAsB,UAAU,SAAS,WAAW,uBAAuB"}
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export { n as createCodemodeRegistry, t as createCodemodeTools } from "./codemodeTools-CSYUxIeA.mjs";
package/llms.txt ADDED
@@ -0,0 +1,13 @@
1
+ # @agimon-ai/po-codemode
2
+
3
+ Package-owned guidance for Code mode for Po sessions: discover and exec over namespaces other packages contribute
4
+
5
+ ## How to use
6
+
7
+ - [Use code mode](./src/prompts/po-use-codemode/SKILL.md): The discover and exec tools, script globals, limits and trust.
8
+
9
+ ## Resources
10
+
11
+ - [Package README](./README.md): Installation, development commands, native server command, and extension-specific usage.
12
+
13
+ - [Plugin lifecycle](./README.md#structure-and-lifecycle): Entry structure, registration ownership, startup, shutdown, and failure cleanup.