youmd 0.8.28 → 0.9.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.
Files changed (60) hide show
  1. package/dist/commands/orchestrate.d.ts +12 -0
  2. package/dist/commands/orchestrate.d.ts.map +1 -0
  3. package/dist/commands/orchestrate.js +273 -0
  4. package/dist/commands/orchestrate.js.map +1 -0
  5. package/dist/commands/remote.d.ts +8 -0
  6. package/dist/commands/remote.d.ts.map +1 -1
  7. package/dist/commands/remote.js +8 -0
  8. package/dist/commands/remote.js.map +1 -1
  9. package/dist/commands/stack.d.ts.map +1 -1
  10. package/dist/commands/stack.js +37 -3
  11. package/dist/commands/stack.js.map +1 -1
  12. package/dist/commands/status.js +1 -1
  13. package/dist/commands/status.js.map +1 -1
  14. package/dist/commands/storage.d.ts +7 -0
  15. package/dist/commands/storage.d.ts.map +1 -0
  16. package/dist/commands/storage.js +220 -0
  17. package/dist/commands/storage.js.map +1 -0
  18. package/dist/commands/sync.d.ts.map +1 -1
  19. package/dist/commands/sync.js +17 -0
  20. package/dist/commands/sync.js.map +1 -1
  21. package/dist/index.js +53 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/api.d.ts +32 -0
  24. package/dist/lib/api.d.ts.map +1 -1
  25. package/dist/lib/api.js +21 -0
  26. package/dist/lib/api.js.map +1 -1
  27. package/dist/lib/config.d.ts +15 -0
  28. package/dist/lib/config.d.ts.map +1 -1
  29. package/dist/lib/config.js.map +1 -1
  30. package/dist/lib/daemon.d.ts +19 -0
  31. package/dist/lib/daemon.d.ts.map +1 -1
  32. package/dist/lib/daemon.js +72 -1
  33. package/dist/lib/daemon.js.map +1 -1
  34. package/dist/lib/foldermd.d.ts +70 -0
  35. package/dist/lib/foldermd.d.ts.map +1 -0
  36. package/dist/lib/foldermd.js +226 -0
  37. package/dist/lib/foldermd.js.map +1 -0
  38. package/dist/lib/orchestrator/loop.d.ts +55 -0
  39. package/dist/lib/orchestrator/loop.d.ts.map +1 -0
  40. package/dist/lib/orchestrator/loop.js +248 -0
  41. package/dist/lib/orchestrator/loop.js.map +1 -0
  42. package/dist/lib/orchestrator/supervisor.d.ts +80 -0
  43. package/dist/lib/orchestrator/supervisor.d.ts.map +1 -0
  44. package/dist/lib/orchestrator/supervisor.js +315 -0
  45. package/dist/lib/orchestrator/supervisor.js.map +1 -0
  46. package/dist/lib/orchestrator/tools.d.ts +16 -0
  47. package/dist/lib/orchestrator/tools.d.ts.map +1 -0
  48. package/dist/lib/orchestrator/tools.js +258 -0
  49. package/dist/lib/orchestrator/tools.js.map +1 -0
  50. package/dist/lib/remote-executor.d.ts +15 -1
  51. package/dist/lib/remote-executor.d.ts.map +1 -1
  52. package/dist/lib/remote-executor.js +195 -0
  53. package/dist/lib/remote-executor.js.map +1 -1
  54. package/dist/mcp/registry.d.ts.map +1 -1
  55. package/dist/mcp/registry.js +89 -0
  56. package/dist/mcp/registry.js.map +1 -1
  57. package/package.json +1 -1
  58. package/scripts/skillstack-sync/com.you.orchestrator-watch.plist +38 -0
  59. package/scripts/skillstack-sync/install-daemons-linux.sh +168 -0
  60. package/scripts/skillstack-sync/install-daemons.sh +1 -1
@@ -34,10 +34,14 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.YOUMD_DAEMONS = void 0;
37
+ exports.detectDaemonBackend = detectDaemonBackend;
38
+ exports.hasUserSystemd = hasUserSystemd;
37
39
  exports.expandHome = expandHome;
38
40
  exports.tailUsefulLine = tailUsefulLine;
39
41
  exports.newestMtimeIso = newestMtimeIso;
40
42
  exports.isLaunchAgentLoaded = isLaunchAgentLoaded;
43
+ exports.isSystemdUnitActive = isSystemdUnitActive;
44
+ exports.isDaemonLoaded = isDaemonLoaded;
41
45
  exports.getDaemonHealth = getDaemonHealth;
42
46
  const child_process = __importStar(require("child_process"));
43
47
  const fs = __importStar(require("fs"));
@@ -57,6 +61,7 @@ exports.YOUMD_DAEMONS = [
57
61
  intervalSeconds: 0,
58
62
  stdoutLog: runtimeLogPath("realtime-sync.out.log"),
59
63
  stderrLog: runtimeLogPath("realtime-sync.err.log"),
64
+ linuxUnit: "you-realtime-sync.service",
60
65
  },
61
66
  {
62
67
  label: "com.you.skillstack-sync",
@@ -67,6 +72,7 @@ exports.YOUMD_DAEMONS = [
67
72
  stdoutLog: runtimeLogPath("skillstack-sync.out.log"),
68
73
  stderrLog: runtimeLogPath("skillstack-sync.err.log"),
69
74
  combinedLog: runtimeLogPath("skillstack-sync.log"),
75
+ linuxUnit: "you-skillstack-sync.timer",
70
76
  },
71
77
  {
72
78
  label: "com.you.identity-sync",
@@ -76,6 +82,7 @@ exports.YOUMD_DAEMONS = [
76
82
  intervalSeconds: 300,
77
83
  stdoutLog: runtimeLogPath("identity-sync.out.log"),
78
84
  stderrLog: runtimeLogPath("identity-sync.err.log"),
85
+ linuxUnit: "you-identity-sync.timer",
79
86
  },
80
87
  {
81
88
  label: "com.you.context-sync",
@@ -86,8 +93,50 @@ exports.YOUMD_DAEMONS = [
86
93
  stdoutLog: runtimeLogPath("context-sync.out.log"),
87
94
  stderrLog: runtimeLogPath("context-sync.err.log"),
88
95
  combinedLog: runtimeLogPath("context-sync.log"),
96
+ linuxUnit: "you-context-sync.timer",
97
+ },
98
+ {
99
+ label: "com.you.orchestrator-watch",
100
+ name: "orchestrator report-back",
101
+ command: "you orchestrate watch --once",
102
+ intervalSeconds: 60,
103
+ stdoutLog: runtimeLogPath("orchestrator-watch.out.log"),
104
+ stderrLog: runtimeLogPath("orchestrator-watch.err.log"),
105
+ linuxUnit: "you-orchestrator-watch.timer",
89
106
  },
90
107
  ];
108
+ /**
109
+ * Which resident-daemon supervisor this host uses.
110
+ * - macOS → launchd (LaunchAgents), the original path.
111
+ * - Linux with a reachable `systemctl --user` → systemd user units (VPS path).
112
+ * - anything else → unsupported (sync still works on an interval via cron/manual).
113
+ */
114
+ function detectDaemonBackend() {
115
+ if (process.platform === "darwin")
116
+ return "launchd";
117
+ if (process.platform === "linux" && hasUserSystemd())
118
+ return "systemd";
119
+ return "unsupported";
120
+ }
121
+ let cachedUserSystemd;
122
+ function hasUserSystemd() {
123
+ // Only memoize a POSITIVE result: a transient probe failure at boot (user bus not up yet right
124
+ // after linger/boot) must not wedge a long-lived daemon into "no systemd" for its whole life.
125
+ if (cachedUserSystemd === true)
126
+ return true;
127
+ if (process.platform !== "linux")
128
+ return false;
129
+ // `--version` succeeds even with no user manager / no XDG_RUNTIME_DIR, so it is a poor proxy for
130
+ // "user units actually work" on a headless box. `show-environment` requires a live connection to
131
+ // the per-user systemd manager, which is exactly what enable/start/is-active need.
132
+ const result = child_process.spawnSync("systemctl", ["--user", "show-environment"], {
133
+ encoding: "utf-8",
134
+ });
135
+ const ok = !result.error && result.status === 0;
136
+ if (ok)
137
+ cachedUserSystemd = true;
138
+ return ok;
139
+ }
91
140
  function expandHome(input) {
92
141
  if (input === "~")
93
142
  return os.homedir();
@@ -155,6 +204,28 @@ function isLaunchAgentLoaded(label) {
155
204
  });
156
205
  return result.status === 0 && !!result.stdout.trim();
157
206
  }
207
+ /** True if the given systemd --user unit is active (running service or armed timer). */
208
+ function isSystemdUnitActive(unit) {
209
+ if (!hasUserSystemd())
210
+ return false;
211
+ const result = child_process.spawnSync("systemctl", ["--user", "is-active", unit], {
212
+ encoding: "utf-8",
213
+ });
214
+ // `is-active` prints "active" / "activating" and exits 0 when up; non-zero otherwise.
215
+ const state = (result.stdout || "").trim();
216
+ return result.status === 0 && (state === "active" || state === "activating");
217
+ }
218
+ /** Platform-aware "is this daemon loaded?" for a YoumdDaemon, across launchd + systemd. */
219
+ function isDaemonLoaded(daemon) {
220
+ switch (detectDaemonBackend()) {
221
+ case "launchd":
222
+ return isLaunchAgentLoaded(daemon.label);
223
+ case "systemd":
224
+ return isSystemdUnitActive(daemon.linuxUnit);
225
+ default:
226
+ return false;
227
+ }
228
+ }
158
229
  function getDaemonHealth() {
159
230
  return exports.YOUMD_DAEMONS.map((daemon) => {
160
231
  const logs = [
@@ -172,7 +243,7 @@ function getDaemonHealth() {
172
243
  : undefined;
173
244
  return {
174
245
  ...daemon,
175
- loaded: isLaunchAgentLoaded(daemon.label),
246
+ loaded: isDaemonLoaded(daemon),
176
247
  legacyLoaded: daemon.legacyLabel ? isLaunchAgentLoaded(daemon.legacyLabel) : false,
177
248
  lastLogLine: tailUsefulLine(daemon.combinedLog ?? daemon.stdoutLog) ?? tailUsefulLine(daemon.stdoutLog),
178
249
  lastErrorLine,
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
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
+ [k: string]: unknown;
13
+ }
14
+ /** Resolve a folder.md API key from explicit arg → config → env. Returns null if none. */
15
+ export declare function resolveFolderMdKey(explicit?: string): string | null;
16
+ /**
17
+ * Resolve a usable folder.md key with ZERO user paste. Explicit/env/config key
18
+ * wins; otherwise auto-provision via the you.md backend (mints a scoped key
19
+ * server-to-server) and cache it locally. Returns the key + the media folderId
20
+ * when provisioning supplied one. Throws a friendly error if not authenticated
21
+ * or if provisioning is not configured on the backend.
22
+ */
23
+ export declare function ensureProvisionedKey(explicit?: string): Promise<{
24
+ apiKey: string;
25
+ folderId?: string;
26
+ }>;
27
+ /**
28
+ * Resolve the folder id to use for this user's media, creating + persisting a dedicated
29
+ * "you.md media" folder if none is configured. Shared by the CLI and the MCP tools so the
30
+ * "which folder?" logic lives in one place.
31
+ */
32
+ export declare function ensureUserFolder(apiKey: string, explicit?: string): Promise<string>;
33
+ /** List the user's folders (workspaces). */
34
+ export declare function listFolders(auth: FolderMdAuth): Promise<unknown[]>;
35
+ /** Create a folder (workspace), e.g. a per-you.md-user media folder. */
36
+ export declare function createFolder(auth: FolderMdAuth, name: string): Promise<FolderMdFile>;
37
+ /** List files in a folder. */
38
+ export declare function listFiles(auth: FolderMdAuth, folderId: string): Promise<FolderMdFile[]>;
39
+ /**
40
+ * Upload a local file (binary or text) to a folder via multipart. This is the large-file/media
41
+ * path the brain cannot handle. Returns the created file record (store its `id` as the brain
42
+ * pointer). For text-only content the folder.md MCP `file_write` tool is an alternative.
43
+ */
44
+ export declare function uploadFile(auth: FolderMdAuth, folderId: string, localPath: string, options?: {
45
+ destPath?: string;
46
+ mimeType?: string;
47
+ }): Promise<FolderMdFile>;
48
+ /**
49
+ * Download a file's bytes. folder.md storage is private (no public CDN URL yet), so bytes come
50
+ * back through the authenticated API; you.md proxies/streams them rather than handing out a URL.
51
+ */
52
+ export declare function downloadFile(auth: FolderMdAuth, folderId: string, fileId: string, destPath: string): Promise<{
53
+ bytes: number;
54
+ path: string;
55
+ }>;
56
+ /**
57
+ * The brain pointer: what you.md stores (as a plain string, which the bundle handles perfectly)
58
+ * to reference a media artifact living in folder.md. Embed JSON.stringify(this) in a memory or
59
+ * custom_file. No bytes ever enter the brain.
60
+ */
61
+ export interface BrainMediaPointer {
62
+ provider: "folder.md";
63
+ folderId: string;
64
+ fileId: string;
65
+ name: string;
66
+ mimeType?: string;
67
+ size?: number;
68
+ uploadedAt: string;
69
+ }
70
+ //# 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,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,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,226 @@
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
+ /** Resolve a folder.md API key from explicit arg → config → env. Returns null if none. */
63
+ function resolveFolderMdKey(explicit) {
64
+ if (explicit && explicit.trim())
65
+ return explicit.trim();
66
+ const cfg = (0, config_1.readGlobalConfig)();
67
+ const fromCfg = typeof cfg.folderMdKey === "string" ? cfg.folderMdKey : undefined;
68
+ return (fromCfg ||
69
+ process.env.FOLDER_API_KEY ||
70
+ process.env.FOLDERMD_API_KEY ||
71
+ null);
72
+ }
73
+ /**
74
+ * Resolve a usable folder.md key with ZERO user paste. Explicit/env/config key
75
+ * wins; otherwise auto-provision via the you.md backend (mints a scoped key
76
+ * server-to-server) and cache it locally. Returns the key + the media folderId
77
+ * when provisioning supplied one. Throws a friendly error if not authenticated
78
+ * or if provisioning is not configured on the backend.
79
+ */
80
+ async function ensureProvisionedKey(explicit) {
81
+ const local = resolveFolderMdKey(explicit);
82
+ if (local) {
83
+ const cfg = (0, config_1.readGlobalConfig)();
84
+ return { apiKey: local, folderId: cfg.folderMdFolderId };
85
+ }
86
+ const res = await (0, api_1.provisionStorage)();
87
+ if (!res.ok || !res.data?.apiKey) {
88
+ const msg = (0, api_1.apiErrorMessage)(res.data) ||
89
+ (res.status === 401
90
+ ? "not authenticated — run `you login` first"
91
+ : res.status === 503
92
+ ? "folder.md storage isn't enabled on the server yet"
93
+ : "could not provision folder.md storage");
94
+ throw new Error(msg);
95
+ }
96
+ const cfg = (0, config_1.readGlobalConfig)();
97
+ cfg.folderMdKey = res.data.apiKey;
98
+ if (res.data.folderId)
99
+ cfg.folderMdFolderId = res.data.folderId;
100
+ (0, config_1.writeGlobalConfig)(cfg);
101
+ return { apiKey: res.data.apiKey, folderId: res.data.folderId || cfg.folderMdFolderId };
102
+ }
103
+ function baseUrl(auth) {
104
+ return (auth.baseUrl || process.env.FOLDERMD_BASE_URL || exports.FOLDERMD_DEFAULT_BASE).replace(/\/$/, "");
105
+ }
106
+ function authHeaders(auth) {
107
+ return { Authorization: `Bearer ${auth.apiKey}` };
108
+ }
109
+ async function asError(res) {
110
+ let body = "";
111
+ try {
112
+ body = await res.text();
113
+ }
114
+ catch {
115
+ /* ignore */
116
+ }
117
+ return new Error(`folder.md ${res.status} ${res.statusText}${body ? `: ${body.slice(0, 300)}` : ""}`);
118
+ }
119
+ /**
120
+ * Resolve the folder id to use for this user's media, creating + persisting a dedicated
121
+ * "you.md media" folder if none is configured. Shared by the CLI and the MCP tools so the
122
+ * "which folder?" logic lives in one place.
123
+ */
124
+ async function ensureUserFolder(apiKey, explicit) {
125
+ const cfg = (0, config_1.readGlobalConfig)();
126
+ const existing = (explicit && explicit.trim()) || cfg.folderMdFolderId;
127
+ if (existing)
128
+ return existing;
129
+ const auth = { apiKey };
130
+ // Reuse an existing folder if present, else create one.
131
+ try {
132
+ const folders = (await listFolders(auth));
133
+ const mine = folders.find((f) => f.name === "you.md media") || folders[0];
134
+ if (mine?.id)
135
+ return persistFolderId(mine.id);
136
+ }
137
+ catch {
138
+ // listing failed — fall through to create
139
+ }
140
+ const created = await createFolder(auth, "you.md media");
141
+ if (!created.id)
142
+ throw new Error("folder.md did not return a folder id on create");
143
+ return persistFolderId(String(created.id));
144
+ }
145
+ function persistFolderId(id) {
146
+ const cfg = (0, config_1.readGlobalConfig)();
147
+ if (cfg.folderMdFolderId !== id) {
148
+ cfg.folderMdFolderId = id;
149
+ (0, config_1.writeGlobalConfig)(cfg);
150
+ }
151
+ return id;
152
+ }
153
+ /** List the user's folders (workspaces). */
154
+ async function listFolders(auth) {
155
+ const res = await fetch(`${baseUrl(auth)}/folders`, {
156
+ headers: authHeaders(auth),
157
+ signal: AbortSignal.timeout(30000),
158
+ });
159
+ if (!res.ok)
160
+ throw await asError(res);
161
+ const data = (await res.json());
162
+ return Array.isArray(data) ? data : data.folders ?? [];
163
+ }
164
+ /** Create a folder (workspace), e.g. a per-you.md-user media folder. */
165
+ async function createFolder(auth, name) {
166
+ const res = await fetch(`${baseUrl(auth)}/folders`, {
167
+ method: "POST",
168
+ headers: { ...authHeaders(auth), "Content-Type": "application/json" },
169
+ body: JSON.stringify({ name }),
170
+ signal: AbortSignal.timeout(30000),
171
+ });
172
+ if (!res.ok)
173
+ throw await asError(res);
174
+ return (await res.json());
175
+ }
176
+ /** List files in a folder. */
177
+ async function listFiles(auth, folderId) {
178
+ const res = await fetch(`${baseUrl(auth)}/folders/${encodeURIComponent(folderId)}/files`, {
179
+ headers: authHeaders(auth),
180
+ signal: AbortSignal.timeout(30000),
181
+ });
182
+ if (!res.ok)
183
+ throw await asError(res);
184
+ const data = (await res.json());
185
+ return Array.isArray(data) ? data : data.files ?? [];
186
+ }
187
+ /**
188
+ * Upload a local file (binary or text) to a folder via multipart. This is the large-file/media
189
+ * path the brain cannot handle. Returns the created file record (store its `id` as the brain
190
+ * pointer). For text-only content the folder.md MCP `file_write` tool is an alternative.
191
+ */
192
+ async function uploadFile(auth, folderId, localPath, options = {}) {
193
+ if (!fs.existsSync(localPath))
194
+ throw new Error(`file not found: ${localPath}`);
195
+ const bytes = fs.readFileSync(localPath);
196
+ const name = options.destPath || path.basename(localPath);
197
+ const blob = new Blob([bytes], options.mimeType ? { type: options.mimeType } : undefined);
198
+ const form = new FormData();
199
+ form.append("file", blob, name);
200
+ if (options.destPath)
201
+ form.append("path", options.destPath);
202
+ const res = await fetch(`${baseUrl(auth)}/folders/${encodeURIComponent(folderId)}/files`, {
203
+ method: "POST",
204
+ headers: authHeaders(auth), // do NOT set Content-Type; fetch sets the multipart boundary
205
+ body: form,
206
+ signal: AbortSignal.timeout(120000),
207
+ });
208
+ if (!res.ok)
209
+ throw await asError(res);
210
+ return (await res.json());
211
+ }
212
+ /**
213
+ * Download a file's bytes. folder.md storage is private (no public CDN URL yet), so bytes come
214
+ * back through the authenticated API; you.md proxies/streams them rather than handing out a URL.
215
+ */
216
+ async function downloadFile(auth, folderId, fileId, destPath) {
217
+ const url = `${baseUrl(auth)}/folders/${encodeURIComponent(folderId)}/files/${encodeURIComponent(fileId)}?download=true`;
218
+ const res = await fetch(url, { headers: authHeaders(auth), signal: AbortSignal.timeout(120000) });
219
+ if (!res.ok)
220
+ throw await asError(res);
221
+ const buf = Buffer.from(await res.arrayBuffer());
222
+ fs.mkdirSync(path.dirname(path.resolve(destPath)), { recursive: true });
223
+ fs.writeFileSync(destPath, buf);
224
+ return { bytes: buf.length, path: destPath };
225
+ }
226
+ //# sourceMappingURL=foldermd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foldermd.js","sourceRoot":"","sources":["../../src/lib/foldermd.ts"],"names":[],"mappings":"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"}
@@ -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"}