@agimon-ai/po-codemode 0.0.0-stage → 0.0.1-alpha.0
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/LICENSE +149 -0
- package/README.md +82 -2
- package/dist/apiContracts.cjs +17 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +13 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/codemodeTools-BX2qieCR.cjs +349 -0
- package/dist/codemodeTools-BX2qieCR.cjs.map +1 -0
- package/dist/codemodeTools-CSYUxIeA.mjs +338 -0
- package/dist/codemodeTools-CSYUxIeA.mjs.map +1 -0
- package/dist/extensions/server.cjs +206 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +201 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.mts +60 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1 -0
- package/llms.txt +13 -0
- package/package.json +97 -3
- package/src/prompts/po-use-codemode/SKILL.md +44 -0
|
@@ -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 @@
|
|
|
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;
|
package/dist/index.d.mts
ADDED
|
@@ -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.
|