@hyperdrive.bot/paseo-server 0.3.43 → 0.3.44

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 (18) hide show
  1. package/dist/server/server/agent/agent-manager.d.ts +6 -0
  2. package/dist/server/server/agent/agent-manager.js +7 -1
  3. package/dist/server/server/agent/import-sessions.d.ts +6 -1
  4. package/dist/server/server/agent/import-sessions.js +27 -2
  5. package/dist/server/server/agent/providers/claude/agent.d.ts +16 -0
  6. package/dist/server/server/agent/providers/claude/agent.js +21 -2
  7. package/dist/server/server/agent/providers/claude/background-work-kinds.d.ts +20 -0
  8. package/dist/server/server/agent/providers/claude/background-work-kinds.js +14 -0
  9. package/dist/server/web-ui/_expo/static/js/web/{index-2ff48a7009ad2309c577d5a43b925f69.js → index-6a99048b3a9acca9bc30efd44300414e.js} +4 -4
  10. package/dist/server/web-ui/_expo/static/js/web/index-6a99048b3a9acca9bc30efd44300414e.js.br +0 -0
  11. package/dist/server/web-ui/_expo/static/js/web/{index-2ff48a7009ad2309c577d5a43b925f69.js.gz → index-6a99048b3a9acca9bc30efd44300414e.js.gz} +0 -0
  12. package/dist/server/web-ui/_expo/static/js/web/{index-2ff48a7009ad2309c577d5a43b925f69.js.map.br → index-6a99048b3a9acca9bc30efd44300414e.js.map.br} +0 -0
  13. package/dist/server/web-ui/_expo/static/js/web/{index-2ff48a7009ad2309c577d5a43b925f69.js.map.gz → index-6a99048b3a9acca9bc30efd44300414e.js.map.gz} +0 -0
  14. package/dist/server/web-ui/index.html +1 -1
  15. package/dist/server/web-ui/index.html.br +0 -0
  16. package/dist/server/web-ui/index.html.gz +0 -0
  17. package/package.json +6 -6
  18. package/dist/server/web-ui/_expo/static/js/web/index-2ff48a7009ad2309c577d5a43b925f69.js.br +0 -0
@@ -322,6 +322,12 @@ export declare class AgentManager {
322
322
  cwd: string;
323
323
  workspaceId: string;
324
324
  labels?: Record<string, string>;
325
+ /**
326
+ * Config carried over from a previous agent record for the same provider
327
+ * session. Without it an import falls back to daemon defaults, which can
328
+ * demote a session to a smaller-context model and force a compaction.
329
+ */
330
+ config?: Partial<AgentSessionConfig>;
325
331
  }): Promise<ManagedAgent>;
326
332
  /**
327
333
  * Hot-swap a running agent's provider to a compatible alternative
@@ -614,6 +614,7 @@ export class AgentManager {
614
614
  throw new Error(`Provider '${input.provider}' does not support importing sessions`);
615
615
  }
616
616
  const { storedConfig, launchConfig } = await this.prepareSessionConfig({
617
+ ...input.config,
617
618
  provider: input.provider,
618
619
  cwd: input.cwd,
619
620
  }, resolvedAgentId);
@@ -2827,7 +2828,12 @@ export class AgentManager {
2827
2828
  const activeBackgroundTaskCount = this.getActiveBackgroundTaskCount(agent);
2828
2829
  if (activeBackgroundTaskCount > 0) {
2829
2830
  agent.suppressedAttentionCount = (agent.suppressedAttentionCount ?? 0) + 1;
2830
- this.logger.debug({
2831
+ // info, not debug: this is the ONLY production signal that the
2832
+ // suppression fired. The daemon logs at level 30 and emits zero debug
2833
+ // lines, so at debug this was unobservable — and an absent log then
2834
+ // looked identical to a working feature. Verify with:
2835
+ // journalctl -u paseo.service | grep "Suppressed finished-attention"
2836
+ this.logger.info({
2831
2837
  agentId: agent.id,
2832
2838
  activeBackgroundTaskCount,
2833
2839
  suppressedAttentionCount: agent.suppressedAttentionCount,
@@ -2,7 +2,7 @@ import type { z } from "zod";
2
2
  import type { Logger } from "pino";
3
3
  import type { ProviderSnapshotManager } from "./provider-snapshot-manager.js";
4
4
  import type { AgentManager, ManagedAgent } from "./agent-manager.js";
5
- import type { AgentStorage } from "./agent-storage.js";
5
+ import type { AgentStorage, StoredAgentRecord } from "./agent-storage.js";
6
6
  import type { AgentProvider } from "./agent-sdk-types.js";
7
7
  import type { FetchRecentProviderSessionsRequestMessage, ImportAgentRequestMessageSchema, RecentProviderSessionDescriptorPayload } from "@hyperdrive.bot/paseo-protocol/messages";
8
8
  type ImportAgentRequestMessage = z.infer<typeof ImportAgentRequestMessageSchema>;
@@ -43,5 +43,10 @@ export declare function normalizeImportAgentRequest(msg: ImportAgentRequestMessa
43
43
  };
44
44
  export declare function listImportableProviderSessions(input: ListImportableProviderSessionsInput): Promise<ListImportableProviderSessionsResult>;
45
45
  export declare function importProviderSession(input: ImportProviderSessionInput): Promise<ImportProviderSessionResult>;
46
+ export declare function inheritedImportConfig(record: StoredAgentRecord | undefined): {
47
+ model?: string;
48
+ thinkingOptionId?: string;
49
+ modeId?: string;
50
+ } | undefined;
46
51
  export {};
47
52
  //# sourceMappingURL=import-sessions.d.ts.map
@@ -72,13 +72,18 @@ export async function importProviderSession(input) {
72
72
  throw new Error("Import requires cwd from the selected provider session");
73
73
  }
74
74
  const handle = buildImportPersistenceHandle({ provider, providerHandleId, cwd });
75
- await unarchiveAgentByHandle(input.agentStorage, input.agentManager, handle);
75
+ const priorRecord = await unarchiveAgentByHandle(input.agentStorage, input.agentManager, handle);
76
+ const inheritedConfig = inheritedImportConfig(priorRecord);
77
+ if (inheritedConfig) {
78
+ input.logger?.info?.({ providerHandleId, ...inheritedConfig }, "Import inheriting config from the session's previous agent record");
79
+ }
76
80
  const snapshot = await input.agentManager.importProviderSession({
77
81
  provider,
78
82
  providerHandleId,
79
83
  cwd,
80
84
  workspaceId: input.workspaceId,
81
85
  labels,
86
+ ...(inheritedConfig ? { config: inheritedConfig } : {}),
82
87
  });
83
88
  await unarchiveAgentState(input.agentStorage, input.agentManager, snapshot.id);
84
89
  return {
@@ -92,9 +97,29 @@ async function unarchiveAgentByHandle(agentStorage, agentManager, handle) {
92
97
  (record.persistence.sessionId === handle.sessionId ||
93
98
  record.persistence.nativeHandle === handle.nativeHandle));
94
99
  if (!matched) {
95
- return;
100
+ return undefined;
96
101
  }
97
102
  await unarchiveAgentState(agentStorage, agentManager, matched.id);
103
+ return matched;
104
+ }
105
+ // An import that lands on a session paseo has seen before must not silently
106
+ // downgrade it. The prior record already carries the model, thinking option and
107
+ // permission mode the session was running under; without this the imported agent
108
+ // falls back to daemon defaults, which has demoted a 1M-context session to the
109
+ // 200k model and auto-compacted its transcript on the first prompt.
110
+ export function inheritedImportConfig(record) {
111
+ if (!record) {
112
+ return undefined;
113
+ }
114
+ const modeId = record.lastModeId ?? record.config?.modeId ?? undefined;
115
+ const inherited = {
116
+ ...(record.config?.model ? { model: record.config.model } : {}),
117
+ ...(record.config?.thinkingOptionId
118
+ ? { thinkingOptionId: record.config.thinkingOptionId }
119
+ : {}),
120
+ ...(modeId ? { modeId } : {}),
121
+ };
122
+ return Object.keys(inherited).length > 0 ? inherited : undefined;
98
123
  }
99
124
  function parseRecentProviderSessionsSince(since) {
100
125
  if (!since) {
@@ -79,6 +79,22 @@ export declare class ClaudeAgentClient implements AgentClient {
79
79
  }>;
80
80
  private assertConfig;
81
81
  }
82
+ /**
83
+ * Tool names whose tool_result can ANNOUNCE background work that outlives the turn.
84
+ *
85
+ * This gate is the reason the tracker sees anything at all. It was previously
86
+ * `toolName !== "Bash"`, which made the monitor and cron start-patterns in
87
+ * `background-task-tracker.ts` unreachable: a `Monitor` tool_result returned
88
+ * here before `noteToolResultText` was ever called, so a monitor-only session
89
+ * reported zero background tasks, bucketed as "done", and kept lighting the
90
+ * unread chip on every tick.
91
+ *
92
+ * ⚠️ The parser having a pattern is NOT enough — the tool name must be in this
93
+ * set too. Any new kind of background work needs BOTH, and an integration test
94
+ * that drives `handleToolResult` (not the parser directly), or the same hole
95
+ * reopens silently. See `background-work-kinds.ts`.
96
+ */
97
+ export declare const BACKGROUND_WORK_TOOL_NAMES: Set<string>;
82
98
  export declare class ClaudeAgentSession implements AgentSession {
83
99
  readonly provider: "claude";
84
100
  readonly capabilities: AgentCapabilityFlags;
@@ -1514,6 +1514,22 @@ class ClaudeContextUsageState {
1514
1514
  };
1515
1515
  }
