Compare commits

..
27 changed files with 109 additions and 2645 deletions
-4
View File
@@ -1,4 +0,0 @@
{
"monorepoCommit": "4c88728f144add3457b4273d4b9a04ee53c53be3",
"sourcePath": "quixos-instance/packages/todo-runtime"
}
+6 -8
View File
@@ -1,15 +1,13 @@
# Generated from the checked package contract
package_id: "package:todo-runtime"
package_revision_id: "package:todo-runtime@1"
runtime_protocol_version: "quixos-capabilities-v1"
exports: { export_id: "export:todo-runtime:complete" runtime_symbol: "complete" }
exports: { export_id: "export:todo-runtime:reopen" runtime_symbol: "reopen" }
exports: { export_id: "export:todo-runtime:archive" runtime_symbol: "archive" }
exports: { export_id: "export:todo-runtime:display-label-get" runtime_symbol: "displayLabelGet" }
exports: { export_id: "export:todo-runtime:display-label-watch" runtime_symbol: "displayLabelWatch" }
exports: { export_id: "export:todo-runtime:display-label-watch-stop" runtime_symbol: "displayLabelWatchStop" }
exports: { export_id: "export:todo-runtime:search-document-get" runtime_symbol: "searchDocumentGet" }
exports: { export_id: "export:todo-runtime:search-document-watch" runtime_symbol: "searchDocumentWatch" }
exports: { export_id: "export:todo-runtime:search-document-watch-stop" runtime_symbol: "searchDocumentWatchStop" }
exports: { export_id: "export:todo-runtime:display-label-get" runtime_symbol: "displayLabel.get" }
exports: { export_id: "export:todo-runtime:display-label-watch" runtime_symbol: "displayLabel.watch" }
exports: { export_id: "export:todo-runtime:display-label-watch-stop" runtime_symbol: "displayLabel.watchStop" }
exports: { export_id: "export:todo-runtime:search-document-get" runtime_symbol: "searchDocument.get" }
exports: { export_id: "export:todo-runtime:search-document-watch" runtime_symbol: "searchDocument.watch" }
exports: { export_id: "export:todo-runtime:search-document-watch-stop" runtime_symbol: "searchDocument.watchStop" }
exports: { export_id: "export:todo-runtime:create-task" runtime_symbol: "createTask" }
exports: { export_id: "create-completion" runtime_symbol: "createCompletion" }
Generated
+7 -7
View File
@@ -37,17 +37,17 @@
"quixosNixHelpers": {
"flake": false,
"locked": {
"lastModified": 1789602549,
"narHash": "sha256-DD66dQ3dzEvG13Zju/4sVSV4pnktSUkJ/Rbr1KkHMdg=",
"ref": "refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
"rev": "e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
"revCount": 32,
"lastModified": 1788543053,
"narHash": "sha256-3YReATWEVxZinYVi/l3cwOz+oFoZUrwj24kUBQTmUpQ=",
"ref": "refs/tags/quixos-reachability/56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
"rev": "56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
"revCount": 8,
"type": "git",
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
},
"original": {
"ref": "refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
"rev": "e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
"ref": "refs/tags/quixos-reachability/56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
"rev": "56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
"type": "git",
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
}
+2 -9
View File
@@ -6,25 +6,18 @@
flake-utils.url = "github:numtide/flake-utils";
quixosNixHelpers = {
url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f&rev=e2747066ca7d9d001dcb5dd936e17969ed88fc5f";
url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a&rev=56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a";
flake = false;
};
};
outputs =
inputs@{
nixpkgs,
flake-utils,
quixosNixHelpers,
...
}:
outputs = inputs@{ nixpkgs, flake-utils, quixosNixHelpers, ... }:
let
quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix";
in
quixosHelpers.mkCaminoTsYarnNixifyFlake {
inherit inputs nixpkgs flake-utils;
packageRoot = ./.;
migrationEntrypoint = "dist/migrate.js";
promptName = "todo-runtime";
bundle = {
entry = "dist/server.js";
+1 -1
View File
@@ -12,7 +12,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370"
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d"
},
"devDependencies": {
"@types/node": "^24",
+18 -15
View File
@@ -1,37 +1,40 @@
import interface CompletionData;
external atom Completion id "atom:completion";
import interface TaskData;
external atom Task id "atom:task";
package TodoRuntime id "package:todo-runtime" revision "package:todo-runtime@1" {
operation complete id "export:todo-runtime:complete" : unit -> string mode call receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
constructor completion id "completion-constructor" : Completion input record {completedAt: double; scheduledDate: string;};
state status id "port:todo-actions:status" : string [read, write];
};
operation reopen id "export:todo-runtime:reopen" : unit -> string mode call receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
state status id "port:todo-actions:status" : string [read, write];
};
operation archive id "export:todo-runtime:archive" : unit -> string mode call receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
state status id "port:todo-actions:status" : string [read, write];
};
operation displayLabelGet id "export:todo-runtime:display-label-get" : unit -> string mode call receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
state title id "port:todo-label:title" : string [read];
state status id "port:todo-label:status" : string [read];
state priority id "port:todo-label:priority" : string [read];
};
operation displayLabelWatch id "export:todo-runtime:display-label-watch" : unit -> watch-handle mode watch-start emits string receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
state title id "port:todo-label:title" : string [read];
state status id "port:todo-label:status" : string [read];
state priority id "port:todo-label:priority" : string [read];
};
operation displayLabelWatchStop id "export:todo-runtime:display-label-watch-stop" : watch-handle -> unit mode watch-stop receiver atom Task;
operation searchDocumentGet id "export:todo-runtime:search-document-get" : unit -> message "org.quixos.web-studio.SearchDocument" mode call receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
state title id "port:todo-search:title" : string [read];
state status id "port:todo-search:status" : string [read];
state priority id "port:todo-search:priority" : string [read];
state dueDate id "port:todo-search:due-date" : string [read];
};
operation searchDocumentWatch id "export:todo-runtime:search-document-watch" : unit -> watch-handle mode watch-start emits message "org.quixos.web-studio.SearchDocument" receiver atom Task requires {
interface data id "port:todo-runtime:data" : TaskData;
state title id "port:todo-search:title" : string [read];
state status id "port:todo-search:status" : string [read];
state priority id "port:todo-search:priority" : string [read];
state dueDate id "port:todo-search:due-date" : string [read];
};
operation searchDocumentWatchStop id "export:todo-runtime:search-document-watch-stop" : watch-handle -> unit mode watch-stop receiver atom Task;
constructor createTask id "export:todo-runtime:create-task" constructs Task : string requires {
interface data id "port:todo-runtime:data" : TaskData;
};
constructor createCompletion id "create-completion" constructs Completion : record {completedAt: double; scheduledDate: string;} requires {
interface data id "completion-data" : CompletionData;
state title id "port:todo-constructor:title" : string [write];
};
}
-12
View File
@@ -1,12 +0,0 @@
{
"backend": "typescript",
"bindingOutput": "src/gen/qx.ts",
"options": {
"messages": {
"org.quixos.web-studio.SearchDocument": {
"module": "../messages.js",
"export": "searchDocumentBinding"
}
}
}
}
+1 -9
View File
@@ -1,14 +1,6 @@
quixos-lock version 1 {
quixos source {
repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git";
commit "4c88728f144add3457b4273d4b9a04ee53c53be3";
}
interface TaskData source {
repository "https://repos.quixos.org/quixos-templates/interface-task-data.git";
commit "73d0b65861ab7d4194e431a6a38e28a288687fe9";
}
interface CompletionData source {
repository "https://repos.quixos.org/quixos-templates/interface-completion-data.git";
commit "6af9cc41f203378dce92f14b716708ba053d30fc";
commit "9c3ab572ecfbc83785038c3d9f174516df15d63f";
}
}
-6
View File
@@ -1,6 +0,0 @@
{
"generatedBy": "qx-scaffold-v1",
"schemaVersion": 1,
"contracts": {},
"migrations": []
}
-4
View File
@@ -1,4 +0,0 @@
{
"generatedBy": "qx-scaffold-v1",
"nixifyPluginUrl": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js"
}
-2440
View File
File diff suppressed because one or more lines are too long
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { archive as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { complete as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { createTask as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { displayLabel as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { displayLabel as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { stopWatch as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { reopen as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { searchDocument as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { searchDocument as handler } from "../task.impl.js";
-2
View File
@@ -1,2 +0,0 @@
// This adapter keeps the implementation file hand-authored.
export { stopWatch as handler } from "../task.impl.js";
-15
View File
@@ -1,15 +0,0 @@
import { encodeQxValue, decodeQxValue, type MessageBinding, type QxValueType } from "@quixos/camino-package-runtime";
type SearchDocument = { title: string; subtitle: string; keywords: string[] };
const schema: QxValueType = {
kind: "record",
fields: {
title: { kind: "scalar", name: "string" },
subtitle: { kind: "scalar", name: "string" },
keywords: { kind: "list", value: { kind: "scalar", name: "string" } },
},
};
export const searchDocumentBinding: MessageBinding<SearchDocument> = {
encode: (value) => encodeQxValue(schema, value, {}),
decode: (value) => decodeQxValue(schema, value, {}),
};
-3
View File
@@ -1,3 +0,0 @@
// Generated by qx-scaffold-v1
import { serveMigration } from "@quixos/camino-package-runtime";
await serveMigration({});
+25 -28
View File
@@ -1,29 +1,26 @@
// Generated by qx-scaffold-v1
import { servePackageRuntime } from "@quixos/camino-package-runtime";
import { createRuntime } from "./gen/qx.js";
import { createCompletion } from "./task.impl.js";
import { handler as impl0 } from "./impl/complete.js";
import { handler as impl1 } from "./impl/reopen.js";
import { handler as impl2 } from "./impl/archive.js";
import { handler as impl3 } from "./impl/displayLabelGet.js";
import { handler as impl4 } from "./impl/displayLabelWatch.js";
import { handler as impl5 } from "./impl/displayLabelWatchStop.js";
import { handler as impl6 } from "./impl/searchDocumentGet.js";
import { handler as impl7 } from "./impl/searchDocumentWatch.js";
import { handler as impl8 } from "./impl/searchDocumentWatchStop.js";
import { handler as impl9 } from "./impl/createTask.js";
servePackageRuntime(
createRuntime({
createCompletion,
complete: impl0,
reopen: impl1,
archive: impl2,
displayLabelGet: impl3,
displayLabelWatch: impl4,
displayLabelWatchStop: impl5,
searchDocumentGet: impl6,
searchDocumentWatch: impl7,
searchDocumentWatchStop: impl8,
createTask: impl9,
}),
);
import {
archive,
complete,
createTask,
displayLabel,
reopen,
searchDocument,
stopWatch,
} from "./task.impl.js";
servePackageRuntime({
packageRevisionId: "package:todo-runtime@1",
exports: {
"export:todo-runtime:complete": complete,
"export:todo-runtime:reopen": reopen,
"export:todo-runtime:archive": archive,
"export:todo-runtime:display-label-get": displayLabel,
"export:todo-runtime:display-label-watch": displayLabel,
"export:todo-runtime:display-label-watch-stop": stopWatch,
"export:todo-runtime:search-document-get": searchDocument,
"export:todo-runtime:search-document-watch": searchDocument,
"export:todo-runtime:search-document-watch-stop": stopWatch,
"export:todo-runtime:create-task": createTask,
},
});
+44 -59
View File
@@ -1,72 +1,57 @@
import type { Contexts } from "./gen/qx.js";
import { derived, type RuntimeContext } from "@quixos/camino-package-runtime";
export const complete = async ({ ports }: Contexts["complete"]) => {
const [status, repeatDays, dueDate] = await Promise.all([
ports.data["status.get"](),
ports.data["repeatDays.get"](),
ports.data["dueDate.get"](),
]);
if (status === "ARCHIVED") throw new Error("Restore this task before completing it");
if (status === "DONE") return "DONE";
if (!Number.isInteger(repeatDays) || repeatDays < 0 || repeatDays > 36500)
throw new Error("Repeat interval must be between 0 and 36500 whole days");
const now = Date.now();
const completion = await ports.completion.construct({ completedAt: now, scheduledDate: dueDate });
await ports.data["completions.connect"](completion);
if (repeatDays > 0) {
const next = new Date(now);
next.setUTCDate(next.getUTCDate() + repeatDays);
await ports.data["dueDate.set"](next.toISOString().slice(0, 10));
return "OPEN";
}
await ports.data["status.set"]("DONE");
const status = (context: RuntimeContext) =>
context.state<string>("port:todo-actions:status");
export const complete = async (context: RuntimeContext) => {
await status(context).set("DONE");
return "DONE";
};
export const createCompletion = async ({ ports, input, objectId }: Contexts["createCompletion"]) => {
if (!Number.isFinite(input.completedAt)) throw new Error("Invalid completion time");
await ports.data["completedAt.set"](input.completedAt);
await ports.data["scheduledDate.set"](input.scheduledDate);
return objectId;
};
export const reopen = async ({ ports }: Contexts["reopen"]) => {
await ports.data["status.set"]("OPEN");
export const reopen = async (context: RuntimeContext) => {
await status(context).set("OPEN");
return "OPEN";
};
export const archive = async ({ ports }: Contexts["archive"]) => {
await ports.data["status.set"]("ARCHIVED");
export const archive = async (context: RuntimeContext) => {
await status(context).set("ARCHIVED");
return "ARCHIVED";
};
export const displayLabel = {
kind: "derived" as const,
get: async ({ ports }: Contexts["displayLabelGet"]) => {
export const displayLabel = derived(
async (context) => {
const [title, status, priority] = await Promise.all([
ports.data["title.get"](),
ports.data["status.get"](),
ports.data["priority.get"](),
context.state<string>("port:todo-label:title").get(),
context.state<string>("port:todo-label:status").get(),
context.state<string>("port:todo-label:priority").get(),
]);
const priorityText = priority && priority !== "NORMAL" ? ` ${priority.toLowerCase()}` : "";
return `[${status || "OPEN"}]${priorityText} ${title || "Untitled task"}`;
const statusText = status ?? "OPEN";
const priorityText =
priority && priority !== "NORMAL" ? ` ${priority.toLowerCase()}` : "";
return `[${statusText}]${priorityText} ${title ?? "Untitled task"}`;
},
);
export const searchDocument = derived(async (context) => {
const [title, status, priority, dueDate] = await Promise.all([
context.state<string>("port:todo-search:title").get(),
context.state<string>("port:todo-search:status").get(),
context.state<string>("port:todo-search:priority").get(),
context.state<string>("port:todo-search:due-date").get(),
]);
return {
title: title || "Untitled task",
subtitle: `Task · ${status || "OPEN"}${dueDate ? ` · due ${dueDate}` : ""}`,
keywords: ["task", status || "open", priority || "normal", dueDate || ""],
};
});
export const createTask = async (context: RuntimeContext) => {
const title = typeof context.input.value === "string" && context.input.value.trim()
? context.input.value.trim()
: "Untitled task";
await context.state<string>("port:todo-constructor:title").set(title);
return context.objectId;
};
export const searchDocument = {
kind: "derived" as const,
get: async ({ ports }: Contexts["searchDocumentGet"]) => {
const [title, status, priority, dueDate] = await Promise.all([
ports.data["title.get"](),
ports.data["status.get"](),
ports.data["priority.get"](),
ports.data["dueDate.get"](),
]);
return {
title: title || "Untitled task",
subtitle: `Task · ${status || "OPEN"}${dueDate ? ` · due ${dueDate}` : ""}`,
keywords: ["task", status || "open", priority || "normal", dueDate || ""],
};
},
};
export const createTask = async ({ ports, input, objectId }: Contexts["createTask"]) => {
await ports.data["title.set"](input.trim() || "Untitled task");
return objectId;
};
export const stopWatch = () => null;
+1 -1
View File
@@ -159,7 +159,7 @@ cacheEntries = {
"@bufbuild/protobuf@npm:2.12.1" = { filename = "@bufbuild-protobuf-npm-2.12.1-d8afb467b3-2d40cfe4ec.zip"; hash = "sha512-LUDP5Ow7sOPwarLih3HcXcVm6qywVfvok9dWIbBAfQJy1I9ApJCtR97YOe1UFRThr3G7E68CSzrjbvDFbVbdqQ=="; };
"@connectrpc/connect-node@npm:2.1.2" = { filename = "@connectrpc-connect-node-npm-2.1.2-021434d5d5-ba8b0c9384.zip"; hash = "sha512-uosMk4TDgps3eqeoJtwM1Qpgk1J9LscBRgSRKDYzbqlgSitazqQrEEd/i+RWnknd7WbKD8d/X1sCcDXgKeE+qQ=="; };
"@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; };
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370" = { filename = "@quixos-camino-package-runtime-https-84d8fd5109-6d173f9220.zip"; hash = "sha512-bRc/kiD/ODsJqBNX4+RTqdsczILibHLhB+X8MckDCoK+j32c4Hszh87obb1Rwjb5o35aI0fzArQqCwK270zzlw=="; };
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d" = { filename = "@quixos-camino-package-runtime-https-683bcbf33c-c90d5d5c53.zip"; hash = "sha512-yQ1dXFMR2k+xbkka2rrhsAcrQFZlJAZEYM0hqwGzdV5RJ+fhQEh3BEgoPiL2yxrxulU4zg/jsj8BTBFRp1feyg=="; };
"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; };
"@typescript/typescript-linux-arm64@npm:7.0.2" = { filename = "@typescript-typescript-linux-arm64-npm-7.0.2-9cacfc53a0-10c0.zip"; hash = "sha512-s4c7nGT/lQIw6x0IfrL0b3ECy/D0g7UoDLdiIWJoM6EGXk5N/dmXdxUdA8Cr3hV/3nO2BYKTQ6Ai8/zGhiSQ3A=="; };
"@typescript/typescript-linux-x64@npm:7.0.2" = { filename = "@typescript-typescript-linux-x64-npm-7.0.2-8dd7ff8d24-10c0.zip"; hash = "sha512-k9EUK5CZ3OOPnyslp8SAAonHJpnpPmlaulppI/NmFyCzNs3UN/TLPUkyQia3KIxgbyTzKoXI5L5fl8Uj9bJ7Cg=="; };
+4 -4
View File
@@ -31,14 +31,14 @@ __metadata:
languageName: node
linkType: hard
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370":
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d":
version: 0.1.0
resolution: "@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370"
resolution: "@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d"
dependencies:
"@bufbuild/protobuf": "npm:^2.12.1"
"@connectrpc/connect": "npm:^2.1.2"
"@connectrpc/connect-node": "npm:^2.1.2"
checksum: 10c0/6d173f9220ff383b09a81357e3e453a9db1ccc82e26c72e107e5fc31c9030a82be8f7d9ce07b3387cee86dbd51c236f9a37e5a2347f302b42a0b02b6ef4cf397
checksum: 10c0/c90d5d5c5311da4fb16e491adabae1b0072b40566524064460cd21ab01b3755e5127e7e14048770448283e22f6cb1af1ba5538ce0fe3b23f014c1151a757deca
languageName: node
linkType: hard
@@ -46,7 +46,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@quixos/todo-runtime@workspace:."
dependencies:
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370"
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d"
"@types/node": "npm:^24"
typescript: "npm:^7.0.2"
bin: