run402 4.62.1 → 4.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "surface_version": "4.62.1",
2
+ "surface_version": "4.63.0",
3
3
  "verbs": [
4
4
  "repos create",
5
5
  "repos list",
@@ -53,7 +53,7 @@ export async function runDaemon() {
53
53
  // Load the heavy module ONCE — this is the entire point of residency.
54
54
  // Its top-level await pulls the SDK graph; the prewarm dials the API
55
55
  // origin so the first forwarded session rides a warm h2 connection.
56
- const { prewarmGitvaultConnection } = await import("../sdk/dist/node/gitvault-prewarm.js");
56
+ const { prewarmGitvaultConnection, kickGitvaultConnection } = await import("../sdk/dist/node/gitvault-prewarm.js");
57
57
  prewarmGitvaultConnection();
58
58
  const { runHelperSession } = await import("./remote-helper-session.mjs");
59
59
 
@@ -169,10 +169,26 @@ export async function runDaemon() {
169
169
  socket.end();
170
170
  return;
171
171
  }
172
+ // gitvault-first-op-premium (design point: pre-connect on session
173
+ // accept). Git's own helper handshake (capabilities/list stdin
174
+ // exchange) buys ~100-200ms of free overlap before the SESSION's
175
+ // first real transport op — kick the owned dispatcher's connection
176
+ // right now, before env/cwd swap even, so a dead/never-dialed
177
+ // socket redials NOW instead of on the verb's critical path. The
178
+ // NARROW half only (`kickGitvaultConnection`), never the full
179
+ // `prewarmGitvaultConnection` — that also (re)warms the signer +
180
+ // paid-fetch buyer stack, which this daemon already warmed ONCE at
181
+ // boot; re-running it per session was measured to cost an EXTRA
182
+ // ~150-300ms/session (two live Base RPC probes a gitvault session
183
+ // never needs) for zero benefit. Fire-and-forget by contract
184
+ // (never throws, never awaited, never delays a session).
185
+ const acceptedAt = Date.now();
186
+ kickGitvaultConnection();
172
187
  busy = true;
173
188
  sessionsServed += 1;
174
189
  const stdin = new PassThrough();
175
190
  const restoreEnv = applySessionEnv(msg.env ?? {});
191
+ const envReadyAt = Date.now();
176
192
  const prevCwd = process.cwd();
177
193
  let restoreCwd = () => {};
178
194
  try {
@@ -213,6 +229,17 @@ export async function runDaemon() {
213
229
  };
214
230
  session = { stdin, restoreEnv, restoreCwd, restoreWrites, backgroundWork: null };
215
231
  send({ t: "ready" });
232
+ // gitvault-first-op-premium task 1.1: phase stamps for attribution
233
+ // (session accept -> env ready -> first transport call, the last
234
+ // covered by the existing RUN402_GITVAULT_TRACE per-op lines).
235
+ // Emitted AFTER write-redirection so they ride the socket to the
236
+ // client and land in the SAME trace stream the bench harness
237
+ // already captures — gated on the session's own env, exactly like
238
+ // every other gitvault-trace line.
239
+ if (process.env.RUN402_GITVAULT_TRACE === "1") {
240
+ process.stderr.write(`gitvault-trace: daemon session-accept ${sessionsServed} at ${acceptedAt}\n`);
241
+ process.stderr.write(`gitvault-trace: daemon env-ready ${sessionsServed} +${envReadyAt - acceptedAt}ms\n`);
242
+ }
216
243
  // gitvault-checkpoint-cadence design D2: a push's auto-gc cycle
217
244
  // (if triggered) hands its ALREADY-STARTED promise here instead
218
245
  // of being awaited inline — `runHelperSession` itself still
@@ -115,6 +115,7 @@
115
115
  */
116
116
 
117
117
  import { createInterface } from "node:readline";
118
+ import { statSync } from "node:fs";
118
119
 
119
120
  // The heavy graphs load as ONE top-level await batch — in the in-process
120
121
  // host this races the thin bin's already-fired prewarm; in the daemon host
@@ -123,10 +124,65 @@ const sdkModP = import("./sdk.mjs");
123
124
  const walletModP = import("./wallet-context.mjs");
124
125
  const isoModP = import("#sdk");
125
126
  const nodeModP = import("#sdk/node");
127
+ const configModP = import("./config.mjs");
126
128
  const { getSdk } = await sdkModP;
127
129
  const { resolveWalletCore, enforceWalletExistsCore, WalletSelectionError } = await walletModP;
128
130
  const { gitvaultRemoteAddressForm, gitvaultSlugReleasedInfo, parseGitvaultRemoteUrl } = await isoModP;
129
131
  const { GITVAULT_R402_REF_NAMESPACE, hardenedGit, resolveGitInvocationRepo, readPinnedGitvaultRepo, pinGitvaultRepo, readGitvaultRestoreMarker, readGitvaultAutoGcThreshold } = await nodeModP;
132
+ const { allowanceFile, projectCredentialsFile, profileStateFile } = await configModP;
133
+
134
+ /**
135
+ * Per-session SDK construction cache (gitvault-first-op-premium task 2.2).
136
+ *
137
+ * `getSdk()` builds a fresh Node SDK instance on every call — cheap for a
138
+ * traditional one-process-per-invocation CLI, but this module is ALSO the
139
+ * resident daemon's per-session engine, where every forwarded session calls
140
+ * it fresh exactly once (via `openVault`). Measured: constructing a NEW SDK
141
+ * instance re-probes the paid-fetch buyer's rail selection (two live RPC
142
+ * calls, `sepolia.base.org` + `mainnet.base.org`, ~150-300ms combined) on
143
+ * its own first authenticated request — a cost a genuinely resident process
144
+ * should pay ONCE, not once per session. This is the dominant share of the
145
+ * measured "first transport op" premium a resident daemon was built to
146
+ * eliminate and, before this cache, did not.
147
+ *
148
+ * Keyed on the resolved wallet + the env that governs config resolution
149
+ * (`RUN402_CONFIG_DIR`/`RUN402_API_BASE` — the exact two vars `getSdk`'s own
150
+ * doc comment calls out as reasons a fresh instance mattered for tests that
151
+ * mutate them between calls in one process) and INVALIDATED on the mtime of
152
+ * the three files whose bytes actually determine signer/credential material
153
+ * (allowance, project-credentials keystore, profile state) — a wallet
154
+ * rotation, `run402 init`, or any other on-disk change is picked up on the
155
+ * very next call, no daemon restart required. A file that does not exist
156
+ * yet (fresh wallet, no allowance) signs into the key as `null`, so its
157
+ * LATER appearance also busts the cache. The in-process fallback host calls
158
+ * this at most once per process anyway, so it degrades to exactly today's
159
+ * behavior there — this only changes anything for the daemon.
160
+ */
161
+ let cachedSdk = null; // { key, sdk }
162
+
163
+ function mtimeOf(path) {
164
+ try {
165
+ return statSync(path).mtimeMs;
166
+ } catch {
167
+ return null;
168
+ }
169
+ }
170
+
171
+ function sdkCacheKey() {
172
+ const wallet = process.env.RUN402_WALLET ?? "";
173
+ const configDir = process.env.RUN402_CONFIG_DIR ?? "";
174
+ const apiBase = process.env.RUN402_API_BASE ?? "";
175
+ const files = [mtimeOf(allowanceFile()), mtimeOf(projectCredentialsFile()), mtimeOf(profileStateFile())];
176
+ return `${wallet} ${configDir} ${apiBase} ${files.join(",")}`;
177
+ }
178
+
179
+ export function getCachedSdk() {
180
+ const key = sdkCacheKey();
181
+ if (cachedSdk && cachedSdk.key === key) return cachedSdk.sdk;
182
+ const sdk = getSdk();
183
+ cachedSdk = { key, sdk };
184
+ return sdk;
185
+ }
130
186
 
131
187
  /** The session's input stream — injected per session (daemon: the socket's forwarded stdin). */
132
188
  let sessionStdin = process.stdin;
@@ -450,7 +506,7 @@ async function main(argv, { onBackgroundWork } = {}) {
450
506
  * pin.
451
507
  */
452
508
  const openVault = async (repoDir) => {
453
- const result = await getSdk().gitvault.resolveOrCreateAddress({ address, allow_create: false, ...(repoDir ? { repo_dir: repoDir } : {}) });
509
+ const result = await getCachedSdk().gitvault.resolveOrCreateAddress({ address, allow_create: false, ...(repoDir ? { repo_dir: repoDir } : {}) });
454
510
  return { vault: result.handle.vault, resolution: result.resolution };
455
511
  };
456
512
 
@@ -482,14 +538,14 @@ async function main(argv, { onBackgroundWork } = {}) {
482
538
  if (addressForm === "id" && repoDir) {
483
539
  const pinned = await readPinnedGitvaultRepo(repoDir);
484
540
  if (pinned) {
485
- const result = await getSdk().gitvault.resolveOrCreateAddress({ address, repo_dir: repoDir, allow_create: false });
541
+ const result = await getCachedSdk().gitvault.resolveOrCreateAddress({ address, repo_dir: repoDir, allow_create: false });
486
542
  return result.handle.vault;
487
543
  }
488
544
  }
489
545
  const result =
490
546
  addressForm === "id"
491
- ? await getSdk().gitvault.openOrCreate({ ...target, repo_dir: repoDir })
492
- : await getSdk().gitvault.resolveOrCreateAddress({ address, repo_dir: repoDir, allow_create: true });
547
+ ? await getCachedSdk().gitvault.openOrCreate({ ...target, repo_dir: repoDir })
548
+ : await getCachedSdk().gitvault.resolveOrCreateAddress({ address, repo_dir: repoDir, allow_create: true });
493
549
  if (addressForm === "id" && repoDir) await pinGitvaultRepo(repoDir, result.handle.repo_id, undefined, { project_id: target.project_id, org_id: target.org_id });
494
550
  if (!result.found && result.created) {
495
551
  note("");
@@ -556,7 +612,7 @@ async function main(argv, { onBackgroundWork } = {}) {
556
612
  // always runs `list` first in a helper session, so this one site
557
613
  // heals the pin for the `fetch`/`push` that follows it.
558
614
  const recovered = repoDir && opened.resolution?.offline
559
- ? await getSdk().gitvault.recoverStalePin({ address, repo_dir: repoDir, resolution: opened.resolution, error: err })
615
+ ? await getCachedSdk().gitvault.recoverStalePin({ address, repo_dir: repoDir, resolution: opened.resolution, error: err })
560
616
  : null;
561
617
  if (!recovered) throw err;
562
618
  note(`pinned vault ${opened.resolution.repo_id} no longer resolves — re-resolved to ${recovered.resolution.repo_id}, retrying`);
@@ -630,7 +686,7 @@ async function main(argv, { onBackgroundWork } = {}) {
630
686
  const shared = sharedListSession && sharedListSession.repoDir === repoDir && sharedListSession.walletName === (resolvedWallet?.name ?? null) ? sharedListSession : null;
631
687
  const restored = shared
632
688
  ? await shared.vault.restoreObjectsInto(repoDir, { marker: shared.fetchMarker, state: shared.fetchState })
633
- : await getSdk().gitvault.restore({ ...target, repo_dir: repoDir, target_dir: repoDir });
689
+ : await getCachedSdk().gitvault.restore({ ...target, repo_dir: repoDir, target_dir: repoDir });
634
690
  if (verbosity >= 1) note(`restored generation ${restored.generation}`);
635
691
  // clone-installs-retained-refs D3: a bookkeeping failure here degrades to
636
692
  // exactly today's (pre-change) behavior — one stderr note, fetch still
@@ -686,7 +742,7 @@ async function main(argv, { onBackgroundWork } = {}) {
686
742
  if (!shouldRunAutoGc(threshold, generationsSinceCheckpoint)) return;
687
743
 
688
744
  const runCycle = async () => {
689
- const sdk = getSdk();
745
+ const sdk = getCachedSdk();
690
746
  const checkpoint = await sdk.gitvault.compact({ ...target });
691
747
  const prune = await sdk.gitvault.prune(target); // PLAN only — never `submit`; see compact()'s own grant-close doc comment for why prune needs no headroom of its own
692
748
  return { checkpoint, prune };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "run402",
3
- "version": "4.62.1",
3
+ "version": "4.63.0",
4
4
  "description": "CLI for Run402 — full-stack backend infrastructure for AI agents: Postgres, auth, storage, serverless functions and atomic deploys. Paid with x402/MPP. Includes $0.03 image generation.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -4,9 +4,25 @@ export declare const prewarmDeps: {
4
4
  warmSigner: () => unknown;
5
5
  warmPaidStack: () => unknown;
6
6
  };
7
+ /**
8
+ * The connection-dial half alone (gitvault-first-op-premium task 2.1 —
9
+ * "pre-connect on session accept"). A RESIDENT daemon already ran the full
10
+ * prewarm (dial + signer + paid-stack) exactly once at boot; re-running
11
+ * `warmPaidStack` on every forwarded session was measured to cost an EXTRA
12
+ * ~150-300ms per session (two live Base RPC probes, `sepolia.base.org` +
13
+ * `mainnet.base.org`, that a gitvault session never actually needs) for no
14
+ * benefit — the paid-fetch buyer stack only needs loading once per process.
15
+ * This is the narrow half a session-accept hook should call: kick the owned
16
+ * dispatcher's connection (so a dead/never-dialed socket redials NOW,
17
+ * overlapping git's own helper handshake) and nothing else. Same contract as
18
+ * the full prewarm: fire-and-forget, every failure swallowed, no side effects.
19
+ */
20
+ export declare function kickGitvaultConnection(apiBase?: string): void;
7
21
  /**
8
22
  * Start the connection + signer prewarm. Returns immediately; nothing to
9
- * await, nothing thrown, ever.
23
+ * await, nothing thrown, ever. Call this ONCE per process (verb startup, or
24
+ * daemon boot) — see `kickGitvaultConnection` for the narrower, repeatable
25
+ * connection-only half a resident daemon should use per forwarded session.
10
26
  */
11
27
  export declare function prewarmGitvaultConnection(apiBase?: string): void;
12
28
  //# sourceMappingURL=gitvault-prewarm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitvault-prewarm.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-prewarm.ts"],"names":[],"mappings":"AAiCA,4BAA4B;AAC5B,eAAO,MAAM,WAAW,EAAE;IACxB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,OAAO,CAAC;CAwB9B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAyBhE"}
1
+ {"version":3,"file":"gitvault-prewarm.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-prewarm.ts"],"names":[],"mappings":"AAiCA,4BAA4B;AAC5B,eAAO,MAAM,WAAW,EAAE;IACxB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,OAAO,CAAC;CAwB9B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAU7D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBhE"}
@@ -56,10 +56,19 @@ export const prewarmDeps = {
56
56
  },
57
57
  };
58
58
  /**
59
- * Start the connection + signer prewarm. Returns immediately; nothing to
60
- * await, nothing thrown, ever.
59
+ * The connection-dial half alone (gitvault-first-op-premium task 2.1
60
+ * "pre-connect on session accept"). A RESIDENT daemon already ran the full
61
+ * prewarm (dial + signer + paid-stack) exactly once at boot; re-running
62
+ * `warmPaidStack` on every forwarded session was measured to cost an EXTRA
63
+ * ~150-300ms per session (two live Base RPC probes, `sepolia.base.org` +
64
+ * `mainnet.base.org`, that a gitvault session never actually needs) for no
65
+ * benefit — the paid-fetch buyer stack only needs loading once per process.
66
+ * This is the narrow half a session-accept hook should call: kick the owned
67
+ * dispatcher's connection (so a dead/never-dialed socket redials NOW,
68
+ * overlapping git's own helper handshake) and nothing else. Same contract as
69
+ * the full prewarm: fire-and-forget, every failure swallowed, no side effects.
61
70
  */
62
- export function prewarmGitvaultConnection(apiBase) {
71
+ export function kickGitvaultConnection(apiBase) {
63
72
  try {
64
73
  const base = apiBase ?? getApiBase();
65
74
  void prewarmDeps
@@ -70,6 +79,15 @@ export function prewarmGitvaultConnection(apiBase) {
70
79
  catch {
71
80
  /* a malformed base or missing fetch must never reach a verb */
72
81
  }
82
+ }
83
+ /**
84
+ * Start the connection + signer prewarm. Returns immediately; nothing to
85
+ * await, nothing thrown, ever. Call this ONCE per process (verb startup, or
86
+ * daemon boot) — see `kickGitvaultConnection` for the narrower, repeatable
87
+ * connection-only half a resident daemon should use per forwarded session.
88
+ */
89
+ export function prewarmGitvaultConnection(apiBase) {
90
+ kickGitvaultConnection(apiBase);
73
91
  // Deferred so a remote helper's `capabilities` reply is never delayed by
74
92
  // the synchronous sign — the warmup only has to land before the verb's
75
93
  // first authenticated request, which is several stdin exchanges away.
@@ -1 +1 @@
1
- {"version":3,"file":"gitvault-prewarm.js","sourceRoot":"","sources":["../../src/node/gitvault-prewarm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,WAAW,GAIpB;IACF,yEAAyE;IACzE,qEAAqE;IACrE,yEAAyE;IACzE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACrC,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,2DAA2D;IAC3D,UAAU,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC;IACpD,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,qEAAqE;IACrE,wEAAwE;IACxE,mEAAmE;IACnE,aAAa,EAAE,GAAG,EAAE;QAClB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;YACrJ,MAAM,IAAI,GAAI,aAAa,EAA+B,EAAE,IAAI,CAAC;YACjE,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvB,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;QACrC,KAAK,WAAW;aACb,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;aACtE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;aAClD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IACD,yEAAyE;IACzE,uEAAuE;IACvE,sEAAsE;IACtE,YAAY,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,WAAW,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;QACD,IAAI,CAAC;YACH,WAAW,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"gitvault-prewarm.js","sourceRoot":"","sources":["../../src/node/gitvault-prewarm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,WAAW,GAIpB;IACF,yEAAyE;IACzE,qEAAqE;IACrE,yEAAyE;IACzE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACrC,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,2DAA2D;IAC3D,UAAU,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC;IACpD,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,qEAAqE;IACrE,wEAAwE;IACxE,mEAAmE;IACnE,aAAa,EAAE,GAAG,EAAE;QAClB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;YACrJ,MAAM,IAAI,GAAI,aAAa,EAA+B,EAAE,IAAI,CAAC;YACjE,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvB,CAAC;CACF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;QACrC,KAAK,WAAW;aACb,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;aACtE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;aAClD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,yEAAyE;IACzE,uEAAuE;IACvE,sEAAsE;IACtE,YAAY,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,WAAW,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;QACD,IAAI,CAAC;YACH,WAAW,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -13,6 +13,10 @@ declare class TicketStore {
13
13
  }
14
14
  /** Test-only export of the store (the class itself is not public API). */
15
15
  export { TicketStore as _TicketStoreForTests };
16
+ /** Test/diagnostic-only: the number of real dials to the API origin this process has made. */
17
+ export declare function _apiDialCount(): number;
18
+ /** Test-only: reset the dial counter alongside the dispatcher singleton. */
19
+ export declare function _resetApiDialCount(): void;
16
20
  /** The owned dispatcher — created lazily so config/env resolution happens at first use, once per process. */
17
21
  export declare function sdkDispatcher(): Dispatcher;
18
22
  /** Test-only: drop the singleton so a suite can re-resolve config. */
@@ -1 +1 @@
1
- {"version":3,"file":"http-dispatcher.d.ts","sourceRoot":"","sources":["../../src/node/http-dispatcher.ts"],"names":[],"mappings":"AAoCA,OAAO,EAA6C,KAAK,UAAU,EAAuB,MAAM,QAAQ,CAAC;AAMzG;;;;;GAKG;AACH,cAAM,WAAW;;gBAKH,IAAI,EAAE,MAAM;IAIxB,GAAG,IAAI,MAAM,GAAG,SAAS;IAezB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAY3B;AAiCD,0EAA0E;AAC1E,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,CAAC;AAI/C,6GAA6G;AAC7G,wBAAgB,aAAa,IAAI,UAAU,CA0B1C;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAiDD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,UAAU,CAAC,KAGxC,CAAC"}
1
+ {"version":3,"file":"http-dispatcher.d.ts","sourceRoot":"","sources":["../../src/node/http-dispatcher.ts"],"names":[],"mappings":"AAoCA,OAAO,EAA6C,KAAK,UAAU,EAAuB,MAAM,QAAQ,CAAC;AAMzG;;;;;GAKG;AACH,cAAM,WAAW;;gBAKH,IAAI,EAAE,MAAM;IAIxB,GAAG,IAAI,MAAM,GAAG,SAAS;IAezB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAY3B;AAqCD,0EAA0E;AAC1E,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,CAAC;AAY/C,8FAA8F;AAC9F,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AACD,4EAA4E;AAC5E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAID,6GAA6G;AAC7G,wBAAgB,aAAa,IAAI,UAAU,CA0B1C;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAiDD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,UAAU,CAAC,KAGxC,CAAC"}
@@ -96,6 +96,10 @@ function apiConnector(store) {
96
96
  callback(err, socket);
97
97
  };
98
98
  try {
99
+ apiDialCount += 1;
100
+ if (process.env.RUN402_GITVAULT_TRACE === "1") {
101
+ process.stderr.write(`gitvault-trace: dispatcher-dial #${apiDialCount} ${options.servername ?? options.hostname}\n`);
102
+ }
99
103
  const socket = tlsConnect({
100
104
  host: options.host ?? options.hostname,
101
105
  port: options.port ? Number(options.port) : 443,
@@ -115,6 +119,24 @@ function apiConnector(store) {
115
119
  }
116
120
  /** Test-only export of the store (the class itself is not public API). */
117
121
  export { TicketStore as _TicketStoreForTests };
122
+ /**
123
+ * Dial-vs-reused attribution (gitvault-first-op-premium task 1.1). Every
124
+ * real TCP dial to the API origin increments this — `apiConnector` is the
125
+ * ONLY place undici opens a fresh socket for that origin, so a count that
126
+ * climbs faster than "once per process" proves a connection is dying and
127
+ * being re-dialed rather than genuinely reused across daemon sessions.
128
+ * Cheap (an integer increment) and always counted; the stderr line is
129
+ * gated on `RUN402_GITVAULT_TRACE=1` like every other transport trace.
130
+ */
131
+ let apiDialCount = 0;
132
+ /** Test/diagnostic-only: the number of real dials to the API origin this process has made. */
133
+ export function _apiDialCount() {
134
+ return apiDialCount;
135
+ }
136
+ /** Test-only: reset the dial counter alongside the dispatcher singleton. */
137
+ export function _resetApiDialCount() {
138
+ apiDialCount = 0;
139
+ }
118
140
  let agentSingleton = null;
119
141
  /** The owned dispatcher — created lazily so config/env resolution happens at first use, once per process. */
120
142
  export function sdkDispatcher() {
@@ -1 +1 @@
1
- {"version":3,"file":"http-dispatcher.js","sourceRoot":"","sources":["../../src/node/http-dispatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-dispatcher.js","sourceRoot":"","sources":["../../src/node/http-dispatcher.ts"],"names":[],"mappings":"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"}