1516
1516
  }
1517
+ /**
1518
+ * Tool names whose tool_result can ANNOUNCE background work that outlives the turn.
1519
+ *
1520
+ * This gate is the reason the tracker sees anything at all. It was previously
1521
+ * `toolName !== "Bash"`, which made the monitor and cron start-patterns in
1522
+ * `background-task-tracker.ts` unreachable: a `Monitor` tool_result returned
1523
+ * here before `noteToolResultText` was ever called, so a monitor-only session
1524
+ * reported zero background tasks, bucketed as "done", and kept lighting the
1525
+ * unread chip on every tick.
1526
+ *
1527
+ * ⚠️ The parser having a pattern is NOT enough — the tool name must be in this
1528
+ * set too. Any new kind of background work needs BOTH, and an integration test
1529
+ * that drives `handleToolResult` (not the parser directly), or the same hole
1530
+ * reopens silently. See `background-work-kinds.ts`.
1531
+ */
1532
+ export const BACKGROUND_WORK_TOOL_NAMES = new Set(["Bash", "Monitor", "CronCreate", "CronDelete"]);
1517
1533
  export class ClaudeAgentSession {
1518
1534
  /**
1519
1535
  * Register a hook event handler for an agent. Stub in Epic 1 — Epic 3 wires
@@ -4122,7 +4138,7 @@ export class ClaudeAgentSession {
4122
4138
  * Both go into the record so the UI can show what is actually running.
4123
4139
  */
4124
4140
  trackBackgroundShellStart(block, toolName, entry) {
4125
- if (toolName !== "Bash" || block.is_error) {
4141
+ if (!BACKGROUND_WORK_TOOL_NAMES.has(toolName) || block.is_error) {
4126
4142
  return;
4127
4143
  }
4128
4144
  const resultText = typeof block.content === "string" ? block.content : JSON.stringify(block.content ?? "");
@@ -4136,7 +4152,10 @@ export class ClaudeAgentSession {
4136
4152
  startedAt: resolveBackgroundShellStartedAt(extractBackgroundOutputFile(resultText)),
4137
4153
  });
4138
4154
  if (started.length > 0) {
4139
- this.logger.debug({ taskIds: started, command }, "Tracking Claude background shell(s)");
4155
+ // info, not debug: the daemon runs at level 30 and emits no debug lines,
4156
+ // so a debug log here is unobservable in production — which is exactly
4157
+ // how a silently-unreachable tracker went unnoticed.
4158
+ this.logger.info({ taskIds: started, toolName, command }, "Tracking background work");
4140
4159
  }
4141
4160
  }
4142
4161
  /**
@@ -21,6 +21,17 @@
21
21
  * fails. Add an entry claiming `tracked: true` without a start pattern that
22
22
  * actually extracts its id and `background-work-kinds.test.ts` fails.
23
23
  *
24
+ * ⚠️ A PATTERN IS NOT ENOUGH — THE TOOL NAME MUST BE GATED IN TOO
25
+ *
26
+ * `trackBackgroundShellStart` in `providers/claude/agent.ts` only forwards a
27
+ * tool_result to the parser when its tool name is in `BACKGROUND_WORK_TOOL_NAMES`.
28
+ * The first version of this file shipped monitor and cron patterns while that
29
+ * gate still read `toolName !== "Bash"`, so both were dead code in production
30
+ * and every test passed because the tests called the parser directly. A kind is
31
+ * only really tracked when it has: a start pattern, a retirement path, an entry
32
+ * here, AND its tool name in that set — proven by an integration test that goes
33
+ * through `handleToolResult`.
34
+ *
24
35
  * SAMPLES ARE CAPTURES, NOT TRANSCRIPTIONS
25
36
  *
26
37
  * Every `sample` below was pasted verbatim out of a live session's tool_result
@@ -43,6 +54,12 @@ interface TrackedKind {
43
54
  retiredBy: string;
44
55
  /** Which module owns the tracking. */
45
56
  trackedBy: string;
57
+ /**
58
+ * The tool name this kind's result arrives under. MUST be present in
59
+ * `BACKGROUND_WORK_TOOL_NAMES` (providers/claude/agent.ts) or the parser is
60
+ * never reached, however correct its pattern is.
61
+ */
62
+ toolName: string;
46
63
  }
