@xopcai/xopc 0.0.153 → 0.0.155

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 (109) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-XA9328eM.js → activity-store-Btmg10yU.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-E09Jv6kW.js → agent-avatar-dicebear-pdlJJov8.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agents-BA46Lyc7.js → agents-NDjTqOIb.js} +1 -1
  6. package/dist/gateway/static/root/assets/{api-kQEpNIa-.js → api-GGYxPxVF.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-BzrND8g7.js → app-management-settings-panel-BU9oSmtJ.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-CKMCWf75.js → appearance-settings-B2chSkbj.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-DPP_gFCc.js → apps-page-DHvwQknj.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-DNOroxSq.js → archive-plugin-BC83GwY1.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-PtKuOOfL.js → attachment-load-DWSH5325.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-C7HQ5bAK.js → automation-suggestion-card-Bc25f4wz.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-BuMTtTYy.js → automations-page-32U6mfy-.js} +1 -1
  14. package/dist/gateway/static/root/assets/{binary-plugins-DDFoTNKm.js → binary-plugins-Kgu5yX35.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-CH_e8EXF.js → block-editor-B9gJmzdE.js} +4 -4
  16. package/dist/gateway/static/root/assets/{browser-settings-page-43uOCSrE.js → browser-settings-page-CTWycuu_.js} +1 -1
  17. package/dist/gateway/static/root/assets/{capability-presets-api-Cby6Utaf.js → capability-presets-api-6z36IfIC.js} +1 -1
  18. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-BZvp3H2p.js → capability-presets-settings-panel-Bqzl2UZ9.js} +1 -1
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-COdmaOO4.js → channel-recipient-api-DEkm4HRd.js} +1 -1
  20. package/dist/gateway/static/root/assets/{channels-settings-BAPRTSF4.js → channels-settings-DdelF9BQ.js} +1 -1
  21. package/dist/gateway/static/root/assets/channels-status-swr-CBgr61Zt.js +1 -0
  22. package/dist/gateway/static/root/assets/{connector-logo-CinEws2y.js → connector-logo-DPriINR1.js} +1 -1
  23. package/dist/gateway/static/root/assets/{connectors-page-P-Ur9mlf.js → connectors-page-CO3ASIfE.js} +1 -1
  24. package/dist/gateway/static/root/assets/{desktop-pet-O3wyOYRG.js → desktop-pet-CG91Su8E.js} +1 -1
  25. package/dist/gateway/static/root/assets/{desktop-pet-settings-nbvEKluo.js → desktop-pet-settings-DUzETFxq.js} +1 -1
  26. package/dist/gateway/static/root/assets/{directory-picker-path-field-DyZJo5xz.js → directory-picker-path-field-XNbI2wM7.js} +1 -1
  27. package/dist/gateway/static/root/assets/{dreaming-settings-CruD-NNs.js → dreaming-settings-BsLa5Nr8.js} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-debug-page-CV7SDe48.js → extension-debug-page-C-5Nyrdu.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-page-DJCYwgB_.js → extension-page-BEocT43y.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-settings-page-6kJQVKbq.js → extension-settings-page--XOHrL-O.js} +1 -1
  31. package/dist/gateway/static/root/assets/{gateway-config-api-DOewYtbP.js → gateway-config-api-DZrNmiR3.js} +1 -1
  32. package/dist/gateway/static/root/assets/{gateway-settings-BjjXod61.js → gateway-settings-DfBvlqb2.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-startup-retry-ewVb05iS.js → gateway-startup-retry-Cc5dxiD_.js} +1 -1
  34. package/dist/gateway/static/root/assets/{goal-create-dialog-BStw0m9M.js → goal-create-dialog-BRVB5I7f.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goal-detail-page-BOChQ7i7.js → goal-detail-page-Drdz_llY.js} +1 -1
  36. package/dist/gateway/static/root/assets/{goals-config-api-CYNvVerg.js → goals-config-api-Cdghd3f3.js} +1 -1
  37. package/dist/gateway/static/root/assets/{goals-page-BrNRDv8T.js → goals-page-CEh2UTzg.js} +1 -1
  38. package/dist/gateway/static/root/assets/{goals-settings-CHZcm6es.js → goals-settings-CvOdikU6.js} +1 -1
  39. package/dist/gateway/static/root/assets/{heartbeat-settings-B5oMLvbo.js → heartbeat-settings-CvaxjdV_.js} +1 -1
  40. package/dist/gateway/static/root/assets/{index-B5cSZcER.js → index-C4HpPu1y.js} +62 -62
  41. package/dist/gateway/static/root/assets/index-DjvInkv6.css +1 -0
  42. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Eb8IqcMd.js → keyboard-shortcuts-settings-BVt0deH6.js} +1 -1
  43. package/dist/gateway/static/root/assets/{local-app-workbench-page-L-MQ_dJY.js → local-app-workbench-page-Dcmb1Ruc.js} +1 -1
  44. package/dist/gateway/static/root/assets/{local-apps-page-Zb0f5eNc.js → local-apps-page-C0HGfwao.js} +1 -1
  45. package/dist/gateway/static/root/assets/{locale-store-CQDaFvDN.js → locale-store-Dt0pSudQ.js} +1 -1
  46. package/dist/gateway/static/root/assets/logs-page-BWdV-HsP.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-RnzQRPvB.js → markdown-split-CjVg43Kl.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-BoX0SWrl.js → media-plugins-D-LkrsY6.js} +1 -1
  49. package/dist/gateway/static/root/assets/{messages--cnUi8Ld.js → messages-CqXpNawC.js} +4 -4
  50. package/dist/gateway/static/root/assets/{models-hub-panel-BQuynkNz.js → models-hub-panel-Du41WFC6.js} +1 -1
  51. package/dist/gateway/static/root/assets/{notes-page-CSOXTk0P.js → notes-page-BsoNcBQ3.js} +1 -1
  52. package/dist/gateway/static/root/assets/{notes-workbench-B7NIQBqd.js → notes-workbench-VeU2xG2r.js} +2 -2
  53. package/dist/gateway/static/root/assets/{page-tabs-Dl9G6Pm3.js → page-tabs-C9OfBAT6.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-B8R5o1uN.js → preview-open-alternatives-BCrigyTS.js} +1 -1
  55. package/dist/gateway/static/root/assets/{project-detail-page-DoN-qkzc.js → project-detail-page-B9QsnXWV.js} +1 -1
  56. package/dist/gateway/static/root/assets/{projects-page-BBOW0A-s.js → projects-page-BbplZbzF.js} +1 -1
  57. package/dist/gateway/static/root/assets/{remote-access-hub-BzXHX9bU.js → remote-access-hub-CfbuqKDd.js} +1 -1
  58. package/dist/gateway/static/root/assets/{save-bar-controls-D6OGeVDa.js → save-bar-controls-CnyZMYdJ.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-CKrch41X.js → schedule-field-Bez97_Ou.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-FroNrvKO.js → schema-form-DbKY5jSv.js} +1 -1
  61. package/dist/gateway/static/root/assets/{sessions-page-c4n4TLc2.js → sessions-page-CSQLpHd4.js} +1 -1
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-C25HTTPK.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-1SeKT26L.js → settings-collapsible-section-4f60Dgw-.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-Cz4xOOt4.js → settings-form-section-CCQ7MjdZ.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-rBI7xqmM.js → settings-loading-skeleton-CQhjhb0F.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-page-7SlGFgmR.js → settings-page-BZb-E5vI.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-page-layout-C7B19AHf.js → settings-page-layout-C7sfPFaM.js} +1 -1
  68. package/dist/gateway/static/root/assets/{setup-status-panel-_x53a0I_.js → setup-status-panel-B1FSxWQ3.js} +1 -1
  69. package/dist/gateway/static/root/assets/{share-preview-page-DwcX1sXG.js → share-preview-page-DeErzPeg.js} +1 -1
  70. package/dist/gateway/static/root/assets/{shares-settings-BwfS4kkk.js → shares-settings-DDg5dL3k.js} +1 -1
  71. package/dist/gateway/static/root/assets/skill-reload-api-B-ocgAT-.js +1 -0
  72. package/dist/gateway/static/root/assets/{skills-page-sCuywwN5.js → skills-page-CtO4i9ds.js} +1 -1
  73. package/dist/gateway/static/root/assets/sliding-segmented-uWmrxE3P.js +1 -0
  74. package/dist/gateway/static/root/assets/{system-settings-panel-CZkASLIv.js → system-settings-panel-Dk1ZhfpM.js} +1 -1
  75. package/dist/gateway/static/root/assets/{theme-store-DP5WlsZg.js → theme-store-Cd_gY2Cb.js} +1 -1
  76. package/dist/gateway/static/root/assets/{typed-models-lib-C2TbyW3H.js → typed-models-lib-fe1xAgdw.js} +1 -1
  77. package/dist/gateway/static/root/assets/{use-channel-catalog-4WYXfEXk.js → use-channel-catalog-Cbo3s1uh.js} +1 -1
  78. package/dist/gateway/static/root/assets/{user-context-page-0MO96b3-.js → user-context-page-CqtVqiYz.js} +1 -1
  79. package/dist/gateway/static/root/assets/{user-profile-fields-editor-Cqalx8iJ.js → user-profile-fields-editor-DcnCOHwp.js} +1 -1
  80. package/dist/gateway/static/root/assets/{user-profile-settings-panel-CVbTC44o.js → user-profile-settings-panel-CTWZR6nV.js} +1 -1
  81. package/dist/gateway/static/root/assets/{utils-DOvyuYat.js → utils-BDzZMJls.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-ClOb2PfC.js → voice-api-key-field-C9Psto-d.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-page-Ci_rGhsb.js → work-discovery-page-CNVeagdJ.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-item-detail-page-DnJeDqJB.js → work-item-detail-page-DKSNc1SH.js} +1 -1
  85. package/dist/gateway/static/root/assets/work-page-Bwbg1Ht-.js +1 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-pNCz37MS.js → workflow-run-setup-panel-ZKbrdYmp.js} +1 -1
  87. package/dist/gateway/static/root/assets/{workflows-page-BFTxMEH6.js → workflows-page-DBHqpZ76.js} +1 -1
  88. package/dist/gateway/static/root/index.html +7 -7
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/embedded/run-turn.js +2 -2
  91. package/dist/src/agent/embedded/session-runner.js +3 -3
  92. package/dist/src/agent/embedded/xopc-stream-bridge.d.ts +1 -1
  93. package/dist/src/agent/embedded/xopc-stream-bridge.js +1 -1
  94. package/dist/src/config/agent-profile.js +1 -1
  95. package/dist/src/gateway/agents-admin.js +1 -1
  96. package/dist/src/gateway/heartbeat/service.js +1 -1
  97. package/dist/src/heartbeat/index.js +1 -1
  98. package/dist/src/infra/update-restart.d.ts +1 -0
  99. package/dist/src/infra/update-restart.js +20 -0
  100. package/dist/src/infra/update-runner.js +1 -0
  101. package/dist/src/infra/update-service-refresh.d.ts +14 -0
  102. package/dist/src/infra/update-service-refresh.js +66 -0
  103. package/package.json +5 -5
  104. package/dist/gateway/static/root/assets/channels-status-swr-DvB_8J5B.js +0 -1
  105. package/dist/gateway/static/root/assets/index-CNr0KWZU.css +0 -1
  106. package/dist/gateway/static/root/assets/logs-page-ToUMpW7t.js +0 -7
  107. package/dist/gateway/static/root/assets/settings-advanced-gate-BEsX3iAM.js +0 -1
  108. package/dist/gateway/static/root/assets/skill-reload-api-BkjO4n_a.js +0 -1
  109. package/dist/gateway/static/root/assets/work-page-n9XZM9PY.js +0 -1
