youmd 0.8.29 → 0.9.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/dist/commands/orchestrate.d.ts +12 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +273 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/remote.d.ts +8 -0
- package/dist/commands/remote.d.ts.map +1 -1
- package/dist/commands/remote.js +8 -0
- package/dist/commands/remote.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +37 -3
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/storage.d.ts +7 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +220 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +32 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +21 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +15 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/daemon.d.ts +19 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/daemon.js +72 -1
- package/dist/lib/daemon.js.map +1 -1
- package/dist/lib/foldermd.d.ts +71 -0
- package/dist/lib/foldermd.d.ts.map +1 -0
- package/dist/lib/foldermd.js +244 -0
- package/dist/lib/foldermd.js.map +1 -0
- package/dist/lib/orchestrator/loop.d.ts +55 -0
- package/dist/lib/orchestrator/loop.d.ts.map +1 -0
- package/dist/lib/orchestrator/loop.js +248 -0
- package/dist/lib/orchestrator/loop.js.map +1 -0
- package/dist/lib/orchestrator/supervisor.d.ts +80 -0
- package/dist/lib/orchestrator/supervisor.d.ts.map +1 -0
- package/dist/lib/orchestrator/supervisor.js +315 -0
- package/dist/lib/orchestrator/supervisor.js.map +1 -0
- package/dist/lib/orchestrator/tools.d.ts +16 -0
- package/dist/lib/orchestrator/tools.d.ts.map +1 -0
- package/dist/lib/orchestrator/tools.js +258 -0
- package/dist/lib/orchestrator/tools.js.map +1 -0
- package/dist/lib/remote-executor.d.ts +15 -1
- package/dist/lib/remote-executor.d.ts.map +1 -1
- package/dist/lib/remote-executor.js +195 -0
- package/dist/lib/remote-executor.js.map +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +89 -0
- package/dist/mcp/registry.js.map +1 -1
- package/package.json +1 -1
- package/scripts/skillstack-sync/com.you.orchestrator-watch.plist +38 -0
- package/scripts/skillstack-sync/install-daemons-linux.sh +168 -0
- package/scripts/skillstack-sync/install-daemons.sh +1 -1
package/dist/lib/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export declare const FOLDERMD_DEFAULT_BASE = "https://www.folder.md/api/v1";
|
|
2
|
+
export interface FolderMdAuth {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FolderMdFile {
|
|
7
|
+
id: string;
|
|
8
|
+
path?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
size?: number;
|
|
11
|
+
mimeType?: string;
|
|
12
|
+
mime_type?: string;
|
|
13
|
+
[k: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/** Resolve a folder.md API key from explicit arg → config → env. Returns null if none. */
|
|
16
|
+
export declare function resolveFolderMdKey(explicit?: string): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a usable folder.md key with ZERO user paste. Explicit/env/config key
|
|
19
|
+
* wins; otherwise auto-provision via the you.md backend (mints a scoped key
|
|
20
|
+
* server-to-server) and cache it locally. Returns the key + the media folderId
|
|
21
|
+
* when provisioning supplied one. Throws a friendly error if not authenticated
|
|
22
|
+
* or if provisioning is not configured on the backend.
|
|
23
|
+
*/
|
|
24
|
+
export declare function ensureProvisionedKey(explicit?: string): Promise<{
|
|
25
|
+
apiKey: string;
|
|
26
|
+
folderId?: string;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the folder id to use for this user's media, creating + persisting a dedicated
|
|
30
|
+
* "you.md media" folder if none is configured. Shared by the CLI and the MCP tools so the
|
|
31
|
+
* "which folder?" logic lives in one place.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ensureUserFolder(apiKey: string, explicit?: string): Promise<string>;
|
|
34
|
+
/** List the user's folders (workspaces). */
|
|
35
|
+
export declare function listFolders(auth: FolderMdAuth): Promise<unknown[]>;
|
|
36
|
+
/** Create a folder (workspace), e.g. a per-you.md-user media folder. */
|
|
37
|
+
export declare function createFolder(auth: FolderMdAuth, name: string): Promise<FolderMdFile>;
|
|
38
|
+
/** List files in a folder. */
|
|
39
|
+
export declare function listFiles(auth: FolderMdAuth, folderId: string): Promise<FolderMdFile[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Upload a local file (binary or text) to a folder via multipart. This is the large-file/media
|
|
42
|
+
* path the brain cannot handle. Returns the created file record (store its `id` as the brain
|
|
43
|
+
* pointer). For text-only content the folder.md MCP `file_write` tool is an alternative.
|
|
44
|
+
*/
|
|
45
|
+
export declare function uploadFile(auth: FolderMdAuth, folderId: string, localPath: string, options?: {
|
|
46
|
+
destPath?: string;
|
|
47
|
+
mimeType?: string;
|
|
48
|
+
}): Promise<FolderMdFile>;
|
|
49
|
+
/**
|
|
50
|
+
* Download a file's bytes. folder.md storage is private (no public CDN URL yet), so bytes come
|
|
51
|
+
* back through the authenticated API; you.md proxies/streams them rather than handing out a URL.
|
|
52
|
+
*/
|
|
53
|
+
export declare function downloadFile(auth: FolderMdAuth, folderId: string, fileId: string, destPath: string): Promise<{
|
|
54
|
+
bytes: number;
|
|
55
|
+
path: string;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* The brain pointer: what you.md stores (as a plain string, which the bundle handles perfectly)
|
|
59
|
+
* to reference a media artifact living in folder.md. Embed JSON.stringify(this) in a memory or
|
|
60
|
+
* custom_file. No bytes ever enter the brain.
|
|
61
|
+
*/
|
|
62
|
+
export interface BrainMediaPointer {
|
|
63
|
+
provider: "folder.md";
|
|
64
|
+
folderId: string;
|
|
65
|
+
fileId: string;
|
|
66
|
+
name: string;
|
|
67
|
+
mimeType?: string;
|
|
68
|
+
size?: number;
|
|
69
|
+
uploadedAt: string;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=foldermd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foldermd.d.ts","sourceRoot":"","sources":["../../src/lib/foldermd.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAqBD,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUnE;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBhD;AAoBD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzF;AAWD,4CAA4C;AAC5C,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAQxE;AAED,wEAAwE;AACxE,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAS1F;AAED,8BAA8B;AAC9B,wBAAsB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAQ7F;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,YAAY,CAAC,CAiBvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ1C;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// foldermd.ts — You.md ↔ folder.md client (large-file / media offload).
|
|
3
|
+
//
|
|
4
|
+
// You.md is a structured-TEXT brain: every "file" is a markdown/JSON string in a ~1MB Convex
|
|
5
|
+
// bundle, mirrored to GitHub under a 700KB text-only cap. There is NO binary/large-file path.
|
|
6
|
+
// folder.md (Houston's own agent-native storage product) fills that slot. The brain stays
|
|
7
|
+
// text-first and stores only a POINTER (folder.md folder/file id); the bytes live in folder.md.
|
|
8
|
+
//
|
|
9
|
+
// Auth is a per-folder Bearer API key (`fmd_live_…`). ZERO-USER-WORK provisioning now exists:
|
|
10
|
+
// `ensureProvisionedKey()` calls the you.md backend (`POST /api/v1/me/storage/provision`),
|
|
11
|
+
// which mints a scoped folder.md key server-to-server (shared FOLDERMD_SERVICE_SECRET) and
|
|
12
|
+
// returns it to the authenticated owner's client, cached locally. The user never pastes a key.
|
|
13
|
+
// An explicit key (config / FOLDER_API_KEY / FOLDERMD_API_KEY) still wins when present.
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.FOLDERMD_DEFAULT_BASE = void 0;
|
|
49
|
+
exports.resolveFolderMdKey = resolveFolderMdKey;
|
|
50
|
+
exports.ensureProvisionedKey = ensureProvisionedKey;
|
|
51
|
+
exports.ensureUserFolder = ensureUserFolder;
|
|
52
|
+
exports.listFolders = listFolders;
|
|
53
|
+
exports.createFolder = createFolder;
|
|
54
|
+
exports.listFiles = listFiles;
|
|
55
|
+
exports.uploadFile = uploadFile;
|
|
56
|
+
exports.downloadFile = downloadFile;
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const config_1 = require("./config");
|
|
60
|
+
const api_1 = require("./api");
|
|
61
|
+
exports.FOLDERMD_DEFAULT_BASE = "https://www.folder.md/api/v1";
|
|
62
|
+
function normalizeFileRecord(raw) {
|
|
63
|
+
const record = (raw && typeof raw === "object" ? raw : {});
|
|
64
|
+
const wrapped = record.file && typeof record.file === "object"
|
|
65
|
+
? record.file
|
|
66
|
+
: record;
|
|
67
|
+
return {
|
|
68
|
+
...wrapped,
|
|
69
|
+
id: String(wrapped.id ?? ""),
|
|
70
|
+
path: typeof wrapped.path === "string" ? wrapped.path : undefined,
|
|
71
|
+
name: typeof wrapped.name === "string" ? wrapped.name : undefined,
|
|
72
|
+
size: typeof wrapped.size === "number" ? wrapped.size : undefined,
|
|
73
|
+
mimeType: typeof wrapped.mimeType === "string"
|
|
74
|
+
? wrapped.mimeType
|
|
75
|
+
: typeof wrapped.mime_type === "string"
|
|
76
|
+
? wrapped.mime_type
|
|
77
|
+
: undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Resolve a folder.md API key from explicit arg → config → env. Returns null if none. */
|
|
81
|
+
function resolveFolderMdKey(explicit) {
|
|
82
|
+
if (explicit && explicit.trim())
|
|
83
|
+
return explicit.trim();
|
|
84
|
+
const cfg = (0, config_1.readGlobalConfig)();
|
|
85
|
+
const fromCfg = typeof cfg.folderMdKey === "string" ? cfg.folderMdKey : undefined;
|
|
86
|
+
return (fromCfg ||
|
|
87
|
+
process.env.FOLDER_API_KEY ||
|
|
88
|
+
process.env.FOLDERMD_API_KEY ||
|
|
89
|
+
null);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolve a usable folder.md key with ZERO user paste. Explicit/env/config key
|
|
93
|
+
* wins; otherwise auto-provision via the you.md backend (mints a scoped key
|
|
94
|
+
* server-to-server) and cache it locally. Returns the key + the media folderId
|
|
95
|
+
* when provisioning supplied one. Throws a friendly error if not authenticated
|
|
96
|
+
* or if provisioning is not configured on the backend.
|
|
97
|
+
*/
|
|
98
|
+
async function ensureProvisionedKey(explicit) {
|
|
99
|
+
const local = resolveFolderMdKey(explicit);
|
|
100
|
+
if (local) {
|
|
101
|
+
const cfg = (0, config_1.readGlobalConfig)();
|
|
102
|
+
return { apiKey: local, folderId: cfg.folderMdFolderId };
|
|
103
|
+
}
|
|
104
|
+
const res = await (0, api_1.provisionStorage)();
|
|
105
|
+
if (!res.ok || !res.data?.apiKey) {
|
|
106
|
+
const msg = (0, api_1.apiErrorMessage)(res.data) ||
|
|
107
|
+
(res.status === 401
|
|
108
|
+
? "not authenticated — run `you login` first"
|
|
109
|
+
: res.status === 503
|
|
110
|
+
? "folder.md storage isn't enabled on the server yet"
|
|
111
|
+
: "could not provision folder.md storage");
|
|
112
|
+
throw new Error(msg);
|
|
113
|
+
}
|
|
114
|
+
const cfg = (0, config_1.readGlobalConfig)();
|
|
115
|
+
cfg.folderMdKey = res.data.apiKey;
|
|
116
|
+
if (res.data.folderId)
|
|
117
|
+
cfg.folderMdFolderId = res.data.folderId;
|
|
118
|
+
(0, config_1.writeGlobalConfig)(cfg);
|
|
119
|
+
return { apiKey: res.data.apiKey, folderId: res.data.folderId || cfg.folderMdFolderId };
|
|
120
|
+
}
|
|
121
|
+
function baseUrl(auth) {
|
|
122
|
+
return (auth.baseUrl || process.env.FOLDERMD_BASE_URL || exports.FOLDERMD_DEFAULT_BASE).replace(/\/$/, "");
|
|
123
|
+
}
|
|
124
|
+
function authHeaders(auth) {
|
|
125
|
+
return { Authorization: `Bearer ${auth.apiKey}` };
|
|
126
|
+
}
|
|
127
|
+
async function asError(res) {
|
|
128
|
+
let body = "";
|
|
129
|
+
try {
|
|
130
|
+
body = await res.text();
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
/* ignore */
|
|
134
|
+
}
|
|
135
|
+
return new Error(`folder.md ${res.status} ${res.statusText}${body ? `: ${body.slice(0, 300)}` : ""}`);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolve the folder id to use for this user's media, creating + persisting a dedicated
|
|
139
|
+
* "you.md media" folder if none is configured. Shared by the CLI and the MCP tools so the
|
|
140
|
+
* "which folder?" logic lives in one place.
|
|
141
|
+
*/
|
|
142
|
+
async function ensureUserFolder(apiKey, explicit) {
|
|
143
|
+
const cfg = (0, config_1.readGlobalConfig)();
|
|
144
|
+
const existing = (explicit && explicit.trim()) || cfg.folderMdFolderId;
|
|
145
|
+
if (existing)
|
|
146
|
+
return existing;
|
|
147
|
+
const auth = { apiKey };
|
|
148
|
+
// Reuse an existing folder if present, else create one.
|
|
149
|
+
try {
|
|
150
|
+
const folders = (await listFolders(auth));
|
|
151
|
+
const mine = folders.find((f) => f.name === "you.md media") || folders[0];
|
|
152
|
+
if (mine?.id)
|
|
153
|
+
return persistFolderId(mine.id);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// listing failed — fall through to create
|
|
157
|
+
}
|
|
158
|
+
const created = await createFolder(auth, "you.md media");
|
|
159
|
+
if (!created.id)
|
|
160
|
+
throw new Error("folder.md did not return a folder id on create");
|
|
161
|
+
return persistFolderId(String(created.id));
|
|
162
|
+
}
|
|
163
|
+
function persistFolderId(id) {
|
|
164
|
+
const cfg = (0, config_1.readGlobalConfig)();
|
|
165
|
+
if (cfg.folderMdFolderId !== id) {
|
|
166
|
+
cfg.folderMdFolderId = id;
|
|
167
|
+
(0, config_1.writeGlobalConfig)(cfg);
|
|
168
|
+
}
|
|
169
|
+
return id;
|
|
170
|
+
}
|
|
171
|
+
/** List the user's folders (workspaces). */
|
|
172
|
+
async function listFolders(auth) {
|
|
173
|
+
const res = await fetch(`${baseUrl(auth)}/folders`, {
|
|
174
|
+
headers: authHeaders(auth),
|
|
175
|
+
signal: AbortSignal.timeout(30000),
|
|
176
|
+
});
|
|
177
|
+
if (!res.ok)
|
|
178
|
+
throw await asError(res);
|
|
179
|
+
const data = (await res.json());
|
|
180
|
+
return Array.isArray(data) ? data : data.folders ?? [];
|
|
181
|
+
}
|
|
182
|
+
/** Create a folder (workspace), e.g. a per-you.md-user media folder. */
|
|
183
|
+
async function createFolder(auth, name) {
|
|
184
|
+
const res = await fetch(`${baseUrl(auth)}/folders`, {
|
|
185
|
+
method: "POST",
|
|
186
|
+
headers: { ...authHeaders(auth), "Content-Type": "application/json" },
|
|
187
|
+
body: JSON.stringify({ name }),
|
|
188
|
+
signal: AbortSignal.timeout(30000),
|
|
189
|
+
});
|
|
190
|
+
if (!res.ok)
|
|
191
|
+
throw await asError(res);
|
|
192
|
+
return normalizeFileRecord(await res.json());
|
|
193
|
+
}
|
|
194
|
+
/** List files in a folder. */
|
|
195
|
+
async function listFiles(auth, folderId) {
|
|
196
|
+
const res = await fetch(`${baseUrl(auth)}/folders/${encodeURIComponent(folderId)}/files`, {
|
|
197
|
+
headers: authHeaders(auth),
|
|
198
|
+
signal: AbortSignal.timeout(30000),
|
|
199
|
+
});
|
|
200
|
+
if (!res.ok)
|
|
201
|
+
throw await asError(res);
|
|
202
|
+
const data = (await res.json());
|
|
203
|
+
return Array.isArray(data) ? data : data.files ?? [];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Upload a local file (binary or text) to a folder via multipart. This is the large-file/media
|
|
207
|
+
* path the brain cannot handle. Returns the created file record (store its `id` as the brain
|
|
208
|
+
* pointer). For text-only content the folder.md MCP `file_write` tool is an alternative.
|
|
209
|
+
*/
|
|
210
|
+
async function uploadFile(auth, folderId, localPath, options = {}) {
|
|
211
|
+
if (!fs.existsSync(localPath))
|
|
212
|
+
throw new Error(`file not found: ${localPath}`);
|
|
213
|
+
const bytes = fs.readFileSync(localPath);
|
|
214
|
+
const name = options.destPath || path.basename(localPath);
|
|
215
|
+
const blob = new Blob([bytes], options.mimeType ? { type: options.mimeType } : undefined);
|
|
216
|
+
const form = new FormData();
|
|
217
|
+
form.append("file", blob, name);
|
|
218
|
+
if (options.destPath)
|
|
219
|
+
form.append("path", options.destPath);
|
|
220
|
+
const res = await fetch(`${baseUrl(auth)}/folders/${encodeURIComponent(folderId)}/files`, {
|
|
221
|
+
method: "POST",
|
|
222
|
+
headers: authHeaders(auth), // do NOT set Content-Type; fetch sets the multipart boundary
|
|
223
|
+
body: form,
|
|
224
|
+
signal: AbortSignal.timeout(120000),
|
|
225
|
+
});
|
|
226
|
+
if (!res.ok)
|
|
227
|
+
throw await asError(res);
|
|
228
|
+
return normalizeFileRecord(await res.json());
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Download a file's bytes. folder.md storage is private (no public CDN URL yet), so bytes come
|
|
232
|
+
* back through the authenticated API; you.md proxies/streams them rather than handing out a URL.
|
|
233
|
+
*/
|
|
234
|
+
async function downloadFile(auth, folderId, fileId, destPath) {
|
|
235
|
+
const url = `${baseUrl(auth)}/folders/${encodeURIComponent(folderId)}/files/${encodeURIComponent(fileId)}?download=true`;
|
|
236
|
+
const res = await fetch(url, { headers: authHeaders(auth), signal: AbortSignal.timeout(120000) });
|
|
237
|
+
if (!res.ok)
|
|
238
|
+
throw await asError(res);
|
|
239
|
+
const buf = Buffer.from(await res.arrayBuffer());
|
|
240
|
+
fs.mkdirSync(path.dirname(path.resolve(destPath)), { recursive: true });
|
|
241
|
+
fs.writeFileSync(destPath, buf);
|
|
242
|
+
return { bytes: buf.length, path: destPath };
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=foldermd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foldermd.js","sourceRoot":"","sources":["../../src/lib/foldermd.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,EAAE;AACF,6FAA6F;AAC7F,8FAA8F;AAC9F,0FAA0F;AAC1F,gGAAgG;AAChG,EAAE;AACF,8FAA8F;AAC9F,2FAA2F;AAC3F,2FAA2F;AAC3F,+FAA+F;AAC/F,wFAAwF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CxF,gDAUC;AASD,oDA0BC;AAyBD,4CAgBC;AAYD,kCAQC;AAGD,oCASC;AAGD,8BAQC;AAOD,gCAsBC;AAMD,oCAaC;AA3ND,uCAAyB;AACzB,2CAA6B;AAC7B,qCAA+D;AAC/D,+BAA0D;AAE7C,QAAA,qBAAqB,GAAG,8BAA8B,CAAC;AAiBpE,SAAS,mBAAmB,CAAC,GAAY;IACvC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC5D,CAAC,CAAE,MAAM,CAAC,IAAgC;QAC1C,CAAC,CAAC,MAAM,CAAC;IACX,OAAO;QACL,GAAG,OAAO;QACV,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5B,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACjE,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACjE,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACjE,QAAQ,EAAE,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC5C,CAAC,CAAC,OAAO,CAAC,QAAQ;YAClB,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;gBACrC,CAAC,CAAC,OAAO,CAAC,SAAS;gBACnB,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,SAAgB,kBAAkB,CAAC,QAAiB;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,GAAG,GAAG,IAAA,yBAAgB,GAA6B,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,WAAsB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,OAAO,CACL,OAAO;QACP,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,IAAI,CACL,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,QAAiB;IAEjB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,IAAA,yBAAgB,GAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,IAAA,sBAAgB,GAAE,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACjC,MAAM,GAAG,GACP,IAAA,qBAAe,EAAC,GAAG,CAAC,IAAI,CAAC;YACzB,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;gBACjB,CAAC,CAAC,2CAA2C;gBAC7C,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;oBAClB,CAAC,CAAC,mDAAmD;oBACrD,CAAC,CAAC,uCAAuC,CAAC,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,yBAAgB,GAAE,CAAC;IAC/B,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ;QAAE,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IAChE,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,OAAO,CAAC,IAAkB;IACjC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,6BAAqB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,WAAW,CAAC,IAAkB;IACrC,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAa;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxG,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAiB;IACtE,MAAM,GAAG,GAAG,IAAA,yBAAgB,GAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC;IACvE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,IAAI,GAAiB,EAAE,MAAM,EAAE,CAAC;IACtC,wDAAwD;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,CAA0C,CAAC;QACnF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,IAAI,EAAE,EAAE;YAAE,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnF,OAAO,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,MAAM,GAAG,GAAG,IAAA,yBAAgB,GAAE,CAAC;IAC/B,IAAI,GAAG,CAAC,gBAAgB,KAAK,EAAE,EAAE,CAAC;QAChC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,4CAA4C;AACrC,KAAK,UAAU,WAAW,CAAC,IAAkB;IAClD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;QAClD,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwC,CAAC;IACvE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,wEAAwE;AACjE,KAAK,UAAU,YAAY,CAAC,IAAkB,EAAE,IAAY;IACjE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACrE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,8BAA8B;AACvB,KAAK,UAAU,SAAS,CAAC,IAAkB,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxF,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgD,CAAC;IAC/E,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAC9B,IAAkB,EAClB,QAAgB,EAChB,SAAiB,EACjB,UAAoD,EAAE;IAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,QAAQ;QAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,6DAA6D;QACzF,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAO,CAAC;KACrC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,YAAY,CAChC,IAAkB,EAClB,QAAgB,EAChB,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,QAAQ,CAAC,UAAU,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACzH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAO,CAAC,EAAE,CAAC,CAAC;IACnG,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface LoopTool {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
/** Human-readable parameter hints, e.g. { harness: "claude|codex|cursor", goal: "task text" }. */
|
|
5
|
+
parameters: Record<string, string>;
|
|
6
|
+
run: (args: Record<string, unknown>) => Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
export interface LoopMessage {
|
|
9
|
+
role: "system" | "user" | "assistant";
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
/** Injected model caller — returns the assistant's raw text for a message list. */
|
|
13
|
+
export type ModelCaller = (messages: LoopMessage[]) => Promise<string>;
|
|
14
|
+
export interface LoopStep {
|
|
15
|
+
index: number;
|
|
16
|
+
tool: string;
|
|
17
|
+
args: Record<string, unknown>;
|
|
18
|
+
result: string;
|
|
19
|
+
thought?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RunLoopOptions {
|
|
22
|
+
goal: string;
|
|
23
|
+
tools: LoopTool[];
|
|
24
|
+
callModel: ModelCaller;
|
|
25
|
+
maxSteps?: number;
|
|
26
|
+
/** Extra orientation injected into the system prompt (identity, machine, fleet state). */
|
|
27
|
+
context?: string;
|
|
28
|
+
/** Progress callback per step (for spinner/log output). */
|
|
29
|
+
onStep?: (step: LoopStep) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Transient model-call failures to absorb before giving up on a step (real LLM APIs hiccup;
|
|
32
|
+
* one network blip shouldn't abandon the whole goal). Default 2 retries → 3 attempts total.
|
|
33
|
+
*/
|
|
34
|
+
maxModelRetries?: number;
|
|
35
|
+
/** Injectable sleep (so tests don't wait on real backoff). Defaults to setTimeout. */
|
|
36
|
+
sleep?: (ms: number) => Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export interface LoopOutcome {
|
|
39
|
+
finished: boolean;
|
|
40
|
+
summary: string;
|
|
41
|
+
steps: LoopStep[];
|
|
42
|
+
}
|
|
43
|
+
interface ToolCall {
|
|
44
|
+
thought?: string;
|
|
45
|
+
tool: string;
|
|
46
|
+
args: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
export declare function parseToolCall(raw: string): ToolCall | null;
|
|
49
|
+
/**
|
|
50
|
+
* Run the orchestrator loop until the model calls `finish` or maxSteps is hit.
|
|
51
|
+
* Each step: ask the model for a tool call → run it → append the result → repeat.
|
|
52
|
+
*/
|
|
53
|
+
export declare function runAgentLoop(options: RunLoopOptions): Promise<LoopOutcome>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../../src/lib/orchestrator/loop.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kGAAkG;IAClG,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,WAAW,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sFAAsF;IACtF,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,UAAU,QAAQ;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAyDD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAwD1D;AAMD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAkHhF"}
|