@lamplitisles/dsh-nanocodex 0.1.0-beta.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 +65 -0
- package/NOTICE +2 -0
- package/README.md +182 -0
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/cordis.patch.yml +52 -0
- package/dist/index.d.ts +435 -0
- package/dist/index.js +3405 -0
- package/dist/standard-preset.d.ts +7 -0
- package/dist/standard-preset.js +25 -0
- package/engine-release.json +14 -0
- package/package.json +119 -0
- package/presets/standard/agent.cordis.yml +6 -0
- package/presets/standard/preset.yml +2 -0
- package/vendor/nanocodex/README.md +1344 -0
- package/vendor/nanocodex/actions/events.d.mts +10 -0
- package/vendor/nanocodex/actions/events.mjs +163 -0
- package/vendor/nanocodex/actions/index.d.mts +13 -0
- package/vendor/nanocodex/actions/index.mjs +35 -0
- package/vendor/nanocodex/actions/session.d.mts +66 -0
- package/vendor/nanocodex/actions/session.mjs +59 -0
- package/vendor/nanocodex/actions/turn.d.mts +59 -0
- package/vendor/nanocodex/actions/turn.mjs +37 -0
- package/vendor/nanocodex/actions/voice.d.mts +22 -0
- package/vendor/nanocodex/actions/voice.mjs +50 -0
- package/vendor/nanocodex/browser/Agent.d.mts +55 -0
- package/vendor/nanocodex/browser/Agent.mjs +11 -0
- package/vendor/nanocodex/browser/ChatGptSubscription.d.mts +7 -0
- package/vendor/nanocodex/browser/ChatGptSubscription.mjs +19 -0
- package/vendor/nanocodex/browser/InlineAgent.mjs +266 -0
- package/vendor/nanocodex/browser/Transport.d.mts +74 -0
- package/vendor/nanocodex/browser/Transport.mjs +61 -0
- package/vendor/nanocodex/browser/Voice.d.mts +71 -0
- package/vendor/nanocodex/browser/Voice.mjs +291 -0
- package/vendor/nanocodex/browser/VoiceSession.mjs +688 -0
- package/vendor/nanocodex/browser/WorkerAgent.d.mts +65 -0
- package/vendor/nanocodex/browser/WorkerAgent.mjs +1472 -0
- package/vendor/nanocodex/browser/agent.worker.mjs +3 -0
- package/vendor/nanocodex/browser/config.d.mts +36 -0
- package/vendor/nanocodex/browser/config.mjs +439 -0
- package/vendor/nanocodex/browser/engine.mjs +13 -0
- package/vendor/nanocodex/browser/harness.mjs +55 -0
- package/vendor/nanocodex/browser/host.d.mts +83 -0
- package/vendor/nanocodex/browser/host.mjs +555 -0
- package/vendor/nanocodex/browser/hostManagedWebSocket.d.mts +14 -0
- package/vendor/nanocodex/browser/hostManagedWebSocket.mjs +110 -0
- package/vendor/nanocodex/browser/index.d.mts +92 -0
- package/vendor/nanocodex/browser/index.mjs +23 -0
- package/vendor/nanocodex/browser/indexeddb-durability-store.mjs +197 -0
- package/vendor/nanocodex/browser/workspace.d.mts +16 -0
- package/vendor/nanocodex/browser/workspace.mjs +107 -0
- package/vendor/nanocodex/cloud/Client.d.mts +83 -0
- package/vendor/nanocodex/cloud/Client.mjs +231 -0
- package/vendor/nanocodex/cloud/Decorator.d.mts +31 -0
- package/vendor/nanocodex/cloud/Decorator.mjs +37 -0
- package/vendor/nanocodex/cloud/Dialog.d.mts +113 -0
- package/vendor/nanocodex/cloud/Dialog.mjs +366 -0
- package/vendor/nanocodex/cloud/Errors.d.mts +22 -0
- package/vendor/nanocodex/cloud/Errors.mjs +39 -0
- package/vendor/nanocodex/cloud/Principal.d.mts +26 -0
- package/vendor/nanocodex/cloud/Principal.mjs +88 -0
- package/vendor/nanocodex/cloud/RemoteProvider.mjs +88 -0
- package/vendor/nanocodex/cloud/Transport.d.mts +47 -0
- package/vendor/nanocodex/cloud/Transport.mjs +454 -0
- package/vendor/nanocodex/cloud/actions/account.d.mts +9 -0
- package/vendor/nanocodex/cloud/actions/account.mjs +19 -0
- package/vendor/nanocodex/cloud/actions/agent.d.mts +18 -0
- package/vendor/nanocodex/cloud/actions/agent.mjs +428 -0
- package/vendor/nanocodex/cloud/actions/connection.d.mts +133 -0
- package/vendor/nanocodex/cloud/actions/connection.mjs +580 -0
- package/vendor/nanocodex/cloud/actions/grant.d.mts +10 -0
- package/vendor/nanocodex/cloud/actions/grant.mjs +12 -0
- package/vendor/nanocodex/cloud/actions/index.d.mts +7 -0
- package/vendor/nanocodex/cloud/actions/index.mjs +7 -0
- package/vendor/nanocodex/cloud/actions/machineUsd.d.mts +23 -0
- package/vendor/nanocodex/cloud/actions/machineUsd.mjs +37 -0
- package/vendor/nanocodex/cloud/actions/model.d.mts +12 -0
- package/vendor/nanocodex/cloud/actions/model.mjs +50 -0
- package/vendor/nanocodex/cloud/actions/mpp.d.mts +28 -0
- package/vendor/nanocodex/cloud/actions/mpp.mjs +39 -0
- package/vendor/nanocodex/cloud/index.d.mts +30 -0
- package/vendor/nanocodex/cloud/index.mjs +9 -0
- package/vendor/nanocodex/cloud/internal.mjs +533 -0
- package/vendor/nanocodex/cloud/mercator.mjs +108 -0
- package/vendor/nanocodex/cloud/server/HostPrincipal.d.mts +34 -0
- package/vendor/nanocodex/cloud/server/HostPrincipal.mjs +202 -0
- package/vendor/nanocodex/cloud/server/index.d.mts +1 -0
- package/vendor/nanocodex/cloud/server/index.mjs +1 -0
- package/vendor/nanocodex/cloud/types.d.mts +211 -0
- package/vendor/nanocodex/cloudflare/Agent.d.mts +133 -0
- package/vendor/nanocodex/cloudflare/Agent.mjs +811 -0
- package/vendor/nanocodex/cloudflare/egress-subject.mjs +19 -0
- package/vendor/nanocodex/cloudflare/egress.d.mts +41 -0
- package/vendor/nanocodex/cloudflare/egress.mjs +119 -0
- package/vendor/nanocodex/cloudflare/event-socket.mjs +316 -0
- package/vendor/nanocodex/cloudflare/index.d.mts +7 -0
- package/vendor/nanocodex/cloudflare/index.mjs +6 -0
- package/vendor/nanocodex/host/Agent.d.mts +55 -0
- package/vendor/nanocodex/host/Agent.mjs +1 -0
- package/vendor/nanocodex/host/index.d.mts +82 -0
- package/vendor/nanocodex/host/index.mjs +10 -0
- package/vendor/nanocodex/index.d.mts +81 -0
- package/vendor/nanocodex/index.mjs +12 -0
- package/vendor/nanocodex/internal.mjs +1275 -0
- package/vendor/nanocodex/managed/Agent.d.mts +380 -0
- package/vendor/nanocodex/managed/Agent.mjs +1694 -0
- package/vendor/nanocodex/managed/ManagedError.d.mts +9 -0
- package/vendor/nanocodex/managed/ManagedError.mjs +8 -0
- package/vendor/nanocodex/managed/README.md +241 -0
- package/vendor/nanocodex/managed/Voice.mjs +202 -0
- package/vendor/nanocodex/managed/index.d.mts +20 -0
- package/vendor/nanocodex/managed/index.mjs +2 -0
- package/vendor/nanocodex/managed/internal.mjs +119 -0
- package/vendor/nanocodex/node/Agent.d.mts +50 -0
- package/vendor/nanocodex/node/Agent.mjs +203 -0
- package/vendor/nanocodex/node/ChatGptSubscription.d.mts +9 -0
- package/vendor/nanocodex/node/ChatGptSubscription.mjs +17 -0
- package/vendor/nanocodex/node/Transport.d.mts +44 -0
- package/vendor/nanocodex/node/Transport.mjs +46 -0
- package/vendor/nanocodex/node/host.mjs +731 -0
- package/vendor/nanocodex/node/index.d.mts +73 -0
- package/vendor/nanocodex/node/index.mjs +17 -0
- package/vendor/nanocodex/node/workspace.d.mts +10 -0
- package/vendor/nanocodex/node/workspace.mjs +198 -0
- package/vendor/nanocodex/package.json +200 -0
- package/vendor/nanocodex/pkg-node/nanocodex.d.ts +675 -0
- package/vendor/nanocodex/pkg-node/nanocodex.js +2628 -0
- package/vendor/nanocodex/pkg-node/nanocodex_bg.wasm.d.ts +105 -0
- package/vendor/nanocodex/pkg-node/package.json +1 -0
- package/vendor/nanocodex/pkg-web/.nanocodex-bindgen-stamp +6 -0
- package/vendor/nanocodex/pkg-web/nanocodex-build.json +1 -0
- package/vendor/nanocodex/pkg-web/nanocodex.d.ts +805 -0
- package/vendor/nanocodex/pkg-web/nanocodex.js +2714 -0
- package/vendor/nanocodex/pkg-web/nanocodex_bg.js +2615 -0
- package/vendor/nanocodex/pkg-web/nanocodex_bg.wasm +0 -0
- package/vendor/nanocodex/pkg-web/nanocodex_bg.wasm.d.ts +105 -0
- package/vendor/nanocodex/pkg-web/nanocodex_worker.js +9 -0
- package/vendor/nanocodex/pkg-web/package.json +1 -0
- package/vendor/nanocodex/runtime/chatgpt-subscription.mjs +212 -0
- package/vendor/nanocodex/runtime/cloudflare-durability-store.d.mts +26 -0
- package/vendor/nanocodex/runtime/cloudflare-durability-store.mjs +168 -0
- package/vendor/nanocodex/runtime/code-evaluator.worker.mjs +137 -0
- package/vendor/nanocodex/runtime/code-runtime.mjs +1 -0
- package/vendor/nanocodex/runtime/durability-store.d.mts +85 -0
- package/vendor/nanocodex/runtime/durability-store.mjs +631 -0
- package/vendor/nanocodex/runtime/durability.mjs +153 -0
- package/vendor/nanocodex/runtime/managed-transport.mjs +460 -0
- package/vendor/nanocodex/runtime/mcp-runtime.mjs +534 -0
- package/vendor/nanocodex/runtime/postgres-durability-store.d.mts +64 -0
- package/vendor/nanocodex/runtime/postgres-durability-store.mjs +532 -0
- package/vendor/nanocodex/runtime/quickjs-evaluator.d.mts +17 -0
- package/vendor/nanocodex/runtime/quickjs-evaluator.mjs +236 -0
- package/vendor/nanocodex/runtime/responses-transport.mjs +22 -0
- package/vendor/nanocodex/runtime/subagents.d.mts +107 -0
- package/vendor/nanocodex/runtime/subagents.mjs +54 -0
- package/vendor/nanocodex/runtime/subscription-store.d.mts +8 -0
- package/vendor/nanocodex/runtime/subscription-store.mjs +42 -0
- package/vendor/nanocodex/runtime/tempo-provider.d.mts +125 -0
- package/vendor/nanocodex/runtime/tempo-provider.mjs +264 -0
- package/vendor/nanocodex/runtime/tool-configuration.mjs +1 -0
- package/vendor/nanocodex/runtime/tool-router.mjs +1 -0
- package/vendor/nanocodex/runtime/utf8.mjs +1 -0
- package/vendor/nanocodex/runtime/worker-evaluator.mjs +162 -0
- package/vendor/nanocodex/runtime/workspace.d.mts +1 -0
- package/vendor/nanocodex/runtime/workspace.mjs +1 -0
- package/vendor/nanocodex/tools/Tools.d.mts +56 -0
- package/vendor/nanocodex/tools/Tools.mjs +136 -0
- package/vendor/nanocodex/tools/artifact.d.mts +1 -0
- package/vendor/nanocodex/tools/artifact.mjs +1 -0
- package/vendor/nanocodex/tools/attachment.mjs +1 -0
- package/vendor/nanocodex/tools/bash.d.mts +1 -0
- package/vendor/nanocodex/tools/bash.mjs +1 -0
- package/vendor/nanocodex/tools/browser/accountInfo.mjs +795 -0
- package/vendor/nanocodex/tools/browser/browserBuffer.mjs +18 -0
- package/vendor/nanocodex/tools/browser/browserCompiler.mjs +155 -0
- package/vendor/nanocodex/tools/browser/browserEgress.mjs +161 -0
- package/vendor/nanocodex/tools/browser/browserPython.mjs +133 -0
- package/vendor/nanocodex/tools/browser/browserShell.mjs +1075 -0
- package/vendor/nanocodex/tools/browser/browserSprintf.mjs +4 -0
- package/vendor/nanocodex/tools/browser/browserSsh.mjs +201 -0
- package/vendor/nanocodex/tools/browser/browserZlib.mjs +136 -0
- package/vendor/nanocodex/tools/browser/compiler.worker.mjs +160 -0
- package/vendor/nanocodex/tools/browser/devTunnelsSshBrowser.mjs +13 -0
- package/vendor/nanocodex/tools/browser/index.d.mts +209 -0
- package/vendor/nanocodex/tools/browser/index.mjs +174 -0
- package/vendor/nanocodex/tools/browser/opfsGit.mjs +248 -0
- package/vendor/nanocodex/tools/browser/python.worker.mjs +114 -0
- package/vendor/nanocodex/tools/browser/threadGit.mjs +197 -0
- package/vendor/nanocodex/tools/browser/unsupportedNodeRsa.mjs +5 -0
- package/vendor/nanocodex/tools/browser/workspace.mjs +83 -0
- package/vendor/nanocodex/tools/dataset.d.mts +1 -0
- package/vendor/nanocodex/tools/dataset.mjs +1 -0
- package/vendor/nanocodex/tools/datasetContract.mjs +1 -0
- package/vendor/nanocodex/tools/datasetEngine.mjs +1 -0
- package/vendor/nanocodex/tools/hostedCatalog.d.mts +1 -0
- package/vendor/nanocodex/tools/hostedCatalog.mjs +1 -0
- package/vendor/nanocodex/tools/index.d.mts +49 -0
- package/vendor/nanocodex/tools/index.mjs +19 -0
- package/vendor/nanocodex/tools/namedTool.mjs +1 -0
- package/vendor/nanocodex/tools/repository-workspace.d.mts +1 -0
- package/vendor/nanocodex/tools/repository-workspace.mjs +1 -0
- package/vendor/nanocodex/tools/ssh.d.mts +1 -0
- package/vendor/nanocodex/tools/ssh.mjs +1 -0
- package/vendor/nanocodex/tools/standard.mjs +1 -0
- package/vendor/nanocodex/tools/standardDescriptions.mjs +1 -0
- package/vendor/nanocodex/types.d.mts +663 -0
- package/vendor/nanocodex/wasm.d.mts +4 -0
- package/vendor/nanocodex/worker/ChatGptSubscription.d.mts +9 -0
- package/vendor/nanocodex/worker/ChatGptSubscription.mjs +29 -0
- package/vendor/nanocodex/worker/index.d.mts +18 -0
- package/vendor/nanocodex/worker/index.mjs +5 -0
- package/vendor/nanocodex-tools/README.md +65 -0
- package/vendor/nanocodex-tools/dist/hosted/app-tool-catalog.d.ts +7 -0
- package/vendor/nanocodex-tools/dist/hosted/app-tool-catalog.js +14 -0
- package/vendor/nanocodex-tools/dist/hosted/broker-core.d.ts +172 -0
- package/vendor/nanocodex-tools/dist/hosted/broker-core.js +1278 -0
- package/vendor/nanocodex-tools/dist/hosted/index.d.ts +3 -0
- package/vendor/nanocodex-tools/dist/hosted/index.js +3 -0
- package/vendor/nanocodex-tools/dist/hosted/protocol.d.ts +120 -0
- package/vendor/nanocodex-tools/dist/hosted/protocol.js +415 -0
- package/vendor/nanocodex-tools/dist/index.d.ts +19 -0
- package/vendor/nanocodex-tools/dist/index.js +14 -0
- package/vendor/nanocodex-tools/dist/memory.d.ts +204 -0
- package/vendor/nanocodex-tools/dist/memory.js +411 -0
- package/vendor/nanocodex-tools/dist/namespace.d.ts +87 -0
- package/vendor/nanocodex-tools/dist/namespace.js +338 -0
- package/vendor/nanocodex-tools/dist/repository-archive.d.ts +4 -0
- package/vendor/nanocodex-tools/dist/repository-archive.js +104 -0
- package/vendor/nanocodex-tools/dist/runtime.d.ts +30 -0
- package/vendor/nanocodex-tools/dist/runtime.js +37 -0
- package/vendor/nanocodex-tools/dist/session.d.ts +167 -0
- package/vendor/nanocodex-tools/dist/session.js +286 -0
- package/vendor/nanocodex-tools/dist/shell.d.ts +51 -0
- package/vendor/nanocodex-tools/dist/shell.js +553 -0
- package/vendor/nanocodex-tools/dist/ssh.d.ts +29 -0
- package/vendor/nanocodex-tools/dist/ssh.js +66 -0
- package/vendor/nanocodex-tools/dist/workspace.d.ts +45 -0
- package/vendor/nanocodex-tools/dist/workspace.js +237 -0
- package/vendor/nanocodex-tools/package.json +122 -0
- package/vendor/nanocodex-tools/runtime/code-runtime.mjs +817 -0
- package/vendor/nanocodex-tools/runtime/tool-configuration.mjs +50 -0
- package/vendor/nanocodex-tools/runtime/tool-router.mjs +730 -0
- package/vendor/nanocodex-tools/runtime/utf8.d.mts +2 -0
- package/vendor/nanocodex-tools/runtime/utf8.mjs +25 -0
- package/vendor/nanocodex-tools/tools/artifact.d.mts +69 -0
- package/vendor/nanocodex-tools/tools/artifact.mjs +270 -0
- package/vendor/nanocodex-tools/tools/attachment.mjs +603 -0
- package/vendor/nanocodex-tools/tools/bash.d.mts +90 -0
- package/vendor/nanocodex-tools/tools/bash.mjs +742 -0
- package/vendor/nanocodex-tools/tools/dataset.d.mts +9 -0
- package/vendor/nanocodex-tools/tools/dataset.mjs +47 -0
- package/vendor/nanocodex-tools/tools/datasetContract.mjs +54 -0
- package/vendor/nanocodex-tools/tools/datasetEngine.mjs +1167 -0
- package/vendor/nanocodex-tools/tools/execution-contract.d.mts +5 -0
- package/vendor/nanocodex-tools/tools/execution-contract.mjs +63 -0
- package/vendor/nanocodex-tools/tools/hostedCatalog.d.mts +20 -0
- package/vendor/nanocodex-tools/tools/hostedCatalog.mjs +67 -0
- package/vendor/nanocodex-tools/tools/hostedMachine.d.mts +10 -0
- package/vendor/nanocodex-tools/tools/hostedMachine.mjs +56 -0
- package/vendor/nanocodex-tools/tools/just-bash-browser.d.mts +1 -0
- package/vendor/nanocodex-tools/tools/just-bash-browser.mjs +1 -0
- package/vendor/nanocodex-tools/tools/namedTool.d.mts +3 -0
- package/vendor/nanocodex-tools/tools/namedTool.mjs +3 -0
- package/vendor/nanocodex-tools/tools/nodeProcess.d.mts +10 -0
- package/vendor/nanocodex-tools/tools/nodeProcess.mjs +314 -0
- package/vendor/nanocodex-tools/tools/processOutput.mjs +56 -0
- package/vendor/nanocodex-tools/tools/repository-workspace.d.mts +55 -0
- package/vendor/nanocodex-tools/tools/repository-workspace.mjs +397 -0
- package/vendor/nanocodex-tools/tools/ssh.d.mts +56 -0
- package/vendor/nanocodex-tools/tools/ssh.mjs +503 -0
- package/vendor/nanocodex-tools/tools/standard.mjs +458 -0
- package/vendor/nanocodex-tools/tools/standardDescriptions.mjs +3 -0
- package/vendor/nanocodex-tools/tools/types.d.mts +83 -0
- package/vendor/nanocodex-tools/tools/workspace.d.mts +25 -0
- package/vendor/nanocodex-tools/tools/workspace.mjs +282 -0
- package/vendor/nanocodex-tools/tools/x.d.mts +30 -0
- package/vendor/nanocodex-tools/tools/x.mjs +91 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/// <reference lib="webworker" />
|
|
2
|
+
import { loadPyodide } from "pyodide";
|
|
3
|
+
import { installBrowserEgressFetch } from "./browserEgress.mjs";
|
|
4
|
+
const PYODIDE_INDEX_URL = "https://cdn.jsdelivr.net/pyodide/v314.0.5/full/";
|
|
5
|
+
let workspaceRoot;
|
|
6
|
+
let egress;
|
|
7
|
+
let runtimePromise;
|
|
8
|
+
self.addEventListener("message", (event) => {
|
|
9
|
+
const message = event.data;
|
|
10
|
+
if (message.type === "initialize") {
|
|
11
|
+
workspaceRoot = message.workspaceRoot;
|
|
12
|
+
egress = message.egress;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (message.type !== "execute" || typeof message.id !== "number")
|
|
16
|
+
return;
|
|
17
|
+
void execute(message.id, message.input);
|
|
18
|
+
});
|
|
19
|
+
async function execute(id, input) {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = input;
|
|
22
|
+
const { pyodide, nativeFs } = await runtime();
|
|
23
|
+
await nativeFs.syncfs();
|
|
24
|
+
let stdout = "";
|
|
25
|
+
let stderr = "";
|
|
26
|
+
let stdinOffset = 0;
|
|
27
|
+
pyodide.setStdout({ batched: (line) => stdout += `${line}\n` });
|
|
28
|
+
pyodide.setStderr({ batched: (line) => stderr += `${line}\n` });
|
|
29
|
+
pyodide.setStdin({
|
|
30
|
+
stdin: () => {
|
|
31
|
+
if (stdinOffset >= input.stdin.length)
|
|
32
|
+
return null;
|
|
33
|
+
const newline = input.stdin.indexOf("\n", stdinOffset);
|
|
34
|
+
const end = newline < 0 ? input.stdin.length : newline + 1;
|
|
35
|
+
const chunk = input.stdin.slice(stdinOffset, end);
|
|
36
|
+
stdinOffset = end;
|
|
37
|
+
return chunk;
|
|
38
|
+
},
|
|
39
|
+
autoEOF: true,
|
|
40
|
+
});
|
|
41
|
+
const globals = pyodide.toPy({
|
|
42
|
+
argv: parsed.argv,
|
|
43
|
+
cwd: input.cwd,
|
|
44
|
+
source: parsed.source ?? "",
|
|
45
|
+
hasSource: parsed.source !== null,
|
|
46
|
+
filename: parsed.filename,
|
|
47
|
+
moduleName: parsed.moduleName ?? "",
|
|
48
|
+
hasModule: parsed.moduleName !== null,
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
await pyodide.runPythonAsync(PYTHON_LAUNCHER, { globals });
|
|
52
|
+
await nativeFs.syncfs();
|
|
53
|
+
self.postMessage({ id, result: { stdout, stderr, exitCode: 0 } });
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
await nativeFs.syncfs().catch(() => undefined);
|
|
57
|
+
self.postMessage({
|
|
58
|
+
id,
|
|
59
|
+
result: {
|
|
60
|
+
stdout,
|
|
61
|
+
stderr: `${stderr}${formatPythonError(error)}\n`,
|
|
62
|
+
exitCode: pythonExitCode(error),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
globals.destroy();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
self.postMessage({ id, error: error instanceof Error ? error.message : String(error) });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function runtime() {
|
|
75
|
+
if (!runtimePromise) {
|
|
76
|
+
runtimePromise = (async () => {
|
|
77
|
+
if (!workspaceRoot)
|
|
78
|
+
throw new Error("Python worker was not initialized");
|
|
79
|
+
if (!egress)
|
|
80
|
+
throw new Error("Python worker egress was not initialized");
|
|
81
|
+
installBrowserEgressFetch({
|
|
82
|
+
...egress,
|
|
83
|
+
fetch: globalThis.fetch,
|
|
84
|
+
});
|
|
85
|
+
const pyodide = await loadPyodide({ indexURL: PYODIDE_INDEX_URL });
|
|
86
|
+
const nativeFs = await pyodide.mountNativeFS("/workspace", workspaceRoot);
|
|
87
|
+
return { pyodide, nativeFs };
|
|
88
|
+
})();
|
|
89
|
+
}
|
|
90
|
+
return runtimePromise;
|
|
91
|
+
}
|
|
92
|
+
function formatPythonError(error) {
|
|
93
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
94
|
+
return message.trim() || "Python execution failed";
|
|
95
|
+
}
|
|
96
|
+
function pythonExitCode(error) {
|
|
97
|
+
const match = /SystemExit:\s*(\d+)/.exec(error instanceof Error ? error.message : String(error));
|
|
98
|
+
return match ? Number(match[1]) : 1;
|
|
99
|
+
}
|
|
100
|
+
const PYTHON_LAUNCHER = `
|
|
101
|
+
import os
|
|
102
|
+
import runpy
|
|
103
|
+
import sys
|
|
104
|
+
|
|
105
|
+
os.chdir(cwd)
|
|
106
|
+
sys.argv = list(argv)
|
|
107
|
+
if hasModule:
|
|
108
|
+
runpy.run_module(moduleName, run_name="__main__", alter_sys=True)
|
|
109
|
+
elif hasSource:
|
|
110
|
+
scope = {"__name__": "__main__", "__file__": filename}
|
|
111
|
+
exec(compile(source, filename, "exec"), scope, scope)
|
|
112
|
+
else:
|
|
113
|
+
runpy.run_path(filename, run_name="__main__")
|
|
114
|
+
`;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import "./browserBuffer.mjs";
|
|
2
|
+
import git from "isomorphic-git";
|
|
3
|
+
import http from "isomorphic-git/http/web";
|
|
4
|
+
import { createOpfsGitFs, openOpfsGitFs, openOpfsWorkspaceRoot } from "./opfsGit.mjs";
|
|
5
|
+
export const THREAD_GIT_DIRECTORY = "/workspace";
|
|
6
|
+
export const THREAD_GIT_AUTHOR = { name: "Nanocodex", email: "agent@nanocodex.dev" };
|
|
7
|
+
const directory = THREAD_GIT_DIRECTORY;
|
|
8
|
+
const author = THREAD_GIT_AUTHOR;
|
|
9
|
+
const configuredRemotePath = "nanocodex.remote";
|
|
10
|
+
export function browserThread(threadId, origin) {
|
|
11
|
+
if (!/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/.test(threadId)) {
|
|
12
|
+
throw new Error("invalid browser thread id");
|
|
13
|
+
}
|
|
14
|
+
const baseUrl = new URL(origin);
|
|
15
|
+
const shareUrl = new URL("/", baseUrl);
|
|
16
|
+
shareUrl.searchParams.set("thread", threadId);
|
|
17
|
+
return {
|
|
18
|
+
id: threadId,
|
|
19
|
+
workspaceName: `nanocodex-thread-${threadId}`,
|
|
20
|
+
repositoryName: `thread-${threadId}`,
|
|
21
|
+
branch: "nanocodex",
|
|
22
|
+
remoteUrl: `${baseUrl.origin}/git/thread-${threadId}`,
|
|
23
|
+
shareUrl: shareUrl.toString(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export async function initializeThreadGit(thread) {
|
|
27
|
+
return inspectThreadGit(thread, async (fs) => {
|
|
28
|
+
return status(fs, thread);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** Ensures the repository exists without scanning its complete worktree. */
|
|
32
|
+
export function prepareThreadGit(thread) {
|
|
33
|
+
return inspectPreparedThreadGit(thread, (rawFs, workspaceRoot) => ({ rawFs, workspaceRoot }));
|
|
34
|
+
}
|
|
35
|
+
export function inspectThreadGit(thread, inspect) {
|
|
36
|
+
return inspectPreparedThreadGit(thread, (rawFs) => inspect(rawFs));
|
|
37
|
+
}
|
|
38
|
+
async function inspectPreparedThreadGit(thread, inspect) {
|
|
39
|
+
return withThreadGitLock(thread, async () => {
|
|
40
|
+
const workspaceRoot = await openOpfsWorkspaceRoot(thread.workspaceName);
|
|
41
|
+
const fs = createOpfsGitFs(workspaceRoot);
|
|
42
|
+
if (!(await exists(fs, `${directory}/.git/config`))) {
|
|
43
|
+
await initializeOrRestore(fs, thread);
|
|
44
|
+
}
|
|
45
|
+
await configureRemote(fs, thread);
|
|
46
|
+
return inspect(fs, workspaceRoot);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export async function threadGitStatus(thread) {
|
|
50
|
+
return withThreadGitLock(thread, async () => {
|
|
51
|
+
const fs = await openOpfsGitFs(thread.workspaceName);
|
|
52
|
+
if (!(await exists(fs, `${directory}/.git/config`)))
|
|
53
|
+
await initializeOrRestore(fs, thread);
|
|
54
|
+
return status(fs, thread);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export async function commitAndPushThread(thread, message = "Update workspace", notificationSource) {
|
|
58
|
+
return withThreadGitLock(thread, async () => {
|
|
59
|
+
const fs = await openOpfsGitFs(thread.workspaceName);
|
|
60
|
+
if (!(await exists(fs, `${directory}/.git/config`)))
|
|
61
|
+
await initializeOrRestore(fs, thread);
|
|
62
|
+
await configureRemote(fs, thread);
|
|
63
|
+
const matrix = await git.statusMatrix({ fs, dir: directory });
|
|
64
|
+
const changed = matrix.filter(([, headStatus, workdirStatus]) => headStatus !== workdirStatus);
|
|
65
|
+
for (const [filepath, , workdirStatus] of changed) {
|
|
66
|
+
if (workdirStatus === 0)
|
|
67
|
+
await git.remove({ fs, dir: directory, filepath });
|
|
68
|
+
else
|
|
69
|
+
await git.add({ fs, dir: directory, filepath });
|
|
70
|
+
}
|
|
71
|
+
if (changed.length > 0) {
|
|
72
|
+
await git.commit({ fs, dir: directory, message: message.trim() || "Update workspace", author });
|
|
73
|
+
}
|
|
74
|
+
const head = await resolveHead(fs);
|
|
75
|
+
if (!head)
|
|
76
|
+
throw new Error("Create at least one workspace file before the first push");
|
|
77
|
+
await git.push({
|
|
78
|
+
fs,
|
|
79
|
+
http,
|
|
80
|
+
dir: directory,
|
|
81
|
+
remote: "origin",
|
|
82
|
+
ref: thread.branch,
|
|
83
|
+
remoteRef: thread.branch,
|
|
84
|
+
});
|
|
85
|
+
const next = await status(fs, thread);
|
|
86
|
+
notifyThreadGitChanged(thread, notificationSource);
|
|
87
|
+
return next;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
export async function pullThread(thread, notificationSource) {
|
|
91
|
+
return withThreadGitLock(thread, async () => {
|
|
92
|
+
const fs = await openOpfsGitFs(thread.workspaceName);
|
|
93
|
+
if (!(await exists(fs, `${directory}/.git/config`)))
|
|
94
|
+
await initializeOrRestore(fs, thread);
|
|
95
|
+
await configureRemote(fs, thread);
|
|
96
|
+
const refs = await remoteRefs(thread);
|
|
97
|
+
if (!refs.some((ref) => ref.ref === thread.branch || ref.ref === `refs/heads/${thread.branch}`)) {
|
|
98
|
+
throw new Error("This thread has not been pushed yet");
|
|
99
|
+
}
|
|
100
|
+
if (await resolveHead(fs)) {
|
|
101
|
+
await git.pull({ fs, http, dir: directory, remote: "origin", ref: thread.branch, author });
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
await restoreRemote(fs, thread);
|
|
105
|
+
}
|
|
106
|
+
const next = await status(fs, thread);
|
|
107
|
+
notifyThreadGitChanged(thread, notificationSource);
|
|
108
|
+
return next;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
export function subscribeThreadGitChanges(thread, listener) {
|
|
112
|
+
if (typeof BroadcastChannel === "undefined")
|
|
113
|
+
return () => undefined;
|
|
114
|
+
const channel = new BroadcastChannel(`nanocodex-git-${thread.id}`);
|
|
115
|
+
channel.addEventListener("message", (event) => {
|
|
116
|
+
const source = event.data != null && typeof event.data === "object" &&
|
|
117
|
+
typeof event.data.source === "string"
|
|
118
|
+
? event.data.source
|
|
119
|
+
: undefined;
|
|
120
|
+
listener(source);
|
|
121
|
+
});
|
|
122
|
+
return () => channel.close();
|
|
123
|
+
}
|
|
124
|
+
export function notifyThreadGitChanged(thread, source) {
|
|
125
|
+
if (typeof BroadcastChannel === "undefined")
|
|
126
|
+
return;
|
|
127
|
+
const channel = new BroadcastChannel(`nanocodex-git-${thread.id}`);
|
|
128
|
+
channel.postMessage({ type: "changed", source });
|
|
129
|
+
channel.close();
|
|
130
|
+
}
|
|
131
|
+
async function initializeOrRestore(fs, thread) {
|
|
132
|
+
const refs = await remoteRefs(thread);
|
|
133
|
+
await git.init({ fs, dir: directory, defaultBranch: thread.branch });
|
|
134
|
+
await configureRemote(fs, thread);
|
|
135
|
+
if (refs.some((ref) => ref.ref === thread.branch || ref.ref === `refs/heads/${thread.branch}`)) {
|
|
136
|
+
await restoreRemote(fs, thread);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function restoreRemote(fs, thread) {
|
|
140
|
+
const fetched = await git.fetch({
|
|
141
|
+
fs,
|
|
142
|
+
http,
|
|
143
|
+
dir: directory,
|
|
144
|
+
remote: "origin",
|
|
145
|
+
ref: thread.branch,
|
|
146
|
+
singleBranch: true,
|
|
147
|
+
});
|
|
148
|
+
const oid = fetched.fetchHead;
|
|
149
|
+
if (!oid)
|
|
150
|
+
throw new Error("The thread remote did not return a branch head");
|
|
151
|
+
await git.writeRef({ fs, dir: directory, ref: `refs/heads/${thread.branch}`, value: oid, force: true });
|
|
152
|
+
await git.checkout({ fs, dir: directory, ref: thread.branch, force: true });
|
|
153
|
+
}
|
|
154
|
+
async function configureRemote(fs, thread) {
|
|
155
|
+
if (await git.getConfig({ fs, dir: directory, path: configuredRemotePath }) === thread.remoteUrl)
|
|
156
|
+
return;
|
|
157
|
+
await git.addRemote({ fs, dir: directory, remote: "origin", url: thread.remoteUrl, force: true });
|
|
158
|
+
await git.setConfig({ fs, dir: directory, path: `branch.${thread.branch}.remote`, value: "origin" });
|
|
159
|
+
await git.setConfig({
|
|
160
|
+
fs,
|
|
161
|
+
dir: directory,
|
|
162
|
+
path: `branch.${thread.branch}.merge`,
|
|
163
|
+
value: `refs/heads/${thread.branch}`,
|
|
164
|
+
});
|
|
165
|
+
await git.setConfig({ fs, dir: directory, path: "user.name", value: author.name });
|
|
166
|
+
await git.setConfig({ fs, dir: directory, path: "user.email", value: author.email });
|
|
167
|
+
await git.setConfig({ fs, dir: directory, path: configuredRemotePath, value: thread.remoteUrl });
|
|
168
|
+
}
|
|
169
|
+
async function status(fs, thread) {
|
|
170
|
+
const matrix = await git.statusMatrix({ fs, dir: directory });
|
|
171
|
+
return {
|
|
172
|
+
branch: thread.branch,
|
|
173
|
+
head: await resolveHead(fs),
|
|
174
|
+
changes: matrix
|
|
175
|
+
.filter(([, headStatus, workdirStatus, stageStatus]) => headStatus !== workdirStatus || headStatus !== stageStatus)
|
|
176
|
+
.map(([filepath]) => filepath),
|
|
177
|
+
remoteUrl: thread.remoteUrl,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async function remoteRefs(thread) {
|
|
181
|
+
return git.listServerRefs({ http, url: thread.remoteUrl, protocolVersion: 2, prefix: "refs/heads/" });
|
|
182
|
+
}
|
|
183
|
+
async function resolveHead(fs) {
|
|
184
|
+
return git.resolveRef({ fs, dir: directory, ref: "HEAD" }).catch(() => undefined);
|
|
185
|
+
}
|
|
186
|
+
async function exists(fs, path) {
|
|
187
|
+
return fs.promises.stat(path).then(() => true, () => false);
|
|
188
|
+
}
|
|
189
|
+
export async function withThreadGitLock(thread, operation, signal) {
|
|
190
|
+
if (!navigator.locks) {
|
|
191
|
+
throw new Error("This browser must support Web Locks to safely share the OPFS Git repository");
|
|
192
|
+
}
|
|
193
|
+
const name = `nanocodex-git-${thread.id}`;
|
|
194
|
+
return signal
|
|
195
|
+
? navigator.locks.request(name, { signal }, operation)
|
|
196
|
+
: navigator.locks.request(name, operation);
|
|
197
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const THREAD_STORAGE_KEY = "nanocodex-thread-id";
|
|
2
|
+
const THREAD_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/;
|
|
3
|
+
let browserThread;
|
|
4
|
+
const workspaces = new Map();
|
|
5
|
+
export function getBrowserThread() {
|
|
6
|
+
if (browserThread)
|
|
7
|
+
return browserThread;
|
|
8
|
+
const url = new URL(window.location.href);
|
|
9
|
+
const requested = url.searchParams.get("thread")?.toLowerCase();
|
|
10
|
+
let retained;
|
|
11
|
+
try {
|
|
12
|
+
retained = window.localStorage.getItem(THREAD_STORAGE_KEY)?.toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
retained = undefined;
|
|
16
|
+
}
|
|
17
|
+
const id = requested && THREAD_PATTERN.test(requested)
|
|
18
|
+
? requested
|
|
19
|
+
: retained && THREAD_PATTERN.test(retained)
|
|
20
|
+
? retained
|
|
21
|
+
: crypto.randomUUID();
|
|
22
|
+
try {
|
|
23
|
+
window.localStorage.setItem(THREAD_STORAGE_KEY, id);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// The query parameter remains the durable/shareable thread identity.
|
|
27
|
+
}
|
|
28
|
+
if (url.searchParams.get("thread") !== id) {
|
|
29
|
+
url.searchParams.set("thread", id);
|
|
30
|
+
window.history.replaceState(window.history.state, "", url);
|
|
31
|
+
}
|
|
32
|
+
browserThread = {
|
|
33
|
+
id,
|
|
34
|
+
workspaceName: `nanocodex-thread-${id}`,
|
|
35
|
+
repositoryName: `thread-${id}`,
|
|
36
|
+
branch: "nanocodex",
|
|
37
|
+
remoteUrl: `${window.location.origin}/git/thread-${id}`,
|
|
38
|
+
shareUrl: url.toString(),
|
|
39
|
+
};
|
|
40
|
+
return browserThread;
|
|
41
|
+
}
|
|
42
|
+
export function selectBrowserThread(threadId) {
|
|
43
|
+
const id = threadId?.toLowerCase();
|
|
44
|
+
if (typeof id !== "string" || !THREAD_PATTERN.test(id))
|
|
45
|
+
throw new TypeError("browser thread id must be a UUID");
|
|
46
|
+
const url = new URL(window.location.href);
|
|
47
|
+
url.searchParams.set("thread", id);
|
|
48
|
+
try { window.localStorage.setItem(THREAD_STORAGE_KEY, id); }
|
|
49
|
+
catch { /* The URL remains authoritative. */ }
|
|
50
|
+
if (window.location.href !== url.toString())
|
|
51
|
+
window.history.replaceState(window.history.state, "", url);
|
|
52
|
+
browserThread = {
|
|
53
|
+
id,
|
|
54
|
+
workspaceName: `nanocodex-thread-${id}`,
|
|
55
|
+
repositoryName: `thread-${id}`,
|
|
56
|
+
branch: "nanocodex",
|
|
57
|
+
remoteUrl: `${window.location.origin}/git/thread-${id}`,
|
|
58
|
+
shareUrl: url.toString(),
|
|
59
|
+
};
|
|
60
|
+
return browserThread;
|
|
61
|
+
}
|
|
62
|
+
export function openKernelWorkspace() {
|
|
63
|
+
return openThreadWorkspace(getBrowserThread().id);
|
|
64
|
+
}
|
|
65
|
+
export function openThreadWorkspace(threadId) {
|
|
66
|
+
const name = `nanocodex-thread-${threadId}`;
|
|
67
|
+
let workspace = workspaces.get(name);
|
|
68
|
+
workspace ??= import("nanocodex/browser/workspace")
|
|
69
|
+
.then((module) => module.open({ name }))
|
|
70
|
+
.catch((error) => {
|
|
71
|
+
workspaces.delete(name);
|
|
72
|
+
throw error;
|
|
73
|
+
});
|
|
74
|
+
workspaces.set(name, workspace);
|
|
75
|
+
return workspace;
|
|
76
|
+
}
|
|
77
|
+
export function subscribeThreadWorkspaceChanges(threadId, listener) {
|
|
78
|
+
if (typeof BroadcastChannel === "undefined")
|
|
79
|
+
return () => undefined;
|
|
80
|
+
const channel = new BroadcastChannel(`nanocodex-git-${threadId}`);
|
|
81
|
+
channel.addEventListener("message", listener);
|
|
82
|
+
return () => channel.close();
|
|
83
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/dataset.d.mts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/dataset.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/datasetContract.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/datasetEngine.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/hostedCatalog.d.mts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/hostedCatalog.mjs";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { NamedTool } from "../types.mjs";
|
|
2
|
+
import type { Workspace } from "../runtime/workspace.mjs";
|
|
3
|
+
export * from "./artifact.mjs";
|
|
4
|
+
export type JsonToolOptions = Readonly<{
|
|
5
|
+
/** Defaults to the same-origin `/api/tools/web-search` or image route. */
|
|
6
|
+
url?: string | URL | undefined;
|
|
7
|
+
fetch?: typeof globalThis.fetch | undefined;
|
|
8
|
+
headers?: Readonly<Record<string, string>> | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export type ImageGenerationOptions = JsonToolOptions & Readonly<{
|
|
12
|
+
recentImages?(sessionId: string, count: number): string[];
|
|
13
|
+
rememberImage?(sessionId: string, imageUrl: string): void;
|
|
14
|
+
workspace?: Readonly<{ readFile(path: string): Promise<Uint8Array> }> | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
|
|
17
|
+
/** The standard web search tool with its complete runtime JSON Schema. */
|
|
18
|
+
export function web(options?: JsonToolOptions): NamedTool;
|
|
19
|
+
|
|
20
|
+
/** The standard image generation/editing tool. */
|
|
21
|
+
export function imageGeneration(options?: ImageGenerationOptions): NamedTool;
|
|
22
|
+
|
|
23
|
+
/** Reads supported image formats from a caller-owned workspace. */
|
|
24
|
+
export function viewImage(options: {
|
|
25
|
+
workspace: Pick<Workspace, "readFile">;
|
|
26
|
+
}): NamedTool;
|
|
27
|
+
|
|
28
|
+
/** A session-scoped planning tool. */
|
|
29
|
+
export function updatePlan(): NamedTool;
|
|
30
|
+
|
|
31
|
+
export { dataset } from "./dataset.mjs";
|
|
32
|
+
export type { DatasetOptions } from "./dataset.mjs";
|
|
33
|
+
export { justBash } from "./bash.mjs";
|
|
34
|
+
export type { JustBashNetworkOptions, JustBashRuntime } from "./bash.mjs";
|
|
35
|
+
export { materializeRepositoryWorkspace } from "./repository-workspace.mjs";
|
|
36
|
+
export type {
|
|
37
|
+
RepositoryWorkspaceDescriptor,
|
|
38
|
+
RepositoryWorkspaceFetch,
|
|
39
|
+
RepositoryWorkspaceRemote,
|
|
40
|
+
} from "./repository-workspace.mjs";
|
|
41
|
+
export { createTools } from "./Tools.mjs";
|
|
42
|
+
export type {
|
|
43
|
+
AttachmentClient,
|
|
44
|
+
AttachmentSocket,
|
|
45
|
+
AttachmentTarget,
|
|
46
|
+
AttachmentTransport,
|
|
47
|
+
Tools,
|
|
48
|
+
} from "./Tools.mjs";
|
|
49
|
+
export type { HostedMachine } from "./hostedCatalog.mjs";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export {
|
|
2
|
+
ARTIFACT_DIRECTORY,
|
|
3
|
+
ArtifactStore,
|
|
4
|
+
artifact,
|
|
5
|
+
artifactPath,
|
|
6
|
+
artifactToolDefinition,
|
|
7
|
+
createArtifactTool,
|
|
8
|
+
parseArtifactDocument,
|
|
9
|
+
} from "./artifact.mjs";
|
|
10
|
+
export {
|
|
11
|
+
imageGeneration,
|
|
12
|
+
updatePlan,
|
|
13
|
+
viewImage,
|
|
14
|
+
web,
|
|
15
|
+
} from "./standard.mjs";
|
|
16
|
+
export { dataset } from "./dataset.mjs";
|
|
17
|
+
export { justBash } from "./bash.mjs";
|
|
18
|
+
export { materializeRepositoryWorkspace } from "./repository-workspace.mjs";
|
|
19
|
+
export { createTools } from "./Tools.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { namedTool } from "../../nanocodex-tools/tools/namedTool.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/repository-workspace.d.mts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/repository-workspace.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/ssh.d.mts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/ssh.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/standard.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../nanocodex-tools/tools/standardDescriptions.mjs";
|