@@ -11,7 +11,7 @@
11
11
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260713-1" />
12
12
  <link rel="manifest" href="/site.webmanifest?v=20260713-1" />
13
13
  <title>xopc</title>
14
- <script type="module" crossorigin src="/assets/index-B5cSZcER.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-C4HpPu1y.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
@@ -24,15 +24,15 @@
24
24
  <link rel="modulepreload" crossorigin href="/assets/check-BODqo66o.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/circle-alert-RzVebuX2.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
27
- <link rel="modulepreload" crossorigin href="/assets/messages--cnUi8Ld.js">
28
- <link rel="modulepreload" crossorigin href="/assets/locale-store-CQDaFvDN.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/messages-CqXpNawC.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/locale-store-Dt0pSudQ.js">
29
29
  <link rel="modulepreload" crossorigin href="/assets/schemas-DgQq6Z5S.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
32
- <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-ewVb05iS.js">
33
- <link rel="modulepreload" crossorigin href="/assets/activity-store-XA9328eM.js">
34
- <link rel="modulepreload" crossorigin href="/assets/theme-store-DP5WlsZg.js">
35
- <link rel="stylesheet" crossorigin href="/assets/index-CNr0KWZU.css">
32
+ <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-Cc5dxiD_.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/activity-store-Btmg10yU.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/theme-store-Cd_gY2Cb.js">
35
+ <link rel="stylesheet" crossorigin href="/assets/index-DjvInkv6.css">
36
36
  </head>
