@anhlp/alp-paseo 0.0.0-beta.1 → 0.0.0-beta.2

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 (77) hide show
  1. package/README.md +15 -4
  2. package/client/task-pills.ts +5 -1
  3. package/package.json +6 -12
  4. package/server/dist/alpd.js +1867 -741
  5. package/server/dist/index.js +1954 -800
  6. package/server/dist/library.js +4 -2
  7. package/server/dist/main.js +36 -5
  8. package/server/dist/mapping.js +25 -16
  9. package/server/dist/panel/library.js +4 -2
  10. package/server/dist/panel/mapping.js +25 -16
  11. package/server/dist/panel/tasks.js +4 -2
  12. package/server/dist/panel/usage.js +4 -2
  13. package/server/dist/paseo/agents.js +47 -17
  14. package/server/dist/paseo/index.js +34 -4
  15. package/server/dist/paseo/plugins.js +4 -2
  16. package/server/dist/paseo/timeline-items.js +25 -2
  17. package/server/dist/provider-core.js +23 -1
  18. package/server/dist/provider.js +1804 -656
  19. package/server/dist/remote/index.js +27 -3
  20. package/server/dist/remote/link.js +4 -2
  21. package/server/dist/remote/panels.js +4 -2
  22. package/server/dist/remote/provider.js +27 -3
  23. package/server/dist/tasks.js +4 -2
  24. package/server/dist/tool-detail.js +26 -0
  25. package/server/dist/usage.js +4 -2
  26. package/server/dist/web-app/_expo/static/js/web/{index-185bf24e94a45852b2cfa53666d1cb86.js → index-c01174e6924afca25f226efae0b2a3ae.js} +2 -2
  27. package/server/dist/web-app/_expo/static/js/web/{index-185bf24e94a45852b2cfa53666d1cb86.js.br → index-c01174e6924afca25f226efae0b2a3ae.js.br} +0 -0
  28. package/server/dist/web-app/_expo/static/js/web/{index-185bf24e94a45852b2cfa53666d1cb86.js.gz → index-c01174e6924afca25f226efae0b2a3ae.js.gz} +0 -0
  29. package/server/dist/web-app/alp-web-app.json +2 -1
  30. package/server/dist/web-app/index.html +1 -1
  31. package/server/dist/web-app/index.html.br +0 -0
  32. package/server/dist/web-app/index.html.gz +0 -0
  33. package/server/dist/web.js +4 -2
  34. package/server/dist/alp-templates.d.ts +0 -9
  35. package/server/dist/compat.d.ts +0 -3
  36. package/server/dist/index.d.ts +0 -10
  37. package/server/dist/library.d.ts +0 -1
  38. package/server/dist/main.d.ts +0 -2
  39. package/server/dist/mapping-wire.d.ts +0 -58
  40. package/server/dist/mapping.d.ts +0 -99
  41. package/server/dist/panel/compat.d.ts +0 -3
  42. package/server/dist/panel/library.d.ts +0 -6
  43. package/server/dist/panel/mapping.d.ts +0 -1
  44. package/server/dist/panel/session-tasks.d.ts +0 -6
  45. package/server/dist/panel/tasks.d.ts +0 -8
  46. package/server/dist/panel/usage.d.ts +0 -3
  47. package/server/dist/paseo/agents.d.ts +0 -65
  48. package/server/dist/paseo/chat-search.d.ts +0 -18
  49. package/server/dist/paseo/checkout.d.ts +0 -71
  50. package/server/dist/paseo/files.d.ts +0 -19
  51. package/server/dist/paseo/gateway.d.ts +0 -61
  52. package/server/dist/paseo/git.d.ts +0 -21
  53. package/server/dist/paseo/index.d.ts +0 -56
  54. package/server/dist/paseo/plugins.d.ts +0 -17
  55. package/server/dist/paseo/providers.d.ts +0 -19
  56. package/server/dist/paseo/quiet.d.ts +0 -2
  57. package/server/dist/paseo/relay-transport.d.ts +0 -43
  58. package/server/dist/paseo/relay.d.ts +0 -84
  59. package/server/dist/paseo/timeline-items.d.ts +0 -13
  60. package/server/dist/paseo/timeline-projection.d.ts +0 -96
  61. package/server/dist/paseo/timeline-store.d.ts +0 -60
  62. package/server/dist/paseo/usage.d.ts +0 -12
  63. package/server/dist/paseo/workspaces.d.ts +0 -58
  64. package/server/dist/provider-core.d.ts +0 -68
  65. package/server/dist/provider.d.ts +0 -28
  66. package/server/dist/remote/index.d.ts +0 -10
  67. package/server/dist/remote/link.d.ts +0 -58
  68. package/server/dist/remote/panels.d.ts +0 -29
  69. package/server/dist/remote/provider.d.ts +0 -25
  70. package/server/dist/session-tasks.d.ts +0 -1
  71. package/server/dist/shared/library.d.ts +0 -258
  72. package/server/dist/shared/tasks.d.ts +0 -128
  73. package/server/dist/shared/team-models.d.ts +0 -14
  74. package/server/dist/shared/usage.d.ts +0 -27
  75. package/server/dist/tasks.d.ts +0 -1
  76. package/server/dist/usage.d.ts +0 -1
  77. package/server/dist/web.d.ts +0 -42
