pullfrog 0.1.106 → 0.1.107
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.
- package/dist/cli.mjs +1054 -882
- package/dist/index.js +4011 -3839
- package/dist/internal/index.d.ts +4 -2
- package/dist/internal.js +2287 -73
- package/dist/mcp/server.d.ts +2 -0
- package/dist/models.d.ts +34 -10
- package/dist/modes.d.ts +5 -1
- package/dist/utils/isPullfrog.d.ts +13 -1
- package/dist/utils/openCodeModels.d.ts +9 -0
- package/dist/utils/outstandingThreads.d.ts +2 -0
- package/dist/utils/publishedCatalogs.d.ts +50 -0
- package/dist/utils/runContext.d.ts +10 -1
- package/dist/utils/runContextData.d.ts +1 -1
- package/dist/utils/runErrorRenderer.d.ts +2 -0
- package/dist/utils/setup.d.ts +2 -0
- package/dist/utils/version.d.ts +2 -0
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -78971,8 +78971,8 @@ var require_resolve = __commonJS({
|
|
|
78971
78971
|
}
|
|
78972
78972
|
return count;
|
|
78973
78973
|
}
|
|
78974
|
-
function getFullPath(resolver, id = "",
|
|
78975
|
-
if (
|
|
78974
|
+
function getFullPath(resolver, id = "", normalize4) {
|
|
78975
|
+
if (normalize4 !== false)
|
|
78976
78976
|
id = normalizeId(id);
|
|
78977
78977
|
const p = resolver.parse(id);
|
|
78978
78978
|
return _getFullPath(resolver, p);
|
|
@@ -80601,7 +80601,7 @@ var require_fast_uri = __commonJS({
|
|
|
80601
80601
|
}
|
|
80602
80602
|
return stringScheme;
|
|
80603
80603
|
}
|
|
80604
|
-
function
|
|
80604
|
+
function normalize4(uri, options) {
|
|
80605
80605
|
if (typeof uri === "string") {
|
|
80606
80606
|
uri = /** @type {T} */
|
|
80607
80607
|
normalizeString(uri, options);
|
|
@@ -81001,7 +81001,7 @@ var require_fast_uri = __commonJS({
|
|
|
81001
81001
|
}
|
|
81002
81002
|
var fastUri = {
|
|
81003
81003
|
SCHEMES,
|
|
81004
|
-
normalize:
|
|
81004
|
+
normalize: normalize4,
|
|
81005
81005
|
resolve: resolve3,
|
|
81006
81006
|
resolveComponent,
|
|
81007
81007
|
equal,
|
|
@@ -112919,7 +112919,7 @@ var import_picocolors = __toESM(require_picocolors(), 1);
|
|
|
112919
112919
|
// package.json
|
|
112920
112920
|
var package_default = {
|
|
112921
112921
|
name: "pullfrog",
|
|
112922
|
-
version: "0.1.
|
|
112922
|
+
version: "0.1.107",
|
|
112923
112923
|
cliContractVersion: "1",
|
|
112924
112924
|
type: "module",
|
|
112925
112925
|
bin: {
|
|
@@ -116293,7 +116293,7 @@ function rungPosition(params) {
|
|
|
116293
116293
|
function provider(config3) {
|
|
116294
116294
|
return config3;
|
|
116295
116295
|
}
|
|
116296
|
-
var
|
|
116296
|
+
var bundledProviders = {
|
|
116297
116297
|
anthropic: provider({
|
|
116298
116298
|
displayName: "Anthropic",
|
|
116299
116299
|
envVars: ["ANTHROPIC_API_KEY", "CLAUDE_CODE_OAUTH_TOKEN"],
|
|
@@ -116313,7 +116313,8 @@ var providers2 = {
|
|
|
116313
116313
|
// versions (claude-fable-5 was missing there when this was added), so track ~…-latest to
|
|
116314
116314
|
// stay catalog-valid and auto-follow version bumps.
|
|
116315
116315
|
openRouterResolve: "openrouter/~anthropic/claude-fable-latest",
|
|
116316
|
-
subagentModel: "claude-sonnet"
|
|
116316
|
+
subagentModel: "claude-sonnet",
|
|
116317
|
+
pinned: true
|
|
116317
116318
|
},
|
|
116318
116319
|
"claude-opus": {
|
|
116319
116320
|
displayName: "Claude Opus",
|
|
@@ -116371,7 +116372,8 @@ var providers2 = {
|
|
|
116371
116372
|
resolve: "openai/gpt-6.1-sol",
|
|
116372
116373
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
116373
116374
|
openRouterResolve: "openrouter/openai/gpt-6.1-sol-pro",
|
|
116374
|
-
subagentModel: "gpt-sol"
|
|
116375
|
+
subagentModel: "gpt-sol",
|
|
116376
|
+
pinned: true
|
|
116375
116377
|
},
|
|
116376
116378
|
// gpt-5.6's balanced mid-tier. selectable on its own and doubles as Sol's
|
|
116377
116379
|
// cheaper lens-fanout subagent — replaces the old hidden gpt-5.4 target.
|
|
@@ -116559,7 +116561,8 @@ var providers2 = {
|
|
|
116559
116561
|
resolve: "deepseek/deepseek-flash",
|
|
116560
116562
|
effort: ["low", "high", "max"],
|
|
116561
116563
|
openRouterEffort: ["none", "low", "high", "max"],
|
|
116562
|
-
openRouterResolve: "openrouter/deepseek/deepseek-v4.1-flash"
|
|
116564
|
+
openRouterResolve: "openrouter/deepseek/deepseek-v4.1-flash",
|
|
116565
|
+
pinned: true
|
|
116563
116566
|
},
|
|
116564
116567
|
// legacy aliases — deepseek retires these on 2026-07-24; transparently
|
|
116565
116568
|
// upgrade existing users to the v4 family via the fallback chain.
|
|
@@ -116734,7 +116737,8 @@ var providers2 = {
|
|
|
116734
116737
|
resolve: "opencode/claude-fable-5-1",
|
|
116735
116738
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
116736
116739
|
openRouterResolve: "openrouter/~anthropic/claude-fable-latest",
|
|
116737
|
-
subagentModel: "claude-sonnet"
|
|
116740
|
+
subagentModel: "claude-sonnet",
|
|
116741
|
+
pinned: true
|
|
116738
116742
|
},
|
|
116739
116743
|
"claude-opus": {
|
|
116740
116744
|
displayName: "Claude Opus",
|
|
@@ -116782,7 +116786,8 @@ var providers2 = {
|
|
|
116782
116786
|
resolve: "opencode/gpt-6.1-sol",
|
|
116783
116787
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
116784
116788
|
openRouterResolve: "openrouter/openai/gpt-6.1-sol-pro",
|
|
116785
|
-
subagentModel: "gpt-sol"
|
|
116789
|
+
subagentModel: "gpt-sol",
|
|
116790
|
+
pinned: true
|
|
116786
116791
|
},
|
|
116787
116792
|
// gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
|
|
116788
116793
|
"gpt-terra": {
|
|
@@ -116869,7 +116874,8 @@ var providers2 = {
|
|
|
116869
116874
|
// id. k2.6 is the newest build Zen will actually serve, and the mirror
|
|
116870
116875
|
// guard permits the step down because k2.7-code is in ZEN_UNDEPLOYED.
|
|
116871
116876
|
resolve: "opencode/kimi-k2.6",
|
|
116872
|
-
openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
|
|
116877
|
+
openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code",
|
|
116878
|
+
pinned: true
|
|
116873
116879
|
},
|
|
116874
116880
|
// M3 is its own line beside M2, not a bump of it — same reason `kimi-k3`
|
|
116875
116881
|
// sits beside `kimi-k2` rather than replacing it.
|
|
@@ -117338,13 +117344,15 @@ var providers2 = {
|
|
|
117338
117344
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
117339
117345
|
openRouterResolve: "openrouter/~anthropic/claude-opus-latest",
|
|
117340
117346
|
preferred: true,
|
|
117341
|
-
subagentModel: "claude-sonnet"
|
|
117347
|
+
subagentModel: "claude-sonnet",
|
|
117348
|
+
pinned: true
|
|
117342
117349
|
},
|
|
117343
117350
|
"claude-sonnet": {
|
|
117344
117351
|
displayName: "Claude Sonnet",
|
|
117345
117352
|
resolve: "openrouter/~anthropic/claude-sonnet-latest",
|
|
117346
117353
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
117347
|
-
openRouterResolve: "openrouter/~anthropic/claude-sonnet-latest"
|
|
117354
|
+
openRouterResolve: "openrouter/~anthropic/claude-sonnet-latest",
|
|
117355
|
+
pinned: true
|
|
117348
117356
|
},
|
|
117349
117357
|
"claude-haiku": {
|
|
117350
117358
|
displayName: "Claude Haiku",
|
|
@@ -117352,7 +117360,8 @@ var providers2 = {
|
|
|
117352
117360
|
// the rolling alias moved to Haiku 5.5 on 2026-10-07, which publishes
|
|
117353
117361
|
// the ladder Haiku 4.5 did not.
|
|
117354
117362
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
117355
|
-
openRouterResolve: "openrouter/~anthropic/claude-haiku-latest"
|
|
117363
|
+
openRouterResolve: "openrouter/~anthropic/claude-haiku-latest",
|
|
117364
|
+
pinned: true
|
|
117356
117365
|
},
|
|
117357
117366
|
// pinned to the explicit Sol/Terra/Luna tiers (not the ~openai/gpt-latest
|
|
117358
117367
|
// rolling alias): after that rename, ~gpt-mini-latest no longer maps
|
|
@@ -117379,7 +117388,8 @@ var providers2 = {
|
|
|
117379
117388
|
resolve: "openrouter/openai/gpt-6.1-sol-pro",
|
|
117380
117389
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
117381
117390
|
openRouterResolve: "openrouter/openai/gpt-6.1-sol-pro",
|
|
117382
|
-
subagentModel: "gpt-sol"
|
|
117391
|
+
subagentModel: "gpt-sol",
|
|
117392
|
+
pinned: true
|
|
117383
117393
|
},
|
|
117384
117394
|
// gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
|
|
117385
117395
|
"gpt-terra": {
|
|
@@ -117444,8 +117454,9 @@ var providers2 = {
|
|
|
117444
117454
|
displayName: "Gemini Pro",
|
|
117445
117455
|
resolve: "openrouter/~google/gemini-pro-latest",
|
|
117446
117456
|
effort: ["low", "medium", "high"],
|
|
117447
|
-
openRouterResolve: "openrouter/~google/gemini-pro-latest"
|
|
117457
|
+
openRouterResolve: "openrouter/~google/gemini-pro-latest",
|
|
117448
117458
|
// Inherit — see google/gemini-pro for rationale.
|
|
117459
|
+
pinned: true
|
|
117449
117460
|
},
|
|
117450
117461
|
"gemini-flash": {
|
|
117451
117462
|
displayName: "Gemini Flash",
|
|
@@ -117454,7 +117465,8 @@ var providers2 = {
|
|
|
117454
117465
|
// entry tracks its siblings' generation bumps for free. the ladder still
|
|
117455
117466
|
// mirrors exactly: claude-code hard-errors on an out-of-range `--effort`.
|
|
117456
117467
|
effort: ["low", "medium", "high"],
|
|
117457
|
-
openRouterResolve: "openrouter/~google/gemini-flash-latest"
|
|
117468
|
+
openRouterResolve: "openrouter/~google/gemini-flash-latest",
|
|
117469
|
+
pinned: true
|
|
117458
117470
|
},
|
|
117459
117471
|
grok: {
|
|
117460
117472
|
displayName: "Grok",
|
|
@@ -117477,7 +117489,8 @@ var providers2 = {
|
|
|
117477
117489
|
displayName: "DeepSeek Flash",
|
|
117478
117490
|
resolve: "openrouter/deepseek/deepseek-v4.1-flash",
|
|
117479
117491
|
effort: ["none", "low", "high", "max"],
|
|
117480
|
-
openRouterResolve: "openrouter/deepseek/deepseek-v4.1-flash"
|
|
117492
|
+
openRouterResolve: "openrouter/deepseek/deepseek-v4.1-flash",
|
|
117493
|
+
pinned: true
|
|
117481
117494
|
},
|
|
117482
117495
|
// legacy alias — deepseek retires this on 2026-07-24; transparently
|
|
117483
117496
|
// upgrade existing users to the v4 family via the fallback chain.
|
|
@@ -117634,6 +117647,7 @@ var providers2 = {
|
|
|
117634
117647
|
}
|
|
117635
117648
|
})
|
|
117636
117649
|
};
|
|
117650
|
+
var providers2 = bundledProviders;
|
|
117637
117651
|
function parseModel(slug2) {
|
|
117638
117652
|
const slashIdx = slug2.indexOf("/");
|
|
117639
117653
|
if (slashIdx === -1) {
|
|
@@ -117672,27 +117686,30 @@ var CLAUDE_CODE_ONLY_CREDENTIALS = ["ANTHROPIC_AUTH_TOKEN", "CLAUDE_CODE_OAUTH_T
|
|
|
117672
117686
|
function getOpenCodeEnvVars(slug2) {
|
|
117673
117687
|
return getModelEnvVars(slug2).filter((v) => !CLAUDE_CODE_ONLY_CREDENTIALS.includes(v));
|
|
117674
117688
|
}
|
|
117675
|
-
|
|
117676
|
-
|
|
117677
|
-
|
|
117678
|
-
|
|
117679
|
-
|
|
117680
|
-
|
|
117681
|
-
|
|
117682
|
-
|
|
117683
|
-
|
|
117684
|
-
|
|
117685
|
-
|
|
117686
|
-
|
|
117687
|
-
|
|
117688
|
-
|
|
117689
|
-
|
|
117690
|
-
|
|
117691
|
-
|
|
117692
|
-
|
|
117693
|
-
|
|
117694
|
-
|
|
117695
|
-
)
|
|
117689
|
+
function flattenAliases(source) {
|
|
117690
|
+
return Object.entries(source).flatMap(
|
|
117691
|
+
([providerKey, config3]) => Object.entries(config3.models).map(([modelId, def]) => ({
|
|
117692
|
+
slug: `${providerKey}/${modelId}`,
|
|
117693
|
+
provider: providerKey,
|
|
117694
|
+
displayName: def.displayName,
|
|
117695
|
+
description: def.description,
|
|
117696
|
+
resolve: def.resolve,
|
|
117697
|
+
openRouterResolve: def.openRouterResolve,
|
|
117698
|
+
preferred: def.preferred ?? false,
|
|
117699
|
+
isFree: def.isFree ?? false,
|
|
117700
|
+
fallback: def.fallback,
|
|
117701
|
+
routing: def.routing,
|
|
117702
|
+
// subagentModel is stored as an alias key local to the provider; expand
|
|
117703
|
+
// here to a fully-qualified slug so callers can look up the target alias
|
|
117704
|
+
// directly without re-deriving the provider.
|
|
117705
|
+
subagentModel: def.subagentModel ? `${providerKey}/${def.subagentModel}` : void 0,
|
|
117706
|
+
effort: def.effort,
|
|
117707
|
+
openRouterEffort: def.openRouterEffort,
|
|
117708
|
+
hidden: def.hidden ?? false
|
|
117709
|
+
}))
|
|
117710
|
+
);
|
|
117711
|
+
}
|
|
117712
|
+
var modelAliases = flattenAliases(providers2);
|
|
117696
117713
|
var AUTO_EFFICIENT = "auto/efficient";
|
|
117697
117714
|
var AUTO_INTELLIGENT = "auto/intelligent";
|
|
117698
117715
|
var AUTO_TIER_TARGET = {
|
|
@@ -117764,9 +117781,7 @@ function autoLadder(slug2) {
|
|
|
117764
117781
|
const target = slug2.slice(AUTO_PREFIX.length);
|
|
117765
117782
|
return target === "router" ? ROUTER_LADDER : PROVIDER_LADDERS[target];
|
|
117766
117783
|
}
|
|
117767
|
-
var ROUTED_PROVIDERS
|
|
117768
|
-
PROVIDER_LADDERS
|
|
117769
|
-
).map((key) => ({ key, displayName: providers2[key].displayName }));
|
|
117784
|
+
var ROUTED_PROVIDERS;
|
|
117770
117785
|
function isCardGatedModel(slug2) {
|
|
117771
117786
|
return resolveOpenRouterModel(slug2) !== void 0;
|
|
117772
117787
|
}
|
|
@@ -117804,27 +117819,21 @@ function resolveModelRung(params) {
|
|
|
117804
117819
|
if (!published) return void 0;
|
|
117805
117820
|
return resolveRung({ position: params.position, published });
|
|
117806
117821
|
}
|
|
117807
|
-
var
|
|
117808
|
-
|
|
117809
|
-
|
|
117810
|
-
|
|
117811
|
-
var DEFAULT_PROXY_MODEL = defaultProxyAlias.openRouterResolve;
|
|
117812
|
-
var defaultProxyDisplayName = defaultProxyAlias.displayName;
|
|
117813
|
-
var trialProxyAlias = resolveDisplayAlias("openai/gpt-luna");
|
|
117814
|
-
if (!trialProxyAlias?.openRouterResolve) {
|
|
117815
|
-
throw new Error("TRIAL_PROXY_MODEL: openai/gpt-luna has no openRouterResolve");
|
|
117816
|
-
}
|
|
117817
|
-
var TRIAL_PROXY_MODEL = trialProxyAlias.openRouterResolve;
|
|
117818
|
-
var TRIAL_PROXY_DISPLAY_NAME = trialProxyAlias.displayName;
|
|
117822
|
+
var DEFAULT_PROXY_MODEL;
|
|
117823
|
+
var defaultProxyDisplayName;
|
|
117824
|
+
var TRIAL_PROXY_MODEL;
|
|
117825
|
+
var TRIAL_PROXY_DISPLAY_NAME;
|
|
117819
117826
|
var TRIAL_FUNDED_USD_LIMIT = 10;
|
|
117820
|
-
|
|
117821
|
-
const
|
|
117822
|
-
|
|
117823
|
-
const
|
|
117824
|
-
|
|
117825
|
-
|
|
117827
|
+
function checkLadders() {
|
|
117828
|
+
for (const [name, ladder] of Object.entries({ ...PROVIDER_LADDERS, router: ROUTER_LADDER })) {
|
|
117829
|
+
const terminal = /* @__PURE__ */ new Set();
|
|
117830
|
+
for (const slug2 of Object.values(ladder)) {
|
|
117831
|
+
const alias = resolveDisplayAlias(slug2);
|
|
117832
|
+
if (!alias) throw new Error(`${name} ladder names unknown alias ${slug2}`);
|
|
117833
|
+
terminal.add(alias.slug);
|
|
117834
|
+
}
|
|
117835
|
+
if (terminal.size < 2) throw new Error(`${name} ladder runs every tier on ${[...terminal][0]}`);
|
|
117826
117836
|
}
|
|
117827
|
-
if (terminal.size < 2) throw new Error(`${name} ladder runs every tier on ${[...terminal][0]}`);
|
|
117828
117837
|
}
|
|
117829
117838
|
var OSS_MODEL_ALLOWLIST = [
|
|
117830
117839
|
// opt-in: 0.86x the old default on the measured mix, and Meta trains on the
|
|
@@ -117839,13 +117848,46 @@ var OSS_RECOMMENDED_MODEL = AUTO_TIER_TARGET[AUTO_EFFICIENT];
|
|
|
117839
117848
|
function ossFundedModelNames() {
|
|
117840
117849
|
return OSS_MODEL_ALLOWLIST.map((slug2) => resolveDisplayAlias(slug2)?.displayName ?? slug2);
|
|
117841
117850
|
}
|
|
117842
|
-
var ossAllowedTargets
|
|
117843
|
-
|
|
117851
|
+
var ossAllowedTargets;
|
|
117852
|
+
function deriveFromProviders() {
|
|
117853
|
+
const efficient = resolveDisplayAlias(AUTO_EFFICIENT);
|
|
117854
|
+
if (!efficient?.openRouterResolve) {
|
|
117855
|
+
throw new Error(`DEFAULT_PROXY_MODEL: ${AUTO_EFFICIENT} has no openRouterResolve`);
|
|
117856
|
+
}
|
|
117857
|
+
const trial = resolveDisplayAlias("openai/gpt-luna");
|
|
117858
|
+
if (!trial?.openRouterResolve) {
|
|
117859
|
+
throw new Error("TRIAL_PROXY_MODEL: openai/gpt-luna has no openRouterResolve");
|
|
117860
|
+
}
|
|
117861
|
+
checkLadders();
|
|
117862
|
+
const allowed = OSS_MODEL_ALLOWLIST.map((slug2) => {
|
|
117844
117863
|
const target = resolveOpenRouterModel(slug2);
|
|
117845
117864
|
if (!target) throw new Error(`OSS_MODEL_ALLOWLIST: ${slug2} has no openRouterResolve`);
|
|
117846
117865
|
return target;
|
|
117847
|
-
})
|
|
117848
|
-
|
|
117866
|
+
});
|
|
117867
|
+
DEFAULT_PROXY_MODEL = efficient.openRouterResolve;
|
|
117868
|
+
defaultProxyDisplayName = efficient.displayName;
|
|
117869
|
+
TRIAL_PROXY_MODEL = trial.openRouterResolve;
|
|
117870
|
+
TRIAL_PROXY_DISPLAY_NAME = trial.displayName;
|
|
117871
|
+
ossAllowedTargets = new Set(allowed);
|
|
117872
|
+
ROUTED_PROVIDERS = Object.keys(PROVIDER_LADDERS).map((key) => ({
|
|
117873
|
+
key,
|
|
117874
|
+
displayName: providers2[key]?.displayName ?? key
|
|
117875
|
+
}));
|
|
117876
|
+
}
|
|
117877
|
+
deriveFromProviders();
|
|
117878
|
+
function installProviders(next2) {
|
|
117879
|
+
const previous = providers2;
|
|
117880
|
+
try {
|
|
117881
|
+
providers2 = next2;
|
|
117882
|
+
modelAliases = flattenAliases(next2);
|
|
117883
|
+
deriveFromProviders();
|
|
117884
|
+
} catch (error63) {
|
|
117885
|
+
providers2 = previous;
|
|
117886
|
+
modelAliases = flattenAliases(previous);
|
|
117887
|
+
deriveFromProviders();
|
|
117888
|
+
throw error63;
|
|
117889
|
+
}
|
|
117890
|
+
}
|
|
117849
117891
|
function isOssAllowedModel(slug2) {
|
|
117850
117892
|
if (!slug2) return false;
|
|
117851
117893
|
const target = resolveOpenRouterModel(slug2);
|
|
@@ -118054,12 +118096,15 @@ function createProcessOutputActivityTimeout(ctx) {
|
|
|
118054
118096
|
|
|
118055
118097
|
// utils/claudeSubscription.ts
|
|
118056
118098
|
var CLAUDE_CODE_IDENTITY = "You are Claude Code, Anthropic's official CLI for Claude.";
|
|
118057
|
-
|
|
118058
|
-
|
|
118059
|
-
|
|
118099
|
+
function fallbackProbeModel() {
|
|
118100
|
+
const resolve3 = resolveModelSlug("anthropic/claude-haiku");
|
|
118101
|
+
if (!resolve3) {
|
|
118102
|
+
throw new Error("claudeSubscription preflight: anthropic/claude-haiku missing from registry");
|
|
118103
|
+
}
|
|
118104
|
+
return resolve3.slice(resolve3.indexOf("/") + 1);
|
|
118060
118105
|
}
|
|
118061
|
-
var FALLBACK_PROBE_MODEL = fallbackResolve.slice(fallbackResolve.indexOf("/") + 1);
|
|
118062
118106
|
async function preflightClaudeSubscription(params) {
|
|
118107
|
+
const model = params.model ?? fallbackProbeModel();
|
|
118063
118108
|
let res;
|
|
118064
118109
|
try {
|
|
118065
118110
|
res = await fetch("https://api.anthropic.com/v1/messages", {
|
|
@@ -118072,7 +118117,7 @@ async function preflightClaudeSubscription(params) {
|
|
|
118072
118117
|
"x-app": "cli"
|
|
118073
118118
|
},
|
|
118074
118119
|
body: JSON.stringify({
|
|
118075
|
-
model
|
|
118120
|
+
model,
|
|
118076
118121
|
max_tokens: 1,
|
|
118077
118122
|
system: CLAUDE_CODE_IDENTITY,
|
|
118078
118123
|
messages: [{ role: "user", content: "ok" }]
|
|
@@ -118756,6 +118801,10 @@ function getDevDependencyVersion(name) {
|
|
|
118756
118801
|
}
|
|
118757
118802
|
return version3;
|
|
118758
118803
|
}
|
|
118804
|
+
var HARNESS_PACKAGES = ["@anthropic-ai/claude-code", "@openai/codex", "opencode-ai"];
|
|
118805
|
+
function getHarnessPins() {
|
|
118806
|
+
return Object.fromEntries(HARNESS_PACKAGES.map((name) => [name, getDevDependencyVersion(name)]));
|
|
118807
|
+
}
|
|
118759
118808
|
|
|
118760
118809
|
// utils/skills.ts
|
|
118761
118810
|
var skillsVersion = getDevDependencyVersion("skills");
|
|
@@ -119424,8 +119473,12 @@ Every body \`### \` section carries one; an inline comment carries one when its
|
|
|
119424
119473
|
The 4-backtick fence lets the block hold its own 3-backtick fences and stay one-click copyable. Skip the optional sections when they'd add nothing.
|
|
119425
119474
|
|
|
119426
119475
|
Backtick-wrap identifiers and file names. Don't repeat diff content, don't include raw \`+123 / -45\` stats, no changelog, no horizontal rules, and no \`### Key changes\` / \`### Issues found\` / \`<b>TL;DR</b>\` heading \u2014 each \`### \` heading IS the issue.`;
|
|
119427
|
-
function computeModes(
|
|
119476
|
+
function computeModes(params) {
|
|
119477
|
+
const agentId = params.agentId;
|
|
119478
|
+
const signedCommits = params.signedCommits ?? false;
|
|
119479
|
+
const botLogin = params.botLogin ?? "pullfrog[bot]";
|
|
119428
119480
|
const t2 = (toolName) => formatMcpToolRef(agentId, toolName);
|
|
119481
|
+
const selfAuthor = botLogin === "pullfrog[bot]" ? "`author=pullfrog[bot]`" : `\`author=${botLogin}\` or \`author=pullfrog[bot]\``;
|
|
119429
119482
|
const commitStep = signedCommits ? `commit via \`${t2("commit_changes")}\` \u2014 it lands a GitHub-signed commit directly on the remote branch (no push step)` : `commit locally via shell (\`git add . && git commit -m "..."\`)`;
|
|
119430
119483
|
const finalizeStep = signedCommits ? `confirm a clean working tree (\`git status\`) \u2014 your \`${t2("commit_changes")}\` calls already landed the work on the remote` : `confirm a clean working tree, then push via \`${t2("push_branch")}\``;
|
|
119431
119484
|
return [
|
|
@@ -119599,7 +119652,7 @@ ${PR_SUMMARY_FORMAT}`
|
|
|
119599
119652
|
|
|
119600
119653
|
4. **prior feedback \u2014 read AND retire it**: fetch previous reviews via \`${t2("list_pull_request_reviews")}\`, then call \`${t2("get_review_comments")}\` on each prior Pullfrog review. Each thread renders as a section whose first line is a fenced tag \`comment author=<login> id=<fullDatabaseId> review=<reviewId> thread=<graphqlId>\`; section headers carry \`[RESOLVED]\` / \`[OUTDATED]\` when relevant. For every **open, Pullfrog-originated** thread, decide and act:
|
|
119601
119654
|
|
|
119602
|
-
- **Pullfrog-originated** means the FIRST \`comment author=...\` tag in the section is
|
|
119655
|
+
- **Pullfrog-originated** means the FIRST \`comment author=...\` tag in the section is ${selfAuthor}. The \`*\` marker on individual comments is unrelated \u2014 it flags whether a comment belongs to the queried review, not whether it is the thread root.
|
|
119603
119656
|
- **addressed?** read the file at the thread's anchor and judge whether the substantive concern is now resolved by the new commits. Lines being modified isn't enough: reformatting, renaming, or moving the same code elsewhere doesn't address a concern. If the comment raised multiple distinct concerns, ALL must be addressed. The \`[OUTDATED]\` tag means GitHub moved the anchor (line shift, force-push, rename) \u2014 it does NOT mean the concern was addressed; re-read the code at its new location before deciding.
|
|
119604
119657
|
- **if addressed**: call \`${t2("reply_to_review_comment")}\` with the root tag's numeric \`id=\` as \`comment_id\` (NOT the \`thread=\` value \u2014 that's a separate GraphQL ID used only by resolve) and a one-line body (e.g. \`Addressed in <short-sha>.\`), then call \`${t2("resolve_review_thread")}\` with the root tag's \`thread=\` value as \`thread_id\`. Do this BEFORE drafting the new review so the GitHub thread state aligns with the new review by the time it lands.
|
|
119605
119658
|
- **if uncertain or partially addressed**: leave open. False-positive resolutions erode trust faster than false negatives.
|
|
@@ -119740,7 +119793,7 @@ ${PR_SUMMARY_FORMAT}`
|
|
|
119740
119793
|
}
|
|
119741
119794
|
];
|
|
119742
119795
|
}
|
|
119743
|
-
var modes = computeModes("opencode");
|
|
119796
|
+
var modes = computeModes({ agentId: "opencode" });
|
|
119744
119797
|
var NON_COMMITTING_MODES = /* @__PURE__ */ new Set([
|
|
119745
119798
|
"Review",
|
|
119746
119799
|
"IncrementalReview",
|
|
@@ -121960,7 +122013,7 @@ var codex = agent({
|
|
|
121960
122013
|
|
|
121961
122014
|
// agents/opencode.ts
|
|
121962
122015
|
import { spawn as nodeSpawn2 } from "node:child_process";
|
|
121963
|
-
import { mkdirSync as
|
|
122016
|
+
import { mkdirSync as mkdirSync8, writeFileSync as writeFileSync8 } from "node:fs";
|
|
121964
122017
|
import { totalmem } from "node:os";
|
|
121965
122018
|
import { join as join9 } from "node:path";
|
|
121966
122019
|
import { performance as performance7 } from "node:perf_hooks";
|
|
@@ -127373,10 +127426,770 @@ var import_undici2 = __toESM(require_undici2(), 1);
|
|
|
127373
127426
|
|
|
127374
127427
|
// utils/openCodeModels.ts
|
|
127375
127428
|
import { spawnSync as spawnSync4 } from "node:child_process";
|
|
127429
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
127430
|
+
import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync7 } from "node:fs";
|
|
127376
127431
|
import { join as join8 } from "node:path";
|
|
127432
|
+
|
|
127433
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/cache/adapter.js
|
|
127434
|
+
var AdapterError = class extends Error {
|
|
127435
|
+
/** the adapter method that failed */
|
|
127436
|
+
method;
|
|
127437
|
+
/** the full store key, or the op's prefix when the call covered many keys. never the raw input. */
|
|
127438
|
+
key;
|
|
127439
|
+
constructor(method, key, cause) {
|
|
127440
|
+
super(`cache ${method} failed for ${key}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
127441
|
+
this.name = "AdapterError";
|
|
127442
|
+
this.method = method;
|
|
127443
|
+
this.key = key;
|
|
127444
|
+
}
|
|
127445
|
+
};
|
|
127446
|
+
|
|
127447
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/cache/memory.js
|
|
127448
|
+
function memory({ maxItems = 1e3 } = {}) {
|
|
127449
|
+
const store = /* @__PURE__ */ new Map();
|
|
127450
|
+
const peek = (key) => {
|
|
127451
|
+
const slot = store.get(key);
|
|
127452
|
+
if (slot === void 0)
|
|
127453
|
+
return;
|
|
127454
|
+
if (slot.until > Date.now())
|
|
127455
|
+
return slot;
|
|
127456
|
+
store.delete(key);
|
|
127457
|
+
};
|
|
127458
|
+
const evict = () => {
|
|
127459
|
+
for (const [key, slot] of store) {
|
|
127460
|
+
store.delete(key);
|
|
127461
|
+
if (!slot.used)
|
|
127462
|
+
return;
|
|
127463
|
+
slot.used = false;
|
|
127464
|
+
store.set(key, slot);
|
|
127465
|
+
}
|
|
127466
|
+
};
|
|
127467
|
+
return {
|
|
127468
|
+
get: (key) => {
|
|
127469
|
+
const slot = peek(key);
|
|
127470
|
+
if (slot === void 0)
|
|
127471
|
+
return;
|
|
127472
|
+
slot.used = true;
|
|
127473
|
+
return slot.entry;
|
|
127474
|
+
},
|
|
127475
|
+
peek: (key) => peek(key)?.entry,
|
|
127476
|
+
// the TTL rides on each entry, so ops with different lifetimes can share one store
|
|
127477
|
+
// evicted before the new slot goes in, so the entry being written is never the one dropped: after it, a full store
|
|
127478
|
+
// whose every slot was read would pass each over and drop the new, unread one
|
|
127479
|
+
set: (key, entry, ttlMs) => {
|
|
127480
|
+
store.delete(key);
|
|
127481
|
+
if (store.size >= maxItems)
|
|
127482
|
+
evict();
|
|
127483
|
+
store.set(key, { entry, until: Date.now() + ttlMs, used: false });
|
|
127484
|
+
},
|
|
127485
|
+
delete: (keys) => {
|
|
127486
|
+
for (const key of keys)
|
|
127487
|
+
store.delete(key);
|
|
127488
|
+
},
|
|
127489
|
+
// a snapshot, so deleting while iterating is safe
|
|
127490
|
+
list: (prefix) => {
|
|
127491
|
+
const now = Date.now();
|
|
127492
|
+
const listed = [];
|
|
127493
|
+
for (const [key, slot] of store)
|
|
127494
|
+
if (slot.until > now && key.startsWith(prefix))
|
|
127495
|
+
listed.push([key, slot.entry]);
|
|
127496
|
+
return listed;
|
|
127497
|
+
}
|
|
127498
|
+
};
|
|
127499
|
+
}
|
|
127500
|
+
|
|
127501
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/issues.js
|
|
127502
|
+
function issueJSON(issue4) {
|
|
127503
|
+
const segments = issue4.path ?? [];
|
|
127504
|
+
const path4 = [];
|
|
127505
|
+
for (let i2 = 0; i2 < segments.length; i2++) {
|
|
127506
|
+
const segment = segments[i2];
|
|
127507
|
+
const wrapped = typeof segment === "object" && segment !== null;
|
|
127508
|
+
const key = wrapped ? segment.key : segment;
|
|
127509
|
+
if (typeof key === "string" || typeof key === "number" && Number.isFinite(key))
|
|
127510
|
+
path4.push(key);
|
|
127511
|
+
else if (typeof key === "symbol")
|
|
127512
|
+
path4.push(String(key));
|
|
127513
|
+
else if (!(wrapped && key === null && segment.type === "set"))
|
|
127514
|
+
break;
|
|
127515
|
+
}
|
|
127516
|
+
const { keyword } = issue4;
|
|
127517
|
+
return typeof keyword === "string" ? { message: issue4.message, path: path4, keyword } : { message: issue4.message, path: path4 };
|
|
127518
|
+
}
|
|
127519
|
+
function issuesJSON(issues) {
|
|
127520
|
+
const out = [];
|
|
127521
|
+
for (let i2 = 0; i2 < issues.length; i2++)
|
|
127522
|
+
if (issues[i2])
|
|
127523
|
+
out.push(issueJSON(issues[i2]));
|
|
127524
|
+
return out;
|
|
127525
|
+
}
|
|
127526
|
+
var identifier = /^[A-Za-z_$][\w$]*$/;
|
|
127527
|
+
var longestKey = 40;
|
|
127528
|
+
function renderPath(path4) {
|
|
127529
|
+
let out = "";
|
|
127530
|
+
for (const key of path4) {
|
|
127531
|
+
if (typeof key === "number")
|
|
127532
|
+
out += `[${key}]`;
|
|
127533
|
+
else if (key.length <= longestKey && identifier.test(key))
|
|
127534
|
+
out += out ? `.${key}` : key;
|
|
127535
|
+
else
|
|
127536
|
+
out += `[${JSON.stringify(key.length <= longestKey ? key : `${key.slice(0, longestKey)}\u2026`)}]`;
|
|
127537
|
+
}
|
|
127538
|
+
return out;
|
|
127539
|
+
}
|
|
127540
|
+
var shown = 10;
|
|
127541
|
+
function summary2(issues, truncated2) {
|
|
127542
|
+
const lines = [];
|
|
127543
|
+
let i2 = 0;
|
|
127544
|
+
for (; i2 < issues.length && lines.length < shown; i2++) {
|
|
127545
|
+
const issue4 = issues[i2];
|
|
127546
|
+
if (!issue4)
|
|
127547
|
+
continue;
|
|
127548
|
+
const { message: message2, path: path4 } = issueJSON(issue4);
|
|
127549
|
+
lines.push(path4.length ? `${renderPath(path4)}: ${message2}` : message2);
|
|
127550
|
+
}
|
|
127551
|
+
let more = 0;
|
|
127552
|
+
for (; i2 < issues.length; i2++)
|
|
127553
|
+
if (issues[i2])
|
|
127554
|
+
more++;
|
|
127555
|
+
if (more > 0)
|
|
127556
|
+
lines.push(truncated2 ? `and over ${more} more` : `and ${more} more`);
|
|
127557
|
+
else if (truncated2)
|
|
127558
|
+
lines.push("and more");
|
|
127559
|
+
return `validation failed: ${lines.join("; ")}`;
|
|
127560
|
+
}
|
|
127561
|
+
var ValidationError = class extends Error {
|
|
127562
|
+
name = "ValidationError";
|
|
127563
|
+
constructor(result) {
|
|
127564
|
+
super(message(result));
|
|
127565
|
+
Object.defineProperty(this, "result", { value: result });
|
|
127566
|
+
Object.assign(this, { issues: result.issues });
|
|
127567
|
+
}
|
|
127568
|
+
/**
|
|
127569
|
+
* The error as plain data, each issue projected to its message, path and keyword, so what else a validator keeps on
|
|
127570
|
+
* one (Valibot's and Zod's `input`) is left out. The messages are the validator's own, and some quote the value.
|
|
127571
|
+
*/
|
|
127572
|
+
toJSON() {
|
|
127573
|
+
const json4 = { name: "ValidationError", message: this.message, issues: issuesJSON(this.issues) };
|
|
127574
|
+
return truncated(this.result) ? { ...json4, truncated: true } : json4;
|
|
127575
|
+
}
|
|
127576
|
+
};
|
|
127577
|
+
function message(result) {
|
|
127578
|
+
try {
|
|
127579
|
+
return ownSummary(result) ?? summary2(result.issues, truncated(result));
|
|
127580
|
+
} catch {
|
|
127581
|
+
return "validation failed";
|
|
127582
|
+
}
|
|
127583
|
+
}
|
|
127584
|
+
function ownSummary(result) {
|
|
127585
|
+
const own2 = result;
|
|
127586
|
+
return typeof own2.message === "string" ? own2.message : typeof own2.summary === "string" ? own2.summary : void 0;
|
|
127587
|
+
}
|
|
127588
|
+
var truncated = (result) => result.truncated === true;
|
|
127589
|
+
|
|
127590
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/env.js
|
|
127591
|
+
var debugging = () => debug2 ??= read();
|
|
127592
|
+
var read = () => {
|
|
127593
|
+
try {
|
|
127594
|
+
return globalThis.process?.env?.LOG_LEVEL === "debug";
|
|
127595
|
+
} catch {
|
|
127596
|
+
return false;
|
|
127597
|
+
}
|
|
127598
|
+
};
|
|
127599
|
+
var debug2;
|
|
127600
|
+
|
|
127601
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/hash-node.js
|
|
127602
|
+
import { createRequire } from "node:module";
|
|
127603
|
+
var sha1 = (text) => {
|
|
127604
|
+
crypto3 ??= load();
|
|
127605
|
+
return crypto3.hash("sha1", text);
|
|
127606
|
+
};
|
|
127607
|
+
var crypto3;
|
|
127608
|
+
var load = () => globalThis.process?.getBuiltinModule?.("node:crypto") ?? createRequire("/")("node:crypto");
|
|
127609
|
+
|
|
127610
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/key.js
|
|
127611
|
+
function cacheKey(value2) {
|
|
127612
|
+
if (value2 === null)
|
|
127613
|
+
throw new Error("null cannot be part of a cache key");
|
|
127614
|
+
if (value2 === void 0)
|
|
127615
|
+
return "~void";
|
|
127616
|
+
const json4 = canonical(value2);
|
|
127617
|
+
return json4.length > longKey ? `#${sha1(json4)}` : json4;
|
|
127618
|
+
}
|
|
127619
|
+
var longKey = 4096;
|
|
127620
|
+
function hashKey(key) {
|
|
127621
|
+
if (key === "~void")
|
|
127622
|
+
return key;
|
|
127623
|
+
return key[0] === "#" ? key.slice(1) : sha1(key);
|
|
127624
|
+
}
|
|
127625
|
+
function canonical(value2) {
|
|
127626
|
+
return serialize(value2, 0);
|
|
127627
|
+
}
|
|
127628
|
+
function serialize(value2, depth) {
|
|
127629
|
+
switch (typeof value2) {
|
|
127630
|
+
case "number":
|
|
127631
|
+
if (Number.isFinite(value2))
|
|
127632
|
+
return String(value2);
|
|
127633
|
+
throw new Error(`${value2} cannot be part of a cache key`);
|
|
127634
|
+
case "string":
|
|
127635
|
+
case "boolean":
|
|
127636
|
+
return JSON.stringify(value2);
|
|
127637
|
+
case "undefined":
|
|
127638
|
+
throw new Error("undefined cannot be part of a cache key, except as an object property");
|
|
127639
|
+
case "object":
|
|
127640
|
+
break;
|
|
127641
|
+
default:
|
|
127642
|
+
throw new Error(`a ${typeof value2} cannot be part of a cache key`);
|
|
127643
|
+
}
|
|
127644
|
+
if (value2 === null)
|
|
127645
|
+
return "null";
|
|
127646
|
+
if (depth++ === 64)
|
|
127647
|
+
throw new Error("an input nested more than 64 levels deep, or circular");
|
|
127648
|
+
if (Array.isArray(value2)) {
|
|
127649
|
+
let out2 = "[";
|
|
127650
|
+
for (let i2 = 0; i2 < value2.length; i2++)
|
|
127651
|
+
out2 += `${i2 ? "," : ""}${serialize(value2[i2], depth)}`;
|
|
127652
|
+
return `${out2}]`;
|
|
127653
|
+
}
|
|
127654
|
+
const proto = Object.getPrototypeOf(value2);
|
|
127655
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
127656
|
+
const name = proto.constructor?.name || "class instance";
|
|
127657
|
+
throw new Error(`a ${name} cannot be part of a cache key: only JSON data can`);
|
|
127658
|
+
}
|
|
127659
|
+
let out = "";
|
|
127660
|
+
for (const key of Object.keys(value2).sort()) {
|
|
127661
|
+
const v = value2[key];
|
|
127662
|
+
if (v !== void 0)
|
|
127663
|
+
out += `${out ? "," : ""}${JSON.stringify(key)}:${serialize(v, depth)}`;
|
|
127664
|
+
}
|
|
127665
|
+
return `{${out}}`;
|
|
127666
|
+
}
|
|
127667
|
+
|
|
127668
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/plain.js
|
|
127669
|
+
var isPlain = (value2) => {
|
|
127670
|
+
if (typeof value2 !== "object" || value2 === null)
|
|
127671
|
+
return false;
|
|
127672
|
+
const proto = Object.getPrototypeOf(value2);
|
|
127673
|
+
return proto === Object.prototype || proto === null;
|
|
127674
|
+
};
|
|
127675
|
+
|
|
127676
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/sleep.js
|
|
127677
|
+
function sleep(ms, signal) {
|
|
127678
|
+
return new Promise((resolve3) => {
|
|
127679
|
+
if (signal?.aborted)
|
|
127680
|
+
return resolve3();
|
|
127681
|
+
const done = () => {
|
|
127682
|
+
clearTimeout(timer);
|
|
127683
|
+
signal?.removeEventListener("abort", done);
|
|
127684
|
+
resolve3();
|
|
127685
|
+
};
|
|
127686
|
+
const timer = setTimeout(done, ms);
|
|
127687
|
+
signal?.addEventListener("abort", done, { once: true });
|
|
127688
|
+
});
|
|
127689
|
+
}
|
|
127690
|
+
|
|
127691
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/api.js
|
|
127692
|
+
function backoff(schedule, attempt) {
|
|
127693
|
+
const d = schedule[attempt - 1];
|
|
127694
|
+
return d === void 0 ? -1 : Math.round(d / 2 + Math.random() * d / 2);
|
|
127695
|
+
}
|
|
127696
|
+
async function assertSchema(schema2, value2) {
|
|
127697
|
+
const result = await schema2["~standard"].validate(value2);
|
|
127698
|
+
if (result.issues)
|
|
127699
|
+
throw new ValidationError(result);
|
|
127700
|
+
return result.value;
|
|
127701
|
+
}
|
|
127702
|
+
var TimeoutError = class extends Error {
|
|
127703
|
+
name = "TimeoutError";
|
|
127704
|
+
/** the op's `timeout`, in ms */
|
|
127705
|
+
timeout;
|
|
127706
|
+
constructor(timeout) {
|
|
127707
|
+
super(`attempt timed out after ${timeout}ms`);
|
|
127708
|
+
this.timeout = timeout;
|
|
127709
|
+
}
|
|
127710
|
+
};
|
|
127711
|
+
var gates = /* @__PURE__ */ new WeakMap();
|
|
127712
|
+
function semaphore(size) {
|
|
127713
|
+
let free = size;
|
|
127714
|
+
const line = [];
|
|
127715
|
+
return {
|
|
127716
|
+
acquire: (signal) => free > 0 ? void free-- : wait(line, signal),
|
|
127717
|
+
release: () => {
|
|
127718
|
+
const next2 = line.shift();
|
|
127719
|
+
if (next2)
|
|
127720
|
+
next2();
|
|
127721
|
+
else
|
|
127722
|
+
free++;
|
|
127723
|
+
}
|
|
127724
|
+
};
|
|
127725
|
+
}
|
|
127726
|
+
function wait(line, signal, left) {
|
|
127727
|
+
return new Promise((resolve3, reject) => {
|
|
127728
|
+
const abort = () => {
|
|
127729
|
+
line.splice(line.indexOf(next2), 1);
|
|
127730
|
+
left?.();
|
|
127731
|
+
reject(signal.reason);
|
|
127732
|
+
};
|
|
127733
|
+
const next2 = () => {
|
|
127734
|
+
signal?.removeEventListener("abort", abort);
|
|
127735
|
+
resolve3();
|
|
127736
|
+
};
|
|
127737
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
127738
|
+
line.push(next2);
|
|
127739
|
+
});
|
|
127740
|
+
}
|
|
127741
|
+
function op(options) {
|
|
127742
|
+
return build(options, true);
|
|
127743
|
+
}
|
|
127744
|
+
function build(options, cacheMethods) {
|
|
127745
|
+
const { name, input: inputSchema, output: outputSchema, run: run4, dedupe, ttl, cache: adapter, timeout } = options;
|
|
127746
|
+
const { retry, concurrency } = options;
|
|
127747
|
+
const delayFor = Array.isArray(retry) ? (_, attempt) => backoff(retry, attempt) : retry;
|
|
127748
|
+
if (ttl !== void 0 && typeof ttl !== "function" && !isLifetime(ttl)) {
|
|
127749
|
+
throw new TypeError(`yes.op: ttl must be a positive number of milliseconds, got ${ttl}`);
|
|
127750
|
+
}
|
|
127751
|
+
if (timeout !== void 0 && !(isLifetime(timeout) && timeout <= maxDelay)) {
|
|
127752
|
+
throw new TypeError(`yes.op: timeout must be a positive number of milliseconds up to ${maxDelay}, got ${timeout}`);
|
|
127753
|
+
}
|
|
127754
|
+
if (concurrency !== void 0 && !(Number.isInteger(concurrency) && concurrency > 0)) {
|
|
127755
|
+
throw new TypeError(`yes.op: concurrency must be a positive integer, got ${concurrency}`);
|
|
127756
|
+
}
|
|
127757
|
+
const lifetime = typeof ttl === "function" ? ttl : (result) => result == null || result instanceof Error ? 0 : ttl;
|
|
127758
|
+
if (adapter && (!name || name.includes(":"))) {
|
|
127759
|
+
throw new TypeError(`yes.op: an op with a cache adapter needs a name without ":", got ${JSON.stringify(name)}`);
|
|
127760
|
+
}
|
|
127761
|
+
if (adapter && ttl === void 0)
|
|
127762
|
+
throw new TypeError(`yes.op: a cache adapter does nothing without a ttl`);
|
|
127763
|
+
const store = ttl === void 0 ? void 0 : adapter ?? memory({ maxItems: options.maxItems });
|
|
127764
|
+
const keepsErrors = !!store && "peek" in store;
|
|
127765
|
+
const prefix = adapter ? `yes:${name}:` : "";
|
|
127766
|
+
const storeKey = adapter ? (key) => prefix + hashedKey(key) : (key) => key.local;
|
|
127767
|
+
const reported = adapter ? void 0 : hashKey;
|
|
127768
|
+
const label = name ? `[${name}] ` : "";
|
|
127769
|
+
const slots = concurrency === void 0 ? void 0 : semaphore(concurrency);
|
|
127770
|
+
const gate = options.rateLimit === void 0 ? void 0 : gates.get(options.rateLimit);
|
|
127771
|
+
if (options.rateLimit !== void 0 && !gate)
|
|
127772
|
+
throw new TypeError(`yes.op: rateLimit takes a yes.rateLimiter`);
|
|
127773
|
+
const take = gate?.take;
|
|
127774
|
+
const admit = slots || take ? async (signal, limitKey) => {
|
|
127775
|
+
await slots?.acquire(signal);
|
|
127776
|
+
try {
|
|
127777
|
+
await take?.(signal, limitKey);
|
|
127778
|
+
} catch (error63) {
|
|
127779
|
+
slots?.release();
|
|
127780
|
+
throw error63;
|
|
127781
|
+
}
|
|
127782
|
+
} : void 0;
|
|
127783
|
+
const keyOf = (input2) => {
|
|
127784
|
+
try {
|
|
127785
|
+
return { local: cacheKey(input2), hashed: void 0 };
|
|
127786
|
+
} catch (error63) {
|
|
127787
|
+
throw new Error(`${label}${error63.message}. dedupe and ttl key the input, and a query always dedupes; a write is yes.mutation, which never keys.`, { cause: error63 });
|
|
127788
|
+
}
|
|
127789
|
+
};
|
|
127790
|
+
const report = (attempt, message2, error63, key) => {
|
|
127791
|
+
console.log(`${label}attempt ${attempt} ${message2}`);
|
|
127792
|
+
const data = key === void 0 ? { error: error63, attempt } : { key, error: error63, attempt };
|
|
127793
|
+
console.log(...label ? [label, data] : [data]);
|
|
127794
|
+
};
|
|
127795
|
+
const on = options.on ?? {};
|
|
127796
|
+
const onHit = on.hit ?? void 0;
|
|
127797
|
+
const onRun = on.run ?? void 0;
|
|
127798
|
+
const onAttempt = on.attempt ?? void 0;
|
|
127799
|
+
const onRetry = hookOr(on.retry, delayFor && ((event) => report(event.attempt, `failed, retrying in ${event.wait}ms`, event.error, event.key)));
|
|
127800
|
+
const onSuccess = on.success ?? void 0;
|
|
127801
|
+
const onFailure = hookOr(on.failure, delayFor && ((event) => report(event.attempts, "failed, not retrying", event.error, event.key)));
|
|
127802
|
+
const failureLine = on.failure === void 0;
|
|
127803
|
+
const runOnce = (input2, ctx, signal) => {
|
|
127804
|
+
if (timeout === void 0)
|
|
127805
|
+
return run4(input2, ctx);
|
|
127806
|
+
const controller = timeout !== void 0 && ownsSignal(ctx) ? new AbortController() : void 0;
|
|
127807
|
+
const follow = controller && signal && (() => controller.abort(signal.reason));
|
|
127808
|
+
return new Promise((resolve3, reject) => {
|
|
127809
|
+
let settled = false;
|
|
127810
|
+
let pending;
|
|
127811
|
+
const settle2 = (done) => (value2) => {
|
|
127812
|
+
if (settled)
|
|
127813
|
+
return;
|
|
127814
|
+
settled = true;
|
|
127815
|
+
clearTimeout(pending);
|
|
127816
|
+
if (follow)
|
|
127817
|
+
signal.removeEventListener("abort", follow);
|
|
127818
|
+
done(value2);
|
|
127819
|
+
};
|
|
127820
|
+
if (timeout !== void 0) {
|
|
127821
|
+
pending = setTimeout(() => {
|
|
127822
|
+
const error63 = new TimeoutError(timeout);
|
|
127823
|
+
settle2(reject)(error63);
|
|
127824
|
+
controller?.abort(error63);
|
|
127825
|
+
}, timeout);
|
|
127826
|
+
}
|
|
127827
|
+
if (follow) {
|
|
127828
|
+
if (signal.aborted)
|
|
127829
|
+
follow();
|
|
127830
|
+
else
|
|
127831
|
+
signal.addEventListener("abort", follow, { once: true });
|
|
127832
|
+
}
|
|
127833
|
+
try {
|
|
127834
|
+
const own2 = controller ? { ...ctx, signal: controller.signal } : ctx;
|
|
127835
|
+
Promise.resolve(run4(input2, own2)).then(settle2(resolve3), settle2(reject));
|
|
127836
|
+
} catch (error63) {
|
|
127837
|
+
settle2(reject)(error63);
|
|
127838
|
+
}
|
|
127839
|
+
});
|
|
127840
|
+
};
|
|
127841
|
+
const attempts = async (input2, ctx, key, trace, signal, tally) => {
|
|
127842
|
+
const limitKey = gate?.by?.(input2, ctx);
|
|
127843
|
+
const own2 = inject(ctx);
|
|
127844
|
+
for (let attempt = 1; ; attempt++) {
|
|
127845
|
+
signal?.throwIfAborted();
|
|
127846
|
+
if (admit)
|
|
127847
|
+
await admit(signal, limitKey);
|
|
127848
|
+
if (tally)
|
|
127849
|
+
tally.started = attempt;
|
|
127850
|
+
try {
|
|
127851
|
+
let returned;
|
|
127852
|
+
try {
|
|
127853
|
+
if (onAttempt) {
|
|
127854
|
+
const awaited = onAttempt({ name, input: input2, ctx, key: hashedKey(key), attempt });
|
|
127855
|
+
if (isThenable(awaited))
|
|
127856
|
+
await awaited;
|
|
127857
|
+
}
|
|
127858
|
+
returned = await runOnce(input2, own2, signal);
|
|
127859
|
+
} finally {
|
|
127860
|
+
slots?.release();
|
|
127861
|
+
}
|
|
127862
|
+
const result = outputSchema ? await assertSchema(outputSchema, returned) : returned;
|
|
127863
|
+
trace?.(`run resolved on attempt ${attempt}`);
|
|
127864
|
+
return result;
|
|
127865
|
+
} catch (thrown) {
|
|
127866
|
+
let error63 = thrown;
|
|
127867
|
+
let wait2 = -1;
|
|
127868
|
+
let stopped = false;
|
|
127869
|
+
if (gate && !(error63 instanceof ValidationError)) {
|
|
127870
|
+
try {
|
|
127871
|
+
const paused = gate.failed(error63, limitKey);
|
|
127872
|
+
if (paused)
|
|
127873
|
+
trace?.(`rate limit paused for ${paused}ms`);
|
|
127874
|
+
} catch (stop2) {
|
|
127875
|
+
error63 = stop2;
|
|
127876
|
+
stopped = true;
|
|
127877
|
+
}
|
|
127878
|
+
}
|
|
127879
|
+
if (delayFor && !stopped && !(error63 instanceof ValidationError) && !signal?.aborted) {
|
|
127880
|
+
try {
|
|
127881
|
+
wait2 = delayFor(error63, attempt);
|
|
127882
|
+
} catch (stop2) {
|
|
127883
|
+
error63 = stop2;
|
|
127884
|
+
}
|
|
127885
|
+
if (typeof wait2 !== "number") {
|
|
127886
|
+
error63 = new TypeError(`yes.op: a retry waits a number of ms, got ${typeof wait2}`, { cause: error63 });
|
|
127887
|
+
wait2 = -1;
|
|
127888
|
+
} else if (wait2 > maxDelay) {
|
|
127889
|
+
error63 = new RangeError(`yes.op: a retry waits at most ${maxDelay}ms, got ${wait2}`, { cause: error63 });
|
|
127890
|
+
wait2 = -1;
|
|
127891
|
+
}
|
|
127892
|
+
}
|
|
127893
|
+
if (wait2 >= 0 && onRetry) {
|
|
127894
|
+
try {
|
|
127895
|
+
const returned = onRetry({ name, input: input2, ctx, key: hashedKey(key), error: error63, attempt, wait: wait2 });
|
|
127896
|
+
if (isThenable(returned))
|
|
127897
|
+
await returned;
|
|
127898
|
+
} catch (stop2) {
|
|
127899
|
+
error63 = stop2;
|
|
127900
|
+
wait2 = -1;
|
|
127901
|
+
}
|
|
127902
|
+
}
|
|
127903
|
+
if (wait2 >= 0) {
|
|
127904
|
+
await sleep(wait2, signal);
|
|
127905
|
+
continue;
|
|
127906
|
+
}
|
|
127907
|
+
trace?.(`run failed on attempt ${attempt}`, { error: error63 });
|
|
127908
|
+
throw error63;
|
|
127909
|
+
}
|
|
127910
|
+
}
|
|
127911
|
+
};
|
|
127912
|
+
const execution = onRun || onSuccess || onFailure ? async (input2, ctx, key, trace, signal, write2) => {
|
|
127913
|
+
const tally = { started: 0 };
|
|
127914
|
+
let result;
|
|
127915
|
+
try {
|
|
127916
|
+
if (onRun) {
|
|
127917
|
+
const awaited = onRun({ name, input: input2, ctx, key: hashedKey(key) });
|
|
127918
|
+
if (isThenable(awaited))
|
|
127919
|
+
await awaited;
|
|
127920
|
+
}
|
|
127921
|
+
result = await attempts(input2, ctx, key, trace, signal, tally);
|
|
127922
|
+
if (write2)
|
|
127923
|
+
result = await write2(result);
|
|
127924
|
+
} catch (error63) {
|
|
127925
|
+
if (onFailure && !signal?.aborted && !(failureLine && tally.started <= 1)) {
|
|
127926
|
+
const awaited = onFailure({ name, input: input2, ctx, key: hashedKey(key), error: error63, attempts: tally.started });
|
|
127927
|
+
if (isThenable(awaited))
|
|
127928
|
+
await awaited;
|
|
127929
|
+
}
|
|
127930
|
+
throw error63;
|
|
127931
|
+
}
|
|
127932
|
+
if (onSuccess) {
|
|
127933
|
+
const awaited = onSuccess({ name, input: input2, ctx, key: hashedKey(key), result, attempts: tally.started });
|
|
127934
|
+
if (isThenable(awaited))
|
|
127935
|
+
await awaited;
|
|
127936
|
+
}
|
|
127937
|
+
return result;
|
|
127938
|
+
} : (input2, ctx, key, trace, signal, write2) => {
|
|
127939
|
+
const running = attempts(input2, ctx, key, trace, signal);
|
|
127940
|
+
return write2 ? running.then(write2) : running;
|
|
127941
|
+
};
|
|
127942
|
+
const hit = (input2, ctx, key, trace, from, value2) => {
|
|
127943
|
+
trace?.(`cache hit (${from})`);
|
|
127944
|
+
const awaited = onHit?.({ name, input: input2, ctx, key: hashedKey(key), from });
|
|
127945
|
+
if (!isThenable(awaited))
|
|
127946
|
+
return value2;
|
|
127947
|
+
if (isThenable(value2))
|
|
127948
|
+
value2.then(void 0, () => {
|
|
127949
|
+
});
|
|
127950
|
+
return awaited.then(() => value2);
|
|
127951
|
+
};
|
|
127952
|
+
const inFlight = /* @__PURE__ */ new Map();
|
|
127953
|
+
const writers = /* @__PURE__ */ new Map();
|
|
127954
|
+
let executions = 0;
|
|
127955
|
+
const execute2 = async (rawInput, ctx, refresh) => {
|
|
127956
|
+
const input2 = inputSchema ? await assertSchema(inputSchema, rawInput) : rawInput;
|
|
127957
|
+
const signal = signalOf(ctx);
|
|
127958
|
+
if (!dedupe && !store)
|
|
127959
|
+
return execution(input2, ctx, void 0, debugTrace(label), signal);
|
|
127960
|
+
const key = keyOf(input2);
|
|
127961
|
+
const trace = debugTrace(label, key);
|
|
127962
|
+
const shared = inFlight.get(key.local);
|
|
127963
|
+
if (shared && !refresh) {
|
|
127964
|
+
const [execution2, leader] = shared;
|
|
127965
|
+
return hit(input2, ctx, key, trace, "in-flight", leader ? execution2.catch((error63) => {
|
|
127966
|
+
if (!leader.aborted)
|
|
127967
|
+
throw error63;
|
|
127968
|
+
signal?.throwIfAborted();
|
|
127969
|
+
return execute2(rawInput, ctx, false);
|
|
127970
|
+
}) : execution2);
|
|
127971
|
+
}
|
|
127972
|
+
const fullKey = storeKey(key);
|
|
127973
|
+
const read3 = store && !refresh ? callAdapter("get", fullKey, () => store.get(fullKey), reported) : void 0;
|
|
127974
|
+
const entry = freshEntry(read3);
|
|
127975
|
+
if (entry)
|
|
127976
|
+
return hit(input2, ctx, key, trace, "store", entry.value);
|
|
127977
|
+
const number6 = ++executions;
|
|
127978
|
+
let writer;
|
|
127979
|
+
if (store) {
|
|
127980
|
+
writer = writers.get(key.local);
|
|
127981
|
+
if (!writer) {
|
|
127982
|
+
writer = { running: 0, refreshed: 0 };
|
|
127983
|
+
writers.set(key.local, writer);
|
|
127984
|
+
}
|
|
127985
|
+
writer.running++;
|
|
127986
|
+
if (refresh)
|
|
127987
|
+
writer.refreshed = number6;
|
|
127988
|
+
}
|
|
127989
|
+
const write2 = store && (async (result) => {
|
|
127990
|
+
const ms = lifetime(result);
|
|
127991
|
+
if (!(isLifetime(ms) && writer.refreshed <= number6 && (keepsErrors || !(result instanceof Error)))) {
|
|
127992
|
+
return result;
|
|
127993
|
+
}
|
|
127994
|
+
const created = Date.now();
|
|
127995
|
+
try {
|
|
127996
|
+
await store.set(fullKey, { value: result, created, expires: created + ms, input: input2 }, ms);
|
|
127997
|
+
} catch (error63) {
|
|
127998
|
+
console.error(`${label}cache write failed, returning the result uncached`, new AdapterError("set", reported ? reported(fullKey) : fullKey, error63));
|
|
127999
|
+
}
|
|
128000
|
+
return result;
|
|
128001
|
+
});
|
|
128002
|
+
const promise2 = (async () => {
|
|
128003
|
+
const stored = isThenable(read3) ? freshEntry(await read3) : void 0;
|
|
128004
|
+
if (stored)
|
|
128005
|
+
return hit(input2, ctx, key, trace, "store", stored.value);
|
|
128006
|
+
trace?.(refresh ? "refreshing, running" : "cache miss, running");
|
|
128007
|
+
return execution(input2, ctx, key, trace, signal, write2);
|
|
128008
|
+
})();
|
|
128009
|
+
const settled = writer ? promise2.finally(() => --writer.running || writers.delete(key.local)) : promise2;
|
|
128010
|
+
if (!dedupe)
|
|
128011
|
+
return settled;
|
|
128012
|
+
const flight = [settled, signal];
|
|
128013
|
+
inFlight.set(key.local, flight);
|
|
128014
|
+
return settled.finally(() => inFlight.get(key.local) === flight && inFlight.delete(key.local));
|
|
128015
|
+
};
|
|
128016
|
+
const call = (rawInput, ctx) => execute2(rawInput, ctx, false);
|
|
128017
|
+
const jsonSchema2 = inputSchema?.["~standard"].jsonSchema;
|
|
128018
|
+
if (jsonSchema2) {
|
|
128019
|
+
call["~standard"] = {
|
|
128020
|
+
version: 1,
|
|
128021
|
+
vendor: "yes",
|
|
128022
|
+
name: name ?? "",
|
|
128023
|
+
description: options.description ?? "",
|
|
128024
|
+
jsonSchema: {
|
|
128025
|
+
input: (params) => jsonSchema2.input(params),
|
|
128026
|
+
// what the op returns is what its output schema returns; without one that can say so, any value
|
|
128027
|
+
output: (params) => outputSchema?.["~standard"].jsonSchema?.output(params) ?? {}
|
|
128028
|
+
},
|
|
128029
|
+
...run4.length < 2 && {
|
|
128030
|
+
execute: (input2, options2) => call(input2, options2?.signal ? { signal: options2.signal } : void 0)
|
|
128031
|
+
}
|
|
128032
|
+
};
|
|
128033
|
+
}
|
|
128034
|
+
if (!cacheMethods)
|
|
128035
|
+
return call;
|
|
128036
|
+
const withKey = (input2, use) => {
|
|
128037
|
+
const toKey = (result2) => use(storeKey(keyOf(result2 && !result2.issues ? result2.value : input2)));
|
|
128038
|
+
const result = inputSchema?.["~standard"].validate(input2);
|
|
128039
|
+
return result instanceof Promise ? result.then(toKey) : toKey(result);
|
|
128040
|
+
};
|
|
128041
|
+
return Object.assign(call, {
|
|
128042
|
+
clear: async (input2) => {
|
|
128043
|
+
if (!store)
|
|
128044
|
+
return;
|
|
128045
|
+
if (input2 === void 0)
|
|
128046
|
+
await sweep(store, prefix, () => true);
|
|
128047
|
+
else
|
|
128048
|
+
await withKey(input2, (key) => callAdapter("delete", key, () => store.delete([key]), reported));
|
|
128049
|
+
},
|
|
128050
|
+
// the memory store peeks, so asking whether a key is cached does not change which key is evicted next
|
|
128051
|
+
has: async (input2) => !!store && !!freshEntry(await withKey(input2, (key) => callAdapter("get", key, () => "peek" in store ? store.peek(key) : store.get(key), reported))),
|
|
128052
|
+
// not `async`: on the memory store a predicate that throws throws here, not in a promise nobody awaits
|
|
128053
|
+
invalidate: (match3) => {
|
|
128054
|
+
const accepts = typeof match3 === "function" ? match3 : fieldsMatch(match3);
|
|
128055
|
+
return Promise.resolve(store ? sweep(store, prefix, accepts) : 0);
|
|
128056
|
+
},
|
|
128057
|
+
refresh: (rawInput, ctx) => execute2(rawInput, ctx, true)
|
|
128058
|
+
});
|
|
128059
|
+
}
|
|
128060
|
+
function query(options) {
|
|
128061
|
+
return op({ ...options, dedupe: true });
|
|
128062
|
+
}
|
|
128063
|
+
function mutation({ dedupe: _dedupe, ttl: _ttl, cache: _cache, ...options }) {
|
|
128064
|
+
return build(options, false);
|
|
128065
|
+
}
|
|
128066
|
+
var hookOr = (given, line) => given === void 0 ? line || void 0 : given ?? void 0;
|
|
128067
|
+
var ownsSignal = (ctx) => {
|
|
128068
|
+
if (ctx === void 0)
|
|
128069
|
+
return true;
|
|
128070
|
+
if (!isPlain(ctx))
|
|
128071
|
+
return false;
|
|
128072
|
+
const signal = ctx.signal;
|
|
128073
|
+
return signal === void 0 || isSignal(signal);
|
|
128074
|
+
};
|
|
128075
|
+
var inject = (ctx) => {
|
|
128076
|
+
if (ctx === void 0)
|
|
128077
|
+
return { signal: idleSignal() };
|
|
128078
|
+
return isPlain(ctx) && ctx.signal === void 0 ? { ...ctx, signal: idleSignal() } : ctx;
|
|
128079
|
+
};
|
|
128080
|
+
var idle;
|
|
128081
|
+
var idleSignal = () => {
|
|
128082
|
+
if (idle === void 0 && typeof AbortController === "function")
|
|
128083
|
+
idle = new AbortController().signal;
|
|
128084
|
+
return idle;
|
|
128085
|
+
};
|
|
128086
|
+
var signalOf = (ctx) => {
|
|
128087
|
+
const signal = ctx?.signal;
|
|
128088
|
+
return isSignal(signal) ? signal : void 0;
|
|
128089
|
+
};
|
|
128090
|
+
var isSignal = (value2) => typeof AbortSignal === "function" && value2 instanceof AbortSignal;
|
|
128091
|
+
function debugTrace(label, callKey) {
|
|
128092
|
+
if (!debugging())
|
|
128093
|
+
return;
|
|
128094
|
+
const prefix = `${label}[${(/* @__PURE__ */ new Date()).toISOString()}]`;
|
|
128095
|
+
const start = performance.now();
|
|
128096
|
+
const key = hashedKey(callKey);
|
|
128097
|
+
return (message2, data) => console.log(`${prefix} ${message2} +${Math.round(performance.now() - start)}ms`, { ...key && { key }, ...data });
|
|
128098
|
+
}
|
|
128099
|
+
function hashedKey(key) {
|
|
128100
|
+
if (key)
|
|
128101
|
+
key.hashed ??= hashKey(key.local);
|
|
128102
|
+
return key?.hashed;
|
|
128103
|
+
}
|
|
128104
|
+
var maxDelay = 2 ** 31 - 1;
|
|
128105
|
+
var isLifetime = (ms) => typeof ms === "number" && ms > 0 && Number.isFinite(ms);
|
|
128106
|
+
function fieldsMatch(partial3) {
|
|
128107
|
+
const fields = Object.entries(partial3).map(([field, value2]) => [
|
|
128108
|
+
field,
|
|
128109
|
+
value2 === void 0 ? void 0 : canonical(value2)
|
|
128110
|
+
]);
|
|
128111
|
+
return (input2) => typeof input2 === "object" && input2 !== null && fields.every(([field, value2]) => {
|
|
128112
|
+
const actual = input2[field];
|
|
128113
|
+
return actual === void 0 ? value2 === void 0 : value2 !== void 0 && canonical(actual) === value2;
|
|
128114
|
+
});
|
|
128115
|
+
}
|
|
128116
|
+
var isThenable = (value2) => typeof value2?.then === "function";
|
|
128117
|
+
function freshEntry(value2) {
|
|
128118
|
+
return typeof value2?.expires === "number" && value2.expires > Date.now() && "value" in value2 ? value2 : void 0;
|
|
128119
|
+
}
|
|
128120
|
+
function callAdapter(method, key, run4, reported) {
|
|
128121
|
+
try {
|
|
128122
|
+
const result = run4();
|
|
128123
|
+
if (!isThenable(result))
|
|
128124
|
+
return result;
|
|
128125
|
+
return result.then(void 0, (error63) => {
|
|
128126
|
+
throw new AdapterError(method, reported ? reported(key) : key, error63);
|
|
128127
|
+
});
|
|
128128
|
+
} catch (error63) {
|
|
128129
|
+
throw new AdapterError(method, reported ? reported(key) : key, error63);
|
|
128130
|
+
}
|
|
128131
|
+
}
|
|
128132
|
+
function sweep(store, prefix, match3) {
|
|
128133
|
+
const purge = (listed2) => {
|
|
128134
|
+
const now = Date.now();
|
|
128135
|
+
const keys = [];
|
|
128136
|
+
let count = 0;
|
|
128137
|
+
for (const [key, { input: input2, expires }] of listed2) {
|
|
128138
|
+
if (!(expires > now))
|
|
128139
|
+
keys.push(key);
|
|
128140
|
+
else if (match3(input2)) {
|
|
128141
|
+
keys.push(key);
|
|
128142
|
+
count++;
|
|
128143
|
+
}
|
|
128144
|
+
}
|
|
128145
|
+
const remove = (from) => {
|
|
128146
|
+
if (from >= keys.length)
|
|
128147
|
+
return count;
|
|
128148
|
+
const deleted = callAdapter("delete", prefix, () => store.delete(keys.slice(from, from + 1e3)));
|
|
128149
|
+
return isThenable(deleted) ? Promise.resolve(deleted).then(() => remove(from + 1e3)) : remove(from + 1e3);
|
|
128150
|
+
};
|
|
128151
|
+
return remove(0);
|
|
128152
|
+
};
|
|
128153
|
+
const listed = callAdapter("list", prefix, () => {
|
|
128154
|
+
const listed2 = store.list(prefix);
|
|
128155
|
+
if (Array.isArray(listed2))
|
|
128156
|
+
return listed2;
|
|
128157
|
+
return (async () => {
|
|
128158
|
+
const items = [];
|
|
128159
|
+
for await (const item of await listed2)
|
|
128160
|
+
items.push(item);
|
|
128161
|
+
return items;
|
|
128162
|
+
})();
|
|
128163
|
+
});
|
|
128164
|
+
return Array.isArray(listed) ? purge(listed) : listed.then(purge);
|
|
128165
|
+
}
|
|
128166
|
+
|
|
128167
|
+
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/try.js
|
|
128168
|
+
function asError(value2) {
|
|
128169
|
+
if (value2 instanceof Error)
|
|
128170
|
+
return value2;
|
|
128171
|
+
let message2;
|
|
128172
|
+
try {
|
|
128173
|
+
message2 = String(value2);
|
|
128174
|
+
} catch {
|
|
128175
|
+
message2 = "a value that is not an Error";
|
|
128176
|
+
}
|
|
128177
|
+
return new Error(message2, { cause: value2 });
|
|
128178
|
+
}
|
|
128179
|
+
var tryCall = async (call) => {
|
|
128180
|
+
try {
|
|
128181
|
+
return await (typeof call === "function" ? call() : call);
|
|
128182
|
+
} catch (error63) {
|
|
128183
|
+
return asError(error63);
|
|
128184
|
+
}
|
|
128185
|
+
};
|
|
128186
|
+
|
|
128187
|
+
// utils/openCodeModels.ts
|
|
127377
128188
|
var baseline;
|
|
127378
128189
|
var authorized;
|
|
127379
128190
|
var failure2;
|
|
128191
|
+
var catalogFailure;
|
|
128192
|
+
var DEFAULT_MODELS_URL = "https://models.opencode.ai";
|
|
127380
128193
|
var ANSI_PATTERN = /\[[0-9;]*m/g;
|
|
127381
128194
|
function openCodeHomeEnv(tmpdir5) {
|
|
127382
128195
|
return {
|
|
@@ -127387,6 +128200,36 @@ function openCodeHomeEnv(tmpdir5) {
|
|
|
127387
128200
|
XDG_STATE_HOME: join8(tmpdir5, ".local", "state")
|
|
127388
128201
|
};
|
|
127389
128202
|
}
|
|
128203
|
+
var fetchCatalog = query({
|
|
128204
|
+
run: async (url4, ctx) => {
|
|
128205
|
+
const response = await fetch(url4, { signal: ctx.signal });
|
|
128206
|
+
if (!response.ok) throw new Error(`${url4} answered ${response.status}`);
|
|
128207
|
+
const text = await response.text();
|
|
128208
|
+
JSON.parse(text);
|
|
128209
|
+
return text;
|
|
128210
|
+
},
|
|
128211
|
+
name: "models catalog",
|
|
128212
|
+
timeout: 1e4,
|
|
128213
|
+
retry: [1e3]
|
|
128214
|
+
});
|
|
128215
|
+
async function seedModelsCatalog(tmpdir5) {
|
|
128216
|
+
const source = process.env.OPENCODE_MODELS_URL || DEFAULT_MODELS_URL;
|
|
128217
|
+
const name = source === DEFAULT_MODELS_URL ? "models.json" : `models-${createHash2("sha1").update(source).digest("hex")}.json`;
|
|
128218
|
+
const result = await tryCall(fetchCatalog(`${source}/api.json`));
|
|
128219
|
+
if (result instanceof Error) {
|
|
128220
|
+
catalogFailure = result.cause instanceof Error ? `${result.message}: ${result.cause.message}` : result.message;
|
|
128221
|
+
log2.warning(
|
|
128222
|
+
`\xBB could not download opencode's model catalog (${catalogFailure}). opencode falls back to the snapshot built into it, which lacks models released since that build.`
|
|
128223
|
+
);
|
|
128224
|
+
return;
|
|
128225
|
+
}
|
|
128226
|
+
const dir = join8(openCodeHomeEnv(tmpdir5).XDG_CACHE_HOME, "opencode");
|
|
128227
|
+
mkdirSync7(dir, { recursive: true });
|
|
128228
|
+
writeFileSync7(join8(dir, name), result);
|
|
128229
|
+
}
|
|
128230
|
+
function getModelsCatalogFailure() {
|
|
128231
|
+
return catalogFailure;
|
|
128232
|
+
}
|
|
127390
128233
|
function readModels(params) {
|
|
127391
128234
|
const result = spawnSync4(params.cliPath, ["models"], {
|
|
127392
128235
|
encoding: "utf-8",
|
|
@@ -128387,8 +129230,8 @@ var opencode = agent({
|
|
|
128387
129230
|
const xaiAuth = installXaiAuth();
|
|
128388
129231
|
const homeEnv = openCodeHomeEnv(ctx.tmpdir);
|
|
128389
129232
|
const opencodePluginDir = join9(homeEnv.XDG_CONFIG_HOME, "opencode", "plugin");
|
|
128390
|
-
|
|
128391
|
-
|
|
129233
|
+
mkdirSync8(opencodePluginDir, { recursive: true });
|
|
129234
|
+
writeFileSync8(
|
|
128392
129235
|
join9(opencodePluginDir, PULLFROG_OPENCODE_GATE_PLUGIN_FILENAME),
|
|
128393
129236
|
buildOpencodeSubagentGateSource(ctx)
|
|
128394
129237
|
);
|
|
@@ -136496,7 +137339,7 @@ var Hono3 = class extends Hono {
|
|
|
136496
137339
|
};
|
|
136497
137340
|
|
|
136498
137341
|
// node_modules/.pnpm/mcp-proxy@6.7.21/node_modules/mcp-proxy/dist/startStdioServer-SHdEnYLY.mjs
|
|
136499
|
-
import { createRequire } from "node:module";
|
|
137342
|
+
import { createRequire as createRequire2 } from "node:module";
|
|
136500
137343
|
import { randomUUID as randomUUID3, timingSafeEqual } from "node:crypto";
|
|
136501
137344
|
|
|
136502
137345
|
// node_modules/.pnpm/@modelcontextprotocol+server@2.3.1/node_modules/@modelcontextprotocol/server/dist/chunk-Br0eD_fh.mjs
|
|
@@ -138899,7 +139742,7 @@ var rev2025Codec = {
|
|
|
138899
139742
|
encodeErrorCode: (code) => code === -32002 ? -32602 : code,
|
|
138900
139743
|
checkInboundEnvelope: (_material) => void 0
|
|
138901
139744
|
};
|
|
138902
|
-
function
|
|
139745
|
+
function build2() {
|
|
138903
139746
|
const JSONValueSchema$1 = lazy(() => union([
|
|
138904
139747
|
string2(),
|
|
138905
139748
|
number2(),
|
|
@@ -139774,7 +140617,7 @@ function build() {
|
|
|
139774
140617
|
}
|
|
139775
140618
|
var memo2;
|
|
139776
140619
|
function buildSchemas2026() {
|
|
139777
|
-
return memo2 ??=
|
|
140620
|
+
return memo2 ??= build2();
|
|
139778
140621
|
}
|
|
139779
140622
|
var CACHEABLE_RESULT_METHODS = [
|
|
139780
140623
|
"tools/list",
|
|
@@ -141204,7 +142047,7 @@ var REQUEST_STATE_ONLY_LEG_PACING_MS = 250;
|
|
|
141204
142047
|
function inputRequiredRoundsExceededMessage(method, maxRounds) {
|
|
141205
142048
|
return `Multi-round-trip request '${method}' still required input after ${maxRounds} rounds (inputRequired.maxRounds)`;
|
|
141206
142049
|
}
|
|
141207
|
-
function
|
|
142050
|
+
function sleep2(ms, signal) {
|
|
141208
142051
|
return new Promise((resolve3, reject) => {
|
|
141209
142052
|
if (signal?.aborted) {
|
|
141210
142053
|
reject(signal.reason instanceof SdkError ? signal.reason : new SdkError(SdkErrorCode.RequestTimeout, String(signal.reason)));
|
|
@@ -144363,8 +145206,8 @@ var require_resolve2 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
144363
145206
|
}
|
|
144364
145207
|
return count;
|
|
144365
145208
|
}
|
|
144366
|
-
function getFullPath(resolver, id = "",
|
|
144367
|
-
if (
|
|
145209
|
+
function getFullPath(resolver, id = "", normalize4) {
|
|
145210
|
+
if (normalize4 !== false) id = normalizeId(id);
|
|
144368
145211
|
return _getFullPath(resolver, resolver.parse(id));
|
|
144369
145212
|
}
|
|
144370
145213
|
exports.getFullPath = getFullPath;
|
|
@@ -145459,7 +146302,7 @@ var require_schemes2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
145459
146302
|
var require_fast_uri2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
145460
146303
|
const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizeComponentEncoding, isIPv4, nonSimpleDomain } = require_utils5();
|
|
145461
146304
|
const { SCHEMES, getSchemeHandler } = require_schemes2();
|
|
145462
|
-
function
|
|
146305
|
+
function normalize4(uri, options) {
|
|
145463
146306
|
if (typeof uri === "string") uri = serialize2(parse6(uri, options), options);
|
|
145464
146307
|
else if (typeof uri === "object") uri = parse6(serialize2(uri, options), options);
|
|
145465
146308
|
return uri;
|
|
@@ -145637,7 +146480,7 @@ var require_fast_uri2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
145637
146480
|
}
|
|
145638
146481
|
const fastUri = {
|
|
145639
146482
|
SCHEMES,
|
|
145640
|
-
normalize:
|
|
146483
|
+
normalize: normalize4,
|
|
145641
146484
|
resolve: resolve3,
|
|
145642
146485
|
resolveComponent,
|
|
145643
146486
|
equal,
|
|
@@ -149836,7 +150679,7 @@ var LegacyInputRequiredShim = class {
|
|
|
149836
150679
|
} finally {
|
|
149837
150680
|
roundAbort.dispose();
|
|
149838
150681
|
}
|
|
149839
|
-
} else await
|
|
150682
|
+
} else await sleep2(REQUEST_STATE_ONLY_LEG_PACING_MS, outerSignal);
|
|
149840
150683
|
let ctxNext = {
|
|
149841
150684
|
...ctx,
|
|
149842
150685
|
mcpReq: {
|
|
@@ -152425,7 +153268,7 @@ function createMcpHandler(factory, options = {}) {
|
|
|
152425
153268
|
import http2 from "http";
|
|
152426
153269
|
import { Http2ServerRequest } from "http2";
|
|
152427
153270
|
import { Readable } from "stream";
|
|
152428
|
-
import
|
|
153271
|
+
import crypto5 from "crypto";
|
|
152429
153272
|
import { TLSSocket } from "node:tls";
|
|
152430
153273
|
import fs4 from "fs";
|
|
152431
153274
|
import https2 from "https";
|
|
@@ -153805,7 +154648,7 @@ var rev2025Codec2 = {
|
|
|
153805
154648
|
encodeErrorCode: (code) => code === -32002 ? -32602 : code,
|
|
153806
154649
|
checkInboundEnvelope: (_material) => void 0
|
|
153807
154650
|
};
|
|
153808
|
-
function
|
|
154651
|
+
function build3() {
|
|
153809
154652
|
const JSONValueSchema$1 = lazy(() => union([
|
|
153810
154653
|
string2(),
|
|
153811
154654
|
number2(),
|
|
@@ -154680,7 +155523,7 @@ function build2() {
|
|
|
154680
155523
|
}
|
|
154681
155524
|
var memo3;
|
|
154682
155525
|
function buildSchemas20262() {
|
|
154683
|
-
return memo3 ??=
|
|
155526
|
+
return memo3 ??= build3();
|
|
154684
155527
|
}
|
|
154685
155528
|
var CACHEABLE_RESULT_METHODS2 = [
|
|
154686
155529
|
"tools/list",
|
|
@@ -158700,8 +159543,8 @@ var require_resolve3 = /* @__PURE__ */ __commonJSMin2(((exports) => {
|
|
|
158700
159543
|
}
|
|
158701
159544
|
return count;
|
|
158702
159545
|
}
|
|
158703
|
-
function getFullPath(resolver, id = "",
|
|
158704
|
-
if (
|
|
159546
|
+
function getFullPath(resolver, id = "", normalize4) {
|
|
159547
|
+
if (normalize4 !== false) id = normalizeId(id);
|
|
158705
159548
|
return _getFullPath(resolver, resolver.parse(id));
|
|
158706
159549
|
}
|
|
158707
159550
|
exports.getFullPath = getFullPath;
|
|
@@ -159796,7 +160639,7 @@ var require_schemes3 = /* @__PURE__ */ __commonJSMin2(((exports, module) => {
|
|
|
159796
160639
|
var require_fast_uri3 = /* @__PURE__ */ __commonJSMin2(((exports, module) => {
|
|
159797
160640
|
const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizeComponentEncoding, isIPv4, nonSimpleDomain } = require_utils6();
|
|
159798
160641
|
const { SCHEMES, getSchemeHandler } = require_schemes3();
|
|
159799
|
-
function
|
|
160642
|
+
function normalize4(uri, options) {
|
|
159800
160643
|
if (typeof uri === "string") uri = serialize2(parse6(uri, options), options);
|
|
159801
160644
|
else if (typeof uri === "object") uri = parse6(serialize2(uri, options), options);
|
|
159802
160645
|
return uri;
|
|
@@ -159974,7 +160817,7 @@ var require_fast_uri3 = /* @__PURE__ */ __commonJSMin2(((exports, module) => {
|
|
|
159974
160817
|
}
|
|
159975
160818
|
const fastUri = {
|
|
159976
160819
|
SCHEMES,
|
|
159977
|
-
normalize:
|
|
160820
|
+
normalize: normalize4,
|
|
159978
160821
|
resolve: resolve3,
|
|
159979
160822
|
resolveComponent,
|
|
159980
160823
|
equal,
|
|
@@ -163697,8 +164540,8 @@ var addFormats2 = import_dist2.default;
|
|
|
163697
164540
|
var Ajv3 = import_ajv3.Ajv;
|
|
163698
164541
|
|
|
163699
164542
|
// node_modules/.pnpm/pkce-challenge@5.0.1/node_modules/pkce-challenge/dist/index.node.js
|
|
163700
|
-
var
|
|
163701
|
-
|
|
164543
|
+
var crypto4;
|
|
164544
|
+
crypto4 = globalThis.crypto?.webcrypto ?? // Node.js [18-16] REPL
|
|
163702
164545
|
globalThis.crypto ?? // Node.js >18
|
|
163703
164546
|
import("node:crypto").then((m) => m.webcrypto);
|
|
163704
164547
|
|
|
@@ -163885,7 +164728,7 @@ var __toESM4 = (mod, isNodeMode, target) => (target = mod != null ? __create4(__
|
|
|
163885
164728
|
value: mod,
|
|
163886
164729
|
enumerable: true
|
|
163887
164730
|
}) : target, mod));
|
|
163888
|
-
var __require2 = /* @__PURE__ */
|
|
164731
|
+
var __require2 = /* @__PURE__ */ createRequire2(import.meta.url);
|
|
163889
164732
|
var getProtectedResourceMetadataUrl = (resource) => {
|
|
163890
164733
|
let metadataUrl;
|
|
163891
164734
|
try {
|
|
@@ -169672,13 +170515,13 @@ var newRequest = (incoming, defaultHostname) => {
|
|
|
169672
170515
|
};
|
|
169673
170516
|
var responseCache = Symbol("responseCache");
|
|
169674
170517
|
var getResponseCache = Symbol("getResponseCache");
|
|
169675
|
-
var
|
|
170518
|
+
var cacheKey2 = Symbol("cache");
|
|
169676
170519
|
var GlobalResponse = global.Response;
|
|
169677
170520
|
var Response2 = class _Response {
|
|
169678
170521
|
#body;
|
|
169679
170522
|
#init;
|
|
169680
170523
|
[getResponseCache]() {
|
|
169681
|
-
delete this[
|
|
170524
|
+
delete this[cacheKey2];
|
|
169682
170525
|
return this[responseCache] ||= new GlobalResponse(this.#body, this.#init);
|
|
169683
170526
|
}
|
|
169684
170527
|
constructor(body, init) {
|
|
@@ -169695,14 +170538,14 @@ var Response2 = class _Response {
|
|
|
169695
170538
|
headers = new Headers(init.#init.headers);
|
|
169696
170539
|
}
|
|
169697
170540
|
} else this.#init = init;
|
|
169698
|
-
if (typeof body === "string" || typeof body?.getReader !== "undefined" || body instanceof Blob || body instanceof Uint8Array) this[
|
|
170541
|
+
if (typeof body === "string" || typeof body?.getReader !== "undefined" || body instanceof Blob || body instanceof Uint8Array) this[cacheKey2] = [
|
|
169699
170542
|
init?.status || 200,
|
|
169700
170543
|
body,
|
|
169701
170544
|
headers || init?.headers
|
|
169702
170545
|
];
|
|
169703
170546
|
}
|
|
169704
170547
|
get headers() {
|
|
169705
|
-
const cache = this[
|
|
170548
|
+
const cache = this[cacheKey2];
|
|
169706
170549
|
if (cache) {
|
|
169707
170550
|
if (!(cache[2] instanceof Headers)) cache[2] = new Headers(cache[2] || { "content-type": "text/plain; charset=UTF-8" });
|
|
169708
170551
|
return cache[2];
|
|
@@ -169710,7 +170553,7 @@ var Response2 = class _Response {
|
|
|
169710
170553
|
return this[getResponseCache]().headers;
|
|
169711
170554
|
}
|
|
169712
170555
|
get status() {
|
|
169713
|
-
return this[
|
|
170556
|
+
return this[cacheKey2]?.[0] ?? this[getResponseCache]().status;
|
|
169714
170557
|
}
|
|
169715
170558
|
get ok() {
|
|
169716
170559
|
const status$1 = this.status;
|
|
@@ -169791,7 +170634,7 @@ var buildOutgoingHttpHeaders = (headers) => {
|
|
|
169791
170634
|
return res;
|
|
169792
170635
|
};
|
|
169793
170636
|
var X_ALREADY_SENT = "x-hono-already-sent";
|
|
169794
|
-
if (typeof global.crypto === "undefined") global.crypto =
|
|
170637
|
+
if (typeof global.crypto === "undefined") global.crypto = crypto5;
|
|
169795
170638
|
var outgoingEnded = Symbol("outgoingEnded");
|
|
169796
170639
|
var handleRequestError = () => new Response(null, { status: 400 });
|
|
169797
170640
|
var handleFetchError = (e) => new Response(null, { status: e instanceof Error && (e.name === "TimeoutError" || e.constructor.name === "TimeoutError") ? 504 : 500 });
|
|
@@ -169809,7 +170652,7 @@ var flushHeaders = (outgoing) => {
|
|
|
169809
170652
|
if ("flushHeaders" in outgoing && outgoing.writable) outgoing.flushHeaders();
|
|
169810
170653
|
};
|
|
169811
170654
|
var responseViaCache = async (res, outgoing) => {
|
|
169812
|
-
let [status$1, body, header] = res[
|
|
170655
|
+
let [status$1, body, header] = res[cacheKey2];
|
|
169813
170656
|
let hasContentLength = false;
|
|
169814
170657
|
if (!header) header = { "content-type": "text/plain; charset=UTF-8" };
|
|
169815
170658
|
else if (header instanceof Headers) {
|
|
@@ -169847,7 +170690,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
|
|
169847
170690
|
res = errRes;
|
|
169848
170691
|
}
|
|
169849
170692
|
else res = await res.catch(handleFetchError);
|
|
169850
|
-
if (
|
|
170693
|
+
if (cacheKey2 in res) return responseViaCache(res, outgoing);
|
|
169851
170694
|
const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
|
|
169852
170695
|
if (res.body) {
|
|
169853
170696
|
const reader = res.body.getReader();
|
|
@@ -169935,7 +170778,7 @@ var getRequestListener = (fetchCallback, options = {}) => {
|
|
|
169935
170778
|
incoming,
|
|
169936
170779
|
outgoing
|
|
169937
170780
|
});
|
|
169938
|
-
if (
|
|
170781
|
+
if (cacheKey2 in res) return responseViaCache(res, outgoing);
|
|
169939
170782
|
} catch (e) {
|
|
169940
170783
|
if (!res) if (options.errorHandler) {
|
|
169941
170784
|
res = await options.errorHandler(req ? e : toRequestError(e));
|
|
@@ -183522,8 +184365,8 @@ function closeBrowserDaemon(toolState) {
|
|
|
183522
184365
|
}
|
|
183523
184366
|
|
|
183524
184367
|
// mcp/checkout.ts
|
|
183525
|
-
import { createHash as
|
|
183526
|
-
import { statSync, unlinkSync as unlinkSync3, writeFileSync as
|
|
184368
|
+
import { createHash as createHash4 } from "node:crypto";
|
|
184369
|
+
import { statSync, unlinkSync as unlinkSync3, writeFileSync as writeFileSync12 } from "node:fs";
|
|
183527
184370
|
import { join as join17 } from "node:path";
|
|
183528
184371
|
|
|
183529
184372
|
// node_modules/.pnpm/@ark+schema@0.56.0/node_modules/@ark/schema/out/shared/errors.js
|
|
@@ -190852,740 +191695,6 @@ var schema = ark.schema;
|
|
|
190852
191695
|
var define2 = ark.define;
|
|
190853
191696
|
var declare = ark.declare;
|
|
190854
191697
|
|
|
190855
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/cache/adapter.js
|
|
190856
|
-
var AdapterError = class extends Error {
|
|
190857
|
-
/** the adapter method that failed */
|
|
190858
|
-
method;
|
|
190859
|
-
/** the full store key, or the op's prefix when the call covered many keys. never the raw input. */
|
|
190860
|
-
key;
|
|
190861
|
-
constructor(method, key, cause) {
|
|
190862
|
-
super(`cache ${method} failed for ${key}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
190863
|
-
this.name = "AdapterError";
|
|
190864
|
-
this.method = method;
|
|
190865
|
-
this.key = key;
|
|
190866
|
-
}
|
|
190867
|
-
};
|
|
190868
|
-
|
|
190869
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/cache/memory.js
|
|
190870
|
-
function memory({ maxItems = 1e3 } = {}) {
|
|
190871
|
-
const store = /* @__PURE__ */ new Map();
|
|
190872
|
-
const peek = (key) => {
|
|
190873
|
-
const slot = store.get(key);
|
|
190874
|
-
if (slot === void 0)
|
|
190875
|
-
return;
|
|
190876
|
-
if (slot.until > Date.now())
|
|
190877
|
-
return slot;
|
|
190878
|
-
store.delete(key);
|
|
190879
|
-
};
|
|
190880
|
-
const evict = () => {
|
|
190881
|
-
for (const [key, slot] of store) {
|
|
190882
|
-
store.delete(key);
|
|
190883
|
-
if (!slot.used)
|
|
190884
|
-
return;
|
|
190885
|
-
slot.used = false;
|
|
190886
|
-
store.set(key, slot);
|
|
190887
|
-
}
|
|
190888
|
-
};
|
|
190889
|
-
return {
|
|
190890
|
-
get: (key) => {
|
|
190891
|
-
const slot = peek(key);
|
|
190892
|
-
if (slot === void 0)
|
|
190893
|
-
return;
|
|
190894
|
-
slot.used = true;
|
|
190895
|
-
return slot.entry;
|
|
190896
|
-
},
|
|
190897
|
-
peek: (key) => peek(key)?.entry,
|
|
190898
|
-
// the TTL rides on each entry, so ops with different lifetimes can share one store
|
|
190899
|
-
// evicted before the new slot goes in, so the entry being written is never the one dropped: after it, a full store
|
|
190900
|
-
// whose every slot was read would pass each over and drop the new, unread one
|
|
190901
|
-
set: (key, entry, ttlMs) => {
|
|
190902
|
-
store.delete(key);
|
|
190903
|
-
if (store.size >= maxItems)
|
|
190904
|
-
evict();
|
|
190905
|
-
store.set(key, { entry, until: Date.now() + ttlMs, used: false });
|
|
190906
|
-
},
|
|
190907
|
-
delete: (keys) => {
|
|
190908
|
-
for (const key of keys)
|
|
190909
|
-
store.delete(key);
|
|
190910
|
-
},
|
|
190911
|
-
// a snapshot, so deleting while iterating is safe
|
|
190912
|
-
list: (prefix) => {
|
|
190913
|
-
const now = Date.now();
|
|
190914
|
-
const listed = [];
|
|
190915
|
-
for (const [key, slot] of store)
|
|
190916
|
-
if (slot.until > now && key.startsWith(prefix))
|
|
190917
|
-
listed.push([key, slot.entry]);
|
|
190918
|
-
return listed;
|
|
190919
|
-
}
|
|
190920
|
-
};
|
|
190921
|
-
}
|
|
190922
|
-
|
|
190923
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/issues.js
|
|
190924
|
-
function issueJSON(issue4) {
|
|
190925
|
-
const segments = issue4.path ?? [];
|
|
190926
|
-
const path4 = [];
|
|
190927
|
-
for (let i2 = 0; i2 < segments.length; i2++) {
|
|
190928
|
-
const segment = segments[i2];
|
|
190929
|
-
const wrapped = typeof segment === "object" && segment !== null;
|
|
190930
|
-
const key = wrapped ? segment.key : segment;
|
|
190931
|
-
if (typeof key === "string" || typeof key === "number" && Number.isFinite(key))
|
|
190932
|
-
path4.push(key);
|
|
190933
|
-
else if (typeof key === "symbol")
|
|
190934
|
-
path4.push(String(key));
|
|
190935
|
-
else if (!(wrapped && key === null && segment.type === "set"))
|
|
190936
|
-
break;
|
|
190937
|
-
}
|
|
190938
|
-
const { keyword } = issue4;
|
|
190939
|
-
return typeof keyword === "string" ? { message: issue4.message, path: path4, keyword } : { message: issue4.message, path: path4 };
|
|
190940
|
-
}
|
|
190941
|
-
function issuesJSON(issues) {
|
|
190942
|
-
const out = [];
|
|
190943
|
-
for (let i2 = 0; i2 < issues.length; i2++)
|
|
190944
|
-
if (issues[i2])
|
|
190945
|
-
out.push(issueJSON(issues[i2]));
|
|
190946
|
-
return out;
|
|
190947
|
-
}
|
|
190948
|
-
var identifier = /^[A-Za-z_$][\w$]*$/;
|
|
190949
|
-
var longestKey = 40;
|
|
190950
|
-
function renderPath(path4) {
|
|
190951
|
-
let out = "";
|
|
190952
|
-
for (const key of path4) {
|
|
190953
|
-
if (typeof key === "number")
|
|
190954
|
-
out += `[${key}]`;
|
|
190955
|
-
else if (key.length <= longestKey && identifier.test(key))
|
|
190956
|
-
out += out ? `.${key}` : key;
|
|
190957
|
-
else
|
|
190958
|
-
out += `[${JSON.stringify(key.length <= longestKey ? key : `${key.slice(0, longestKey)}\u2026`)}]`;
|
|
190959
|
-
}
|
|
190960
|
-
return out;
|
|
190961
|
-
}
|
|
190962
|
-
var shown = 10;
|
|
190963
|
-
function summary2(issues, truncated2) {
|
|
190964
|
-
const lines = [];
|
|
190965
|
-
let i2 = 0;
|
|
190966
|
-
for (; i2 < issues.length && lines.length < shown; i2++) {
|
|
190967
|
-
const issue4 = issues[i2];
|
|
190968
|
-
if (!issue4)
|
|
190969
|
-
continue;
|
|
190970
|
-
const { message: message2, path: path4 } = issueJSON(issue4);
|
|
190971
|
-
lines.push(path4.length ? `${renderPath(path4)}: ${message2}` : message2);
|
|
190972
|
-
}
|
|
190973
|
-
let more = 0;
|
|
190974
|
-
for (; i2 < issues.length; i2++)
|
|
190975
|
-
if (issues[i2])
|
|
190976
|
-
more++;
|
|
190977
|
-
if (more > 0)
|
|
190978
|
-
lines.push(truncated2 ? `and over ${more} more` : `and ${more} more`);
|
|
190979
|
-
else if (truncated2)
|
|
190980
|
-
lines.push("and more");
|
|
190981
|
-
return `validation failed: ${lines.join("; ")}`;
|
|
190982
|
-
}
|
|
190983
|
-
var ValidationError = class extends Error {
|
|
190984
|
-
name = "ValidationError";
|
|
190985
|
-
constructor(result) {
|
|
190986
|
-
super(message(result));
|
|
190987
|
-
Object.defineProperty(this, "result", { value: result });
|
|
190988
|
-
Object.assign(this, { issues: result.issues });
|
|
190989
|
-
}
|
|
190990
|
-
/**
|
|
190991
|
-
* The error as plain data, each issue projected to its message, path and keyword, so what else a validator keeps on
|
|
190992
|
-
* one (Valibot's and Zod's `input`) is left out. The messages are the validator's own, and some quote the value.
|
|
190993
|
-
*/
|
|
190994
|
-
toJSON() {
|
|
190995
|
-
const json4 = { name: "ValidationError", message: this.message, issues: issuesJSON(this.issues) };
|
|
190996
|
-
return truncated(this.result) ? { ...json4, truncated: true } : json4;
|
|
190997
|
-
}
|
|
190998
|
-
};
|
|
190999
|
-
function message(result) {
|
|
191000
|
-
try {
|
|
191001
|
-
return ownSummary(result) ?? summary2(result.issues, truncated(result));
|
|
191002
|
-
} catch {
|
|
191003
|
-
return "validation failed";
|
|
191004
|
-
}
|
|
191005
|
-
}
|
|
191006
|
-
function ownSummary(result) {
|
|
191007
|
-
const own2 = result;
|
|
191008
|
-
return typeof own2.message === "string" ? own2.message : typeof own2.summary === "string" ? own2.summary : void 0;
|
|
191009
|
-
}
|
|
191010
|
-
var truncated = (result) => result.truncated === true;
|
|
191011
|
-
|
|
191012
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/env.js
|
|
191013
|
-
var debugging = () => debug2 ??= read();
|
|
191014
|
-
var read = () => {
|
|
191015
|
-
try {
|
|
191016
|
-
return globalThis.process?.env?.LOG_LEVEL === "debug";
|
|
191017
|
-
} catch {
|
|
191018
|
-
return false;
|
|
191019
|
-
}
|
|
191020
|
-
};
|
|
191021
|
-
var debug2;
|
|
191022
|
-
|
|
191023
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/hash-node.js
|
|
191024
|
-
import { createRequire as createRequire2 } from "node:module";
|
|
191025
|
-
var sha1 = (text) => {
|
|
191026
|
-
crypto5 ??= load();
|
|
191027
|
-
return crypto5.hash("sha1", text);
|
|
191028
|
-
};
|
|
191029
|
-
var crypto5;
|
|
191030
|
-
var load = () => globalThis.process?.getBuiltinModule?.("node:crypto") ?? createRequire2("/")("node:crypto");
|
|
191031
|
-
|
|
191032
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/key.js
|
|
191033
|
-
function cacheKey2(value2) {
|
|
191034
|
-
if (value2 === null)
|
|
191035
|
-
throw new Error("null cannot be part of a cache key");
|
|
191036
|
-
if (value2 === void 0)
|
|
191037
|
-
return "~void";
|
|
191038
|
-
const json4 = canonical(value2);
|
|
191039
|
-
return json4.length > longKey ? `#${sha1(json4)}` : json4;
|
|
191040
|
-
}
|
|
191041
|
-
var longKey = 4096;
|
|
191042
|
-
function hashKey(key) {
|
|
191043
|
-
if (key === "~void")
|
|
191044
|
-
return key;
|
|
191045
|
-
return key[0] === "#" ? key.slice(1) : sha1(key);
|
|
191046
|
-
}
|
|
191047
|
-
function canonical(value2) {
|
|
191048
|
-
return serialize(value2, 0);
|
|
191049
|
-
}
|
|
191050
|
-
function serialize(value2, depth) {
|
|
191051
|
-
switch (typeof value2) {
|
|
191052
|
-
case "number":
|
|
191053
|
-
if (Number.isFinite(value2))
|
|
191054
|
-
return String(value2);
|
|
191055
|
-
throw new Error(`${value2} cannot be part of a cache key`);
|
|
191056
|
-
case "string":
|
|
191057
|
-
case "boolean":
|
|
191058
|
-
return JSON.stringify(value2);
|
|
191059
|
-
case "undefined":
|
|
191060
|
-
throw new Error("undefined cannot be part of a cache key, except as an object property");
|
|
191061
|
-
case "object":
|
|
191062
|
-
break;
|
|
191063
|
-
default:
|
|
191064
|
-
throw new Error(`a ${typeof value2} cannot be part of a cache key`);
|
|
191065
|
-
}
|
|
191066
|
-
if (value2 === null)
|
|
191067
|
-
return "null";
|
|
191068
|
-
if (depth++ === 64)
|
|
191069
|
-
throw new Error("an input nested more than 64 levels deep, or circular");
|
|
191070
|
-
if (Array.isArray(value2)) {
|
|
191071
|
-
let out2 = "[";
|
|
191072
|
-
for (let i2 = 0; i2 < value2.length; i2++)
|
|
191073
|
-
out2 += `${i2 ? "," : ""}${serialize(value2[i2], depth)}`;
|
|
191074
|
-
return `${out2}]`;
|
|
191075
|
-
}
|
|
191076
|
-
const proto = Object.getPrototypeOf(value2);
|
|
191077
|
-
if (proto !== Object.prototype && proto !== null) {
|
|
191078
|
-
const name = proto.constructor?.name || "class instance";
|
|
191079
|
-
throw new Error(`a ${name} cannot be part of a cache key: only JSON data can`);
|
|
191080
|
-
}
|
|
191081
|
-
let out = "";
|
|
191082
|
-
for (const key of Object.keys(value2).sort()) {
|
|
191083
|
-
const v = value2[key];
|
|
191084
|
-
if (v !== void 0)
|
|
191085
|
-
out += `${out ? "," : ""}${JSON.stringify(key)}:${serialize(v, depth)}`;
|
|
191086
|
-
}
|
|
191087
|
-
return `{${out}}`;
|
|
191088
|
-
}
|
|
191089
|
-
|
|
191090
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/plain.js
|
|
191091
|
-
var isPlain = (value2) => {
|
|
191092
|
-
if (typeof value2 !== "object" || value2 === null)
|
|
191093
|
-
return false;
|
|
191094
|
-
const proto = Object.getPrototypeOf(value2);
|
|
191095
|
-
return proto === Object.prototype || proto === null;
|
|
191096
|
-
};
|
|
191097
|
-
|
|
191098
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/sleep.js
|
|
191099
|
-
function sleep2(ms, signal) {
|
|
191100
|
-
return new Promise((resolve3) => {
|
|
191101
|
-
if (signal?.aborted)
|
|
191102
|
-
return resolve3();
|
|
191103
|
-
const done = () => {
|
|
191104
|
-
clearTimeout(timer);
|
|
191105
|
-
signal?.removeEventListener("abort", done);
|
|
191106
|
-
resolve3();
|
|
191107
|
-
};
|
|
191108
|
-
const timer = setTimeout(done, ms);
|
|
191109
|
-
signal?.addEventListener("abort", done, { once: true });
|
|
191110
|
-
});
|
|
191111
|
-
}
|
|
191112
|
-
|
|
191113
|
-
// node_modules/.pnpm/yes@0.2.7_typescript@5.9.3/node_modules/yes/dist/ops/api.js
|
|
191114
|
-
function backoff(schedule, attempt) {
|
|
191115
|
-
const d = schedule[attempt - 1];
|
|
191116
|
-
return d === void 0 ? -1 : Math.round(d / 2 + Math.random() * d / 2);
|
|
191117
|
-
}
|
|
191118
|
-
async function assertSchema(schema2, value2) {
|
|
191119
|
-
const result = await schema2["~standard"].validate(value2);
|
|
191120
|
-
if (result.issues)
|
|
191121
|
-
throw new ValidationError(result);
|
|
191122
|
-
return result.value;
|
|
191123
|
-
}
|
|
191124
|
-
var TimeoutError = class extends Error {
|
|
191125
|
-
name = "TimeoutError";
|
|
191126
|
-
/** the op's `timeout`, in ms */
|
|
191127
|
-
timeout;
|
|
191128
|
-
constructor(timeout) {
|
|
191129
|
-
super(`attempt timed out after ${timeout}ms`);
|
|
191130
|
-
this.timeout = timeout;
|
|
191131
|
-
}
|
|
191132
|
-
};
|
|
191133
|
-
var gates = /* @__PURE__ */ new WeakMap();
|
|
191134
|
-
function semaphore(size) {
|
|
191135
|
-
let free = size;
|
|
191136
|
-
const line = [];
|
|
191137
|
-
return {
|
|
191138
|
-
acquire: (signal) => free > 0 ? void free-- : wait(line, signal),
|
|
191139
|
-
release: () => {
|
|
191140
|
-
const next2 = line.shift();
|
|
191141
|
-
if (next2)
|
|
191142
|
-
next2();
|
|
191143
|
-
else
|
|
191144
|
-
free++;
|
|
191145
|
-
}
|
|
191146
|
-
};
|
|
191147
|
-
}
|
|
191148
|
-
function wait(line, signal, left) {
|
|
191149
|
-
return new Promise((resolve3, reject) => {
|
|
191150
|
-
const abort = () => {
|
|
191151
|
-
line.splice(line.indexOf(next2), 1);
|
|
191152
|
-
left?.();
|
|
191153
|
-
reject(signal.reason);
|
|
191154
|
-
};
|
|
191155
|
-
const next2 = () => {
|
|
191156
|
-
signal?.removeEventListener("abort", abort);
|
|
191157
|
-
resolve3();
|
|
191158
|
-
};
|
|
191159
|
-
signal?.addEventListener("abort", abort, { once: true });
|
|
191160
|
-
line.push(next2);
|
|
191161
|
-
});
|
|
191162
|
-
}
|
|
191163
|
-
function op(options) {
|
|
191164
|
-
return build3(options, true);
|
|
191165
|
-
}
|
|
191166
|
-
function build3(options, cacheMethods) {
|
|
191167
|
-
const { name, input: inputSchema, output: outputSchema, run: run4, dedupe, ttl, cache: adapter, timeout } = options;
|
|
191168
|
-
const { retry, concurrency } = options;
|
|
191169
|
-
const delayFor = Array.isArray(retry) ? (_, attempt) => backoff(retry, attempt) : retry;
|
|
191170
|
-
if (ttl !== void 0 && typeof ttl !== "function" && !isLifetime(ttl)) {
|
|
191171
|
-
throw new TypeError(`yes.op: ttl must be a positive number of milliseconds, got ${ttl}`);
|
|
191172
|
-
}
|
|
191173
|
-
if (timeout !== void 0 && !(isLifetime(timeout) && timeout <= maxDelay)) {
|
|
191174
|
-
throw new TypeError(`yes.op: timeout must be a positive number of milliseconds up to ${maxDelay}, got ${timeout}`);
|
|
191175
|
-
}
|
|
191176
|
-
if (concurrency !== void 0 && !(Number.isInteger(concurrency) && concurrency > 0)) {
|
|
191177
|
-
throw new TypeError(`yes.op: concurrency must be a positive integer, got ${concurrency}`);
|
|
191178
|
-
}
|
|
191179
|
-
const lifetime = typeof ttl === "function" ? ttl : (result) => result == null || result instanceof Error ? 0 : ttl;
|
|
191180
|
-
if (adapter && (!name || name.includes(":"))) {
|
|
191181
|
-
throw new TypeError(`yes.op: an op with a cache adapter needs a name without ":", got ${JSON.stringify(name)}`);
|
|
191182
|
-
}
|
|
191183
|
-
if (adapter && ttl === void 0)
|
|
191184
|
-
throw new TypeError(`yes.op: a cache adapter does nothing without a ttl`);
|
|
191185
|
-
const store = ttl === void 0 ? void 0 : adapter ?? memory({ maxItems: options.maxItems });
|
|
191186
|
-
const keepsErrors = !!store && "peek" in store;
|
|
191187
|
-
const prefix = adapter ? `yes:${name}:` : "";
|
|
191188
|
-
const storeKey = adapter ? (key) => prefix + hashedKey(key) : (key) => key.local;
|
|
191189
|
-
const reported = adapter ? void 0 : hashKey;
|
|
191190
|
-
const label = name ? `[${name}] ` : "";
|
|
191191
|
-
const slots = concurrency === void 0 ? void 0 : semaphore(concurrency);
|
|
191192
|
-
const gate = options.rateLimit === void 0 ? void 0 : gates.get(options.rateLimit);
|
|
191193
|
-
if (options.rateLimit !== void 0 && !gate)
|
|
191194
|
-
throw new TypeError(`yes.op: rateLimit takes a yes.rateLimiter`);
|
|
191195
|
-
const take = gate?.take;
|
|
191196
|
-
const admit = slots || take ? async (signal, limitKey) => {
|
|
191197
|
-
await slots?.acquire(signal);
|
|
191198
|
-
try {
|
|
191199
|
-
await take?.(signal, limitKey);
|
|
191200
|
-
} catch (error63) {
|
|
191201
|
-
slots?.release();
|
|
191202
|
-
throw error63;
|
|
191203
|
-
}
|
|
191204
|
-
} : void 0;
|
|
191205
|
-
const keyOf = (input2) => {
|
|
191206
|
-
try {
|
|
191207
|
-
return { local: cacheKey2(input2), hashed: void 0 };
|
|
191208
|
-
} catch (error63) {
|
|
191209
|
-
throw new Error(`${label}${error63.message}. dedupe and ttl key the input, and a query always dedupes; a write is yes.mutation, which never keys.`, { cause: error63 });
|
|
191210
|
-
}
|
|
191211
|
-
};
|
|
191212
|
-
const report = (attempt, message2, error63, key) => {
|
|
191213
|
-
console.log(`${label}attempt ${attempt} ${message2}`);
|
|
191214
|
-
const data = key === void 0 ? { error: error63, attempt } : { key, error: error63, attempt };
|
|
191215
|
-
console.log(...label ? [label, data] : [data]);
|
|
191216
|
-
};
|
|
191217
|
-
const on = options.on ?? {};
|
|
191218
|
-
const onHit = on.hit ?? void 0;
|
|
191219
|
-
const onRun = on.run ?? void 0;
|
|
191220
|
-
const onAttempt = on.attempt ?? void 0;
|
|
191221
|
-
const onRetry = hookOr(on.retry, delayFor && ((event) => report(event.attempt, `failed, retrying in ${event.wait}ms`, event.error, event.key)));
|
|
191222
|
-
const onSuccess = on.success ?? void 0;
|
|
191223
|
-
const onFailure = hookOr(on.failure, delayFor && ((event) => report(event.attempts, "failed, not retrying", event.error, event.key)));
|
|
191224
|
-
const failureLine = on.failure === void 0;
|
|
191225
|
-
const runOnce = (input2, ctx, signal) => {
|
|
191226
|
-
if (timeout === void 0)
|
|
191227
|
-
return run4(input2, ctx);
|
|
191228
|
-
const controller = timeout !== void 0 && ownsSignal(ctx) ? new AbortController() : void 0;
|
|
191229
|
-
const follow = controller && signal && (() => controller.abort(signal.reason));
|
|
191230
|
-
return new Promise((resolve3, reject) => {
|
|
191231
|
-
let settled = false;
|
|
191232
|
-
let pending;
|
|
191233
|
-
const settle2 = (done) => (value2) => {
|
|
191234
|
-
if (settled)
|
|
191235
|
-
return;
|
|
191236
|
-
settled = true;
|
|
191237
|
-
clearTimeout(pending);
|
|
191238
|
-
if (follow)
|
|
191239
|
-
signal.removeEventListener("abort", follow);
|
|
191240
|
-
done(value2);
|
|
191241
|
-
};
|
|
191242
|
-
if (timeout !== void 0) {
|
|
191243
|
-
pending = setTimeout(() => {
|
|
191244
|
-
const error63 = new TimeoutError(timeout);
|
|
191245
|
-
settle2(reject)(error63);
|
|
191246
|
-
controller?.abort(error63);
|
|
191247
|
-
}, timeout);
|
|
191248
|
-
}
|
|
191249
|
-
if (follow) {
|
|
191250
|
-
if (signal.aborted)
|
|
191251
|
-
follow();
|
|
191252
|
-
else
|
|
191253
|
-
signal.addEventListener("abort", follow, { once: true });
|
|
191254
|
-
}
|
|
191255
|
-
try {
|
|
191256
|
-
const own2 = controller ? { ...ctx, signal: controller.signal } : ctx;
|
|
191257
|
-
Promise.resolve(run4(input2, own2)).then(settle2(resolve3), settle2(reject));
|
|
191258
|
-
} catch (error63) {
|
|
191259
|
-
settle2(reject)(error63);
|
|
191260
|
-
}
|
|
191261
|
-
});
|
|
191262
|
-
};
|
|
191263
|
-
const attempts = async (input2, ctx, key, trace, signal, tally) => {
|
|
191264
|
-
const limitKey = gate?.by?.(input2, ctx);
|
|
191265
|
-
const own2 = inject(ctx);
|
|
191266
|
-
for (let attempt = 1; ; attempt++) {
|
|
191267
|
-
signal?.throwIfAborted();
|
|
191268
|
-
if (admit)
|
|
191269
|
-
await admit(signal, limitKey);
|
|
191270
|
-
if (tally)
|
|
191271
|
-
tally.started = attempt;
|
|
191272
|
-
try {
|
|
191273
|
-
let returned;
|
|
191274
|
-
try {
|
|
191275
|
-
if (onAttempt) {
|
|
191276
|
-
const awaited = onAttempt({ name, input: input2, ctx, key: hashedKey(key), attempt });
|
|
191277
|
-
if (isThenable(awaited))
|
|
191278
|
-
await awaited;
|
|
191279
|
-
}
|
|
191280
|
-
returned = await runOnce(input2, own2, signal);
|
|
191281
|
-
} finally {
|
|
191282
|
-
slots?.release();
|
|
191283
|
-
}
|
|
191284
|
-
const result = outputSchema ? await assertSchema(outputSchema, returned) : returned;
|
|
191285
|
-
trace?.(`run resolved on attempt ${attempt}`);
|
|
191286
|
-
return result;
|
|
191287
|
-
} catch (thrown) {
|
|
191288
|
-
let error63 = thrown;
|
|
191289
|
-
let wait2 = -1;
|
|
191290
|
-
let stopped = false;
|
|
191291
|
-
if (gate && !(error63 instanceof ValidationError)) {
|
|
191292
|
-
try {
|
|
191293
|
-
const paused = gate.failed(error63, limitKey);
|
|
191294
|
-
if (paused)
|
|
191295
|
-
trace?.(`rate limit paused for ${paused}ms`);
|
|
191296
|
-
} catch (stop2) {
|
|
191297
|
-
error63 = stop2;
|
|
191298
|
-
stopped = true;
|
|
191299
|
-
}
|
|
191300
|
-
}
|
|
191301
|
-
if (delayFor && !stopped && !(error63 instanceof ValidationError) && !signal?.aborted) {
|
|
191302
|
-
try {
|
|
191303
|
-
wait2 = delayFor(error63, attempt);
|
|
191304
|
-
} catch (stop2) {
|
|
191305
|
-
error63 = stop2;
|
|
191306
|
-
}
|
|
191307
|
-
if (typeof wait2 !== "number") {
|
|
191308
|
-
error63 = new TypeError(`yes.op: a retry waits a number of ms, got ${typeof wait2}`, { cause: error63 });
|
|
191309
|
-
wait2 = -1;
|
|
191310
|
-
} else if (wait2 > maxDelay) {
|
|
191311
|
-
error63 = new RangeError(`yes.op: a retry waits at most ${maxDelay}ms, got ${wait2}`, { cause: error63 });
|
|
191312
|
-
wait2 = -1;
|
|
191313
|
-
}
|
|
191314
|
-
}
|
|
191315
|
-
if (wait2 >= 0 && onRetry) {
|
|
191316
|
-
try {
|
|
191317
|
-
const returned = onRetry({ name, input: input2, ctx, key: hashedKey(key), error: error63, attempt, wait: wait2 });
|
|
191318
|
-
if (isThenable(returned))
|
|
191319
|
-
await returned;
|
|
191320
|
-
} catch (stop2) {
|
|
191321
|
-
error63 = stop2;
|
|
191322
|
-
wait2 = -1;
|
|
191323
|
-
}
|
|
191324
|
-
}
|
|
191325
|
-
if (wait2 >= 0) {
|
|
191326
|
-
await sleep2(wait2, signal);
|
|
191327
|
-
continue;
|
|
191328
|
-
}
|
|
191329
|
-
trace?.(`run failed on attempt ${attempt}`, { error: error63 });
|
|
191330
|
-
throw error63;
|
|
191331
|
-
}
|
|
191332
|
-
}
|
|
191333
|
-
};
|
|
191334
|
-
const execution = onRun || onSuccess || onFailure ? async (input2, ctx, key, trace, signal, write2) => {
|
|
191335
|
-
const tally = { started: 0 };
|
|
191336
|
-
let result;
|
|
191337
|
-
try {
|
|
191338
|
-
if (onRun) {
|
|
191339
|
-
const awaited = onRun({ name, input: input2, ctx, key: hashedKey(key) });
|
|
191340
|
-
if (isThenable(awaited))
|
|
191341
|
-
await awaited;
|
|
191342
|
-
}
|
|
191343
|
-
result = await attempts(input2, ctx, key, trace, signal, tally);
|
|
191344
|
-
if (write2)
|
|
191345
|
-
result = await write2(result);
|
|
191346
|
-
} catch (error63) {
|
|
191347
|
-
if (onFailure && !signal?.aborted && !(failureLine && tally.started <= 1)) {
|
|
191348
|
-
const awaited = onFailure({ name, input: input2, ctx, key: hashedKey(key), error: error63, attempts: tally.started });
|
|
191349
|
-
if (isThenable(awaited))
|
|
191350
|
-
await awaited;
|
|
191351
|
-
}
|
|
191352
|
-
throw error63;
|
|
191353
|
-
}
|
|
191354
|
-
if (onSuccess) {
|
|
191355
|
-
const awaited = onSuccess({ name, input: input2, ctx, key: hashedKey(key), result, attempts: tally.started });
|
|
191356
|
-
if (isThenable(awaited))
|
|
191357
|
-
await awaited;
|
|
191358
|
-
}
|
|
191359
|
-
return result;
|
|
191360
|
-
} : (input2, ctx, key, trace, signal, write2) => {
|
|
191361
|
-
const running = attempts(input2, ctx, key, trace, signal);
|
|
191362
|
-
return write2 ? running.then(write2) : running;
|
|
191363
|
-
};
|
|
191364
|
-
const hit = (input2, ctx, key, trace, from, value2) => {
|
|
191365
|
-
trace?.(`cache hit (${from})`);
|
|
191366
|
-
const awaited = onHit?.({ name, input: input2, ctx, key: hashedKey(key), from });
|
|
191367
|
-
if (!isThenable(awaited))
|
|
191368
|
-
return value2;
|
|
191369
|
-
if (isThenable(value2))
|
|
191370
|
-
value2.then(void 0, () => {
|
|
191371
|
-
});
|
|
191372
|
-
return awaited.then(() => value2);
|
|
191373
|
-
};
|
|
191374
|
-
const inFlight = /* @__PURE__ */ new Map();
|
|
191375
|
-
const writers = /* @__PURE__ */ new Map();
|
|
191376
|
-
let executions = 0;
|
|
191377
|
-
const execute2 = async (rawInput, ctx, refresh) => {
|
|
191378
|
-
const input2 = inputSchema ? await assertSchema(inputSchema, rawInput) : rawInput;
|
|
191379
|
-
const signal = signalOf(ctx);
|
|
191380
|
-
if (!dedupe && !store)
|
|
191381
|
-
return execution(input2, ctx, void 0, debugTrace(label), signal);
|
|
191382
|
-
const key = keyOf(input2);
|
|
191383
|
-
const trace = debugTrace(label, key);
|
|
191384
|
-
const shared = inFlight.get(key.local);
|
|
191385
|
-
if (shared && !refresh) {
|
|
191386
|
-
const [execution2, leader] = shared;
|
|
191387
|
-
return hit(input2, ctx, key, trace, "in-flight", leader ? execution2.catch((error63) => {
|
|
191388
|
-
if (!leader.aborted)
|
|
191389
|
-
throw error63;
|
|
191390
|
-
signal?.throwIfAborted();
|
|
191391
|
-
return execute2(rawInput, ctx, false);
|
|
191392
|
-
}) : execution2);
|
|
191393
|
-
}
|
|
191394
|
-
const fullKey = storeKey(key);
|
|
191395
|
-
const read3 = store && !refresh ? callAdapter("get", fullKey, () => store.get(fullKey), reported) : void 0;
|
|
191396
|
-
const entry = freshEntry(read3);
|
|
191397
|
-
if (entry)
|
|
191398
|
-
return hit(input2, ctx, key, trace, "store", entry.value);
|
|
191399
|
-
const number6 = ++executions;
|
|
191400
|
-
let writer;
|
|
191401
|
-
if (store) {
|
|
191402
|
-
writer = writers.get(key.local);
|
|
191403
|
-
if (!writer) {
|
|
191404
|
-
writer = { running: 0, refreshed: 0 };
|
|
191405
|
-
writers.set(key.local, writer);
|
|
191406
|
-
}
|
|
191407
|
-
writer.running++;
|
|
191408
|
-
if (refresh)
|
|
191409
|
-
writer.refreshed = number6;
|
|
191410
|
-
}
|
|
191411
|
-
const write2 = store && (async (result) => {
|
|
191412
|
-
const ms = lifetime(result);
|
|
191413
|
-
if (!(isLifetime(ms) && writer.refreshed <= number6 && (keepsErrors || !(result instanceof Error)))) {
|
|
191414
|
-
return result;
|
|
191415
|
-
}
|
|
191416
|
-
const created = Date.now();
|
|
191417
|
-
try {
|
|
191418
|
-
await store.set(fullKey, { value: result, created, expires: created + ms, input: input2 }, ms);
|
|
191419
|
-
} catch (error63) {
|
|
191420
|
-
console.error(`${label}cache write failed, returning the result uncached`, new AdapterError("set", reported ? reported(fullKey) : fullKey, error63));
|
|
191421
|
-
}
|
|
191422
|
-
return result;
|
|
191423
|
-
});
|
|
191424
|
-
const promise2 = (async () => {
|
|
191425
|
-
const stored = isThenable(read3) ? freshEntry(await read3) : void 0;
|
|
191426
|
-
if (stored)
|
|
191427
|
-
return hit(input2, ctx, key, trace, "store", stored.value);
|
|
191428
|
-
trace?.(refresh ? "refreshing, running" : "cache miss, running");
|
|
191429
|
-
return execution(input2, ctx, key, trace, signal, write2);
|
|
191430
|
-
})();
|
|
191431
|
-
const settled = writer ? promise2.finally(() => --writer.running || writers.delete(key.local)) : promise2;
|
|
191432
|
-
if (!dedupe)
|
|
191433
|
-
return settled;
|
|
191434
|
-
const flight = [settled, signal];
|
|
191435
|
-
inFlight.set(key.local, flight);
|
|
191436
|
-
return settled.finally(() => inFlight.get(key.local) === flight && inFlight.delete(key.local));
|
|
191437
|
-
};
|
|
191438
|
-
const call = (rawInput, ctx) => execute2(rawInput, ctx, false);
|
|
191439
|
-
const jsonSchema2 = inputSchema?.["~standard"].jsonSchema;
|
|
191440
|
-
if (jsonSchema2) {
|
|
191441
|
-
call["~standard"] = {
|
|
191442
|
-
version: 1,
|
|
191443
|
-
vendor: "yes",
|
|
191444
|
-
name: name ?? "",
|
|
191445
|
-
description: options.description ?? "",
|
|
191446
|
-
jsonSchema: {
|
|
191447
|
-
input: (params) => jsonSchema2.input(params),
|
|
191448
|
-
// what the op returns is what its output schema returns; without one that can say so, any value
|
|
191449
|
-
output: (params) => outputSchema?.["~standard"].jsonSchema?.output(params) ?? {}
|
|
191450
|
-
},
|
|
191451
|
-
...run4.length < 2 && {
|
|
191452
|
-
execute: (input2, options2) => call(input2, options2?.signal ? { signal: options2.signal } : void 0)
|
|
191453
|
-
}
|
|
191454
|
-
};
|
|
191455
|
-
}
|
|
191456
|
-
if (!cacheMethods)
|
|
191457
|
-
return call;
|
|
191458
|
-
const withKey = (input2, use) => {
|
|
191459
|
-
const toKey = (result2) => use(storeKey(keyOf(result2 && !result2.issues ? result2.value : input2)));
|
|
191460
|
-
const result = inputSchema?.["~standard"].validate(input2);
|
|
191461
|
-
return result instanceof Promise ? result.then(toKey) : toKey(result);
|
|
191462
|
-
};
|
|
191463
|
-
return Object.assign(call, {
|
|
191464
|
-
clear: async (input2) => {
|
|
191465
|
-
if (!store)
|
|
191466
|
-
return;
|
|
191467
|
-
if (input2 === void 0)
|
|
191468
|
-
await sweep(store, prefix, () => true);
|
|
191469
|
-
else
|
|
191470
|
-
await withKey(input2, (key) => callAdapter("delete", key, () => store.delete([key]), reported));
|
|
191471
|
-
},
|
|
191472
|
-
// the memory store peeks, so asking whether a key is cached does not change which key is evicted next
|
|
191473
|
-
has: async (input2) => !!store && !!freshEntry(await withKey(input2, (key) => callAdapter("get", key, () => "peek" in store ? store.peek(key) : store.get(key), reported))),
|
|
191474
|
-
// not `async`: on the memory store a predicate that throws throws here, not in a promise nobody awaits
|
|
191475
|
-
invalidate: (match3) => {
|
|
191476
|
-
const accepts = typeof match3 === "function" ? match3 : fieldsMatch(match3);
|
|
191477
|
-
return Promise.resolve(store ? sweep(store, prefix, accepts) : 0);
|
|
191478
|
-
},
|
|
191479
|
-
refresh: (rawInput, ctx) => execute2(rawInput, ctx, true)
|
|
191480
|
-
});
|
|
191481
|
-
}
|
|
191482
|
-
function query(options) {
|
|
191483
|
-
return op({ ...options, dedupe: true });
|
|
191484
|
-
}
|
|
191485
|
-
function mutation({ dedupe: _dedupe, ttl: _ttl, cache: _cache, ...options }) {
|
|
191486
|
-
return build3(options, false);
|
|
191487
|
-
}
|
|
191488
|
-
var hookOr = (given, line) => given === void 0 ? line || void 0 : given ?? void 0;
|
|
191489
|
-
var ownsSignal = (ctx) => {
|
|
191490
|
-
if (ctx === void 0)
|
|
191491
|
-
return true;
|
|
191492
|
-
if (!isPlain(ctx))
|
|
191493
|
-
return false;
|
|
191494
|
-
const signal = ctx.signal;
|
|
191495
|
-
return signal === void 0 || isSignal(signal);
|
|
191496
|
-
};
|
|
191497
|
-
var inject = (ctx) => {
|
|
191498
|
-
if (ctx === void 0)
|
|
191499
|
-
return { signal: idleSignal() };
|
|
191500
|
-
return isPlain(ctx) && ctx.signal === void 0 ? { ...ctx, signal: idleSignal() } : ctx;
|
|
191501
|
-
};
|
|
191502
|
-
var idle;
|
|
191503
|
-
var idleSignal = () => {
|
|
191504
|
-
if (idle === void 0 && typeof AbortController === "function")
|
|
191505
|
-
idle = new AbortController().signal;
|
|
191506
|
-
return idle;
|
|
191507
|
-
};
|
|
191508
|
-
var signalOf = (ctx) => {
|
|
191509
|
-
const signal = ctx?.signal;
|
|
191510
|
-
return isSignal(signal) ? signal : void 0;
|
|
191511
|
-
};
|
|
191512
|
-
var isSignal = (value2) => typeof AbortSignal === "function" && value2 instanceof AbortSignal;
|
|
191513
|
-
function debugTrace(label, callKey) {
|
|
191514
|
-
if (!debugging())
|
|
191515
|
-
return;
|
|
191516
|
-
const prefix = `${label}[${(/* @__PURE__ */ new Date()).toISOString()}]`;
|
|
191517
|
-
const start = performance.now();
|
|
191518
|
-
const key = hashedKey(callKey);
|
|
191519
|
-
return (message2, data) => console.log(`${prefix} ${message2} +${Math.round(performance.now() - start)}ms`, { ...key && { key }, ...data });
|
|
191520
|
-
}
|
|
191521
|
-
function hashedKey(key) {
|
|
191522
|
-
if (key)
|
|
191523
|
-
key.hashed ??= hashKey(key.local);
|
|
191524
|
-
return key?.hashed;
|
|
191525
|
-
}
|
|
191526
|
-
var maxDelay = 2 ** 31 - 1;
|
|
191527
|
-
var isLifetime = (ms) => typeof ms === "number" && ms > 0 && Number.isFinite(ms);
|
|
191528
|
-
function fieldsMatch(partial3) {
|
|
191529
|
-
const fields = Object.entries(partial3).map(([field, value2]) => [
|
|
191530
|
-
field,
|
|
191531
|
-
value2 === void 0 ? void 0 : canonical(value2)
|
|
191532
|
-
]);
|
|
191533
|
-
return (input2) => typeof input2 === "object" && input2 !== null && fields.every(([field, value2]) => {
|
|
191534
|
-
const actual = input2[field];
|
|
191535
|
-
return actual === void 0 ? value2 === void 0 : value2 !== void 0 && canonical(actual) === value2;
|
|
191536
|
-
});
|
|
191537
|
-
}
|
|
191538
|
-
var isThenable = (value2) => typeof value2?.then === "function";
|
|
191539
|
-
function freshEntry(value2) {
|
|
191540
|
-
return typeof value2?.expires === "number" && value2.expires > Date.now() && "value" in value2 ? value2 : void 0;
|
|
191541
|
-
}
|
|
191542
|
-
function callAdapter(method, key, run4, reported) {
|
|
191543
|
-
try {
|
|
191544
|
-
const result = run4();
|
|
191545
|
-
if (!isThenable(result))
|
|
191546
|
-
return result;
|
|
191547
|
-
return result.then(void 0, (error63) => {
|
|
191548
|
-
throw new AdapterError(method, reported ? reported(key) : key, error63);
|
|
191549
|
-
});
|
|
191550
|
-
} catch (error63) {
|
|
191551
|
-
throw new AdapterError(method, reported ? reported(key) : key, error63);
|
|
191552
|
-
}
|
|
191553
|
-
}
|
|
191554
|
-
function sweep(store, prefix, match3) {
|
|
191555
|
-
const purge = (listed2) => {
|
|
191556
|
-
const now = Date.now();
|
|
191557
|
-
const keys = [];
|
|
191558
|
-
let count = 0;
|
|
191559
|
-
for (const [key, { input: input2, expires }] of listed2) {
|
|
191560
|
-
if (!(expires > now))
|
|
191561
|
-
keys.push(key);
|
|
191562
|
-
else if (match3(input2)) {
|
|
191563
|
-
keys.push(key);
|
|
191564
|
-
count++;
|
|
191565
|
-
}
|
|
191566
|
-
}
|
|
191567
|
-
const remove = (from) => {
|
|
191568
|
-
if (from >= keys.length)
|
|
191569
|
-
return count;
|
|
191570
|
-
const deleted = callAdapter("delete", prefix, () => store.delete(keys.slice(from, from + 1e3)));
|
|
191571
|
-
return isThenable(deleted) ? Promise.resolve(deleted).then(() => remove(from + 1e3)) : remove(from + 1e3);
|
|
191572
|
-
};
|
|
191573
|
-
return remove(0);
|
|
191574
|
-
};
|
|
191575
|
-
const listed = callAdapter("list", prefix, () => {
|
|
191576
|
-
const listed2 = store.list(prefix);
|
|
191577
|
-
if (Array.isArray(listed2))
|
|
191578
|
-
return listed2;
|
|
191579
|
-
return (async () => {
|
|
191580
|
-
const items = [];
|
|
191581
|
-
for await (const item of await listed2)
|
|
191582
|
-
items.push(item);
|
|
191583
|
-
return items;
|
|
191584
|
-
})();
|
|
191585
|
-
});
|
|
191586
|
-
return Array.isArray(listed) ? purge(listed) : listed.then(purge);
|
|
191587
|
-
}
|
|
191588
|
-
|
|
191589
191698
|
// utils/progressComment.ts
|
|
191590
191699
|
function parseProgressComment(raw2) {
|
|
191591
191700
|
if (!raw2?.id) return void 0;
|
|
@@ -191730,7 +191839,7 @@ function ensureRepoState(toolState, init) {
|
|
|
191730
191839
|
|
|
191731
191840
|
// utils/changeImpact.ts
|
|
191732
191841
|
import { spawn as spawn4 } from "node:child_process";
|
|
191733
|
-
import { writeFileSync as
|
|
191842
|
+
import { writeFileSync as writeFileSync9 } from "node:fs";
|
|
191734
191843
|
import { join as join10 } from "node:path";
|
|
191735
191844
|
var MAX_CANDIDATES = 24;
|
|
191736
191845
|
var MAX_ATOM_LENGTH = 128;
|
|
@@ -192083,7 +192192,7 @@ async function createChangeImpactArtifact(ctx, params) {
|
|
|
192083
192192
|
lookupError: lookup2.error
|
|
192084
192193
|
});
|
|
192085
192194
|
const path4 = join10(ctx.tmpdir, `pr-${params.pullNumber}-${params.headSha.slice(0, 7)}-impact.md`);
|
|
192086
|
-
|
|
192195
|
+
writeFileSync9(path4, artifact.content);
|
|
192087
192196
|
return {
|
|
192088
192197
|
path: path4,
|
|
192089
192198
|
candidateCount: candidates.selected.length,
|
|
@@ -192352,7 +192461,7 @@ var GENERATED = /(^|\/)(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb
|
|
|
192352
192461
|
|
|
192353
192462
|
// utils/gitAuth.ts
|
|
192354
192463
|
import { execSync } from "node:child_process";
|
|
192355
|
-
import { createHash as
|
|
192464
|
+
import { createHash as createHash3 } from "node:crypto";
|
|
192356
192465
|
import { readFileSync as readFileSync6, realpathSync, unlinkSync } from "node:fs";
|
|
192357
192466
|
import { join as join11 } from "node:path";
|
|
192358
192467
|
|
|
@@ -192415,7 +192524,7 @@ var TRANSIENT_AUTH_PATTERNS = [
|
|
|
192415
192524
|
];
|
|
192416
192525
|
var gitBinary;
|
|
192417
192526
|
function hashFile(path4) {
|
|
192418
|
-
return
|
|
192527
|
+
return createHash3("sha256").update(readFileSync6(path4)).digest("hex");
|
|
192419
192528
|
}
|
|
192420
192529
|
function resolveGit() {
|
|
192421
192530
|
const whichPath = execSync("which git", { encoding: "utf-8" }).trim();
|
|
@@ -192560,7 +192669,7 @@ import { spawnSync as spawnSync8 } from "node:child_process";
|
|
|
192560
192669
|
import { spawn as spawn5, spawnSync as spawnSync7 } from "node:child_process";
|
|
192561
192670
|
import { randomUUID as randomUUID4 } from "node:crypto";
|
|
192562
192671
|
import { once } from "node:events";
|
|
192563
|
-
import { closeSync, existsSync as existsSync10, openSync, writeFileSync as
|
|
192672
|
+
import { closeSync, existsSync as existsSync10, openSync, writeFileSync as writeFileSync10 } from "node:fs";
|
|
192564
192673
|
import { userInfo as userInfo2 } from "node:os";
|
|
192565
192674
|
import { join as join12 } from "node:path";
|
|
192566
192675
|
import { setTimeout as sleep3 } from "node:timers/promises";
|
|
@@ -193447,7 +193556,7 @@ ${spawnError}` : spawnError;
|
|
|
193447
193556
|
function capOutput(output2) {
|
|
193448
193557
|
if (output2.length <= MAX_OUTPUT_CHARS) return output2;
|
|
193449
193558
|
const fullPath = join12(getTempDir(), `shell-${randomUUID4().slice(0, 8)}.log`);
|
|
193450
|
-
|
|
193559
|
+
writeFileSync10(fullPath, output2);
|
|
193451
193560
|
const elided = output2.length - MAX_OUTPUT_CHARS;
|
|
193452
193561
|
return `... [${elided} chars truncated; output saved to ${fullPath}] ...
|
|
193453
193562
|
${output2.slice(-MAX_OUTPUT_CHARS)}`;
|
|
@@ -193523,7 +193632,7 @@ Do NOT use this tool for git commands \u2014 use the dedicated git tools instead
|
|
|
193523
193632
|
throw new Error(`failed to start background process: ${error63.message}`);
|
|
193524
193633
|
}
|
|
193525
193634
|
proc.unref();
|
|
193526
|
-
|
|
193635
|
+
writeFileSync10(pidPath, `${proc.pid}
|
|
193527
193636
|
`);
|
|
193528
193637
|
ctx.toolState.backgroundProcesses.set(handle, { pid: proc.pid, outputPath, pidPath });
|
|
193529
193638
|
return {
|
|
@@ -193868,7 +193977,7 @@ function postProcessRangeDiff(raw2, contextLines = 3) {
|
|
|
193868
193977
|
|
|
193869
193978
|
// mcp/git.ts
|
|
193870
193979
|
import { randomUUID as randomUUID5 } from "node:crypto";
|
|
193871
|
-
import { writeFileSync as
|
|
193980
|
+
import { writeFileSync as writeFileSync11 } from "node:fs";
|
|
193872
193981
|
import { join as join15 } from "node:path";
|
|
193873
193982
|
|
|
193874
193983
|
// utils/apiCommit.ts
|
|
@@ -199321,7 +199430,7 @@ function spillGitOutput(params) {
|
|
|
199321
199430
|
const tempDir = process.env.PULLFROG_TEMP_DIR;
|
|
199322
199431
|
if (!tempDir) throw new Error("PULLFROG_TEMP_DIR not set");
|
|
199323
199432
|
const outputPath = join15(tempDir, `git-${params.command}-${randomUUID5().slice(0, 8)}.txt`);
|
|
199324
|
-
|
|
199433
|
+
writeFileSync11(outputPath, params.output);
|
|
199325
199434
|
const previewByLines = params.output.split("\n").slice(0, OVERFLOW_PREVIEW_LINES).join("\n");
|
|
199326
199435
|
const preview = previewByLines.length <= OVERFLOW_PREVIEW_MAX_CHARS ? previewByLines : `${previewByLines.slice(0, OVERFLOW_PREVIEW_MAX_CHARS)}\u2026`;
|
|
199327
199436
|
log2.info(
|
|
@@ -199666,9 +199775,21 @@ function fixDoubleEscapedString(str) {
|
|
|
199666
199775
|
}
|
|
199667
199776
|
|
|
199668
199777
|
// utils/isPullfrog.ts
|
|
199778
|
+
var BUILT_IN = /* @__PURE__ */ new Set(["pullfrog", "pullfrogdev"]);
|
|
199779
|
+
var runBotLogin = "pullfrog";
|
|
199780
|
+
function setBotLogin(login) {
|
|
199781
|
+
runBotLogin = normalize3(login);
|
|
199782
|
+
}
|
|
199669
199783
|
function isPullfrog(actor) {
|
|
199670
|
-
|
|
199671
|
-
|
|
199784
|
+
if (!actor) return false;
|
|
199785
|
+
const login = normalize3(actor);
|
|
199786
|
+
return login === runBotLogin || BUILT_IN.has(login);
|
|
199787
|
+
}
|
|
199788
|
+
function mentionHandles() {
|
|
199789
|
+
return [.../* @__PURE__ */ new Set(["@pullfrog", `@${runBotLogin}`])];
|
|
199790
|
+
}
|
|
199791
|
+
function normalize3(login) {
|
|
199792
|
+
return login.toLowerCase().replace("[bot]", "");
|
|
199672
199793
|
}
|
|
199673
199794
|
|
|
199674
199795
|
// utils/outstandingThreads.ts
|
|
@@ -199688,6 +199809,7 @@ query ($owner: String!, $name: String!, $prNumber: Int!, $cursor: String) {
|
|
|
199688
199809
|
}
|
|
199689
199810
|
`;
|
|
199690
199811
|
async function countOutstandingPullfrogThreads(ctx, pullNumber) {
|
|
199812
|
+
const isOwn = ctx.isPullfrog ?? isPullfrog;
|
|
199691
199813
|
let count = 0;
|
|
199692
199814
|
let cursor3 = null;
|
|
199693
199815
|
for (let page = 0; page < 50; page += 1) {
|
|
@@ -199699,7 +199821,7 @@ async function countOutstandingPullfrogThreads(ctx, pullNumber) {
|
|
|
199699
199821
|
for (const thread of conn?.nodes ?? []) {
|
|
199700
199822
|
if (!thread || thread.isResolved) continue;
|
|
199701
199823
|
const root = thread.comments?.nodes?.find((c2) => c2 != null);
|
|
199702
|
-
if (root &&
|
|
199824
|
+
if (root && isOwn(root.author?.login)) count += 1;
|
|
199703
199825
|
}
|
|
199704
199826
|
if (!conn?.pageInfo.hasNextPage) break;
|
|
199705
199827
|
cursor3 = conn.pageInfo.endCursor;
|
|
@@ -199740,6 +199862,8 @@ var defaultSettings = {
|
|
|
199740
199862
|
codexAgent: false,
|
|
199741
199863
|
signedCommits: false,
|
|
199742
199864
|
repoIntelligence: false,
|
|
199865
|
+
botLogin: "pullfrog[bot]",
|
|
199866
|
+
botUserId: "226033991",
|
|
199743
199867
|
progressComments: true,
|
|
199744
199868
|
statusChecks: true,
|
|
199745
199869
|
approvalCheck: false,
|
|
@@ -199820,7 +199944,8 @@ async function fetchRunContext(params) {
|
|
|
199820
199944
|
secretsUnavailable: data.secretsUnavailable,
|
|
199821
199945
|
routerUnfunded: data.routerUnfunded,
|
|
199822
199946
|
trialFallback: data.trialFallback,
|
|
199823
|
-
trialCreditsLeftUsd: data.trialCreditsLeftUsd
|
|
199947
|
+
trialCreditsLeftUsd: data.trialCreditsLeftUsd,
|
|
199948
|
+
modelRegistry: data.modelRegistry
|
|
199824
199949
|
};
|
|
199825
199950
|
} catch {
|
|
199826
199951
|
clearTimeout(timeoutId);
|
|
@@ -201169,11 +201294,12 @@ async function configureRepoGit(params) {
|
|
|
201169
201294
|
}
|
|
201170
201295
|
const shouldSetDefaults = !currentEmail || currentEmail === "github-actions[bot]@users.noreply.github.com";
|
|
201171
201296
|
if (shouldSetDefaults) {
|
|
201172
|
-
|
|
201297
|
+
const email5 = `${params.botUserId}+${params.botLogin}@users.noreply.github.com`;
|
|
201298
|
+
execFileSync7("git", ["config", "--local", "user.email", email5], {
|
|
201173
201299
|
cwd: repoDir,
|
|
201174
201300
|
stdio: "pipe"
|
|
201175
201301
|
});
|
|
201176
|
-
|
|
201302
|
+
execFileSync7("git", ["config", "--local", "user.name", params.botLogin], {
|
|
201177
201303
|
cwd: repoDir,
|
|
201178
201304
|
stdio: "pipe"
|
|
201179
201305
|
});
|
|
@@ -201290,7 +201416,7 @@ function formatFilesWithLineNumbers(files) {
|
|
|
201290
201416
|
}
|
|
201291
201417
|
const tocLines = [`## Files (${files.length})`];
|
|
201292
201418
|
for (const entry of tocEntries) {
|
|
201293
|
-
const anchor2 =
|
|
201419
|
+
const anchor2 = createHash4("sha256").update(entry.filename).digest("hex");
|
|
201294
201420
|
const generated = GENERATED.test(entry.filename) ? " \xB7 generated" : "";
|
|
201295
201421
|
tocLines.push(
|
|
201296
201422
|
`- ${entry.filename} \u2192 lines ${entry.startLine}-${entry.endLine} \xB7 diff-${anchor2}${generated}`
|
|
@@ -201673,6 +201799,8 @@ function CheckoutPrTool(ctx) {
|
|
|
201673
201799
|
toolState: ctx.toolState,
|
|
201674
201800
|
shell: ctx.payload.shell,
|
|
201675
201801
|
postCheckoutScript: ctx.postCheckoutScript,
|
|
201802
|
+
botLogin: ctx.botLogin,
|
|
201803
|
+
botUserId: ctx.botUserId,
|
|
201676
201804
|
beforeSha: primary.beforeSha,
|
|
201677
201805
|
signal
|
|
201678
201806
|
});
|
|
@@ -201703,7 +201831,7 @@ function CheckoutPrTool(ctx) {
|
|
|
201703
201831
|
tempDir,
|
|
201704
201832
|
`pr-${pull_number}-${beforeShort}-${headShort}-incremental.diff`
|
|
201705
201833
|
);
|
|
201706
|
-
|
|
201834
|
+
writeFileSync12(incrementalDiffPath, incremental.diff);
|
|
201707
201835
|
incrementalDiff = incremental.diff;
|
|
201708
201836
|
log2.info(
|
|
201709
201837
|
`\xBB incremental diff computed (${incremental.diff.length} bytes) \u2192 ${incrementalDiffPath}`
|
|
@@ -201720,7 +201848,7 @@ function CheckoutPrTool(ctx) {
|
|
|
201720
201848
|
log2.debug(`formatted diff preview (first 100 lines):
|
|
201721
201849
|
${diffPreview}`);
|
|
201722
201850
|
const diffPath = join17(tempDir, `pr-${pull_number}-${headShort}.diff`);
|
|
201723
|
-
|
|
201851
|
+
writeFileSync12(diffPath, formatResult.content);
|
|
201724
201852
|
log2.debug(`wrote diff to ${diffPath} (${formatResult.content.length} bytes)`);
|
|
201725
201853
|
const coverageEntries = incrementalDiff ? parseIncrementalDiffEntries({ content: incrementalDiff }) : parseDiffTocEntries({ toc: formatResult.toc });
|
|
201726
201854
|
primary.diffCoverage = incrementalEmpty ? void 0 : createDiffCoverageState({
|
|
@@ -201883,7 +202011,7 @@ ${dirty}`
|
|
|
201883
202011
|
}
|
|
201884
202012
|
|
|
201885
202013
|
// mcp/checkSuite.ts
|
|
201886
|
-
import { mkdirSync as
|
|
202014
|
+
import { mkdirSync as mkdirSync9, writeFileSync as writeFileSync13 } from "node:fs";
|
|
201887
202015
|
import { join as join18 } from "node:path";
|
|
201888
202016
|
var GetCheckSuiteLogs = type({
|
|
201889
202017
|
check_suite_id: type.number.describe("the id from check_suite.id")
|
|
@@ -201981,7 +202109,7 @@ function GetCheckSuiteLogsTool(ctx) {
|
|
|
201981
202109
|
throw new Error("PULLFROG_TEMP_DIR not set");
|
|
201982
202110
|
}
|
|
201983
202111
|
const logsDir = join18(tempDir, "ci-logs");
|
|
201984
|
-
|
|
202112
|
+
mkdirSync9(logsDir, { recursive: true });
|
|
201985
202113
|
const jobResults = [];
|
|
201986
202114
|
for (const run4 of failedRuns) {
|
|
201987
202115
|
const jobs = await ctx.octokit.paginate(ctx.octokit.rest.actions.listJobsForWorkflowRun, {
|
|
@@ -202008,7 +202136,7 @@ function GetCheckSuiteLogsTool(ctx) {
|
|
|
202008
202136
|
}
|
|
202009
202137
|
const logsText = await logsResult.text();
|
|
202010
202138
|
const logPath = join18(logsDir, `job-${job.id}.log`);
|
|
202011
|
-
|
|
202139
|
+
writeFileSync13(logPath, logsText);
|
|
202012
202140
|
const analysis = analyzeLog(logsText, 80);
|
|
202013
202141
|
const failedSteps = job.steps?.filter((s) => s.conclusion === "failure").map((s) => `Step ${s.number}: ${s.name}`) ?? [];
|
|
202014
202142
|
jobResults.push({
|
|
@@ -202056,7 +202184,7 @@ function GetCheckSuiteLogsTool(ctx) {
|
|
|
202056
202184
|
}
|
|
202057
202185
|
|
|
202058
202186
|
// mcp/commitInfo.ts
|
|
202059
|
-
import { writeFileSync as
|
|
202187
|
+
import { writeFileSync as writeFileSync14 } from "node:fs";
|
|
202060
202188
|
import { join as join19 } from "node:path";
|
|
202061
202189
|
var CommitInfo = type({
|
|
202062
202190
|
sha: type.string.describe("the commit SHA (full or abbreviated) to fetch")
|
|
@@ -202082,7 +202210,7 @@ function CommitInfoTool(ctx) {
|
|
|
202082
202210
|
);
|
|
202083
202211
|
}
|
|
202084
202212
|
const diffFile = join19(tempDir, `commit-${sha.slice(0, 7)}.diff`);
|
|
202085
|
-
|
|
202213
|
+
writeFileSync14(diffFile, formatResult.content);
|
|
202086
202214
|
log2.debug(`wrote commit diff to ${diffFile} (${formatResult.content.length} bytes)`);
|
|
202087
202215
|
return {
|
|
202088
202216
|
sha: data.sha,
|
|
@@ -202841,7 +202969,7 @@ function AwaitDependencyInstallationTool(ctx) {
|
|
|
202841
202969
|
}
|
|
202842
202970
|
|
|
202843
202971
|
// mcp/gh.ts
|
|
202844
|
-
import { mkdirSync as
|
|
202972
|
+
import { mkdirSync as mkdirSync10 } from "node:fs";
|
|
202845
202973
|
import { join as join23 } from "node:path";
|
|
202846
202974
|
var GH_TIMEOUT_MS = 12e4;
|
|
202847
202975
|
var GhParams = type({
|
|
@@ -202865,7 +202993,7 @@ function GhTool(ctx) {
|
|
|
202865
202993
|
parameters: GhParams,
|
|
202866
202994
|
execute: execute(async (params) => {
|
|
202867
202995
|
const configDir = join23(ctx.tmpdir, "gh-config");
|
|
202868
|
-
|
|
202996
|
+
mkdirSync10(configDir, { recursive: true });
|
|
202869
202997
|
const command = ["gh", ...params.args.map(shellQuote)].join(" ");
|
|
202870
202998
|
const result = await runSandboxed({
|
|
202871
202999
|
command,
|
|
@@ -203589,7 +203717,7 @@ function PullRequestInfoTool(ctx) {
|
|
|
203589
203717
|
}
|
|
203590
203718
|
|
|
203591
203719
|
// mcp/reviewComments.ts
|
|
203592
|
-
import { writeFileSync as
|
|
203720
|
+
import { writeFileSync as writeFileSync15 } from "node:fs";
|
|
203593
203721
|
import { join as join24 } from "node:path";
|
|
203594
203722
|
|
|
203595
203723
|
// utils/payload.ts
|
|
@@ -204277,7 +204405,8 @@ function concurrentThreads(allThreads, threadsForReview, input2) {
|
|
|
204277
204405
|
}
|
|
204278
204406
|
function mentionsPullfrog(body) {
|
|
204279
204407
|
if (!body) return false;
|
|
204280
|
-
|
|
204408
|
+
const text = body.split(/\r?\n/).filter((line) => !line.trim().startsWith(">")).join("\n").toLowerCase();
|
|
204409
|
+
return mentionHandles().some((handle) => text.includes(handle));
|
|
204281
204410
|
}
|
|
204282
204411
|
function formatReviewData(input2) {
|
|
204283
204412
|
const rawReviewBody = input2.review.body;
|
|
@@ -204407,7 +204536,7 @@ function GetReviewCommentsTool(ctx) {
|
|
|
204407
204536
|
}
|
|
204408
204537
|
const filename = `review-${params.review_id}-threads.md`;
|
|
204409
204538
|
const commentsPath = join24(tempDir, filename);
|
|
204410
|
-
|
|
204539
|
+
writeFileSync15(commentsPath, formatted.content);
|
|
204411
204540
|
log2.debug(`wrote ${threadBlocks.length} threads to ${commentsPath}`);
|
|
204412
204541
|
return {
|
|
204413
204542
|
review_id: params.review_id,
|
|
@@ -204811,7 +204940,7 @@ function UploadFileTool(ctx) {
|
|
|
204811
204940
|
}
|
|
204812
204941
|
|
|
204813
204942
|
// mcp/xrepo.ts
|
|
204814
|
-
import { mkdirSync as
|
|
204943
|
+
import { mkdirSync as mkdirSync11, rmSync as rmSync5 } from "node:fs";
|
|
204815
204944
|
import { join as join25 } from "node:path";
|
|
204816
204945
|
function assertValidRepoName(name) {
|
|
204817
204946
|
if (!/^[A-Za-z0-9._-]+$/.test(name) || name.startsWith("-") || name.includes("..")) {
|
|
@@ -204893,7 +205022,7 @@ function CheckoutRepoTool(ctx) {
|
|
|
204893
205022
|
}
|
|
204894
205023
|
const access2 = accessFor(ctx, repo);
|
|
204895
205024
|
const dir = join25(ctx.tmpdir, "xrepo", repo);
|
|
204896
|
-
|
|
205025
|
+
mkdirSync11(dir, { recursive: true });
|
|
204897
205026
|
const state = ensureRepoState(ctx.toolState, { owner, name: repo, dir, access: access2 });
|
|
204898
205027
|
const rc = resolveRepoCtx(ctx, repo);
|
|
204899
205028
|
try {
|
|
@@ -204917,7 +205046,9 @@ function CheckoutRepoTool(ctx) {
|
|
|
204917
205046
|
octokit: rc.octokit,
|
|
204918
205047
|
toolState: ctx.toolState,
|
|
204919
205048
|
shell: ctx.payload.shell,
|
|
204920
|
-
postCheckoutScript: null
|
|
205049
|
+
postCheckoutScript: null,
|
|
205050
|
+
botLogin: ctx.botLogin,
|
|
205051
|
+
botUserId: ctx.botUserId
|
|
204921
205052
|
});
|
|
204922
205053
|
log2.info(`\xBB checked out secondary repo ${owner}/${repo} (${access2}) \u2192 ${dir}`);
|
|
204923
205054
|
return { path: dir, access: access2, defaultBranch };
|
|
@@ -206490,7 +206621,7 @@ function activate(input2) {
|
|
|
206490
206621
|
|
|
206491
206622
|
// utils/gitAuthServer.ts
|
|
206492
206623
|
import { randomUUID as randomUUID7 } from "node:crypto";
|
|
206493
|
-
import { writeFileSync as
|
|
206624
|
+
import { writeFileSync as writeFileSync16 } from "node:fs";
|
|
206494
206625
|
import { createServer as createServer4 } from "node:http";
|
|
206495
206626
|
import { join as join26 } from "node:path";
|
|
206496
206627
|
var REVOKED_TRAP_MS = 6e4;
|
|
@@ -206577,7 +206708,7 @@ async function startGitAuthServer(tmpdir5) {
|
|
|
206577
206708
|
`r.on("end",function(){process.stdout.write(d+"\\n")})`,
|
|
206578
206709
|
`}).on("error",function(){process.exit(1)})}`
|
|
206579
206710
|
].join("\n");
|
|
206580
|
-
|
|
206711
|
+
writeFileSync16(scriptPath, content, { mode: 448 });
|
|
206581
206712
|
return scriptPath;
|
|
206582
206713
|
}
|
|
206583
206714
|
async function close() {
|
|
@@ -207821,6 +207952,22 @@ ${collapsible}` : output2;
|
|
|
207821
207952
|
}
|
|
207822
207953
|
|
|
207823
207954
|
// utils/runContextData.ts
|
|
207955
|
+
function installServedRegistry(served) {
|
|
207956
|
+
const pins = getHarnessPins();
|
|
207957
|
+
const moved = Object.keys(pins).filter((name) => served.harnessPins[name] !== pins[name]);
|
|
207958
|
+
if (moved.length > 0) {
|
|
207959
|
+
const theirs = moved.map((name) => `${name}@${served.harnessPins[name]}`).join(", ");
|
|
207960
|
+
log2.info(`\xBB kept the bundled model registry: the server's is written for ${theirs}`);
|
|
207961
|
+
return;
|
|
207962
|
+
}
|
|
207963
|
+
try {
|
|
207964
|
+
installProviders(served.providers);
|
|
207965
|
+
} catch (error63) {
|
|
207966
|
+
log2.warning(
|
|
207967
|
+
`\xBB kept the bundled model registry: the server's ${error63 instanceof Error ? error63.message : error63}`
|
|
207968
|
+
);
|
|
207969
|
+
}
|
|
207970
|
+
}
|
|
207824
207971
|
async function resolveRunContextData(params) {
|
|
207825
207972
|
const actionRef = process.env.GITHUB_ACTION_REF;
|
|
207826
207973
|
log2.info(
|
|
@@ -207852,6 +207999,7 @@ async function resolveRunContextData(params) {
|
|
|
207852
207999
|
})
|
|
207853
208000
|
]);
|
|
207854
208001
|
if (runContext.apiToken) maskSecret(runContext.apiToken);
|
|
208002
|
+
if (runContext.modelRegistry) installServedRegistry(runContext.modelRegistry);
|
|
207855
208003
|
return {
|
|
207856
208004
|
repo: {
|
|
207857
208005
|
owner: repoContext.owner,
|
|
@@ -208072,6 +208220,19 @@ function formatProviderModelNotFound(ctx) {
|
|
|
208072
208220
|
const model = /Model not found: (\S+?)\.?(?:\s|$)/.exec(ctx.errorMessage)?.[1];
|
|
208073
208221
|
const suggestions = /Did you mean: ([^?\n]+)\?/.exec(ctx.errorMessage)?.[1]?.split(",").map((id) => `\`${id.trim()}\``);
|
|
208074
208222
|
const suggested = suggestions?.length ? ` OpenCode suggests ${suggestions.slice(0, -1).join(", ")}${suggestions.length > 1 ? " or " : ""}${suggestions.at(-1)}.` : "";
|
|
208223
|
+
if (ctx.modelsCatalogFailure) {
|
|
208224
|
+
return renderFailure({
|
|
208225
|
+
headline: model ? `OpenCode couldn't download its model list, so it didn't recognize \`${model}\`.` : "OpenCode couldn't download its model list, so it didn't recognize this repo's model.",
|
|
208226
|
+
detail: `It fell back to the copy built into it, which lacks models released since that build. Re-run once the runner can reach OpenCode's model catalog, or pick an older model.${suggested}`,
|
|
208227
|
+
details: {
|
|
208228
|
+
summary: "Why the download failed",
|
|
208229
|
+
text: `${ctx.modelsCatalogFailure}
|
|
208230
|
+
|
|
208231
|
+
${ctx.errorMessage}`
|
|
208232
|
+
},
|
|
208233
|
+
links: [pickModelLink(ctx.repo)]
|
|
208234
|
+
});
|
|
208235
|
+
}
|
|
208075
208236
|
return renderFailure({
|
|
208076
208237
|
headline: model ? `\`${model}\` isn't in OpenCode's catalog.` : "This repo's model isn't in OpenCode's catalog.",
|
|
208077
208238
|
detail: `Pick another model wherever this repo sets it: the Pullfrog console, the workflow's \`model\` input or the \`PULLFROG_MODEL\` variable.${suggested}`,
|
|
@@ -208953,6 +209114,7 @@ async function main() {
|
|
|
208953
209114
|
routedTier: typeof resolvedPromptInput === "string" ? void 0 : resolvedPromptInput.routing?.tier
|
|
208954
209115
|
});
|
|
208955
209116
|
timer.checkpoint("runContextData");
|
|
209117
|
+
setBotLogin(runContext.repoSettings.botLogin);
|
|
208956
209118
|
const payload = resolvePayload(resolvedPromptInput, runContext.repoSettings);
|
|
208957
209119
|
const toolState = initToolState({
|
|
208958
209120
|
progressComment: typeof resolvedPromptInput !== "string" ? resolvedPromptInput.progressComment : void 0,
|
|
@@ -209004,6 +209166,7 @@ async function main() {
|
|
|
209004
209166
|
const repoDir = payload.cwd;
|
|
209005
209167
|
const preIntrospectionDirty = repoDir ? await dirtyTrackedPaths({ cwd: repoDir }) : null;
|
|
209006
209168
|
const opencodeCliPath = await agents.opencode.install();
|
|
209169
|
+
await seedModelsCatalog(tmpdir5);
|
|
209007
209170
|
captureBaselineModels({ cliPath: opencodeCliPath, tmpdir: tmpdir5 });
|
|
209008
209171
|
const injected = [];
|
|
209009
209172
|
if (runContext.dbSecrets) {
|
|
@@ -209199,7 +209362,9 @@ async function main() {
|
|
|
209199
209362
|
octokit,
|
|
209200
209363
|
toolState,
|
|
209201
209364
|
shell: payload.shell,
|
|
209202
|
-
postCheckoutScript: runContext.repoSettings.postCheckoutScript
|
|
209365
|
+
postCheckoutScript: runContext.repoSettings.postCheckoutScript,
|
|
209366
|
+
botLogin: runContext.repoSettings.botLogin,
|
|
209367
|
+
botUserId: runContext.repoSettings.botUserId
|
|
209203
209368
|
});
|
|
209204
209369
|
timer.checkpoint("git");
|
|
209205
209370
|
const pmSpec = await resolvePackageManagerSpec(process.cwd());
|
|
@@ -209226,7 +209391,11 @@ async function main() {
|
|
|
209226
209391
|
timer.checkpoint("lifecycleHooks::setup");
|
|
209227
209392
|
const agentId = agent2.name;
|
|
209228
209393
|
const modes2 = [
|
|
209229
|
-
...computeModes(
|
|
209394
|
+
...computeModes({
|
|
209395
|
+
agentId,
|
|
209396
|
+
signedCommits: runContext.repoSettings.signedCommits,
|
|
209397
|
+
botLogin: runContext.repoSettings.botLogin
|
|
209398
|
+
}),
|
|
209230
209399
|
...runContext.repoSettings.modes
|
|
209231
209400
|
];
|
|
209232
209401
|
const outputSchema = resolveOutputSchema();
|
|
@@ -209252,6 +209421,8 @@ async function main() {
|
|
|
209252
209421
|
apiToken: runContext.apiToken,
|
|
209253
209422
|
modes: modes2,
|
|
209254
209423
|
postCheckoutScript: runContext.repoSettings.postCheckoutScript,
|
|
209424
|
+
botLogin: runContext.repoSettings.botLogin,
|
|
209425
|
+
botUserId: runContext.repoSettings.botUserId,
|
|
209255
209426
|
prepushScript: runContext.repoSettings.prepushScript,
|
|
209256
209427
|
prApproveEnabled: runContext.repoSettings.prApproveEnabled,
|
|
209257
209428
|
reviewDrafts: runContext.repoSettings.reviewDrafts,
|
|
@@ -209517,7 +209688,8 @@ ${instructions.user}` : null,
|
|
|
209517
209688
|
routerActive: !!payload.proxyModel,
|
|
209518
209689
|
model: toolState.model,
|
|
209519
209690
|
credential: toolState.credential,
|
|
209520
|
-
trial: toolState.modelClamped?.reason === "trial"
|
|
209691
|
+
trial: toolState.modelClamped?.reason === "trial",
|
|
209692
|
+
modelsCatalogFailure: getModelsCatalogFailure()
|
|
209521
209693
|
});
|
|
209522
209694
|
await writeRunErrorOutputs({ rendered, toolState });
|
|
209523
209695
|
if (toolContext) {
|
|
@@ -209977,7 +210149,7 @@ async function run2() {
|
|
|
209977
210149
|
}
|
|
209978
210150
|
|
|
209979
210151
|
// commands/_prEvents.ts
|
|
209980
|
-
import { mkdirSync as
|
|
210152
|
+
import { mkdirSync as mkdirSync12, readFileSync as readFileSync10, writeFileSync as writeFileSync17 } from "node:fs";
|
|
209981
210153
|
import { homedir as homedir3 } from "node:os";
|
|
209982
210154
|
import { join as join30 } from "node:path";
|
|
209983
210155
|
var REQUEST_TIMEOUT_MS = 35e3;
|
|
@@ -210045,8 +210217,8 @@ function readCursor(target) {
|
|
|
210045
210217
|
function writeCursor(target, cursor3) {
|
|
210046
210218
|
try {
|
|
210047
210219
|
const path4 = cursorPath(target);
|
|
210048
|
-
|
|
210049
|
-
|
|
210220
|
+
mkdirSync12(join30(stateDir(), "watch"), { recursive: true });
|
|
210221
|
+
writeFileSync17(path4, cursor3, "utf-8");
|
|
210050
210222
|
} catch {
|
|
210051
210223
|
}
|
|
210052
210224
|
}
|
|
@@ -210100,7 +210272,7 @@ function resolveTarget2(repo) {
|
|
|
210100
210272
|
return { owner: match3[1], repo: match3[2] };
|
|
210101
210273
|
}
|
|
210102
210274
|
function cliVersion() {
|
|
210103
|
-
const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec("0.1.
|
|
210275
|
+
const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec("0.1.107");
|
|
210104
210276
|
if (!parts) return "0.0.0";
|
|
210105
210277
|
return `${Number(parts[1])}.${Number(parts[2])}.${Number(parts[3])}`;
|
|
210106
210278
|
}
|
|
@@ -210297,7 +210469,7 @@ async function runCli9(input2) {
|
|
|
210297
210469
|
}
|
|
210298
210470
|
|
|
210299
210471
|
// cli.ts
|
|
210300
|
-
var VERSION10 = "0.1.
|
|
210472
|
+
var VERSION10 = "0.1.107";
|
|
210301
210473
|
var bin = basename2(process.argv[1] || "");
|
|
210302
210474
|
var PROG = bin === "pf" || bin === "pullfrog" ? bin : "pullfrog";
|
|
210303
210475
|
var rawArgs = process.argv.slice(2);
|