37
37
  <body>
38
38
  <div id="root"></div>
package/dist/package.js CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.153";
2
+ var version = "0.0.155";
3
3
  //#endregion
4
4
  export { version };
@@ -74,7 +74,7 @@ async function runXopcEmbeddedTurn(params) {
74
74
  thinkingLevel: thinkingLevel ?? "medium"
75
75
  });
76
76
  const { session, reused } = runner;
77
- const streamFnWithXopcExtensions = wrapStreamFnForXopcExtensions(session.agent.streamFn);
77
+ const streamFnWithXopcExtensions = wrapStreamFnForXopcExtensions(session.agent.streamFunction);
78
78
  const loggingStreamFn = (streamModel, context, options) => {
79
79
  const loopGuard = detectToolLoops(extractRecentToolCalls(context.messages));
80
80
  let effectiveContext = context;
@@ -110,7 +110,7 @@ async function runXopcEmbeddedTurn(params) {
110
110
  }, "Sending messages to AI");
111
111
  return streamFnWithXopcExtensions(streamModel, effectiveContext, options);
112
112
  };
113
- session.agent.streamFn = loggingStreamFn;
113
+ session.agent.streamFunction = loggingStreamFn;
114
114
  if (onEvent) unsubscribe = subscribeEmbeddedSessionEvents(session, (event) => {
115
115
  onEvent({
116
116
  ...event,
@@ -104,7 +104,7 @@ var EmbeddedSessionRunnerPool = class {
104
104
  reused = true;
105
105
  this.stats.reuses += 1;
106
106
  applySystemPromptOverrideToSession(entry.session, params.systemPrompt);
107
- entry.session.agent.streamFn = entry.baseStreamFn;
107
+ entry.session.agent.streamFunction = entry.baseStreamFn;
108
108
  log.debug({ sessionKey: params.sessionKey }, "Reusing pooled embedded session runner");
109
109
  } else {
110
110
  if (existing) this.disposePooledRunner(params.sessionKey, existing, "fingerprint_mismatch");
@@ -189,8 +189,8 @@ var EmbeddedSessionRunnerPool = class {
189
189
  tools: toolNames
190
190
  });
191
191
  applySystemPromptOverrideToSession(session, systemPrompt);
192
- const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFn);
193
- session.agent.streamFn = baseStreamFn;
192
+ const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFunction);
193
+ session.agent.streamFunction = baseStreamFn;
194
194
  return {
195
195
  sessionKey,
196
196
  fingerprint: buildEmbeddedRunnerFingerprint({
@@ -6,6 +6,6 @@ import type { StreamFn } from '@earendil-works/pi-agent-core';
6
6
  * implementation. Wrap the original streamFn so plugin models go through xopc's bridge
7
7
  * and everything else falls through to the original auth-aware streamFn.
8
8
  *
9
- * Use this by reassigning {@link Agent.streamFn} after `createAgentSession` returns.
9
+ * Use this by reassigning {@link Agent.streamFunction} after `createAgentSession` returns.
10
10
  */
11
11
  export declare function wrapStreamFnForXopcExtensions(originalStreamFn: StreamFn): StreamFn;
@@ -10,7 +10,7 @@ init_providers();
10
10
  * implementation. Wrap the original streamFn so plugin models go through xopc's bridge
11
11
  * and everything else falls through to the original auth-aware streamFn.
12
12
  *
13
- * Use this by reassigning {@link Agent.streamFn} after `createAgentSession` returns.
13
+ * Use this by reassigning {@link Agent.streamFunction} after `createAgentSession` returns.
14
14
  */
15
15
  function wrapStreamFnForXopcExtensions(originalStreamFn) {
16
16
  const extensionStreamFn = createExtensionAwareStreamFn();
@@ -1,6 +1,6 @@
1
+ import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
1
2
  import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
3
  import "../agent-manifest/index.js";
3
- import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
4
4
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
5
5
  import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
6
6
  //#region src/config/agent-profile.ts
@@ -1,5 +1,5 @@
1
- import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
1
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
2
+ import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
3
3
  import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
4
4
  import { WORKSPACE_FILES, init_paths, resolveUserProfilePath } from "../config/paths.js";
5
5
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
4
+ import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
4
5
  import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
5
6
  import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
6
- import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
7
7
  import { createHeartbeatWake } from "../../heartbeat/wake.js";
8
8
  import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
9
9
  import { readFile } from "fs/promises";
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
2
+ import { appendCronEventLines } from "./event-prompt.js";
2
3
  import { isWithinActiveHours } from "./active-hours.js";
3
4
  import { isHeartbeatContentEmpty } from "./content-check.js";
4
- import { appendCronEventLines } from "./event-prompt.js";
5
5
  import { createHeartbeatWake } from "./wake.js";
6
6
  export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
@@ -15,6 +15,7 @@ export declare function isRunningInsideGatewayService(env?: Record<string, strin
15
15
  export declare function maybeRestartGatewayAfterUpdate(params: {
16
16
  shouldRestart?: boolean;
17
17
  expectedVersion?: string;
18
+ updatedPackageRoot?: string;
18
19
  configPath?: string;
19
20
  triggerInProcessRestart?: InProcessRestartTrigger;
20
21
  }): Promise<UpdateRestartResult>;
@@ -6,6 +6,7 @@ import { isRestartEnabled } from "../config/commands.flags.js";
6
6
  import { resolveGatewayService } from "../daemon/service.js";
7
7
  import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
8
8
  import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
9
+ import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
9
10
  //#region src/infra/update-restart.ts
10
11
  init_loader();
11
12
  init_paths();
@@ -143,6 +144,25 @@ async function maybeRestartGatewayAfterUpdate(params) {
143
144
  message: "Gateway restart is disabled (commands.restart=false). Restart manually: xopc gateway restart"
144
145
  };
145
146
  if (isRunningInsideGatewayService() && params.triggerInProcessRestart) {
147
+ if (params.updatedPackageRoot && params.expectedVersion) try {
148
+ const service = await resolveGatewayService();
149
+ if (await service.isLoaded({ env: process.env })) await refreshGatewayServiceAfterUpdate({
150
+ service,
151
+ packageRoot: params.updatedPackageRoot,
152
+ expectedVersion: params.expectedVersion
153
+ });
154
+ } catch (err) {
155
+ const message = err instanceof Error ? err.message : String(err);
156
+ log.warn({
157
+ err,
158
+ expectedVersion: params.expectedVersion
159
+ }, `Gateway service refresh failed after update: ${message}`);
160
+ return {
161
+ ok: false,
162
+ mode: "failed",
163
+ message: `Installed ${params.expectedVersion}, but failed to refresh the gateway service: ${message}`
164
+ };
165
+ }
146
166
  const result = params.triggerInProcessRestart();
147
167
  if (!result.ok) return {
148
168
  ok: false,
@@ -541,6 +541,7 @@ async function runGatewayUpdateWithPostSteps(opts = {}) {
541
541
  postUpdate.restart = await maybeRestartGatewayAfterUpdate({
542
542
  shouldRestart: opts.shouldRestart,
543
543
  expectedVersion: result.after?.version ?? void 0,
544
+ updatedPackageRoot: result.mode === "npm" || result.mode === "pnpm" ? result.root : void 0,
544
545
  triggerInProcessRestart: opts.triggerInProcessRestart
545
546
  });
546
547
  return {
@@ -0,0 +1,14 @@
1
+ import type { GatewayService, GatewayServiceCommandConfig, GatewayServiceInstallArgs } from '../daemon/types.js';
2
+ export declare function resolveUpdatedGatewayEntryPoint(packageRoot: string): Promise<string>;
3
+ export declare function buildRefreshedGatewayServiceArgs(params: {
4
+ command: GatewayServiceCommandConfig;
5
+ entryPoint: string;
6
+ expectedVersion: string;
7
+ env?: NodeJS.ProcessEnv;
8
+ }): GatewayServiceInstallArgs;
9
+ export declare function refreshGatewayServiceAfterUpdate(params: {
10
+ service: GatewayService;
11
+ packageRoot: string;
12
+ expectedVersion: string;
13
+ env?: NodeJS.ProcessEnv;
14
+ }): Promise<void>;
@@ -0,0 +1,66 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { SERVICE_VERSION_ENV_KEY, formatGatewayServiceDescription } from "../daemon/constants.js";
4
+ import path from "node:path";
5
+ import fs from "node:fs/promises";
6
+ //#region src/infra/update-service-refresh.ts
7
+ init_logger();
8
+ const log = createLogger("UpdateServiceRefresh");
9
+ function resolveBinPath(bin) {
10
+ if (typeof bin === "string") return bin;
11
+ if (!bin || typeof bin !== "object") return null;
12
+ return bin.xopc ?? Object.values(bin).find((value) => typeof value === "string") ?? null;
13
+ }
14
+ async function resolveUpdatedGatewayEntryPoint(packageRoot) {
15
+ const resolvedRoot = path.resolve(packageRoot);
16
+ const packageJsonPath = path.join(resolvedRoot, "package.json");
17
+ const binPath = resolveBinPath(JSON.parse(await fs.readFile(packageJsonPath, "utf8")).bin);
18
+ if (!binPath) throw new Error(`Updated package has no xopc CLI entry point: ${packageJsonPath}`);
19
+ const entryPoint = path.resolve(resolvedRoot, binPath);
20
+ const relative = path.relative(resolvedRoot, entryPoint);
21
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) throw new Error(`Updated xopc CLI entry point escapes its package root: ${binPath}`);
22
+ await fs.access(entryPoint);
23
+ return entryPoint;
24
+ }
25
+ function buildRefreshedGatewayServiceArgs(params) {
26
+ const programArguments = [...params.command.programArguments];
27
+ const gatewayArgIndex = programArguments.findLastIndex((arg) => arg === "gateway");
28
+ if (gatewayArgIndex < 2) throw new Error("Gateway service command does not contain a replaceable Node.js CLI entry point.");
29
+ programArguments[gatewayArgIndex - 1] = params.entryPoint;
30
+ const environment = {
31
+ ...params.command.environment,
32
+ [SERVICE_VERSION_ENV_KEY]: params.expectedVersion,
33
+ XOPC_SERVICE_MARKER: "1"
34
+ };
35
+ const profile = params.env?.XOPC_PROFILE?.trim() || void 0;
36
+ return {
37
+ env: params.env ?? process.env,
38
+ stdout: process.stdout,
39
+ programArguments,
40
+ workingDirectory: params.command.workingDirectory,
41
+ environment,
42
+ description: formatGatewayServiceDescription({
43
+ profile,
44
+ version: params.expectedVersion
45
+ })
46
+ };
47
+ }
48
+ async function refreshGatewayServiceAfterUpdate(params) {
49
+ const env = params.env ?? process.env;
50
+ const command = await params.service.readCommand(env);
51
+ if (!command) throw new Error("Could not read the installed gateway service command.");
52
+ const entryPoint = await resolveUpdatedGatewayEntryPoint(params.packageRoot);
53
+ const installArgs = buildRefreshedGatewayServiceArgs({
54
+ command,
55
+ entryPoint,
56
+ expectedVersion: params.expectedVersion,
57
+ env
58
+ });
59
+ await params.service.install(installArgs);
60
+ log.info({
61
+ entryPoint,
62
+ expectedVersion: params.expectedVersion
63
+ }, "Refreshed gateway service definition after update");
64
+ }
65
+ //#endregion
66
+ export { buildRefreshedGatewayServiceArgs, refreshGatewayServiceAfterUpdate, resolveUpdatedGatewayEntryPoint };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.153",
3
+ "version": "0.0.155",
4
4
  "description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -65,10 +65,10 @@
65
65
  "node": ">=22.19.0"
66
66
  },
67
67
  "dependencies": {
68
- "@earendil-works/pi-agent-core": "0.80.10",
69
- "@earendil-works/pi-ai": "0.80.10",
70
- "@earendil-works/pi-coding-agent": "0.80.10",
71
- "@earendil-works/pi-tui": "0.80.10",
68
+ "@earendil-works/pi-agent-core": "0.82.1",
69
+ "@earendil-works/pi-ai": "0.82.1",
70
+ "@earendil-works/pi-coding-agent": "0.82.1",
71
+ "@earendil-works/pi-tui": "0.82.1",
72
72
  "@grammyjs/runner": "^2.0.3",
73
73
  "@hono/node-server": "^2.0.4",
74
74
  "@inquirer/prompts": "^8.5.0",
@@ -1 +0,0 @@
1
- import{r as e}from"./locale-store-CQDaFvDN.js";import{n as t}from"./channel-recipient-api-COdmaOO4.js";function n(){return e(`/api/channels/status`)}var r=t;export{r as n,n as t};