47
64
  interface SilencedKind {
48
65
  tracked: false;
@@ -63,6 +80,7 @@ export declare const BACKGROUND_WORK_KINDS: {
63
80
  readonly expectedId: "beuhoixae";
64
81
  readonly retiredBy: "<task-notification> with a terminal <status>";
65
82
  readonly trackedBy: "ClaudeBackgroundTaskTracker.noteToolResultText";
83
+ readonly toolName: "Bash";
66
84
  };
67
85
  readonly monitor: {
68
86
  readonly tracked: true;
@@ -71,6 +89,7 @@ export declare const BACKGROUND_WORK_KINDS: {
71
89
  readonly expectedId: "b6dxcqe9y";
72
90
  readonly retiredBy: "<task-notification> with a terminal <status>";
73
91
  readonly trackedBy: "ClaudeBackgroundTaskTracker.noteToolResultText";
92
+ readonly toolName: "Monitor";
74
93
  };
75
94
  readonly cron: {
76
95
  readonly tracked: true;
@@ -79,6 +98,7 @@ export declare const BACKGROUND_WORK_KINDS: {
79
98
  readonly expectedId: "b8df03d3";
80
99
  readonly retiredBy: "\"Cancelled job <id>.\" in a later tool_result";
81
100
  readonly trackedBy: "ClaudeBackgroundTaskTracker.noteToolResultText";
101
+ readonly toolName: "CronCreate";
82
102
  };
83
103
  readonly scheduled_wakeup: {
84
104
  readonly tracked: false;
@@ -21,6 +21,17 @@
21
21
  * fails. Add an entry claiming `tracked: true` without a start pattern that
22
22
  * actually extracts its id and `background-work-kinds.test.ts` fails.
23
23
  *
24
+ * ⚠️ A PATTERN IS NOT ENOUGH — THE TOOL NAME MUST BE GATED IN TOO
25
+ *
26
+ * `trackBackgroundShellStart` in `providers/claude/agent.ts` only forwards a
27
+ * tool_result to the parser when its tool name is in `BACKGROUND_WORK_TOOL_NAMES`.
28
+ * The first version of this file shipped monitor and cron patterns while that
29
+ * gate still read `toolName !== "Bash"`, so both were dead code in production
30
+ * and every test passed because the tests called the parser directly. A kind is
31
+ * only really tracked when it has: a start pattern, a retirement path, an entry
32
+ * here, AND its tool name in that set — proven by an integration test that goes
33
+ * through `handleToolResult`.
34
+ *
24
35
  * SAMPLES ARE CAPTURES, NOT TRANSCRIPTIONS
25
36
  *
26
37
  * Every `sample` below was pasted verbatim out of a live session's tool_result
@@ -37,6 +48,7 @@ export const BACKGROUND_WORK_KINDS = {
37
48
  expectedId: "beuhoixae",
38
49
  retiredBy: "<task-notification> with a terminal <status>",
39
50
  trackedBy: "ClaudeBackgroundTaskTracker.noteToolResultText",
51
+ toolName: "Bash",
40
52
  },
41
53
  monitor: {
42
54
  tracked: true,
@@ -48,6 +60,7 @@ export const BACKGROUND_WORK_KINDS = {
48
60
  // Only its START was ever invisible.
49
61
  retiredBy: "<task-notification> with a terminal <status>",
50
62
  trackedBy: "ClaudeBackgroundTaskTracker.noteToolResultText",
63
+ toolName: "Monitor",
51
64
  },
52
65
  cron: {
53
66
  tracked: true,
@@ -58,6 +71,7 @@ export const BACKGROUND_WORK_KINDS = {
58
71
  // tool_result is its only retirement signal — note the glued-on period.
59
72
  retiredBy: '"Cancelled job <id>." in a later tool_result',
60
73
  trackedBy: "ClaudeBackgroundTaskTracker.noteToolResultText",
74
+ toolName: "CronCreate",
61
75
  },
62
76
  scheduled_wakeup: {
63
77
  tracked: false,
@@ -1103,7 +1103,7 @@ __d(function(g,r,_i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?
1103
1103
  __d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return N}}),Object.defineProperty(_e,"AppOwnership",{enumerable:!0,get:function(){return l.AppOwnership}}),Object.defineProperty(_e,"ExecutionEnvironment",{enumerable:!0,get:function(){return l.ExecutionEnvironment}}),Object.defineProperty(_e,"UserInterfaceIdiom",{enumerable:!0,get:function(){return l.UserInterfaceIdiom}});var n=e(r(d[0])),t=r(d[1]);r(d[2]);var u=e(r(d[3])),l=r(d[4]),o=e(r(d[5]));o.default||console.warn("No native ExponentConstants module found, are you sure the expo-constants's module is linked properly?");const s=(0,t.requireOptionalNativeModule)('ExpoUpdates');let f=null;if(s){let e;s.manifest?e=s.manifest:s.manifestString&&(e=JSON.parse(s.manifestString)),e&&Object.keys(e).length>0&&(f=e)}let c=null;if(u.default.EXDevLauncher){let e;u.default.EXDevLauncher.manifestString&&(e=JSON.parse(u.default.EXDevLauncher.manifestString)),e&&Object.keys(e).length>0&&(c=e)}let p=null;if(o.default&&o.default.manifest){const e=o.default.manifest;p='string'==typeof e?JSON.parse(e):e}let b=f??c??p;const E=o.default||{},{appOwnership:O}=E,x=(0,n.default)(E,["name","appOwnership"]),v=Object.assign({},x,{appOwnership:O??null});function _(e){return!h(e)}function h(e){return'metadata'in e}function S(e=!1){if(!b){const e=null===b?'null':'undefined';if(x.executionEnvironment,l.ExecutionEnvironment.Bare,x.executionEnvironment===l.ExecutionEnvironment.StoreClient||x.executionEnvironment===l.ExecutionEnvironment.Standalone)throw new t.CodedError('ERR_CONSTANTS_MANIFEST_UNAVAILABLE',`Constants.manifest is ${e}, must be an object.`)}return b}Object.defineProperties(v,{__unsafeNoWarnManifest:{get(){const e=S(!0);return e&&_(e)?e:null},enumerable:!1},__unsafeNoWarnManifest2:{get(){const e=S(!0);return e&&h(e)?e:null},enumerable:!1},manifest:{get(){const e=S();return e&&_(e)?e:null},enumerable:!0},manifest2:{get(){const e=S();return e&&h(e)?e:null},enumerable:!0},expoConfig:{get(){const e=S(!0);return e?s&&s.isEmbeddedLaunch?p:h(e)?e.extra?.expoClient??null:_(e)?e:null:null},enumerable:!0},expoGoConfig:{get(){const e=S(!0);return e?h(e)?e.extra?.expoGo??null:_(e)?e:null:null},enumerable:!0},easConfig:{get(){const e=S(!0);return e?h(e)?e.extra?.eas??null:_(e)?e:null:null},enumerable:!0},__rawManifest_TEST:{get:()=>b,set(e){b=e},enumerable:!1}});var N=v},1006,[35,4,25,1007,1008,1009]);
1104
1104
  __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return u}});var e,t=r(d[0]),u={UIManager:((e=t)&&e.__esModule?e:{default:e}).default}},1007,[159]);