@@ -9477,8 +9477,10 @@ var TAIL_BYTES = 256 * 1024;
9477
9477
  var MAX_FRAME = 16 * 1024 * 1024;
9478
9478
  var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
9479
9479
  var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
9480
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
9481
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
9480
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
9481
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
9482
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
9483
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
9482
9484
 
9483
9485
  // packages/client/src/rpc/errors.js
9484
9486
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
@@ -164,7 +164,7 @@ function encodeFrame(value) {
164
164
  return `${JSON.stringify(value)}
165
165
  `;
166
166
  }
167
- var PROTOCOL_VERSION, MAX_FRAME, AlpRpcError, ERROR, RPC_ERROR, CAPABILITY, RPC_METHODS;
167
+ var PROTOCOL_VERSION, MAX_FRAME, AlpRpcError, ERROR, RPC_ERROR, CAPABILITY, PROMPT_IMAGES, RPC_METHODS, WORKSPACE_FILES;
168
168
  var init_wire = __esm({
169
169
  "packages/protocol/src/wire.js"() {
170
170
  PROTOCOL_VERSION = 1;
@@ -178,8 +178,10 @@ var init_wire = __esm({
178
178
  };
179
179
  ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
180
180
  RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
181
- CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
182
- RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
181
+ CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
182
+ PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
183
+ RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
184
+ WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
183
185
  }
184
186
  });
185
187
 
@@ -16616,6 +16618,7 @@ init_log();
16616
16618
 
16617
16619
  // packages/runtime/src/runtime.ts
16618
16620
  init_log();
16621
+ init_src();
16619
16622
 
16620
16623
  // packages/runtime/src/board.ts
16621
16624
  var PIN_KINDS = ["claim", "decision", "finding"];
@@ -33850,6 +33853,28 @@ function searchTimeline({ rows, query, cursor = 0 }) {
33850
33853
  return { locations, nextCursor: null };
33851
33854
  }
33852
33855
 
33856
+ // integrations/paseo/server/tool-detail.ts
33857
+ function paseoDetail(detail) {
33858
+ switch (detail.type) {
33859
+ case "shell":
33860
+ return { type: "shell", command: detail.command, ...detail.cwd ? { cwd: detail.cwd } : {}, output: detail.output, ...detail.exitCode !== void 0 ? { exitCode: detail.exitCode } : {} };
33861
+ case "read":
33862
+ case "edit":
33863
+ case "write":
33864
+ case "search":
33865
+ case "fetch":
33866
+ case "plan":
33867
+ case "plain_text":
33868
+ return { ...detail };
33869
+ case "sub_agent":
33870
+ return { ...detail, log: detail.log ?? "", actions: [] };
33871
+ default: {
33872
+ const other = detail;
33873
+ return { type: "unknown", input: other.input ?? null, output: other.output ?? null };
33874
+ }
33875
+ }
33876
+ }
33877
+
33853
33878
  // integrations/paseo/server/paseo/timeline-items.ts
33854
33879
  var TimelineDeltas = class {
33855
33880
  last = /* @__PURE__ */ new Map();
@@ -33875,7 +33900,7 @@ var TimelineDeltas = class {
33875
33900
  case "todo":
33876
33901
  return { type: "todo", items: item.items.map((entry) => ({ id: entry.id, text: entry.text, status: entry.status, completed: entry.status === "completed" })) };
33877
33902
  case "tool_call": {
33878
- const detail = item.detail.type === "shell" ? { type: "shell", command: item.detail.command, ...item.detail.cwd ? { cwd: item.detail.cwd } : {}, output: item.detail.output, ...item.detail.exitCode !== void 0 ? { exitCode: item.detail.exitCode } : {} } : { type: "unknown", input: item.detail.input ?? null, output: item.detail.output ?? null };
33903
+ const detail = paseoDetail(item.detail);
33879
33904
  return item.status === "failed" ? { type: "tool_call", callId: item.callId, name: item.name, status: "failed", error: item.error ?? "Tool call failed", detail } : { type: "tool_call", callId: item.callId, name: item.name, status: item.status, error: null, detail };
33880
33905
  }
33881
33906
  }
@@ -34484,6 +34509,7 @@ function createAgents({ clientFactory, home: home2, broadcast, directory, log: l
34484
34509
  const roots = /* @__PURE__ */ new Map();
34485
34510
  const timelines = new InMemoryAgentTimelineStore();
34486
34511
  const deltas = /* @__PURE__ */ new Map();
34512
+ const epochs = /* @__PURE__ */ new Map();
34487
34513
  const replaying = /* @__PURE__ */ new Set();
34488
34514
  const attaching = /* @__PURE__ */ new Map();
34489
34515
  const turns = /* @__PURE__ */ new Map();
@@ -34578,6 +34604,7 @@ function createAgents({ clientFactory, home: home2, broadcast, directory, log: l
34578
34604
  }
34579
34605
  for (const id2 of [...roots.keys()]) if (!seen.has(id2)) {
34580
34606
  roots.delete(id2);
34607
+ epochs.delete(id2);
34581
34608
  broadcast({ type: "agent_update", payload: { kind: "remove", agentId: id2 } });
34582
34609
  directory.changed();
34583
34610
  }
@@ -34677,7 +34704,9 @@ function createAgents({ clientFactory, home: home2, broadcast, directory, log: l
34677
34704
  const { event } = envelope;
34678
34705
  switch (event.type) {
34679
34706
  case "item": {
34680
- if (envelope.epoch && timelines.has(root) && envelope.epoch !== timelines.getEpoch(root)) deltas.set(root, new TimelineDeltas());
34707
+ const seenEpoch = epochs.get(root);
34708
+ if (envelope.epoch) epochs.set(root, envelope.epoch);
34709
+ if (envelope.epoch && seenEpoch && envelope.epoch !== seenEpoch) deltas.set(root, new TimelineDeltas());
34681
34710
  let maker = deltas.get(root);
34682
34711
  if (!maker) deltas.set(root, maker = new TimelineDeltas());
34683
34712
  append(root, maker.next(event.item), envelope.ts);
@@ -34718,6 +34747,7 @@ function createAgents({ clientFactory, home: home2, broadcast, directory, log: l
34718
34747
  pending = (async () => {
34719
34748
  timelines.initialize(root);
34720
34749
  deltas.set(root, new TimelineDeltas());
34750
+ epochs.delete(root);
34721
34751
  replaying.add(root);
34722
34752
  try {
34723
34753
  await alp.request("session.attach", { sessionId: root, replay: true });
@@ -34737,6 +34767,7 @@ function createAgents({ clientFactory, home: home2, broadcast, directory, log: l
34737
34767
  timelines.delete(root);
34738
34768
  deltas.set(root, new TimelineDeltas());
34739
34769
  attaching.delete(root);
34770
+ epochs.delete(root);
34740
34771
  replaying.delete(root);
34741
34772
  turns.delete(root);
34742
34773
  for (const child of children2.values()) {
@@ -7923,6 +7923,15 @@ function createLogger({ component, level, context = {}, write = stderrSink, now
7923
7923
  }
7924
7924
  var TAIL_BYTES = 256 * 1024;
7925
7925
 
7926
+ // packages/protocol/src/wire.js
7927
+ var MAX_FRAME = 16 * 1024 * 1024;
7928
+ var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
7929
+ var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
7930
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
7931
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
7932
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
7933
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
7934
+
7926
7935
  // packages/core/src/atomic.js
7927
7936
  import { rename, rm, writeFile } from "node:fs/promises";
7928
7937
  async function moveFile(from, to) {
@@ -25451,12 +25460,19 @@ async function syncTemplateProfiles(settings, options2 = {}) {
25451
25460
  }
25452
25461
 
25453
25462
  // packages/core/src/workflow.js
25454
- async function resolveWorkflow(root, selected, restored, { library, templates: templates2 } = {}) {
25455
- const settings = await jsonObject(path9.join(root, ".alp/settings.json"), "INVALID_SETTINGS");
25463
+ var INIT_TEAM = "pho";
25464
+ function defaultTeam(settings, { restored, scaffolded = false } = {}) {
25465
+ return teamOf(restored?.mode ?? settings.workflow?.mode ?? (scaffolded ? INIT_TEAM : "custom"));
25466
+ }
25467
+ async function resolveWorkflow(root, selected, restored, { library, templates: templates2, scaffold = false } = {}) {
25468
+ const file2 = path9.join(root, ".alp/settings.json");
25469
+ const settings = await jsonObject(file2, "INVALID_SETTINGS");
25456
25470
  validateSettings(settings, ".alp/settings.json");
25471
+ const scaffolded = scaffold && await optionalText(file2) === void 0;
25472
+ const fallback = defaultTeam(settings, { restored, scaffolded });
25457
25473
  const chosen = selected === void 0 ? void 0 : teamOf(selected);
25458
- if (chosen === "custom") throw new Error("Choose a team, such as pho (Ph\u1EDF) or cafe (Cafe)");
25459
- const mode = chosen ?? teamOf(restored?.mode ?? settings.workflow?.mode ?? "custom");
25474
+ if (chosen === "custom" && fallback !== "custom") throw new Error("Choose a team, such as pho (Ph\u1EDF) or cafe (Cafe)");
25475
+ const mode = chosen ?? fallback;
25460
25476
  if (restored && mode !== teamOf(restored.mode)) throw new Error("Cannot change team in an existing session");
25461
25477
  const team = mode === "custom" ? void 0 : applyProfile(await resolveTeam(root, mode, { library, templates: templates2 }), (settings.team ?? settings.profile)?.[mode]);
25462
25478
  const maxPeers = restored?.maxPeers ?? settings.workflow?.maxPeers ?? team?.maxPeers ?? 2;
@@ -25480,7 +25496,7 @@ async function initProject(projectRoot, { templateRoot: templateRoot2, templates
25480
25496
  const team = await projectProfiles({ root, templates: templates2, library, teamIds });
25481
25497
  const files = {
25482
25498
  "ALP.md": await template("ALP.md"),
25483
- ".alp/settings.json": JSON.stringify({ defaultAgent: "main", workflow: { mode: "pho" }, team, templateDefaults: profileDefaults(team) }, null, 2) + "\n"
25499
+ ".alp/settings.json": JSON.stringify({ defaultAgent: "main", workflow: { mode: INIT_TEAM }, team, templateDefaults: profileDefaults(team) }, null, 2) + "\n"
25484
25500
  };
25485
25501
  const directories2 = [".alp"];
25486
25502
  const created = [];
@@ -25652,13 +25668,13 @@ async function resolveSession(spec, options2 = {}) {
25652
25668
  if (scaffoldMissing) await initProject(spec.cwd, { ...starter, library: options2.library });
25653
25669
  else if (!spec.restore) {
25654
25670
  const settings = await jsonObject(settingsFile, "INVALID_SETTINGS");
25655
- await initProject(spec.cwd, { ...starter, library: options2.library, onlyManagedProfiles: true, teamIds: [teamOf(spec.workflow ?? settings.workflow?.mode ?? "custom")] });
25671
+ await initProject(spec.cwd, { ...starter, library: options2.library, onlyManagedProfiles: true, teamIds: [spec.workflow === void 0 ? defaultTeam(settings) : teamOf(spec.workflow)] });
25656
25672
  }
25657
25673
  }
25658
25674
  if (options2.library) await ensureLibrary(options2.library, options2.templates ? { templates: options2.templates } : {});
25659
25675
  const restored = spec.restore;
25660
25676
  if (restored && spec.agent !== void 0 && spec.agent !== restored.agent) throw new Error("Cannot resume a thread as a different ALP agent");
25661
- const { team, ...workflow } = await resolveWorkflow(spec.cwd, spec.workflow, restored?.workflow, { library: options2.library, templates: options2.templates });
25677
+ const { team, ...workflow } = await resolveWorkflow(spec.cwd, spec.workflow, restored?.workflow, { library: options2.library, templates: options2.templates, scaffold: options2.initialize === false });
25662
25678
  const agent = await resolveAgent(spec.cwd, { agent: spec.agent ?? restored?.agent, library: options2.library, templates: options2.templates });
25663
25679
  const oracleModels = team?.oracleModels ?? ORACLE_MODELS;
25664
25680
  if (agent.name === "oracle" && !restored && !oracleModels.includes(spec.model ?? "")) throw new Error(`Oracle runs on ${oracleModels.join(" or ")}; choose one`);
@@ -25970,13 +25986,6 @@ var log = createLogger({ component: "runtime" });
25970
25986
  import os2 from "node:os";
25971
25987
  import path14 from "node:path";
25972
25988
 
25973
- // packages/protocol/src/wire.js
25974
- var MAX_FRAME = 16 * 1024 * 1024;
25975
- var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
25976
- var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
25977
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
25978
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
25979
-
25980
25989
  // packages/client/src/rpc/errors.js
25981
25990
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
25982
25991
  var CLIENT_ERROR = Object.freeze({
@@ -26000,7 +26009,7 @@ var BIN_DIRECTORIES = [path14.join(os2.homedir(), ".npm-global", "bin"), path14.
26000
26009
 
26001
26010
  // integrations/paseo/server/mapping-wire.ts
26002
26011
  import path15 from "node:path";
26003
- var DEFAULT_TEAM2 = "pho";
26012
+ var DEFAULT_TEAM = "pho";
26004
26013
  function configModels(session, labelOf = () => void 0) {
26005
26014
  if (!session.parentId && session.workflow.mode !== "custom") return { model: session.workflow.mode, models: [{ id: session.workflow.mode, label: session.teamLabel ?? session.workflow.mode, thinkingOptions: [] }] };
26006
26015
  const id = `${session.runtime}:${session.model}`;
@@ -26059,7 +26068,7 @@ async function mapSession(config2, persistence) {
26059
26068
  export {
26060
26069
  DEFAULT_CLAUDE_MODEL,
26061
26070
  DEFAULT_MODEL,
26062
- DEFAULT_TEAM2 as DEFAULT_TEAM,
26071
+ DEFAULT_TEAM,
26063
26072
  InstructionsAdapter as PaseoAdapter,
26064
26073
  alpdSessionOf,
26065
26074
  configModels2 as configModels,
@@ -9477,8 +9477,10 @@ var TAIL_BYTES = 256 * 1024;
9477
9477
  var MAX_FRAME = 16 * 1024 * 1024;
9478
9478
  var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
9479
9479
  var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
9480
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
9481
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
9480
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
9481
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
9482
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
9483
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
9482
9484
 
9483
9485
  // packages/client/src/rpc/errors.js
9484
9486
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
@@ -7923,6 +7923,15 @@ function createLogger({ component, level, context = {}, write = stderrSink, now
7923
7923
  }
7924
7924
  var TAIL_BYTES = 256 * 1024;
7925
7925
 
7926
+ // packages/protocol/src/wire.js
7927
+ var MAX_FRAME = 16 * 1024 * 1024;
7928
+ var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
7929
+ var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
7930
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
7931
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
7932
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
7933
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
7934
+
7926
7935
  // packages/core/src/atomic.js
7927
7936
  import { rename, rm, writeFile } from "node:fs/promises";
7928
7937
  async function moveFile(from, to) {
@@ -25451,12 +25460,19 @@ async function syncTemplateProfiles(settings, options2 = {}) {
25451
25460
  }
25452
25461
 
25453
25462
  // packages/core/src/workflow.js
25454
- async function resolveWorkflow(root, selected, restored, { library, templates: templates2 } = {}) {
25455
- const settings = await jsonObject(path9.join(root, ".alp/settings.json"), "INVALID_SETTINGS");
25463
+ var INIT_TEAM = "pho";
25464
+ function defaultTeam(settings, { restored, scaffolded = false } = {}) {
25465
+ return teamOf(restored?.mode ?? settings.workflow?.mode ?? (scaffolded ? INIT_TEAM : "custom"));
25466
+ }
25467
+ async function resolveWorkflow(root, selected, restored, { library, templates: templates2, scaffold = false } = {}) {
25468
+ const file2 = path9.join(root, ".alp/settings.json");
25469
+ const settings = await jsonObject(file2, "INVALID_SETTINGS");
25456
25470
  validateSettings(settings, ".alp/settings.json");
25471
+ const scaffolded = scaffold && await optionalText(file2) === void 0;
25472
+ const fallback = defaultTeam(settings, { restored, scaffolded });
25457
25473
  const chosen = selected === void 0 ? void 0 : teamOf(selected);
25458
- if (chosen === "custom") throw new Error("Choose a team, such as pho (Ph\u1EDF) or cafe (Cafe)");
25459
- const mode = chosen ?? teamOf(restored?.mode ?? settings.workflow?.mode ?? "custom");
25474
+ if (chosen === "custom" && fallback !== "custom") throw new Error("Choose a team, such as pho (Ph\u1EDF) or cafe (Cafe)");
25475
+ const mode = chosen ?? fallback;
25460
25476
  if (restored && mode !== teamOf(restored.mode)) throw new Error("Cannot change team in an existing session");
25461
25477
  const team = mode === "custom" ? void 0 : applyProfile(await resolveTeam(root, mode, { library, templates: templates2 }), (settings.team ?? settings.profile)?.[mode]);
25462
25478
  const maxPeers = restored?.maxPeers ?? settings.workflow?.maxPeers ?? team?.maxPeers ?? 2;
@@ -25480,7 +25496,7 @@ async function initProject(projectRoot, { templateRoot: templateRoot2, templates
25480
25496
  const team = await projectProfiles({ root, templates: templates2, library, teamIds });
25481
25497
  const files = {
25482
25498
  "ALP.md": await template("ALP.md"),
25483
- ".alp/settings.json": JSON.stringify({ defaultAgent: "main", workflow: { mode: "pho" }, team, templateDefaults: profileDefaults(team) }, null, 2) + "\n"
25499
+ ".alp/settings.json": JSON.stringify({ defaultAgent: "main", workflow: { mode: INIT_TEAM }, team, templateDefaults: profileDefaults(team) }, null, 2) + "\n"
25484
25500
  };
25485
25501
  const directories2 = [".alp"];
25486
25502
  const created = [];
@@ -25652,13 +25668,13 @@ async function resolveSession(spec, options2 = {}) {
25652
25668
  if (scaffoldMissing) await initProject(spec.cwd, { ...starter, library: options2.library });
25653
25669
  else if (!spec.restore) {
25654
25670
  const settings = await jsonObject(settingsFile, "INVALID_SETTINGS");
25655
- await initProject(spec.cwd, { ...starter, library: options2.library, onlyManagedProfiles: true, teamIds: [teamOf(spec.workflow ?? settings.workflow?.mode ?? "custom")] });
25671
+ await initProject(spec.cwd, { ...starter, library: options2.library, onlyManagedProfiles: true, teamIds: [spec.workflow === void 0 ? defaultTeam(settings) : teamOf(spec.workflow)] });
25656
25672
  }
25657
25673
  }
25658
25674
  if (options2.library) await ensureLibrary(options2.library, options2.templates ? { templates: options2.templates } : {});
25659
25675
  const restored = spec.restore;
25660
25676
  if (restored && spec.agent !== void 0 && spec.agent !== restored.agent) throw new Error("Cannot resume a thread as a different ALP agent");
25661
- const { team, ...workflow } = await resolveWorkflow(spec.cwd, spec.workflow, restored?.workflow, { library: options2.library, templates: options2.templates });
25677
+ const { team, ...workflow } = await resolveWorkflow(spec.cwd, spec.workflow, restored?.workflow, { library: options2.library, templates: options2.templates, scaffold: options2.initialize === false });
25662
25678
  const agent = await resolveAgent(spec.cwd, { agent: spec.agent ?? restored?.agent, library: options2.library, templates: options2.templates });
25663
25679
  const oracleModels = team?.oracleModels ?? ORACLE_MODELS;
25664
25680
  if (agent.name === "oracle" && !restored && !oracleModels.includes(spec.model ?? "")) throw new Error(`Oracle runs on ${oracleModels.join(" or ")}; choose one`);
@@ -25970,13 +25986,6 @@ var log = createLogger({ component: "runtime" });
25970
25986
  import os2 from "node:os";
25971
25987
  import path14 from "node:path";
25972
25988
 
25973
- // packages/protocol/src/wire.js
25974
- var MAX_FRAME = 16 * 1024 * 1024;
25975
- var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
25976
- var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
25977
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
25978
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
25979
-
25980
25989
  // packages/client/src/rpc/errors.js
25981
25990
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
25982
25991
  var CLIENT_ERROR = Object.freeze({
@@ -26000,7 +26009,7 @@ var BIN_DIRECTORIES = [path14.join(os2.homedir(), ".npm-global", "bin"), path14.
26000
26009
 
26001
26010
  // integrations/paseo/server/mapping-wire.ts
26002
26011
  import path15 from "node:path";
26003
- var DEFAULT_TEAM2 = "pho";
26012
+ var DEFAULT_TEAM = "pho";
26004
26013
  function configModels(session, labelOf = () => void 0) {
26005
26014
  if (!session.parentId && session.workflow.mode !== "custom") return { model: session.workflow.mode, models: [{ id: session.workflow.mode, label: session.teamLabel ?? session.workflow.mode, thinkingOptions: [] }] };
26006
26015
  const id = `${session.runtime}:${session.model}`;
@@ -26059,7 +26068,7 @@ async function mapSession(config2, persistence) {
26059
26068
  export {
26060
26069
  DEFAULT_CLAUDE_MODEL,
26061
26070
  DEFAULT_MODEL,
26062
- DEFAULT_TEAM2 as DEFAULT_TEAM,
26071
+ DEFAULT_TEAM,
26063
26072
  InstructionsAdapter as PaseoAdapter,
26064
26073
  alpdSessionOf,
26065
26074
  configModels2 as configModels,
@@ -529,8 +529,10 @@ var TAIL_BYTES = 256 * 1024;
529
529
  var MAX_FRAME = 16 * 1024 * 1024;
530
530
  var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
531
531
  var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
532
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
533
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
532
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
533
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
534
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
535
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
534
536
 
535
537
  // packages/client/src/rpc/errors.js
536
538
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
@@ -45,8 +45,10 @@ var AlpRpcError = class extends Error {
45
45
  };
46
46
  var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
47
47
  var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
48
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
49
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
48
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
49
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
50
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
51
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
50
52
 
51
53
  // packages/client/src/rpc/errors.js
52
54
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
@@ -8200,6 +8200,23 @@ function createLogger({ component, level, context = {}, write = stderrSink, now
8200
8200
  }
8201
8201
  var TAIL_BYTES = 256 * 1024;
8202
8202
 
8203
+ // packages/protocol/src/wire.js
8204
+ var PROTOCOL_VERSION = 1;
8205
+ var MAX_FRAME = 16 * 1024 * 1024;
8206
+ var AlpRpcError = class extends Error {
8207
+ constructor(error51) {
8208
+ super(error51?.message ?? "ALP daemon request failed");
8209
+ this.code = error51?.code;
8210
+ this.data = error51?.data;
8211
+ }
8212
+ };
8213
+ var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
8214
+ var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
8215
+ var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language", sessionListPage: "session.list.page", questionWatch: "question.watch", questionWatchTurns: "question.watch.turns", workspaceFiles: "workspace.files", workspaceFilesRead: "workspace.files.read", promptImages: "prompt.images" });
8216
+ var PROMPT_IMAGES = Object.freeze({ mimeTypes: Object.freeze(["image/png", "image/jpeg", "image/gif", "image/webp"]), maxCount: 8, maxBytes: 5 * 1024 * 1024, maxTotalBytes: 11 * 1024 * 1024 });
8217
+ var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "question.watch", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list", "workspace.files.list", "workspace.files.read", "workspace.files.search"]);
8218
+ var WORKSPACE_FILES = Object.freeze({ maxReadBytes: 1024 * 1024, maxListEntries: 1e3, maxPathLength: 4096 });
8219
+
8203
8220
  // packages/runtime/src/board.ts
8204
8221
  var PIN_KINDS = ["claim", "decision", "finding"];
8205
8222
 
@@ -24816,21 +24833,6 @@ import net from "node:net";
24816
24833
  import os from "node:os";
24817
24834
  import path3 from "node:path";
24818
24835
 
24819
- // packages/protocol/src/wire.js
24820
- var PROTOCOL_VERSION = 1;
24821
- var MAX_FRAME = 16 * 1024 * 1024;
24822
- var AlpRpcError = class extends Error {
24823
- constructor(error51) {
24824
- super(error51?.message ?? "ALP daemon request failed");
24825
- this.code = error51?.code;
24826
- this.data = error51?.data;
24827
- }
24828
- };
24829
- var ERROR = Object.freeze({ failed: 1e3, notFound: 1001, forbidden: 1003, conflict: 1004, unavailable: 1005, protocol: 1006 });
24830
- var RPC_ERROR = Object.freeze({ parseError: -32700, invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602 });
24831
- var CAPABILITY = Object.freeze({ attachAfter: "attach.after", promptReceipts: "prompt.receipts", extensionMethods: "extension.methods", team: "team", task: "task", library: "library", settingsLanguage: "settings.language" });
24832
- var RPC_METHODS = Object.freeze(["assignment.recall", "board.list", "catalog.get", "daemon.hello", "daemon.pause", "daemon.pauses", "daemon.resume", "daemon.shutdown", "daemon.status", "daemon.usage", "extension.register", "extension.unregister", "library.delete", "library.duplicate", "library.get", "library.list", "library.models", "library.rename", "library.save", "library.skills.set", "question.answer", "question.list", "session.archive", "session.attach", "session.close", "session.configure", "session.create", "session.get", "session.interrupt", "session.list", "session.log", "session.message", "session.preview", "session.prompt", "session.release", "session.rename", "session.status", "settings.language.get", "settings.language.set", "task.create", "task.gate.resolve", "task.list", "task.update", "team.list"]);
24833
-
24834
24836
  // packages/client/src/rpc/errors.js
24835
24837
  var BRAND = Symbol.for("@anhlp/alp-client/AlpClientError");
24836
24838
  var CLIENT_ERROR = Object.freeze({
@@ -25408,6 +25410,28 @@ function searchTimeline({ rows, query, cursor = 0 }) {
25408
25410
  return { locations, nextCursor: null };
25409
25411
  }
25410
25412
 
25413
+ // integrations/paseo/server/tool-detail.ts
25414
+ function paseoDetail(detail) {
25415
+ switch (detail.type) {
25416
+ case "shell":
25417
+ return { type: "shell", command: detail.command, ...detail.cwd ? { cwd: detail.cwd } : {}, output: detail.output, ...detail.exitCode !== void 0 ? { exitCode: detail.exitCode } : {} };
25418
+ case "read":
25419
+ case "edit":
25420
+ case "write":
25421
+ case "search":
25422
+ case "fetch":
25423
+ case "plan":
25424
+ case "plain_text":
25425
+ return { ...detail };
25426
+ case "sub_agent":
25427
+ return { ...detail, log: detail.log ?? "", actions: [] };
25428
+ default: {
25429
+ const other = detail;
25430
+ return { type: "unknown", input: other.input ?? null, output: other.output ?? null };
25431
+ }
25432
+ }
25433
+ }
25434
+
25411
25435
  // integrations/paseo/server/paseo/timeline-items.ts
25412
25436
  var TimelineDeltas = class {
25413
25437
  last = /* @__PURE__ */ new Map();
@@ -25433,7 +25457,7 @@ var TimelineDeltas = class {
25433
25457
  case "todo":
25434
25458
  return { type: "todo", items: item.items.map((entry) => ({ id: entry.id, text: entry.text, status: entry.status, completed: entry.status === "completed" })) };
25435
25459
  case "tool_call": {
25436
- const detail = item.detail.type === "shell" ? { type: "shell", command: item.detail.command, ...item.detail.cwd ? { cwd: item.detail.cwd } : {}, output: item.detail.output, ...item.detail.exitCode !== void 0 ? { exitCode: item.detail.exitCode } : {} } : { type: "unknown", input: item.detail.input ?? null, output: item.detail.output ?? null };
25460
+ const detail = paseoDetail(item.detail);
25437
25461
  return item.status === "failed" ? { type: "tool_call", callId: item.callId, name: item.name, status: "failed", error: item.error ?? "Tool call failed", detail } : { type: "tool_call", callId: item.callId, name: item.name, status: item.status, error: null, detail };
25438
25462
  }
25439
25463
  }
@@ -26042,6 +26066,7 @@ function createAgents({ clientFactory, home, broadcast, directory, log: log2 = (
26042
26066
  const roots = /* @__PURE__ */ new Map();
26043
26067
  const timelines = new InMemoryAgentTimelineStore();
26044
26068
  const deltas = /* @__PURE__ */ new Map();
26069
+ const epochs = /* @__PURE__ */ new Map();
26045
26070
  const replaying = /* @__PURE__ */ new Set();
26046
26071
  const attaching = /* @__PURE__ */ new Map();
26047
26072
  const turns = /* @__PURE__ */ new Map();
@@ -26136,6 +26161,7 @@ function createAgents({ clientFactory, home, broadcast, directory, log: log2 = (
26136
26161
  }
26137
26162
  for (const id of [...roots.keys()]) if (!seen.has(id)) {
26138
26163
  roots.delete(id);
26164
+ epochs.delete(id);
26139
26165
  broadcast({ type: "agent_update", payload: { kind: "remove", agentId: id } });
26140
26166
  directory.changed();
26141
26167
  }
@@ -26235,7 +26261,9 @@ function createAgents({ clientFactory, home, broadcast, directory, log: log2 = (
26235
26261
  const { event } = envelope;
26236
26262
  switch (event.type) {
26237
26263
  case "item": {
26238
- if (envelope.epoch && timelines.has(root) && envelope.epoch !== timelines.getEpoch(root)) deltas.set(root, new TimelineDeltas());
26264
+ const seenEpoch = epochs.get(root);
26265
+ if (envelope.epoch) epochs.set(root, envelope.epoch);
26266
+ if (envelope.epoch && seenEpoch && envelope.epoch !== seenEpoch) deltas.set(root, new TimelineDeltas());
26239
26267
  let maker = deltas.get(root);
26240
26268
  if (!maker) deltas.set(root, maker = new TimelineDeltas());
26241
26269
  append(root, maker.next(event.item), envelope.ts);
@@ -26276,6 +26304,7 @@ function createAgents({ clientFactory, home, broadcast, directory, log: log2 = (
26276
26304
  pending = (async () => {
26277
26305
  timelines.initialize(root);
26278
26306
  deltas.set(root, new TimelineDeltas());
26307
+ epochs.delete(root);
26279
26308
  replaying.add(root);
26280
26309
  try {
26281
26310
  await alp.request("session.attach", { sessionId: root, replay: true });
@@ -26295,6 +26324,7 @@ function createAgents({ clientFactory, home, broadcast, directory, log: log2 = (
26295
26324
  timelines.delete(root);
26296
26325
  deltas.set(root, new TimelineDeltas());
26297
26326
  attaching.delete(root);
26327
+ epochs.delete(root);
26298
26328
  replaying.delete(root);
26299
26329
  turns.delete(root);
26300
26330
  for (const child of children.values()) {