@agimon-ai/po-image-gen 0.0.0-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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vuong Ngo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @agimon-ai/po-image-gen
2
+
3
+ Generate and edit images using the ChatGPT subscription sign-in that Po features share (Image generation, Web search, Voice). Credentials stay inside the Po host. No API-key fallback or automatic retries.
4
+
5
+ ## Activation
6
+
7
+ This is an optional `image-gen` layer. Register `@agimon-ai/po-image-gen` under a layer's `packages` in your modes config, then include that layer in your chosen major mode. The repository's local `copilot` mode includes it for development; published starter configs do not.
8
+
9
+ Sign in to **ChatGPT for Po features** under Settings > Providers (or with `/login`). Image entitlement and quota depend on your account. This uses the same private ChatGPT image endpoints as Codex, which may change without notice.
10
+
11
+ ## Tool
12
+
13
+ `imagegen` accepts:
14
+
15
+ - `prompt`: non-blank image instructions.
16
+ - `transparent_background`: optional boolean.
17
+ - `referenced_image_paths`: optional list of up to five absolute local PNG, JPEG, or WebP file paths. Omit for a new image; supply for an edit. Each file is limited to 20 MiB, with 50 MiB total.
18
+
19
+ The result includes an inline PNG and a save hint. Files are created exclusively at `<poHome>/generated_images/<session>/<call>.png`; existing files are never overwritten. A save failure returns the image with a warning. Output is limited to 32 MiB.
20
+
21
+ Quota, account denial, and network failures are returned without retrying. Cancelling propagates the abort signal. History references, model/quality/size selection, and MCP are not included.
22
+
23
+ ## Structure and lifecycle
24
+
25
+ The generated server entry discovers the routed `imagegen.server.ts` tool. The web entry discovers its matching `imagegen.web.tsx` renderer. Tool execution uses the host's provider-neutral `imageGeneration` capability; extensions never receive tokens or headers. The host guards readiness and disposal, and refreshes existing OAuth credentials per call.
26
+
27
+ ## Development
28
+
29
+ Run `pnpm exec nx run-many -t lint typecheck build test -p @agimon-ai/po-image-gen` from the repository root. Renderer stories use deterministic local PNGs without remote requests. Their `mockup` status remains until human visual approval and runtime acceptance.
@@ -0,0 +1,53 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ let _agimon_ai_po_core_apiContracts = require("@agimon-ai/po-core/apiContracts");
6
+ let typebox = require("typebox");
7
+ //#region src/schemas/apiContracts.ts
8
+ const Metadata = {
9
+ id: typebox.Type.String(),
10
+ createdAt: typebox.Type.String(),
11
+ byteLength: typebox.Type.Integer()
12
+ };
13
+ const Artifact = typebox.Type.Object({
14
+ ...Metadata,
15
+ sessionId: typebox.Type.String(),
16
+ originalPath: typebox.Type.String(),
17
+ sourceSha256: typebox.Type.String(),
18
+ data: typebox.Type.String(),
19
+ mimeType: typebox.Type.Literal("image/png")
20
+ });
21
+ const apiContracts = (0, _agimon_ai_po_core_apiContracts.defineApiContract)({
22
+ version: 1,
23
+ http: [{
24
+ id: "listImages",
25
+ scope: "session",
26
+ basePath: "images",
27
+ path: "/artifacts",
28
+ method: "GET",
29
+ authentication: "owner",
30
+ description: "List preserved images in the current session.",
31
+ responses: (0, _agimon_ai_po_core_apiContracts.jsonApiResponses)(typebox.Type.Object({
32
+ sessionId: typebox.Type.String(),
33
+ items: typebox.Type.Array(typebox.Type.Object(Metadata)),
34
+ nextCursor: typebox.Type.Union([typebox.Type.String(), typebox.Type.Null()])
35
+ }))
36
+ }, {
37
+ id: "readImage",
38
+ scope: "session",
39
+ basePath: "images",
40
+ path: "/artifact",
41
+ method: "GET",
42
+ authentication: "owner",
43
+ description: "Read a verified preserved session image by artifact or tool call identity.",
44
+ responses: (0, _agimon_ai_po_core_apiContracts.jsonApiResponses)(Artifact)
45
+ }],
46
+ sockets: [],
47
+ dynamic: []
48
+ });
49
+ //#endregion
50
+ exports.apiContracts = apiContracts;
51
+ exports.default = apiContracts;
52
+
53
+ //# sourceMappingURL=apiContracts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst Metadata = { id: Type.String(), createdAt: Type.String(), byteLength: Type.Integer() };\nconst Artifact = Type.Object({\n ...Metadata,\n sessionId: Type.String(),\n originalPath: Type.String(),\n sourceSha256: Type.String(),\n data: Type.String(),\n mimeType: Type.Literal('image/png'),\n});\n\nexport const apiContracts = defineApiContract({\n version: 1,\n http: [\n {\n id: 'listImages',\n scope: 'session',\n basePath: 'images',\n path: '/artifacts',\n method: 'GET',\n authentication: 'owner',\n description: 'List preserved images in the current session.',\n responses: jsonApiResponses(\n Type.Object({\n sessionId: Type.String(),\n items: Type.Array(Type.Object(Metadata)),\n nextCursor: Type.Union([Type.String(), Type.Null()]),\n }),\n ),\n },\n {\n id: 'readImage',\n scope: 'session',\n basePath: 'images',\n path: '/artifact',\n method: 'GET',\n authentication: 'owner',\n description: 'Read a verified preserved session image by artifact or tool call identity.',\n responses: jsonApiResponses(Artifact),\n },\n ],\n sockets: [],\n dynamic: [],\n});\nexport default apiContracts;\n"],"mappings":";;;;;;;AAGA,MAAM,WAAW;CAAE,IAAIA,QAAAA,KAAK,OAAO;CAAG,WAAWA,QAAAA,KAAK,OAAO;CAAG,YAAYA,QAAAA,KAAK,QAAQ;AAAE;AAC3F,MAAM,WAAWA,QAAAA,KAAK,OAAO;CAC3B,GAAG;CACH,WAAWA,QAAAA,KAAK,OAAO;CACvB,cAAcA,QAAAA,KAAK,OAAO;CAC1B,cAAcA,QAAAA,KAAK,OAAO;CAC1B,MAAMA,QAAAA,KAAK,OAAO;CAClB,UAAUA,QAAAA,KAAK,QAAQ,WAAW;AACpC,CAAC;AAED,MAAa,gBAAA,GAAeC,gCAAAA,kBAAAA,CAAkB;CAC5C,SAAS;CACT,MAAM,CACJ;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,QAAQ;EACR,gBAAgB;EAChB,aAAa;EACb,YAAA,GAAWC,gCAAAA,iBAAAA,CACTF,QAAAA,KAAK,OAAO;GACV,WAAWA,QAAAA,KAAK,OAAO;GACvB,OAAOA,QAAAA,KAAK,MAAMA,QAAAA,KAAK,OAAO,QAAQ,CAAC;GACvC,YAAYA,QAAAA,KAAK,MAAM,CAACA,QAAAA,KAAK,OAAO,GAAGA,QAAAA,KAAK,KAAK,CAAC,CAAC;EACrD,CAAC,CACH;CACF,GACA;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,QAAQ;EACR,gBAAgB;EAChB,aAAa;EACb,YAAA,GAAWE,gCAAAA,iBAAAA,CAAiB,QAAQ;CACtC,CACF;CACA,SAAS,CAAC;CACV,SAAS,CAAC;AACZ,CAAC"}
@@ -0,0 +1,52 @@
1
+ //#region src/schemas/apiContracts.d.ts
2
+ export declare const apiContracts: {
3
+ version: 1;
4
+ protocols?: Record<string, string> | undefined;
5
+ schemas?: Record<string, boolean | object> | undefined;
6
+ http: {
7
+ id: string;
8
+ scope: "global" | "session" | "workspace";
9
+ basePath?: string | undefined;
10
+ path: string;
11
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
12
+ description: string;
13
+ availability?: string | undefined;
14
+ authentication: "device" | "none" | "owner";
15
+ parameters?: {
16
+ name: string;
17
+ in: "header" | "path" | "query";
18
+ required: boolean;
19
+ schema: boolean | object;
20
+ }[] | undefined;
21
+ body?: {
22
+ contentType: string;
23
+ contentTypes?: string[] | undefined;
24
+ required: boolean;
25
+ schema: boolean | object;
26
+ } | undefined;
27
+ responses: Record<string, {
28
+ description: string;
29
+ contentType?: string | undefined;
30
+ schema?: boolean | object | undefined;
31
+ events?: Record<string, boolean | object> | undefined;
32
+ }>;
33
+ }[];
34
+ sockets: {
35
+ id: string;
36
+ scope: "global" | "session" | "workspace";
37
+ description: string;
38
+ availability?: string | undefined;
39
+ service: string;
40
+ member: string;
41
+ direction: "client-to-server" | "server-to-client";
42
+ kind: "channel" | "method" | "state";
43
+ input: boolean | object;
44
+ output?: boolean | object | undefined;
45
+ errors?: boolean | object | undefined;
46
+ }[];
47
+ dynamic: string[];
48
+ gaps?: string[] | undefined;
49
+ };
50
+ //#endregion
51
+ export { apiContracts as default };
52
+ //# sourceMappingURL=apiContracts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";qBAaa"}
@@ -0,0 +1,48 @@
1
+ import { defineApiContract, jsonApiResponses } from "@agimon-ai/po-core/apiContracts";
2
+ import { Type } from "typebox";
3
+ //#region src/schemas/apiContracts.ts
4
+ const Metadata = {
5
+ id: Type.String(),
6
+ createdAt: Type.String(),
7
+ byteLength: Type.Integer()
8
+ };
9
+ const Artifact = Type.Object({
10
+ ...Metadata,
11
+ sessionId: Type.String(),
12
+ originalPath: Type.String(),
13
+ sourceSha256: Type.String(),
14
+ data: Type.String(),
15
+ mimeType: Type.Literal("image/png")
16
+ });
17
+ const apiContracts = defineApiContract({
18
+ version: 1,
19
+ http: [{
20
+ id: "listImages",
21
+ scope: "session",
22
+ basePath: "images",
23
+ path: "/artifacts",
24
+ method: "GET",
25
+ authentication: "owner",
26
+ description: "List preserved images in the current session.",
27
+ responses: jsonApiResponses(Type.Object({
28
+ sessionId: Type.String(),
29
+ items: Type.Array(Type.Object(Metadata)),
30
+ nextCursor: Type.Union([Type.String(), Type.Null()])
31
+ }))
32
+ }, {
33
+ id: "readImage",
34
+ scope: "session",
35
+ basePath: "images",
36
+ path: "/artifact",
37
+ method: "GET",
38
+ authentication: "owner",
39
+ description: "Read a verified preserved session image by artifact or tool call identity.",
40
+ responses: jsonApiResponses(Artifact)
41
+ }],
42
+ sockets: [],
43
+ dynamic: []
44
+ });
45
+ //#endregion
46
+ export { apiContracts, apiContracts as default };
47
+
48
+ //# sourceMappingURL=apiContracts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst Metadata = { id: Type.String(), createdAt: Type.String(), byteLength: Type.Integer() };\nconst Artifact = Type.Object({\n ...Metadata,\n sessionId: Type.String(),\n originalPath: Type.String(),\n sourceSha256: Type.String(),\n data: Type.String(),\n mimeType: Type.Literal('image/png'),\n});\n\nexport const apiContracts = defineApiContract({\n version: 1,\n http: [\n {\n id: 'listImages',\n scope: 'session',\n basePath: 'images',\n path: '/artifacts',\n method: 'GET',\n authentication: 'owner',\n description: 'List preserved images in the current session.',\n responses: jsonApiResponses(\n Type.Object({\n sessionId: Type.String(),\n items: Type.Array(Type.Object(Metadata)),\n nextCursor: Type.Union([Type.String(), Type.Null()]),\n }),\n ),\n },\n {\n id: 'readImage',\n scope: 'session',\n basePath: 'images',\n path: '/artifact',\n method: 'GET',\n authentication: 'owner',\n description: 'Read a verified preserved session image by artifact or tool call identity.',\n responses: jsonApiResponses(Artifact),\n },\n ],\n sockets: [],\n dynamic: [],\n});\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAM,WAAW;CAAE,IAAI,KAAK,OAAO;CAAG,WAAW,KAAK,OAAO;CAAG,YAAY,KAAK,QAAQ;AAAE;AAC3F,MAAM,WAAW,KAAK,OAAO;CAC3B,GAAG;CACH,WAAW,KAAK,OAAO;CACvB,cAAc,KAAK,OAAO;CAC1B,cAAc,KAAK,OAAO;CAC1B,MAAM,KAAK,OAAO;CAClB,UAAU,KAAK,QAAQ,WAAW;AACpC,CAAC;AAED,MAAa,eAAe,kBAAkB;CAC5C,SAAS;CACT,MAAM,CACJ;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,QAAQ;EACR,gBAAgB;EAChB,aAAa;EACb,WAAW,iBACT,KAAK,OAAO;GACV,WAAW,KAAK,OAAO;GACvB,OAAO,KAAK,MAAM,KAAK,OAAO,QAAQ,CAAC;GACvC,YAAY,KAAK,MAAM,CAAC,KAAK,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC;EACrD,CAAC,CACH;CACF,GACA;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,QAAQ;EACR,gBAAgB;EAChB,aAAa;EACb,WAAW,iBAAiB,QAAQ;CACtC,CACF;CACA,SAAS,CAAC;CACV,SAAS,CAAC;AACZ,CAAC"}
@@ -0,0 +1,119 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_imagegenTool = require("../imagegenTool-DDb0F5QH.cjs");
6
+ let _agimon_ai_po_core_serverFacet = require("@agimon-ai/po-core/serverFacet");
7
+ let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
8
+ let _agimon_ai_po_core_piSettings = require("@agimon-ai/po-core/piSettings");
9
+ let _agimon_ai_po_core_web = require("@agimon-ai/po-core/web");
10
+ let _agimon_ai_po_core_help = require("@agimon-ai/po-core/help");
11
+ //#region src/types/apiRoutes.ts
12
+ const routes = (0, _agimon_ai_po_core_web.defineApiRoutes)({
13
+ listImages: {
14
+ method: "GET",
15
+ path: "/artifacts",
16
+ query: ["limit", "cursor"],
17
+ response: (0, _agimon_ai_po_core_web.apiResponse)()
18
+ },
19
+ readImage: {
20
+ method: "GET",
21
+ path: "/artifact",
22
+ query: ["id", "toolCallId"],
23
+ response: (0, _agimon_ai_po_core_web.apiResponse)()
24
+ }
25
+ });
26
+ //#endregion
27
+ //#region src/extensions/workspaces/sessions/(backend)/api/images/_lib/imageApi.ts
28
+ /** Owner authentication and session admission are enforced by the host mount. */
29
+ function createImageApi(home) {
30
+ return {
31
+ basePath: "images",
32
+ start(context) {
33
+ if (context.scope !== "session" || !context.sessionId) throw new Error("Images require a session mount.");
34
+ const sessionId = context.sessionId;
35
+ return {
36
+ close() {},
37
+ async fetch(request) {
38
+ const url = new URL(request.url);
39
+ if (request.method !== "GET") return Response.json({ error: "Method not allowed." }, { status: 405 });
40
+ try {
41
+ let result;
42
+ if (url.pathname === routes.listImages.path) {
43
+ const limit = url.searchParams.get("limit");
44
+ const cursor = url.searchParams.get("cursor");
45
+ if (limit !== null && !/^\d+$/u.test(limit) || cursor !== null && !/^\d+$/u.test(cursor)) return Response.json({ error: "Invalid image page." }, { status: 400 });
46
+ result = await require_imagegenTool.listImageArtifacts(home, sessionId, limit === null ? 6 : Number(limit), cursor === null ? 0 : Number(cursor), request.signal);
47
+ } else if (url.pathname === routes.readImage.path) {
48
+ const id = url.searchParams.get("id");
49
+ const call = url.searchParams.get("toolCallId");
50
+ if (id === null === (call === null) || call !== null && (!call || call.length > 16384)) return Response.json({ error: "Provide exactly one image identity." }, { status: 400 });
51
+ result = await require_imagegenTool.readImageArtifact(home, sessionId, id ?? require_imagegenTool.imageArtifactIdForCall(call), request.signal);
52
+ } else return Response.json({ error: "Not found." }, { status: 404 });
53
+ return Response.json(result, { headers: {
54
+ "cache-control": "no-store",
55
+ "x-content-type-options": "nosniff"
56
+ } });
57
+ } catch (error) {
58
+ request.signal.throwIfAborted();
59
+ if (error instanceof require_imagegenTool.ImageArtifactError) return Response.json({ error: error.message }, { status: error.message.startsWith("Invalid") ? 400 : 404 });
60
+ if (error instanceof Error && "code" in error && [
61
+ "ENOENT",
62
+ "ELOOP",
63
+ "ENOTDIR"
64
+ ].includes(String(error.code))) return Response.json({ error: "Image not found." }, { status: 404 });
65
+ throw error;
66
+ }
67
+ }
68
+ };
69
+ }
70
+ };
71
+ }
72
+ //#endregion
73
+ //#region src/extensions/workspaces/sessions/(backend)/api/images/route.server.ts
74
+ var route_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoute)(({ host }) => {
75
+ if (!host.context.homeDirectory) throw new Error("Images require the configured server home.");
76
+ return createImageApi((0, _agimon_ai_po_core_piSettings.poHomeDirectory)(host.context.homeDirectory));
77
+ });
78
+ //#endregion
79
+ //#region src/extensions/workspaces/sessions/(backend)/resource/po-use-image-gen.server.ts
80
+ var po_use_image_gen_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
81
+ name: "po-use-image-gen",
82
+ description: "Use @agimon-ai/po-image-gen: Generate and edit images using a ChatGPT subscription.",
83
+ when: _agimon_ai_po_core_help.DOOM_HELP_WHEN,
84
+ kind: "skill",
85
+ path: (0, _agimon_ai_po_core_serverFacet.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-image-gen/SKILL.md"),
86
+ read: () => (0, _agimon_ai_po_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-image-gen/SKILL.md")
87
+ });
88
+ //#endregion
89
+ //#region src/extensions/workspaces/sessions/(backend)/tool/imagegen.server.ts
90
+ var imagegen_server_default = (0, _agimon_ai_po_core_extensionFile.defineServerTool)(({ host }) => {
91
+ if (!host.context.homeDirectory) throw new Error("Image generation requires the configured server home.");
92
+ return require_imagegenTool.createImagegenTool((0, _agimon_ai_po_core_piSettings.poHomeDirectory)(host.context.homeDirectory));
93
+ });
94
+ //#endregion
95
+ //#region generated/server.ts
96
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
97
+ const via = (identity, value) => value === void 0 ? void 0 : {
98
+ ...identity,
99
+ ...value
100
+ };
101
+ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
102
+ name: "@agimon-ai/po-image-gen",
103
+ session: (context) => ({
104
+ get api() {
105
+ return [at(route_server_default, context)];
106
+ },
107
+ get resources() {
108
+ return [at(po_use_image_gen_server_default, context)];
109
+ },
110
+ get tools() {
111
+ return [via({ name: "imagegen" }, at(imagegen_server_default, context))];
112
+ }
113
+ })
114
+ });
115
+ //#endregion
116
+ exports.default = facet;
117
+ exports.facet = facet;
118
+
119
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","names":["defineApiRoutes","apiResponse","listImageArtifacts","readImageArtifact","imageArtifactIdForCall","ImageArtifactError","defineRoute","poHomeDirectory","defineResource","DOOM_HELP_WHEN","packageResourcePath","readPackageResource","defineServerTool","createImagegenTool","poHomeDirectory","defineServerPlugin","apiRoute","resourcePoUseImageGen","toolImagegen"],"sources":["../../src/types/apiRoutes.ts","../../src/extensions/workspaces/sessions/(backend)/api/images/_lib/imageApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/images/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-use-image-gen.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/imagegen.server.ts","../../generated/server.ts"],"sourcesContent":["import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { ImageArtifact, ImageArtifactList } from './imageArtifacts';\n\nexport const routes = defineApiRoutes({\n listImages: {\n method: 'GET',\n path: '/artifacts',\n query: ['limit', 'cursor'],\n response: apiResponse<ImageArtifactList>(),\n },\n readImage: { method: 'GET', path: '/artifact', query: ['id', 'toolCallId'], response: apiResponse<ImageArtifact>() },\n});\nexport default routes;\n","import type { DoomApi } from '@agimon-ai/po-core/packageApi';\n\nimport {\n ImageArtifactError,\n imageArtifactIdForCall,\n listImageArtifacts,\n readImageArtifact,\n} from '../../../../../../../services/imageArtifacts';\nimport routes from '../../../../../../../types/apiRoutes';\n\n/** Owner authentication and session admission are enforced by the host mount. */\nexport function createImageApi(home: string): DoomApi {\n return {\n basePath: 'images',\n start(context) {\n if (context.scope !== 'session' || !context.sessionId) throw new Error('Images require a session mount.');\n const sessionId = context.sessionId;\n return {\n close() {},\n async fetch(request) {\n const url = new URL(request.url);\n if (request.method !== 'GET') return Response.json({ error: 'Method not allowed.' }, { status: 405 });\n try {\n let result;\n if (url.pathname === routes.listImages.path) {\n const limit = url.searchParams.get('limit');\n const cursor = url.searchParams.get('cursor');\n if ((limit !== null && !/^\\d+$/u.test(limit)) || (cursor !== null && !/^\\d+$/u.test(cursor)))\n return Response.json({ error: 'Invalid image page.' }, { status: 400 });\n result = await listImageArtifacts(\n home,\n sessionId,\n limit === null ? 6 : Number(limit),\n cursor === null ? 0 : Number(cursor),\n request.signal,\n );\n } else if (url.pathname === routes.readImage.path) {\n const id = url.searchParams.get('id');\n const call = url.searchParams.get('toolCallId');\n if ((id === null) === (call === null) || (call !== null && (!call || call.length > 16384)))\n return Response.json({ error: 'Provide exactly one image identity.' }, { status: 400 });\n result = await readImageArtifact(home, sessionId, id ?? imageArtifactIdForCall(call!), request.signal);\n } else return Response.json({ error: 'Not found.' }, { status: 404 });\n return Response.json(result, {\n headers: { 'cache-control': 'no-store', 'x-content-type-options': 'nosniff' },\n });\n } catch (error) {\n request.signal.throwIfAborted();\n if (error instanceof ImageArtifactError)\n return Response.json(\n { error: error.message },\n { status: error.message.startsWith('Invalid') ? 400 : 404 },\n );\n if (\n error instanceof Error &&\n 'code' in error &&\n ['ENOENT', 'ELOOP', 'ENOTDIR'].includes(String(error.code))\n )\n return Response.json({ error: 'Image not found.' }, { status: 404 });\n throw error;\n }\n },\n };\n },\n };\n}\n","import { defineRoute } from '@agimon-ai/po-core/extensionFile';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createImageApi } from './_lib/imageApi';\n\nexport default defineRoute(({ host }: DoomServerPluginContext) => {\n if (!host.context.homeDirectory) throw new Error('Images require the configured server home.');\n return createImageApi(poHomeDirectory(host.context.homeDirectory));\n});\n","// @scaffold-generated\nimport { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { DOOM_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineResource({\n name: 'po-use-image-gen',\n description: 'Use @agimon-ai/po-image-gen: Generate and edit images using a ChatGPT subscription.',\n when: DOOM_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-use-image-gen/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-image-gen/SKILL.md'),\n});\n","import { defineServerTool } from '@agimon-ai/po-core/extensionFile';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createImagegenTool } from '../../../../../services/imagegenTool';\n\nexport default defineServerTool(({ host }: DoomServerPluginContext) => {\n if (!host.context.homeDirectory) throw new Error('Image generation requires the configured server home.');\n return createImagegenTool(poHomeDirectory(host.context.homeDirectory));\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/images/route.server';\nimport resourcePoUseImageGen from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-image-gen.server';\nimport toolImagegen from '../src/extensions/workspaces/sessions/(backend)/tool/imagegen.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 facet = defineServerPlugin({\n name: '@agimon-ai/po-image-gen',\n session: (context) => ({\n get api(): DoomServerSessionPlugin['api'] { return [at(apiRoute, context)]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourcePoUseImageGen, context)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'imagegen' }, at(toolImagegen, context))]; },\n }),\n});\n\nexport default facet;\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ //#region generated/server.d.ts
2
+ export declare const facet: import("@agimon-ai/po-core/serverFacet").DoomServerFacet;
3
+ //#endregion
4
+ export { facet as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAaa,gDAAK"}
@@ -0,0 +1,114 @@
1
+ import { a as readImageArtifact, i as listImageArtifacts, n as ImageArtifactError, r as imageArtifactIdForCall, t as createImagegenTool } from "../imagegenTool-DMrMZjfO.mjs";
2
+ import { defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/serverFacet";
3
+ import { defineResource, defineRoute, defineServerTool } from "@agimon-ai/po-core/extensionFile";
4
+ import { poHomeDirectory } from "@agimon-ai/po-core/piSettings";
5
+ import { apiResponse, defineApiRoutes } from "@agimon-ai/po-core/web";
6
+ import { DOOM_HELP_WHEN } from "@agimon-ai/po-core/help";
7
+ //#region src/types/apiRoutes.ts
8
+ const routes = defineApiRoutes({
9
+ listImages: {
10
+ method: "GET",
11
+ path: "/artifacts",
12
+ query: ["limit", "cursor"],
13
+ response: apiResponse()
14
+ },
15
+ readImage: {
16
+ method: "GET",
17
+ path: "/artifact",
18
+ query: ["id", "toolCallId"],
19
+ response: apiResponse()
20
+ }
21
+ });
22
+ //#endregion
23
+ //#region src/extensions/workspaces/sessions/(backend)/api/images/_lib/imageApi.ts
24
+ /** Owner authentication and session admission are enforced by the host mount. */
25
+ function createImageApi(home) {
26
+ return {
27
+ basePath: "images",
28
+ start(context) {
29
+ if (context.scope !== "session" || !context.sessionId) throw new Error("Images require a session mount.");
30
+ const sessionId = context.sessionId;
31
+ return {
32
+ close() {},
33
+ async fetch(request) {
34
+ const url = new URL(request.url);
35
+ if (request.method !== "GET") return Response.json({ error: "Method not allowed." }, { status: 405 });
36
+ try {
37
+ let result;
38
+ if (url.pathname === routes.listImages.path) {
39
+ const limit = url.searchParams.get("limit");
40
+ const cursor = url.searchParams.get("cursor");
41
+ if (limit !== null && !/^\d+$/u.test(limit) || cursor !== null && !/^\d+$/u.test(cursor)) return Response.json({ error: "Invalid image page." }, { status: 400 });
42
+ result = await listImageArtifacts(home, sessionId, limit === null ? 6 : Number(limit), cursor === null ? 0 : Number(cursor), request.signal);
43
+ } else if (url.pathname === routes.readImage.path) {
44
+ const id = url.searchParams.get("id");
45
+ const call = url.searchParams.get("toolCallId");
46
+ if (id === null === (call === null) || call !== null && (!call || call.length > 16384)) return Response.json({ error: "Provide exactly one image identity." }, { status: 400 });
47
+ result = await readImageArtifact(home, sessionId, id ?? imageArtifactIdForCall(call), request.signal);
48
+ } else return Response.json({ error: "Not found." }, { status: 404 });
49
+ return Response.json(result, { headers: {
50
+ "cache-control": "no-store",
51
+ "x-content-type-options": "nosniff"
52
+ } });
53
+ } catch (error) {
54
+ request.signal.throwIfAborted();
55
+ if (error instanceof ImageArtifactError) return Response.json({ error: error.message }, { status: error.message.startsWith("Invalid") ? 400 : 404 });
56
+ if (error instanceof Error && "code" in error && [
57
+ "ENOENT",
58
+ "ELOOP",
59
+ "ENOTDIR"
60
+ ].includes(String(error.code))) return Response.json({ error: "Image not found." }, { status: 404 });
61
+ throw error;
62
+ }
63
+ }
64
+ };
65
+ }
66
+ };
67
+ }
68
+ //#endregion
69
+ //#region src/extensions/workspaces/sessions/(backend)/api/images/route.server.ts
70
+ var route_server_default = defineRoute(({ host }) => {
71
+ if (!host.context.homeDirectory) throw new Error("Images require the configured server home.");
72
+ return createImageApi(poHomeDirectory(host.context.homeDirectory));
73
+ });
74
+ //#endregion
75
+ //#region src/extensions/workspaces/sessions/(backend)/resource/po-use-image-gen.server.ts
76
+ var po_use_image_gen_server_default = defineResource({
77
+ name: "po-use-image-gen",
78
+ description: "Use @agimon-ai/po-image-gen: Generate and edit images using a ChatGPT subscription.",
79
+ when: DOOM_HELP_WHEN,
80
+ kind: "skill",
81
+ path: packageResourcePath(import.meta.url, "src/prompts/po-use-image-gen/SKILL.md"),
82
+ read: () => readPackageResource(import.meta.url, "src/prompts/po-use-image-gen/SKILL.md")
83
+ });
84
+ //#endregion
85
+ //#region src/extensions/workspaces/sessions/(backend)/tool/imagegen.server.ts
86
+ var imagegen_server_default = defineServerTool(({ host }) => {
87
+ if (!host.context.homeDirectory) throw new Error("Image generation requires the configured server home.");
88
+ return createImagegenTool(poHomeDirectory(host.context.homeDirectory));
89
+ });
90
+ //#endregion
91
+ //#region generated/server.ts
92
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
93
+ const via = (identity, value) => value === void 0 ? void 0 : {
94
+ ...identity,
95
+ ...value
96
+ };
97
+ const facet = defineServerPlugin({
98
+ name: "@agimon-ai/po-image-gen",
99
+ session: (context) => ({
100
+ get api() {
101
+ return [at(route_server_default, context)];
102
+ },
103
+ get resources() {
104
+ return [at(po_use_image_gen_server_default, context)];
105
+ },
106
+ get tools() {
107
+ return [via({ name: "imagegen" }, at(imagegen_server_default, context))];
108
+ }
109
+ })
110
+ });
111
+ //#endregion
112
+ export { facet as default, facet };
113
+
114
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":["apiRoute","resourcePoUseImageGen","toolImagegen"],"sources":["../../src/types/apiRoutes.ts","../../src/extensions/workspaces/sessions/(backend)/api/images/_lib/imageApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/images/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-use-image-gen.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/imagegen.server.ts","../../generated/server.ts"],"sourcesContent":["import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { ImageArtifact, ImageArtifactList } from './imageArtifacts';\n\nexport const routes = defineApiRoutes({\n listImages: {\n method: 'GET',\n path: '/artifacts',\n query: ['limit', 'cursor'],\n response: apiResponse<ImageArtifactList>(),\n },\n readImage: { method: 'GET', path: '/artifact', query: ['id', 'toolCallId'], response: apiResponse<ImageArtifact>() },\n});\nexport default routes;\n","import type { DoomApi } from '@agimon-ai/po-core/packageApi';\n\nimport {\n ImageArtifactError,\n imageArtifactIdForCall,\n listImageArtifacts,\n readImageArtifact,\n} from '../../../../../../../services/imageArtifacts';\nimport routes from '../../../../../../../types/apiRoutes';\n\n/** Owner authentication and session admission are enforced by the host mount. */\nexport function createImageApi(home: string): DoomApi {\n return {\n basePath: 'images',\n start(context) {\n if (context.scope !== 'session' || !context.sessionId) throw new Error('Images require a session mount.');\n const sessionId = context.sessionId;\n return {\n close() {},\n async fetch(request) {\n const url = new URL(request.url);\n if (request.method !== 'GET') return Response.json({ error: 'Method not allowed.' }, { status: 405 });\n try {\n let result;\n if (url.pathname === routes.listImages.path) {\n const limit = url.searchParams.get('limit');\n const cursor = url.searchParams.get('cursor');\n if ((limit !== null && !/^\\d+$/u.test(limit)) || (cursor !== null && !/^\\d+$/u.test(cursor)))\n return Response.json({ error: 'Invalid image page.' }, { status: 400 });\n result = await listImageArtifacts(\n home,\n sessionId,\n limit === null ? 6 : Number(limit),\n cursor === null ? 0 : Number(cursor),\n request.signal,\n );\n } else if (url.pathname === routes.readImage.path) {\n const id = url.searchParams.get('id');\n const call = url.searchParams.get('toolCallId');\n if ((id === null) === (call === null) || (call !== null && (!call || call.length > 16384)))\n return Response.json({ error: 'Provide exactly one image identity.' }, { status: 400 });\n result = await readImageArtifact(home, sessionId, id ?? imageArtifactIdForCall(call!), request.signal);\n } else return Response.json({ error: 'Not found.' }, { status: 404 });\n return Response.json(result, {\n headers: { 'cache-control': 'no-store', 'x-content-type-options': 'nosniff' },\n });\n } catch (error) {\n request.signal.throwIfAborted();\n if (error instanceof ImageArtifactError)\n return Response.json(\n { error: error.message },\n { status: error.message.startsWith('Invalid') ? 400 : 404 },\n );\n if (\n error instanceof Error &&\n 'code' in error &&\n ['ENOENT', 'ELOOP', 'ENOTDIR'].includes(String(error.code))\n )\n return Response.json({ error: 'Image not found.' }, { status: 404 });\n throw error;\n }\n },\n };\n },\n };\n}\n","import { defineRoute } from '@agimon-ai/po-core/extensionFile';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createImageApi } from './_lib/imageApi';\n\nexport default defineRoute(({ host }: DoomServerPluginContext) => {\n if (!host.context.homeDirectory) throw new Error('Images require the configured server home.');\n return createImageApi(poHomeDirectory(host.context.homeDirectory));\n});\n","// @scaffold-generated\nimport { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { DOOM_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineResource({\n name: 'po-use-image-gen',\n description: 'Use @agimon-ai/po-image-gen: Generate and edit images using a ChatGPT subscription.',\n when: DOOM_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-use-image-gen/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-image-gen/SKILL.md'),\n});\n","import { defineServerTool } from '@agimon-ai/po-core/extensionFile';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createImagegenTool } from '../../../../../services/imagegenTool';\n\nexport default defineServerTool(({ host }: DoomServerPluginContext) => {\n if (!host.context.homeDirectory) throw new Error('Image generation requires the configured server home.');\n return createImagegenTool(poHomeDirectory(host.context.homeDirectory));\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/images/route.server';\nimport resourcePoUseImageGen from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-image-gen.server';\nimport toolImagegen from '../src/extensions/workspaces/sessions/(backend)/tool/imagegen.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 facet = defineServerPlugin({\n name: '@agimon-ai/po-image-gen',\n session: (context) => ({\n get api(): DoomServerSessionPlugin['api'] { return [at(apiRoute, context)]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourcePoUseImageGen, context)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'imagegen' }, at(toolImagegen, context))]; },\n }),\n});\n\nexport default facet;\n"],"mappings":"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"}