1105
1105
  __d(function(g,r,i,a,m,e,d){"use strict";var t,n,o;Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"AppOwnership",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"ExecutionEnvironment",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"UserInterfaceIdiom",{enumerable:!0,get:function(){return o}}),(function(t){t.Expo="expo"})(t||(t={})),(function(t){t.Bare="bare",t.Standalone="standalone",t.StoreClient="storeClient"})(n||(n={})),(function(t){t.Handset="handset",t.Tablet="tablet",t.Desktop="desktop",t.TV="tv",t.Unsupported="unsupported"})(o||(o={}))},1008,[]);
1106
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);const n=(Date.now()+'-'+Math.floor(1e9*Math.random())).toString();function o(){if('undefined'!=typeof navigator&&'string'==typeof navigator.userAgent){const t=navigator.userAgent.toLowerCase();if(t.includes('edge'))return'Edge';if(t.includes('edg'))return'Chromium Edge';if(t.includes('opr')&&'opr'in window&&window.opr)return'Opera';if(t.includes('chrome')&&'chrome'in window&&window.chrome)return'Chrome';if(t.includes('trident'))return'IE';if(t.includes('firefox'))return'Firefox';if(t.includes('safari'))return'Safari'}}var s={get appOwnership(){return null},get executionEnvironment(){return t.ExecutionEnvironment.Bare},get sessionId(){return n},get isHeadless(){return'undefined'==typeof navigator||/\bHeadlessChrome\//.test(navigator.userAgent)},get expoVersion(){return this.manifest.sdkVersion||null},get linkingUri(){return'undefined'!=typeof location?location.origin:''},get expoRuntimeVersion(){return this.expoVersion},get deviceName(){return o()},get systemFonts(){return[]},get statusBarHeight(){return 0},get deviceYearClass(){return null},get manifest(){return"{\"name\":\"Paseo\",\"slug\":\"paseo-hyperdrive\",\"version\":\"0.3.43\",\"orientation\":\"portrait\",\"icon\":\"./assets/images/icon.png\",\"scheme\":\"paseo\",\"userInterfaceStyle\":\"automatic\",\"newArchEnabled\":true,\"web\":{\"output\":\"single\",\"favicon\":\"./assets/images/favicon.png\",\"shortName\":\"Paseo\",\"orientation\":\"portrait\",\"name\":\"Paseo\"},\"autolinking\":{\"searchPaths\":[\"../../node_modules\",\"./node_modules\"]},\"experiments\":{\"typedRoutes\":true,\"reactCompiler\":true,\"autolinkingModuleResolution\":true},\"extra\":{\"router\":{},\"eas\":{\"build\":{\"experimental\":{\"ios\":{\"appExtensions\":[{\"bundleIdentifier\":\"bot.hyperdrive.paseo.AgentActivity\",\"targetName\":\"AgentActivity\"}]}}}}},\"sdkVersion\":\"54.0.0\",\"platforms\":[\"ios\",\"android\",\"web\"]}"},get manifest2(){return null},get experienceUrl(){return'undefined'!=typeof location?location.origin:''},get debugMode(){return!1},getWebViewUserAgentAsync:async()=>'undefined'!=typeof navigator?navigator.userAgent:null}},1009,[1008]);
1106
+ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);const n=(Date.now()+'-'+Math.floor(1e9*Math.random())).toString();function o(){if('undefined'!=typeof navigator&&'string'==typeof navigator.userAgent){const t=navigator.userAgent.toLowerCase();if(t.includes('edge'))return'Edge';if(t.includes('edg'))return'Chromium Edge';if(t.includes('opr')&&'opr'in window&&window.opr)return'Opera';if(t.includes('chrome')&&'chrome'in window&&window.chrome)return'Chrome';if(t.includes('trident'))return'IE';if(t.includes('firefox'))return'Firefox';if(t.includes('safari'))return'Safari'}}var s={get appOwnership(){return null},get executionEnvironment(){return t.ExecutionEnvironment.Bare},get sessionId(){return n},get isHeadless(){return'undefined'==typeof navigator||/\bHeadlessChrome\//.test(navigator.userAgent)},get expoVersion(){return this.manifest.sdkVersion||null},get linkingUri(){return'undefined'!=typeof location?location.origin:''},get expoRuntimeVersion(){return this.expoVersion},get deviceName(){return o()},get systemFonts(){return[]},get statusBarHeight(){return 0},get deviceYearClass(){return null},get manifest(){return"{\"name\":\"Paseo\",\"slug\":\"paseo-hyperdrive\",\"version\":\"0.3.44\",\"orientation\":\"portrait\",\"icon\":\"./assets/images/icon.png\",\"scheme\":\"paseo\",\"userInterfaceStyle\":\"automatic\",\"newArchEnabled\":true,\"web\":{\"output\":\"single\",\"favicon\":\"./assets/images/favicon.png\",\"shortName\":\"Paseo\",\"orientation\":\"portrait\",\"name\":\"Paseo\"},\"autolinking\":{\"searchPaths\":[\"../../node_modules\",\"./node_modules\"]},\"experiments\":{\"typedRoutes\":true,\"reactCompiler\":true,\"autolinkingModuleResolution\":true},\"extra\":{\"router\":{},\"eas\":{\"build\":{\"experimental\":{\"ios\":{\"appExtensions\":[{\"bundleIdentifier\":\"bot.hyperdrive.paseo.AgentActivity\",\"targetName\":\"AgentActivity\"}]}}}}},\"sdkVersion\":\"54.0.0\",\"platforms\":[\"ios\",\"android\",\"web\"]}"},get manifest2(){return null},get experienceUrl(){return'undefined'!=typeof location?location.origin:''},get debugMode(){return!1},getWebViewUserAgentAsync:async()=>'undefined'!=typeof navigator?navigator.userAgent:null}},1009,[1008]);
1107
1107
  __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return u}});var e,t=r(d[0]),n=r(d[1]),o=(e=n)&&e.__esModule?e:{default:e};async function u(){if(!o.default.unregisterForNotificationsAsync)throw new t.UnavailabilityError('ExpoNotifications','unregisterForNotificationsAsync');return o.default.unregisterForNotificationsAsync()}},1010,[4,1011]);
1108
1108
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return n}}),r(d[0]);let t=!1;var n={addListener:()=>(t||(console.warn("[expo-notifications] Listening to push token changes is not yet fully supported on web. Adding a listener will have no effect."),t=!0),{remove:()=>{}}),removeListener:()=>{},removeAllListeners:()=>{},emit:()=>{},listenerCount:()=>0}},1011,[4]);
1109
1109
  __d(function(g,r,i,a,m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return u}});var t=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),t.default=e,t})(r(_d[0])),o=e(r(_d[1])),n=r(_d[2]),c=r(_d[3]),s=e(r(_d[4])),d=e(r(_d[5]));const p='https://exp.host/--/api/v2/';async function u(e={}){const s=e.devicePushToken||await(0,d.default)(),u=e.deviceId||await h(),R=e.projectId||o.default.easConfig?.projectId||o.default.expoConfig?.extra?.eas?.projectId;if(!R)throw new n.CodedError('ERR_NOTIFICATIONS_NO_EXPERIENCE_ID',"No \"projectId\" found. If \"projectId\" can't be inferred from the manifest (for instance, in bare workflow), you have to pass it in yourself.");const w=e.applicationId||t.applicationId;if(!w)throw new n.CodedError('ERR_NOTIFICATIONS_NO_APPLICATION_ID',"No \"applicationId\" found. If it can't be inferred from native configuration by expo-application, you have to pass it in yourself.");const O=e.type||y(s),_=e.development||await I(),v=e.baseUrl??p,N=e.url??`${v}push/getExpoPushToken`,x={type:O,deviceId:u.toLowerCase(),development:_,appId:w,deviceToken:E(s),projectId:R},T=await fetch(N,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(x)}).catch(e=>{throw new n.CodedError('ERR_NOTIFICATIONS_NETWORK_ERROR',`Error encountered while fetching Expo token: ${e}.`)});if(!T.ok){const e=T.statusText||T.status;let t;try{t=await T.text()}catch{}throw new n.CodedError('ERR_NOTIFICATIONS_SERVER_ERROR',`Error encountered while fetching Expo token, expected an OK response, received: ${e} (body: "${t}").`)}const b=l(await f(T));try{e.url||e.baseUrl?console.debug("[expo-notifications] Since the URL endpoint to register in has been customized in the options, expo-notifications won't try to auto-update the device push token on the server."):await(0,c.setAutoServerRegistrationEnabledAsync)(!0)}catch(e){console.warn('[expo-notifications] Could not enable automatically registering new device tokens with the Expo notification service',e)}return{type:'expo',data:b}}async function f(e){try{return await e.json()}catch{try{throw new n.CodedError('ERR_NOTIFICATIONS_SERVER_ERROR',`Expected a JSON response from server when fetching Expo token, received body: ${JSON.stringify(await e.text())}.`)}catch{throw new n.CodedError('ERR_NOTIFICATIONS_SERVER_ERROR',`Expected a JSON response from server when fetching Expo token, received response: ${JSON.stringify(e)}.`)}}}function l(e){if(!e||'object'!=typeof e||!e.data||'object'!=typeof e.data||!e.data.expoPushToken||'string'!=typeof e.data.expoPushToken)throw new n.CodedError('ERR_NOTIFICATIONS_SERVER_ERROR',`Malformed response from server, expected "{ data: { expoPushToken: string } }", received: ${JSON.stringify(e,null,2)}.`);return e.data.expoPushToken}async function h(){try{if(!s.default.getInstallationIdAsync)throw new n.UnavailabilityError('ExpoServerRegistrationModule','getInstallationIdAsync');return await s.default.getInstallationIdAsync()}catch(e){throw new n.CodedError('ERR_NOTIF_DEVICE_ID',`Could not have fetched installation ID of the application: ${e}.`)}}function E(e){return'string'==typeof e.data?e.data:JSON.stringify(e.data)}async function I(){return!1}function y(e){switch(e.type){case'ios':return'apns';case'android':return'fcm';default:return e.type}}},1012,[1013,1006,4,1016,1020,1005]);
@@ -15048,7 +15048,7 @@ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{v
15048
15048
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"decodeOfferFragmentPayload",{enumerable:!0,get:function(){return n.decodeOfferFragmentPayload}}),Object.defineProperty(e,"buildDaemonWebSocketUrl",{enumerable:!0,get:function(){return t.buildDaemonWebSocketUrl}}),Object.defineProperty(e,"deriveLabelFromEndpoint",{enumerable:!0,get:function(){return t.deriveLabelFromEndpoint}}),Object.defineProperty(e,"extractHostPortFromWebSocketUrl",{enumerable:!0,get:function(){return t.extractHostPortFromWebSocketUrl}}),Object.defineProperty(e,"normalizeHostPort",{enumerable:!0,get:function(){return t.normalizeHostPort}}),Object.defineProperty(e,"parseConnectionUri",{enumerable:!0,get:function(){return t.parseConnectionUri}}),Object.defineProperty(e,"parseHostPort",{enumerable:!0,get:function(){return t.parseHostPort}}),Object.defineProperty(e,"serializeConnectionUri",{enumerable:!0,get:function(){return t.serializeConnectionUri}}),Object.defineProperty(e,"serializeConnectionUriForStorage",{enumerable:!0,get:function(){return t.serializeConnectionUriForStorage}}),Object.defineProperty(e,"shouldUseTlsForDefaultHostedRelay",{enumerable:!0,get:function(){return t.shouldUseTlsForDefaultHostedRelay}}),e.buildRelayWebSocketUrl=function(n){return(0,t.buildRelayWebSocketUrl)(Object.assign({},n,{role:"client"}))};var t=r(d[0]),n=r(d[1])},3403,[3383,3404]);
15049
15049
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"ConnectionOfferV2Schema",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"ConnectionOfferSchema",{enumerable:!0,get:function(){return o}}),e.decodeOfferFragmentPayload=l,e.parseConnectionOfferFromUrl=function(n){const t=f(n);if(!t)return null;const c=l(t);return o.parse(c)};var n=r(d[0]);const t=n.z.object({v:n.z.literal(2),serverId:n.z.string().min(1),daemonPublicKeyB64:n.z.string().min(1),relay:n.z.object({endpoint:n.z.string().min(1),useTls:n.z.boolean().optional()})}),o=t;function c(n){const t=n.replace(/-/g,"+").replace(/_/g,"/"),o=t.padEnd(t.length+(4-t.length%4)%4,"="),c=globalThis.atob(o),l=Uint8Array.from(c,n=>n.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(l)}function l(n){const t=c(n);return JSON.parse(t)}const u="#offer=";function f(n){const t=n.trim();if(!t)return null;const o=t.indexOf(u);if(-1===o)return null;const c=t.slice(o+u.length).trim();return c.length>0?c:null}},3404,[3282]);
15050
15050
  __d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.resolveAppVersion=function(){const e=u(t.default?.version);if(e)return e;const o=u(n.default.expoConfig?.version);if(o)return o;const f=u(n.default.manifest?.version);if(f)return f;return null};var n=e(r(d[0])),t=e(r(d[1]));function u(e){if("string"!=typeof e)return null;const n=e.trim();return 0===n.length?null:n}},3405,[1006,3406]);
15051
- __d(function(e,t,r,a,o,i,n){o.exports={name:"@hyperdrive.bot/paseo-app",version:"0.3.43",private:!0,main:"index.ts",scripts:{start:"npm run start:expo","start:expo":"cross-env APP_VARIANT=development expo start","reset-project":"node ./scripts/reset-project.js","build:terminal-webview":"node ./scripts/build-terminal-webview-html.mjs","eas-build-post-install":"npm --prefix ../.. run build:app-deps && npm run build:terminal-webview",android:"npm run android:development","android:development":"npm --prefix ../.. run build:client && cross-env APP_VARIANT=development expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=development expo run:android --variant=debug","android:production":"npm --prefix ../.. run build:client && cross-env APP_VARIANT=production expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=production expo run:android --variant=release","android:release":"npm run android:production","android:clear":"node -e \"require('node:fs').rmSync('android', { recursive: true, force: true })\"",ios:"npm --prefix ../.. run build:client && expo run:ios","ios:release":"npm --prefix ../.. run build:client && expo run:ios --configuration Release",web:"npm --prefix ../.. run build:client && concurrently --kill-others --names protocol,client,expo --prefix-colors yellow,blue,magenta \"npm --prefix ../.. run watch:protocol\" \"npm --prefix ../.. run watch:client\" \"npm run web:expo\"","web:expo":"expo start --web",lint:"expo lint",typecheck:"tsgo --noEmit",test:"vitest run","test:browser":"vitest run --project browser","test:e2e":"playwright test --project='Desktop Chrome'","test:e2e:real":"cross-env E2E_FORK_PASEO_HOME_FROM=../../.dev/paseo-home playwright test --project=real-provider","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --project unit --coverage",build:"npm run build:web","build:web":"npm --prefix ../.. run build:app-deps && expo export --platform web --source-maps","profile:workspace-tabs":"node ./scripts/profile-workspace-tabs.mjs","deploy:web":"npm run build:web && wrangler pages deploy dist --project-name paseo-app --branch main"},dependencies:{"@bacons/apple-targets":"4.0.6","@datadog/browser-rum":"^6.23.0","@datadog/browser-rum-react":"^6.23.0","@datadog/mobile-react-native":"^2.7.0","@datadog/mobile-react-native-session-replay":"^2.14.8","@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@expo/image-utils":"0.8.8","@expo/plist":"0.4.9","@expo/prebuild-config":"54.0.8","@floating-ui/react-native":"^0.10.7","@gorhom/bottom-sheet":"^5.2.14","@gorhom/portal":"^1.0.14","@hyperdrive.bot/paseo-client":"*","@hyperdrive.bot/paseo-expo-two-way-audio":"*","@hyperdrive.bot/paseo-extension-sdk":"*","@hyperdrive.bot/paseo-highlight":"*","@react-native-async-storage/async-storage":"2.2.0","@react-native-masked-view/masked-view":"^0.3.2","@react-native/normalize-colors":"^0.81.5","@react-navigation/native":"^7.1.8","@sentry/electron":"^6.11.0","@sentry/react-native":"^6.20.0","@tanstack/react-query":"^5.90.11","@tanstack/react-virtual":"^3.13.21","@xterm/addon-clipboard":"^0.3.0-beta.213","@xterm/addon-fit":"^0.12.0-beta.213","@xterm/addon-image":"^0.10.0-beta.213","@xterm/addon-ligatures":"0.11.0-beta.213","@xterm/addon-search":"^0.17.0-beta.213","@xterm/addon-unicode11":"^0.10.0-beta.213","@xterm/addon-web-links":"^0.13.0-beta.213","@xterm/addon-webgl":"^0.20.0-beta.212","@xterm/xterm":"^6.1.0-beta.213",buffer:"^6.0.3",expo:"^54.0.18","expo-asset":"~12.0.12","expo-audio":"~1.0.13","expo-background-fetch":"~14.0.9","expo-build-properties":"^1.0.9","expo-camera":"~17.0.10","expo-clipboard":"~8.0.7","expo-constants":"~18.0.9","expo-crypto":"^15.0.8","expo-dev-client":"^6.0.15","expo-document-picker":"~14.0.8","expo-file-system":"~19.0.17","expo-haptics":"~15.0.7","expo-image":"~3.0.10","expo-image-manipulator":"~14.0.8","expo-image-picker":"^17.0.8","expo-keep-awake":"^15.0.7","expo-linking":"~8.0.8","expo-localization":"~17.0.9","expo-notifications":"^0.32.16","expo-router":"~6.0.13","expo-sharing":"^14.0.8","expo-speech":"~14.0.8","expo-speech-recognition":"^56.0.1","expo-splash-screen":"~31.0.10","expo-system-ui":"~6.0.7","expo-task-manager":"~14.0.9","fast-deep-equal":"^3.1.3",htmlparser2:"^12.0.0",i18next:"^26.3.0","lucide-react-native":"^0.546.0","markdown-it":"^10.0.0","mnemonic-id":"^3.2.7",qrcode:"^1.5.4",react:"19.1.0","react-dom":"19.1.0","react-i18next":"^17.0.8","react-native":"0.81.5","react-native-draggable-flatlist":"^4.0.3","react-native-edge-to-edge":"^1.7.0","react-native-gesture-handler":"~2.28.0","react-native-keyboard-controller":"^1.21.7","react-native-markdown-display":"^7.0.2","react-native-nitro-modules":"0.35.5","react-native-reanimated":"~4.3.1","react-native-safe-area-context":"~5.6.0","react-native-screens":"~4.16.0","react-native-svg":"^15.14.0","react-native-uitextview":"^2.2.0","react-native-unistyles":"^3.2.4","react-native-web":"~0.21.0","react-native-webview":"^13.16.0","react-native-worklets":"~0.8.3","tiny-invariant":"^1.3.3","use-sync-external-store":"^1.6.0",zod:"^4.4.3",zustand:"^5.0.9"},devDependencies:{"@playwright/test":"^1.56.1","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","@types/chai":"^5.2.2","@types/markdown-it":"^14.1.2","@types/qrcode":"^1.5.6","@types/react":"~19.2.0","@types/ws":"^8.18.1","@vitest/browser":"^4.1.7","@vitest/browser-playwright":"^4.1.7","@vitest/coverage-v8":"^4.1.7","@xterm/headless":"^6.1.0-beta.213",dotenv:"^17.2.3",eslint:"^9.25.0","eslint-config-expo":"~10.0.0",jsdom:"^20.0.3","material-icon-theme":"^5.32.0",playwright:"^1.56.1","serve-sim":"^0.1.40",typescript:"~5.9.2",vitest:"^4.1.6",wrangler:"^4.105.0",ws:"^8.20.0"}}},3406,[]);
15051
+ __d(function(e,t,r,a,o,i,n){o.exports={name:"@hyperdrive.bot/paseo-app",version:"0.3.44",private:!0,main:"index.ts",scripts:{start:"npm run start:expo","start:expo":"cross-env APP_VARIANT=development expo start","reset-project":"node ./scripts/reset-project.js","build:terminal-webview":"node ./scripts/build-terminal-webview-html.mjs","eas-build-post-install":"npm --prefix ../.. run build:app-deps && npm run build:terminal-webview",android:"npm run android:development","android:development":"npm --prefix ../.. run build:client && cross-env APP_VARIANT=development expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=development expo run:android --variant=debug","android:production":"npm --prefix ../.. run build:client && cross-env APP_VARIANT=production expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=production expo run:android --variant=release","android:release":"npm run android:production","android:clear":"node -e \"require('node:fs').rmSync('android', { recursive: true, force: true })\"",ios:"npm --prefix ../.. run build:client && expo run:ios","ios:release":"npm --prefix ../.. run build:client && expo run:ios --configuration Release",web:"npm --prefix ../.. run build:client && concurrently --kill-others --names protocol,client,expo --prefix-colors yellow,blue,magenta \"npm --prefix ../.. run watch:protocol\" \"npm --prefix ../.. run watch:client\" \"npm run web:expo\"","web:expo":"expo start --web",lint:"expo lint",typecheck:"tsgo --noEmit",test:"vitest run","test:browser":"vitest run --project browser","test:e2e":"playwright test --project='Desktop Chrome'","test:e2e:real":"cross-env E2E_FORK_PASEO_HOME_FROM=../../.dev/paseo-home playwright test --project=real-provider","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --project unit --coverage",build:"npm run build:web","build:web":"npm --prefix ../.. run build:app-deps && expo export --platform web --source-maps","profile:workspace-tabs":"node ./scripts/profile-workspace-tabs.mjs","deploy:web":"npm run build:web && wrangler pages deploy dist --project-name paseo-app --branch main"},dependencies:{"@bacons/apple-targets":"4.0.6","@datadog/browser-rum":"^6.23.0","@datadog/browser-rum-react":"^6.23.0","@datadog/mobile-react-native":"^2.7.0","@datadog/mobile-react-native-session-replay":"^2.14.8","@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@expo/image-utils":"0.8.8","@expo/plist":"0.4.9","@expo/prebuild-config":"54.0.8","@floating-ui/react-native":"^0.10.7","@gorhom/bottom-sheet":"^5.2.14","@gorhom/portal":"^1.0.14","@hyperdrive.bot/paseo-client":"*","@hyperdrive.bot/paseo-expo-two-way-audio":"*","@hyperdrive.bot/paseo-extension-sdk":"*","@hyperdrive.bot/paseo-highlight":"*","@react-native-async-storage/async-storage":"2.2.0","@react-native-masked-view/masked-view":"^0.3.2","@react-native/normalize-colors":"^0.81.5","@react-navigation/native":"^7.1.8","@sentry/electron":"^6.11.0","@sentry/react-native":"^6.20.0","@tanstack/react-query":"^5.90.11","@tanstack/react-virtual":"^3.13.21","@xterm/addon-clipboard":"^0.3.0-beta.213","@xterm/addon-fit":"^0.12.0-beta.213","@xterm/addon-image":"^0.10.0-beta.213","@xterm/addon-ligatures":"0.11.0-beta.213","@xterm/addon-search":"^0.17.0-beta.213","@xterm/addon-unicode11":"^0.10.0-beta.213","@xterm/addon-web-links":"^0.13.0-beta.213","@xterm/addon-webgl":"^0.20.0-beta.212","@xterm/xterm":"^6.1.0-beta.213",buffer:"^6.0.3",expo:"^54.0.18","expo-asset":"~12.0.12","expo-audio":"~1.0.13","expo-background-fetch":"~14.0.9","expo-build-properties":"^1.0.9","expo-camera":"~17.0.10","expo-clipboard":"~8.0.7","expo-constants":"~18.0.9","expo-crypto":"^15.0.8","expo-dev-client":"^6.0.15","expo-document-picker":"~14.0.8","expo-file-system":"~19.0.17","expo-haptics":"~15.0.7","expo-image":"~3.0.10","expo-image-manipulator":"~14.0.8","expo-image-picker":"^17.0.8","expo-keep-awake":"^15.0.7","expo-linking":"~8.0.8","expo-localization":"~17.0.9","expo-notifications":"^0.32.16","expo-router":"~6.0.13","expo-sharing":"^14.0.8","expo-speech":"~14.0.8","expo-speech-recognition":"^56.0.1","expo-splash-screen":"~31.0.10","expo-system-ui":"~6.0.7","expo-task-manager":"~14.0.9","fast-deep-equal":"^3.1.3",htmlparser2:"^12.0.0",i18next:"^26.3.0","lucide-react-native":"^0.546.0","markdown-it":"^10.0.0","mnemonic-id":"^3.2.7",qrcode:"^1.5.4",react:"19.1.0","react-dom":"19.1.0","react-i18next":"^17.0.8","react-native":"0.81.5","react-native-draggable-flatlist":"^4.0.3","react-native-edge-to-edge":"^1.7.0","react-native-gesture-handler":"~2.28.0","react-native-keyboard-controller":"^1.21.7","react-native-markdown-display":"^7.0.2","react-native-nitro-modules":"0.35.5","react-native-reanimated":"~4.3.1","react-native-safe-area-context":"~5.6.0","react-native-screens":"~4.16.0","react-native-svg":"^15.14.0","react-native-uitextview":"^2.2.0","react-native-unistyles":"^3.2.4","react-native-web":"~0.21.0","react-native-webview":"^13.16.0","react-native-worklets":"~0.8.3","tiny-invariant":"^1.3.3","use-sync-external-store":"^1.6.0",zod:"^4.4.3",zustand:"^5.0.9"},devDependencies:{"@playwright/test":"^1.56.1","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","@types/chai":"^5.2.2","@types/markdown-it":"^14.1.2","@types/qrcode":"^1.5.6","@types/react":"~19.2.0","@types/ws":"^8.18.1","@vitest/browser":"^4.1.7","@vitest/browser-playwright":"^4.1.7","@vitest/coverage-v8":"^4.1.7","@xterm/headless":"^6.1.0-beta.213",dotenv:"^17.2.3",eslint:"^9.25.0","eslint-config-expo":"~10.0.0",jsdom:"^20.0.3","material-icon-theme":"^5.32.0",playwright:"^1.56.1","serve-sim":"^0.1.40",typescript:"~5.9.2",vitest:"^4.1.6",wrangler:"^4.105.0",ws:"^8.20.0"}}},3406,[]);
15052
15052
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.shouldUseDesktopDaemon=function(){return(0,n.isElectronRuntime)()},e.getDesktopDaemonStatus=async function(){return c(await(0,t.invokeDesktopCommand)("desktop_daemon_status"))},e.startDesktopDaemon=async function(){return c(await(0,t.invokeDesktopCommand)("start_desktop_daemon"))},e.stopDesktopDaemon=async function(n="manual_ipc"){return c(await(0,t.invokeDesktopCommand)("stop_desktop_daemon",{reason:n}))},e.restartDesktopDaemon=async function(){return c(await(0,t.invokeDesktopCommand)("restart_desktop_daemon"))},e.getDesktopDaemonLogs=async function(){return p(await(0,t.invokeDesktopCommand)("desktop_daemon_logs"))},e.getDesktopDaemonPairing=async function(){return k(await(0,t.invokeDesktopCommand)("desktop_daemon_pairing"))},e.getCliDaemonStatus=async function(){const n=await(0,t.invokeDesktopCommand)("cli_daemon_status");if("string"!=typeof n)throw new Error("Unexpected CLI daemon status response.");return n},e.listenToLocalTransportEvents=async function(t){const u=(0,n.getDesktopHost)()?.events?.on;if("function"!=typeof u)throw new Error("Desktop events API is unavailable.");const c=await u("local-daemon-transport-event",n=>{o(n)&&t({sessionId:s(n.sessionId)??"",kind:s(n.kind)??"error",text:s(n.text),binaryBase64:s(n.binaryBase64),code:l(n.code),reason:s(n.reason),error:s(n.error)})});return"function"==typeof c?c:()=>{}},e.openLocalTransportSession=async function(n){const o=await(0,t.invokeDesktopCommand)("open_local_daemon_transport",n);if("string"!=typeof o||0===o.trim().length)throw new Error("Unexpected local transport session response.");return o},e.sendLocalTransportMessage=async function(n){await(0,t.invokeDesktopCommand)("send_local_daemon_transport_message",Object.assign({sessionId:n.sessionId},n.text?{text:n.text}:{},n.binaryBase64?{binaryBase64:n.binaryBase64}:{}))},e.closeLocalTransportSession=async function(n){await(0,t.invokeDesktopCommand)("close_local_daemon_transport",{sessionId:n})},e.getCliInstallStatus=async function(){return f(await(0,t.invokeDesktopCommand)("get_cli_install_status"))},e.installCli=async function(){return f(await(0,t.invokeDesktopCommand)("install_cli"))},e.getSkillsStatus=async function(){return y(await(0,t.invokeDesktopCommand)("get_skills_status"))},e.installSkills=async function(){return y(await(0,t.invokeDesktopCommand)("install_skills"))},e.updateSkills=async function(){return y(await(0,t.invokeDesktopCommand)("update_skills"))},e.uninstallSkills=async function(){return y(await(0,t.invokeDesktopCommand)("uninstall_skills"))};var n=r(d[0]),t=r(d[1]);function o(n){return"object"==typeof n&&null!==n}function s(n){return"string"==typeof n&&n.trim().length>0?n:null}function l(n){return"number"==typeof n&&Number.isFinite(n)?n:null}function u(n){const t=s(n)?.toLowerCase();switch(t){case"starting":return"starting";case"running":return"running";case"errored":case"error":return"errored";default:return"stopped"}}function c(n){if(!o(n))throw new Error("Unexpected desktop daemon status response.");return{serverId:s(n.serverId)??"",status:u(n.status),listen:s(n.listen),hostname:s(n.hostname),pid:l(n.pid),home:s(n.home)??"",version:s(n.version),desktopManaged:!0===n.desktopManaged,error:s(n.error)}}function p(n){if(!o(n))throw new Error("Unexpected desktop daemon logs response.");return{logPath:s(n.logPath)??"",contents:"string"==typeof n.contents?n.contents:""}}function k(n){if(!o(n))throw new Error("Unexpected desktop daemon pairing response.");return{relayEnabled:!0===n.relayEnabled,url:s(n.url),qr:s(n.qr)}}function f(n){if(!o(n))throw new Error("Unexpected install status response.");return{installed:!0===n.installed}}function w(n){switch(n){case"not-installed":case"up-to-date":case"drift":return n;default:throw new Error(`Unexpected skills status state: ${String(n)}`)}}function _(n){if(!o(n))throw new Error("Unexpected skill op response.");const t=s(n.name);if(!t)throw new Error("Skill op missing name.");switch(n.kind){case"add":return{kind:"add",name:t};case"update":return{kind:"update",name:t};case"delete":return{kind:"delete",name:t};default:throw new Error(`Unexpected skill op kind: ${String(n.kind)}`)}}function y(n){if(!o(n))throw new Error("Unexpected skills status response.");const t=Array.isArray(n.ops)?n.ops.map(_):[];return{state:w(n.state),ops:t}}},3407,[3408,3410]);
15053
15053
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.getDesktopHost=n,e.isElectronRuntime=o,e.isElectronRuntimeMac=function(){if(!o())return!1;if("undefined"==typeof navigator)return!1;const t=n()?.platform?.toLowerCase();if("darwin"===t||"mac"===t||"macos"===t)return!0;const u=navigator.userAgent;return u.includes("Mac OS")||u.includes("Macintosh")},r(d[0]);var t=r(d[1]);function n(){return(0,t.getElectronHost)()}function o(){return null!==n()}},3408,[25,3409]);
15054
15054
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.getElectronHost=function(){if("undefined"==typeof window)return null;const t=window.paseoDesktop;if(!t||"object"!=typeof t)return null;return t}},3409,[]);
@@ -16579,5 +16579,5 @@ __d(function(g,r,_i,a,_m,_e,d){"use strict";var e,t=r(d[0]),n=this&&this.__creat
16579
16579
  __r(975);
16580
16580
  __r(341);
16581
16581
  __r(0);
16582
- //# sourceMappingURL=/_expo/static/js/web/index-2ff48a7009ad2309c577d5a43b925f69.js.map
16583
- //# debugId=29b13d8d-0633-4dbe-84c4-98b6a835f886
16582
+ //# sourceMappingURL=/_expo/static/js/web/index-6a99048b3a9acca9bc30efd44300414e.js.map
16583
+ //# debugId=cbb00dd4-165a-4e5f-9fe3-1b46ad539152
@@ -85,6 +85,6 @@
85
85
  <body>
86
86
  <noscript>You need to enable JavaScript to run this app.</noscript>
87
87
  <div id="root"></div>
88
- <script src="/_expo/static/js/web/index-2ff48a7009ad2309c577d5a43b925f69.js" defer></script>
88
+ <script src="/_expo/static/js/web/index-6a99048b3a9acca9bc30efd44300414e.js" defer></script>
89
89
  </body>
90
90
  </html>
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperdrive.bot/paseo-server",
3
- "version": "0.3.43",
3
+ "version": "0.3.44",
4
4
  "description": "Paseo backend server",
5
5
  "files": [
6
6
  "dist/server",
@@ -65,11 +65,11 @@
65
65
  "@agentclientprotocol/sdk": "^0.17.1",
66
66
  "@anthropic-ai/claude-agent-sdk": "^0.3.195",
67
67
  "@anthropic-ai/sdk": "^0.104.2",
68
- "@hyperdrive.bot/paseo-client": "0.3.43",
69
- "@hyperdrive.bot/paseo-extension-sdk": "0.3.43",
70
- "@hyperdrive.bot/paseo-highlight": "0.3.43",
71
- "@hyperdrive.bot/paseo-protocol": "0.3.43",
72
- "@hyperdrive.bot/paseo-relay": "0.3.43",
68
+ "@hyperdrive.bot/paseo-client": "0.3.44",
69
+ "@hyperdrive.bot/paseo-extension-sdk": "0.3.44",
70
+ "@hyperdrive.bot/paseo-highlight": "0.3.44",
71
+ "@hyperdrive.bot/paseo-protocol": "0.3.44",
72
+ "@hyperdrive.bot/paseo-relay": "0.3.44",
73
73
  "@isaacs/ttlcache": "^2.1.4",
74
74
  "@modelcontextprotocol/sdk": "^1.20.1",
75
75
  "@opencode-ai/sdk": "1.2.6",