@te-river/opencode-team-mode 1.7.10 → 1.8.1
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/README.md +5 -3
- package/README.zh-CN.md +5 -3
- package/dist/host/v2-events.d.ts +2 -0
- package/dist/host/v2-events.d.ts.map +1 -1
- package/dist/host/v2-events.js +25 -1
- package/dist/host/v2-events.js.map +1 -1
- package/dist/host/v2-retry.d.ts +115 -18
- package/dist/host/v2-retry.d.ts.map +1 -1
- package/dist/host/v2-retry.js +376 -57
- package/dist/host/v2-retry.js.map +1 -1
- package/dist/host/v2-scope.d.ts +2 -0
- package/dist/host/v2-scope.d.ts.map +1 -1
- package/dist/host/v2-scope.js +4 -0
- package/dist/host/v2-scope.js.map +1 -1
- package/dist/host/v2-types.d.ts +23 -0
- package/dist/host/v2-types.d.ts.map +1 -1
- package/dist/host/v2.d.ts.map +1 -1
- package/dist/host/v2.js +41 -4
- package/dist/host/v2.js.map +1 -1
- package/dist/tm/config-layers.d.ts.map +1 -1
- package/dist/tm/config-layers.js +2 -0
- package/dist/tm/config-layers.js.map +1 -1
- package/dist/tm/config.d.ts +2 -0
- package/dist/tm/config.d.ts.map +1 -1
- package/dist/tm/config.js.map +1 -1
- package/dist/tm/index.d.ts +8 -0
- package/dist/tm/index.d.ts.map +1 -1
- package/dist/tm/index.js +1 -0
- package/dist/tm/index.js.map +1 -1
- package/docs/installation-v2.md +11 -6
- package/docs/v2-port-notes.md +46 -6
- package/package.json +1 -1
- package/scripts/gen-v2-config.mjs +1 -1
package/README.md
CHANGED
|
@@ -732,9 +732,11 @@ for overrides, extra agents and disabling roles.
|
|
|
732
732
|
| `splitAdvice` | `on`/`off` | `on` | Inject a split suggestion when a dispatch brief carries too many acceptance criteria. `off` stops the hint (the prompt discipline stays). |
|
|
733
733
|
| `splitBriefTokens` | number | `4000` | The brief token threshold that triggers it. **Clamped to ≥200.** |
|
|
734
734
|
| `splitMaxCriteria` | number | `3` | More acceptance criteria than this is a signal to split. |
|
|
735
|
-
| `retry` | `on`/`off` | `on` | Retry governance on BOTH request-failure surfaces
|
|
736
|
-
| `retryBaseMs` | number | `5000` | First rung of the ladder:
|
|
737
|
-
| `retryMaxMs` | number | `60000` | Ceiling for that backoff. |
|
|
735
|
+
| `retry` | `on`/`off` | `on` | Retry governance on BOTH request-failure surfaces. **(1) The provider-error governor — a PER-REQUEST retry chain:** each session's own failing request earns `retryMaxRetries` (5) retries waiting **5s/10s/20s/40s/60s** (base doubling to `retryMaxMs`, `retryJitter` default `0`), cumulative WITHIN that request — never across a session's lifetime. Chains are isolated per session (a child's failures never advance the lead's ladder), directives are delivered only to the session that earned them, and a chain ends on `session.idle`, `retryChainGapMs` of quiet, or budget exhaustion (a later error starts a fresh chain). **Sub-agent vs main agent:** a child whose budget is spent is told to hand the work back, and the LEAD receives a notice to run that step itself; the main agent is told to stop and report with options. Injected text names the retry index. A **hard quota** (`allocated quota exceeded` / `increase your limit` / `token-limit` / 余额不足) names NO wait — stop and raise-or-reset — and trips the breaker on the SECOND consecutive error; host 2.1.2's structured `retryAfterMs` is honoured as the wait floor. **(2) The HTTP layer:** a failed request inside `tm_webfetch` / every `tm_search` engine leg (network throw, per-request timeout, HTTP 429 or 5xx) is re-asked up to 3 times on the same 5s/10s/20s rungs, and the reply labels it (`第N次重试后成功` / `重试3次…仍失败`). A policy refusal (off-allowlist, red line, env-file URL, 403/418, other 4xx) is never re-asked. **The host's own retries win:** `session.retry.scheduled` — the desktop's 「尝试 N - 在 X 秒内重试」 countdown — stands our ladder directive down while the host is retrying, and our guidance speaks only when it does not (hard quota / spent budget). **③ The plugin re-drives dead sessions itself:** when a rung's wait is over and nobody continued, the layer admits a synthetic continuation via `ctx.session.synthetic` (verified callable on 2.1.2: "admit synthetic session input and schedule execution") — one per rung within `retryMaxRetries`, never for a session the scope has not seen, cancelled the moment the host retries or the session assembles a request on its own; hard quota re-drives only at a provider-stated retry time. Honest boundary: a plugin cannot intercept the model's own retry — but it can re-drive execution. |
|
|
736
|
+
| `retryBaseMs` | number | `5000` | First rung of the ladder: retry #1 waits 5s, then doubling. |
|
|
737
|
+
| `retryMaxMs` | number | `60000` | Ceiling for that backoff (rungs 4/5 rest on 40s/60s with the defaults). |
|
|
738
|
+
| `retryMaxRetries` | number | `5` | How many retries ONE request earns before its chain stops (5 → 5s/10s/20s/40s/60s). |
|
|
739
|
+
| `retryChainGapMs` | number | `600000` | A session quiet for this long starts a NEW retry chain (counts reset), ms. |
|
|
738
740
|
| `retryJitter` | number | `0` | ± fraction applied to the wait. Default `0` = NO jitter, so the 5s/10s/20s ladder is exact; set a fraction (≤0.95) if parallel sessions should not re-fire in lockstep. |
|
|
739
741
|
| `retryBreakAfter` | number | `5` | Consecutive errors before the breaker trips. |
|
|
740
742
|
| `retryCooldownMs` | number | `60000` | How long new sub-agent dispatches are refused once it has. |
|
package/README.zh-CN.md
CHANGED
|
@@ -650,9 +650,11 @@ Team Lead 自己从不删黑板,你可以随时审计任何一次运行。
|
|
|
650
650
|
| `splitAdvice` | `on`/`off` | `on` | 派工简报的验收标准过多时注入拆分建议。`off` 停掉这条提示(提示词纪律仍在)。 |
|
|
651
651
|
| `splitBriefTokens` | number | `4000` | 触发拆分建议的简报 token 阈值。**夹在 ≥200。** |
|
|
652
652
|
| `splitMaxCriteria` | number | `3` | 验收标准多于这个数就是该拆的信号。 |
|
|
653
|
-
| `retry` | `on`/`off` | `on` |
|
|
654
|
-
| `retryBaseMs` | number | `5000` |
|
|
655
|
-
| `retryMaxMs` | number | `60000` |
|
|
653
|
+
| `retry` | `on`/`off` | `on` | 两个「请求失败」表面上的重试治理。**(1) provider 错误治理器——按请求重试链:** 每个会话自己那条失败请求,累计获得 `retryMaxRetries`(5)次重试,依次等 **5s/10s/20s/40s/60s**(基数翻倍、`retryMaxMs` 封顶、`retryJitter` 默认 0)——**同一次请求内**累计,绝不跨会话生命周期。链按会话隔离(子代理的失败不会推进主代理的阶梯),指令只投递给挣得它的会话;链在 `session.idle`、`retryChainGapMs` 静默、或预算耗尽时结束(之后再来的错误开新链)。**子代理 vs 主代理:** 子代理预算耗尽 → 收到「把工作交回主代理」,同时**主代理收到「自己执行这一步」的通知**;主代理耗尽 → 停止重试并向用户如实报告并给选项。注入文本写明重试序号。**hard quota**(`allocated quota exceeded` / `increase your limit` / `token-limit` / 余额不足)不命名等待——停止并等重置/提升——连续第 2 次即触发断路器;宿主 2.1.2 的结构化 `retryAfterMs` 作为等待下限。**(2) HTTP 层:** `tm_webfetch` 与每条 `tm_search` 引擎腿里失败的请求(网络抛出、单次超时、HTTP 429/5xx)按同一 5s/10s/20s 阶梯最多重问 3 次,回复如实标注(`第N次重试后成功` / `重试3次…仍失败`)。政策性拒绝(白名单外、红线地址、env-file URL、403/418、其它 4xx)绝不重问。**宿主自己的重试优先:** `session.retry.scheduled`(桌面的「尝试 N - 在 X 秒内重试」)存在时我们的等待指令让位,只在宿主不重试的场景(hard quota/预算耗尽)说话。**③ 插件自己复活死掉的会话:** 某一档等待结束而无人继续时,层通过 `ctx.session.synthetic` 注入一条合成续跑(2.1.2 实测可调用:"admit synthetic session input and schedule execution")——每档一次、上限 `retryMaxRetries`、作用域没见过的会话绝不注入、宿主自己重试或会话自己发起请求时立即取消;hard quota 只有在服务端给出重试时间时才重驱动。老实的边界:插件拦不住模型自己的重试——但它能重新驱动执行。 |
|
|
654
|
+
| `retryBaseMs` | number | `5000` | 阶梯第一级:第 1 次重试等 5s,之后翻倍。 |
|
|
655
|
+
| `retryMaxMs` | number | `60000` | 退避上限(默认下第 4/5 级落在 40s/60s)。 |
|
|
656
|
+
| `retryMaxRetries` | number | `5` | 一条请求最多重试几次(5 → 5s/10s/20s/40s/60s);耗尽即停。 |
|
|
657
|
+
| `retryChainGapMs` | number | `600000` | 会话静默超过该时长即视为新请求(重试计数清零),毫秒。 |
|
|
656
658
|
| `retryJitter` | number | `0` | 施加在等待上的 ± 比例。默认 `0` = 不抖动,好让 5s/10s/20s 阶梯精确如初;想让并行会话错开再设成正数(≤0.95)。 |
|
|
657
659
|
| `retryBreakAfter` | number | `5` | 触发断路器前的连续错误次数。 |
|
|
658
660
|
| `retryCooldownMs` | number | `60000` | 断路器跳闸后拒绝新派发的时长。 |
|
package/dist/host/v2-events.d.ts
CHANGED
|
@@ -59,5 +59,7 @@ export declare function applyV2EventFeed(ctx: unknown, opts: {
|
|
|
59
59
|
onEvent: (event: HostEvent) => void;
|
|
60
60
|
types?: readonly string[];
|
|
61
61
|
onError?: (data: unknown) => void;
|
|
62
|
+
onIdle?: (sessionID: string) => void;
|
|
63
|
+
onRetryScheduled?: (data: unknown) => void;
|
|
62
64
|
}): Promise<V2EventFeed>;
|
|
63
65
|
//# sourceMappingURL=v2-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-events.d.ts","sourceRoot":"","sources":["../../src/host/v2-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"v2-events.d.ts","sourceRoot":"","sources":["../../src/host/v2-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAGnD;;;;;;;+EAO+E;AAC/E,eAAO,MAAM,UAAU,iMASb,CAAA;AAEV,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B;iCAC6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAeD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE;IAAE,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,GAC5L,OAAO,CAAC,WAAW,CAAC,CA6ItB"}
|
package/dist/host/v2-events.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* wrapped, and a stream that throws ends the feed with a recorded reason instead
|
|
29
29
|
* of an exception in the host's event loop.
|
|
30
30
|
*/
|
|
31
|
+
import { isTurnEndEvent, sessionIDOf } from "./v2-retry.js";
|
|
31
32
|
/** The types the dispatcher understands, plus the v2 spellings we have observed.
|
|
32
33
|
* Anything else is counted, not forwarded.
|
|
33
34
|
*
|
|
@@ -118,12 +119,35 @@ export async function applyV2EventFeed(ctx, opts) {
|
|
|
118
119
|
// extraction; this only routes the event to it.
|
|
119
120
|
if ((type === "session.error" || type === "session.execution.failed") && typeof opts.onError === "function") {
|
|
120
121
|
try {
|
|
121
|
-
opts.onError(
|
|
122
|
+
opts.onError(raw);
|
|
122
123
|
}
|
|
123
124
|
catch {
|
|
124
125
|
/* an error tap that throws never closes the feed */
|
|
125
126
|
}
|
|
126
127
|
}
|
|
128
|
+
// The retry chains are per REQUEST: a turn ending ends the chain, so the next
|
|
129
|
+
// failure starts back at retry #1 (the user's "同一次" rule). 2.0.28 renamed the
|
|
130
|
+
// idle spelling — the same event-name lesson the error tap above records.
|
|
131
|
+
if (isTurnEndEvent(type) && typeof opts.onIdle === "function") {
|
|
132
|
+
try {
|
|
133
|
+
opts.onIdle(sessionIDOf(raw));
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
/* an idle tap that throws never closes the feed */
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// The host schedules its OWN provider retries (`session.retry.scheduled`:
|
|
140
|
+
// {sessionID, assistantMessageID, attempt, at, error}) and the desktop renders
|
|
141
|
+
// `尝试 N - 在 X 秒内重试` from it. Tap it so the governor can stand its own
|
|
142
|
+
// ladder directive down instead of contradicting the visible countdown.
|
|
143
|
+
if (type === "session.retry.scheduled" && typeof opts.onRetryScheduled === "function") {
|
|
144
|
+
try {
|
|
145
|
+
opts.onRetryScheduled(raw);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
/* a tap that throws never closes the feed */
|
|
149
|
+
}
|
|
150
|
+
}
|
|
127
151
|
if (!type || !allowed.has(type)) {
|
|
128
152
|
const key = type || "(no type)";
|
|
129
153
|
report.unknown[key] = (report.unknown[key] ?? 0) + 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-events.js","sourceRoot":"","sources":["../../src/host/v2-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;
|
|
1
|
+
{"version":3,"file":"v2-events.js","sourceRoot":"","sources":["../../src/host/v2-events.ts"],"names":[],"mappings":"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"}
|
package/dist/host/v2-retry.d.ts
CHANGED
|
@@ -3,15 +3,20 @@
|
|
|
3
3
|
* throttles us".
|
|
4
4
|
*
|
|
5
5
|
* THE HONEST BOUNDARY, stated first because everything below is shaped by it:
|
|
6
|
-
* a plugin has NO seam that
|
|
7
|
-
* request the model decides to send, and we must not pretend to.
|
|
8
|
-
* does
|
|
6
|
+
* a plugin has NO seam that INTERCEPTS the model's own retry — we cannot delay a
|
|
7
|
+
* request the model decides to send, and we must not pretend to. But the method
|
|
8
|
+
* surface does let a plugin RE-DRIVE execution: `ctx.session.synthetic` is callable
|
|
9
|
+
* on 2.1.2 (zero-token probe 2026-10-21, docs/v2-port-notes.md) and the host
|
|
10
|
+
* documents it as "Durably admit synthetic session input and schedule execution
|
|
11
|
+
* unless resume is false". So this layer does four things, and says so:
|
|
9
12
|
*
|
|
10
13
|
* 1. RECOGNISE a provider throttle from the event feed (`session.error`), by
|
|
11
14
|
* matching explicit signatures only — never by guessing. A text that
|
|
12
15
|
* not carry a known signature classifies as `unknown` and changes nothing.
|
|
13
|
-
* 2. COMPUTE an exact wait (
|
|
14
|
-
*
|
|
16
|
+
* 2. COMPUTE an exact wait (a per-request ladder: retries #1..#5 wait
|
|
17
|
+
* 5s/10s/20s/40s/60s; the chain never accumulates across requests, and the
|
|
18
|
+
* host's own `session.retry.scheduled` stands our directive down — the desktop
|
|
19
|
+
* is already rendering that countdown; jitter applies only when retryJitter > 0) — but ONLY for the
|
|
15
20
|
* kinds a wait can fix. A HARD quota (allocated-exceeded / increase-your-limit /
|
|
16
21
|
* token-limit / 余额不足) names no wait: the directive says stop and raise-or-reset,
|
|
17
22
|
* and the breaker trips on the SECOND consecutive hard-quota error instead of
|
|
@@ -24,6 +29,13 @@
|
|
|
24
29
|
* trips and new `subagent` dispatches are DENIED for `cooldownMs`, on the
|
|
25
30
|
* same `permission.evaluate` seam the permission guards use. Both only ever
|
|
26
31
|
* make a rule stricter, so they compose without fighting.
|
|
32
|
+
* 4. RE-DRIVE: when a rung's wait is over and nobody moved — the host scheduled no
|
|
33
|
+
* retry of its own and the session assembled no request — the layer admits a
|
|
34
|
+
* synthetic continuation for that session (`session.synthetic`, resume:true).
|
|
35
|
+
* One re-drive per rung, capped by `maxRetries` per chain, NEVER for a session
|
|
36
|
+
* the scope has not seen, and cancelled the moment the session or the host
|
|
37
|
+
* continues first. A hard quota is re-driven only when the provider stated a
|
|
38
|
+
* retry time — otherwise waiting is the one thing that cannot help.
|
|
27
39
|
*
|
|
28
40
|
* Discipline (the same as every other v2 layer): Team-scoped, never throws (a
|
|
29
41
|
* failure allows the call through and is counted), never rewrites args, and
|
|
@@ -50,13 +62,21 @@ export interface RetryConfig {
|
|
|
50
62
|
jitter: number;
|
|
51
63
|
breakAfter: number;
|
|
52
64
|
cooldownMs: number;
|
|
65
|
+
/** How many retries ONE request earns (default 5 → rungs 5s/10s/20s/40s/60s). */
|
|
66
|
+
maxRetries: number;
|
|
67
|
+
/** A session with no error for this long starts a NEW retry chain. */
|
|
68
|
+
chainGapMs: number;
|
|
53
69
|
}
|
|
54
70
|
/**
|
|
55
|
-
* The default ladder is FIXED
|
|
56
|
-
* wait
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
71
|
+
* The default ladder is FIXED, deterministic AND PER REQUEST: retries #1..#5 of the
|
|
72
|
+
* SAME failed request wait 5s / 10s / 20s / 40s / 60s (base 5000 doubling, jitter 0),
|
|
73
|
+
* then that request's budget is spent (`maxRetries` 5) and the chain stops. A chain
|
|
74
|
+
* never accumulates across requests (idle / gap / post-exhaustion all restart it), and
|
|
75
|
+
* the host's own `session.retry.scheduled` stands our ladder directive down because the
|
|
76
|
+
* desktop is already showing that countdown. Jitter stays a knob — a user who would
|
|
77
|
+
* rather parallel sessions not re-fire in lockstep can set `retryJitter` back to a
|
|
78
|
+
* fraction — but the shipped default promises the fixed ladder, and a promise with
|
|
79
|
+
* jitter in it is not that promise.
|
|
60
80
|
*/
|
|
61
81
|
export declare const RETRY_DEFAULTS: RetryConfig;
|
|
62
82
|
/**
|
|
@@ -71,6 +91,8 @@ export declare function resolveRetryConfig(config?: {
|
|
|
71
91
|
retryJitter: number;
|
|
72
92
|
retryBreakAfter: number;
|
|
73
93
|
retryCooldownMs: number;
|
|
94
|
+
retryMaxRetries: number;
|
|
95
|
+
retryChainGapMs: number;
|
|
74
96
|
}): RetryConfig;
|
|
75
97
|
/**
|
|
76
98
|
* `delay = min(base * 2^attempt, max) * (1 ± jitter)`, rounded to ms and never
|
|
@@ -92,33 +114,97 @@ export interface RetryReport {
|
|
|
92
114
|
cooldownDenied: number;
|
|
93
115
|
foreignSkipped: number;
|
|
94
116
|
threw: number;
|
|
117
|
+
/** per-request budgets that ran out — sub-agents and the main agent counted apart */
|
|
118
|
+
childExhausted: number;
|
|
119
|
+
mainExhausted: number;
|
|
120
|
+
/** retry chains restarted (idle event or idle gap) — proves the ladder is per-request */
|
|
121
|
+
chainsReset: number;
|
|
122
|
+
/** directives armed FOR the lead because a child ran out of its budget */
|
|
123
|
+
leadNotices: number;
|
|
124
|
+
/** host-native retries observed (`session.retry.scheduled`) — the UI's own countdown */
|
|
125
|
+
hostRetries: number;
|
|
126
|
+
/** re-drives the plugin admitted itself (`session.synthetic` fired successfully) */
|
|
127
|
+
pluginRetries: number;
|
|
95
128
|
}
|
|
96
129
|
export interface RetryDirective {
|
|
97
130
|
text: string;
|
|
98
131
|
delayMs: number;
|
|
132
|
+
/** What kind of guidance this is; a host retry may only stand down a "ladder". */
|
|
133
|
+
kind?: "ladder" | "hard" | "exhausted" | "notice";
|
|
134
|
+
}
|
|
135
|
+
/** The turn-ending event spellings across host generations (2.0.28 renamed them). */
|
|
136
|
+
export declare function isTurnEndEvent(type: string): boolean;
|
|
137
|
+
/** The session→role question, pure so a test can pin it without the host. */
|
|
138
|
+
export declare function roleOfSession(sid: string, children: ReadonlyArray<{
|
|
139
|
+
sessionID: string;
|
|
140
|
+
parentSessionID?: string;
|
|
141
|
+
agent?: string;
|
|
142
|
+
}>, agentOf: (sessionID: string) => string, leadAgent?: string): {
|
|
143
|
+
role: RetryRole;
|
|
144
|
+
parentSessionID?: string;
|
|
145
|
+
agent?: string;
|
|
146
|
+
};
|
|
147
|
+
/** Who is making the failing request: the lead session or a dispatched child. */
|
|
148
|
+
export type RetryRole = "main" | "sub" | "unknown";
|
|
149
|
+
export interface RetryObserveOptions {
|
|
150
|
+
sessionID?: unknown;
|
|
151
|
+
structuredRetryAfterMs?: number;
|
|
152
|
+
role?: RetryRole;
|
|
153
|
+
parentSessionID?: unknown;
|
|
154
|
+
agent?: unknown;
|
|
99
155
|
}
|
|
100
156
|
export interface RetryGovernor {
|
|
101
|
-
observe(text: unknown,
|
|
157
|
+
observe(text: unknown, opts?: RetryObserveOptions | number): ProviderErrorClass & {
|
|
102
158
|
delayMs: number;
|
|
103
159
|
};
|
|
104
160
|
observeEvent(raw: unknown): void;
|
|
105
|
-
/**
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
161
|
+
/** The host scheduled its OWN retry (`session.retry.scheduled`): align the chain's
|
|
162
|
+
* attempt with the host's count and stand the ladder directive down — the UI is
|
|
163
|
+
* already showing the host's countdown, and two competing waits would fight. */
|
|
164
|
+
observeHostRetry(raw: unknown): void;
|
|
165
|
+
/** The turn ended: this session's retry chain is over (a new request starts at #1). */
|
|
166
|
+
observeIdle(sessionID: unknown): void;
|
|
167
|
+
/** Peek at the pending directive for a session without consuming it. */
|
|
168
|
+
directive(sessionID?: unknown): RetryDirective | null;
|
|
169
|
+
/** Consume one session's pending directive (the injection hook's one-shot read). */
|
|
170
|
+
takeDirective(sessionID?: unknown): RetryDirective | null;
|
|
171
|
+
inCooldown(sessionID?: unknown): boolean;
|
|
172
|
+
/** ms left in that session's cooldown window (0 when not cooling down). */
|
|
173
|
+
cooldownRemainingMs(sessionID?: unknown): number;
|
|
112
174
|
/** The configured consecutive-error threshold, for the refusal wording. */
|
|
113
175
|
readonly breakAfter: number;
|
|
176
|
+
/** Retries one request earns (the ladder's length). */
|
|
177
|
+
readonly maxRetries: number;
|
|
114
178
|
readonly report: RetryReport;
|
|
115
179
|
reset(): void;
|
|
116
180
|
}
|
|
181
|
+
/** A plugin-driven re-drive request: wait `delayMs`, then admit synthetic input. */
|
|
182
|
+
export interface RedriveRequest {
|
|
183
|
+
sessionID: string;
|
|
184
|
+
delayMs: number;
|
|
185
|
+
/** which re-drive of this chain this is (1-based) */
|
|
186
|
+
attempt: number;
|
|
187
|
+
kind: ProviderErrorKind;
|
|
188
|
+
hardQuota: boolean;
|
|
189
|
+
}
|
|
117
190
|
export interface RetryGovernorOptions extends Partial<RetryConfig> {
|
|
118
191
|
now?: () => number;
|
|
119
192
|
random?: () => number;
|
|
120
193
|
/** Fired for each classification / breaker outcome (the trajectory sink). */
|
|
121
194
|
onEvent?: (row: Record<string, unknown>) => void;
|
|
195
|
+
/** The session→role facts the layer owns (scope + the child registry). */
|
|
196
|
+
roleOf?: (sessionID: string) => {
|
|
197
|
+
role: RetryRole;
|
|
198
|
+
parentSessionID?: string;
|
|
199
|
+
agent?: string;
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* The layer wires this to the REAL re-drive (setTimeout + `ctx.session.synthetic`,
|
|
203
|
+
* verified callable on 2.1.2: "Durably admit synthetic session input and schedule
|
|
204
|
+
* execution unless resume is false"). The governor decides WHEN and with what
|
|
205
|
+
* budget; the layer performs the I/O.
|
|
206
|
+
*/
|
|
207
|
+
redrive?: (req: RedriveRequest) => void;
|
|
122
208
|
}
|
|
123
209
|
/**
|
|
124
210
|
* The state machine. Pure except for the injected `now`/`random`, so a test can
|
|
@@ -138,16 +224,27 @@ export declare function errorTextOf(raw: unknown): string;
|
|
|
138
224
|
* interface, so an absent or non-numeric field is simply 0.
|
|
139
225
|
*/
|
|
140
226
|
export declare function structuredRetryAfterOf(raw: unknown): number;
|
|
227
|
+
/** The session id an event refers to — defensive, the payload shape is not promised. */
|
|
228
|
+
export declare function sessionIDOf(raw: unknown): string;
|
|
141
229
|
export interface RetryLayerInput {
|
|
142
230
|
scope?: TeamScope;
|
|
143
231
|
governor: RetryGovernor;
|
|
144
232
|
/** Fired for each observable outcome so the personality can write the
|
|
145
233
|
* `step_id:"v2-retry"` trajectory line — the layer owns no store. */
|
|
146
234
|
onEvent?: (row: Record<string, unknown>) => void;
|
|
235
|
+
/** The governor's re-drive decisions land here (wired by v2.ts through the sink). */
|
|
236
|
+
bindRedrive?: (fn: (req: RedriveRequest) => void) => void;
|
|
237
|
+
/** Injectable timers so a test can fire the re-drive without sleeping. */
|
|
238
|
+
timers?: {
|
|
239
|
+
set: (cb: () => void, ms: number) => unknown;
|
|
240
|
+
clear: (h: unknown) => void;
|
|
241
|
+
};
|
|
147
242
|
}
|
|
148
243
|
export interface RetryLayer {
|
|
149
244
|
registrations: V2Registration[];
|
|
150
245
|
report: RetryReport;
|
|
246
|
+
/** Stand down a pending re-drive (the host scheduled its own retry for this session). */
|
|
247
|
+
cancelRedrive: (sessionID: unknown) => void;
|
|
151
248
|
}
|
|
152
249
|
/**
|
|
153
250
|
* Register the two hooks the retry layer owns:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-retry.d.ts","sourceRoot":"","sources":["../../src/host/v2-retry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"v2-retry.d.ts","sourceRoot":"","sources":["../../src/host/v2-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAA0B,cAAc,EAAoB,MAAM,eAAe,CAAA;AAExG,iFAAiF;AACjF,eAAO,MAAM,YAAY,kBAAkB,CAAA;AAE3C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAA;AAE1E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,iBAAiB,CAAA;IACvB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAA;IACpB;wEACoE;IACpE,SAAS,EAAE,OAAO,CAAA;CACnB;AAgBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,CAgBvE;AAUD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,WAS5B,CAAA;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,GAAE;IACN,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;CACN,GAClB,WAAW,CAWb;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,GAAG,MAAM,CAMtH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAA;IAClB,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAA;IACnB,wFAAwF;IACxF,WAAW,EAAE,MAAM,CAAA;IACnB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;CAClD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,aAAa,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxF,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EACtC,SAAS,SAAS,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAS/D;AAED,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAA;AAElD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,kBAAkB,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACrG,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC;;qFAEiF;IACjF,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;IACpC,uFAAuF;IACvF,WAAW,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAA;IACrC,wEAAwE;IACxE,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAAA;IACrD,oFAAoF;IACpF,aAAa,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAAA;IACzD,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IACxC,2EAA2E;IAC3E,mBAAmB,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,KAAK,IAAI,IAAI,CAAA;CACd;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,iBAAiB,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,oBAAqB,SAAQ,OAAO,CAAC,WAAW,CAAC;IAChE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;IACrB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAChD,0EAA0E;IAC1E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7F;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;CACxC;AAOD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,oBAAyB,GAAG,aAAa,CAwTlF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAiChD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAmB3D;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAOhD;AAMD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,aAAa,CAAA;IACvB;0EACsE;IACtE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAChD,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,KAAK,IAAI,CAAA;IACzD,0EAA0E;IAC1E,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAA;CACvF;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,yFAAyF;IACzF,aAAa,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5C;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAuItG"}
|