botmux 2.93.1 → 2.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/backend/tmux-backend.d.ts +18 -2
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +45 -3
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +8 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +1 -1
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +6 -1
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/bot-registry.d.ts +50 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +30 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +11 -4
- package/dist/cli/workflow.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +146 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +28 -3
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +92 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/inherit-peer.d.ts +5 -0
- package/dist/core/inherit-peer.d.ts.map +1 -1
- package/dist/core/inherit-peer.js +3 -0
- package/dist/core/inherit-peer.js.map +1 -1
- package/dist/core/session-discovery.d.ts +9 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +24 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +7 -6
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +15 -0
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/trigger-session.js +2 -2
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +30 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +296 -23
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +5 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +7 -0
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +7 -1
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +2 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +2 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +14 -3
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +2 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +7 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/v3-runs-api.d.ts +26 -0
- package/dist/dashboard/v3-runs-api.d.ts.map +1 -0
- package/dist/dashboard/v3-runs-api.js +67 -0
- package/dist/dashboard/v3-runs-api.js.map +1 -0
- package/dist/dashboard/web/app.js +21 -9
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +128 -33
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +42 -6
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/legacy-workflow-link.d.ts +2 -0
- package/dist/dashboard/web/legacy-workflow-link.d.ts.map +1 -0
- package/dist/dashboard/web/legacy-workflow-link.js +12 -0
- package/dist/dashboard/web/legacy-workflow-link.js.map +1 -0
- package/dist/dashboard/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +11 -0
- package/dist/dashboard/web/settings.js.map +1 -1
- package/dist/dashboard/web/v3-terminal.d.ts +11 -0
- package/dist/dashboard/web/v3-terminal.d.ts.map +1 -0
- package/dist/dashboard/web/v3-terminal.js +143 -0
- package/dist/dashboard/web/v3-terminal.js.map +1 -0
- package/dist/dashboard/web/v3.d.ts +2 -0
- package/dist/dashboard/web/v3.d.ts.map +1 -0
- package/dist/dashboard/web/v3.js +564 -0
- package/dist/dashboard/web/v3.js.map +1 -0
- package/dist/dashboard/web/whiteboards.d.ts.map +1 -1
- package/dist/dashboard/web/whiteboards.js +14 -5
- package/dist/dashboard/web/whiteboards.js.map +1 -1
- package/dist/dashboard/web/workflows.d.ts.map +1 -1
- package/dist/dashboard/web/workflows.js +12 -8
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard-web/app.js +834 -724
- package/dist/dashboard-web/apple-touch-icon.png +0 -0
- package/dist/dashboard-web/favicon.png +0 -0
- package/dist/dashboard-web/index.html +3 -1
- package/dist/dashboard-web/style.css +223 -0
- package/dist/dashboard.js +170 -10
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +10 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +8 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +23 -3
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +23 -3
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +12 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +28 -0
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +3 -12
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +2 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +20 -6
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.js +4 -4
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts +29 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +35 -1
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.d.ts +28 -0
- package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-blocked-card-handler.js +134 -0
- package/dist/im/lark/v3-blocked-card-handler.js.map +1 -0
- package/dist/im/lark/v3-blocked-card.d.ts +75 -0
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -0
- package/dist/im/lark/v3-blocked-card.js +206 -0
- package/dist/im/lark/v3-blocked-card.js.map +1 -0
- package/dist/im/lark/v3-gate-card-handler.d.ts +31 -0
- package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-gate-card-handler.js +110 -0
- package/dist/im/lark/v3-gate-card-handler.js.map +1 -0
- package/dist/im/lark/v3-gate-card.d.ts +47 -0
- package/dist/im/lark/v3-gate-card.d.ts.map +1 -0
- package/dist/im/lark/v3-gate-card.js +119 -0
- package/dist/im/lark/v3-gate-card.js.map +1 -0
- package/dist/im/lark/v3-loop-grant-card-handler.d.ts +28 -0
- package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-loop-grant-card-handler.js +90 -0
- package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -0
- package/dist/im/lark/v3-loop-grant-card.d.ts +46 -0
- package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -0
- package/dist/im/lark/v3-loop-grant-card.js +119 -0
- package/dist/im/lark/v3-loop-grant-card.js.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.d.ts +29 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.js +96 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card.d.ts +52 -0
- package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card.js +123 -0
- package/dist/im/lark/v3-revisit-grant-card.js.map +1 -0
- package/dist/im/lark/workflow-cards.d.ts.map +1 -1
- package/dist/im/lark/workflow-cards.js +5 -1
- package/dist/im/lark/workflow-cards.js.map +1 -1
- package/dist/im/lark/workflow-progress-card.d.ts +1 -1
- package/dist/im/lark/workflow-progress-card.js +1 -1
- package/dist/im/lark/workflow-slash-command.d.ts +28 -0
- package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
- package/dist/im/lark/workflow-slash-command.js +61 -5
- package/dist/im/lark/workflow-slash-command.js.map +1 -1
- package/dist/platform/binding.d.ts +6 -0
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +17 -0
- package/dist/platform/binding.js.map +1 -1
- package/dist/platform/tunnel-client.d.ts +2 -0
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +1 -0
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/card-prefs-store.d.ts +4 -0
- package/dist/services/card-prefs-store.d.ts.map +1 -1
- package/dist/services/card-prefs-store.js +19 -0
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/oncall-store.d.ts +25 -0
- package/dist/services/oncall-store.d.ts.map +1 -1
- package/dist/services/oncall-store.js +56 -0
- package/dist/services/oncall-store.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts.map +1 -1
- package/dist/services/transcript-resolver.js +21 -4
- package/dist/services/transcript-resolver.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +7 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +33 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +208 -4
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/terminal-favicon.d.ts +2 -0
- package/dist/utils/terminal-favicon.d.ts.map +1 -0
- package/dist/utils/terminal-favicon.js +5 -0
- package/dist/utils/terminal-favicon.js.map +1 -0
- package/dist/worker.js +152 -8
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +80 -80
- package/dist/workflows/events/payloads.d.ts +4 -4
- package/dist/workflows/events/schema.d.ts +16 -16
- package/dist/workflows/v3/architect.d.ts +37 -0
- package/dist/workflows/v3/architect.d.ts.map +1 -0
- package/dist/workflows/v3/architect.js +226 -0
- package/dist/workflows/v3/architect.js.map +1 -0
- package/dist/workflows/v3/bot-resolve.d.ts +21 -0
- package/dist/workflows/v3/bot-resolve.d.ts.map +1 -0
- package/dist/workflows/v3/bot-resolve.js +48 -0
- package/dist/workflows/v3/bot-resolve.js.map +1 -0
- package/dist/workflows/v3/cli-run.d.ts +24 -0
- package/dist/workflows/v3/cli-run.d.ts.map +1 -0
- package/dist/workflows/v3/cli-run.js +265 -0
- package/dist/workflows/v3/cli-run.js.map +1 -0
- package/dist/workflows/v3/contract.d.ts +302 -0
- package/dist/workflows/v3/contract.d.ts.map +1 -0
- package/dist/workflows/v3/contract.js +91 -0
- package/dist/workflows/v3/contract.js.map +1 -0
- package/dist/workflows/v3/daemon-run.d.ts +311 -0
- package/dist/workflows/v3/daemon-run.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-run.js +775 -0
- package/dist/workflows/v3/daemon-run.js.map +1 -0
- package/dist/workflows/v3/dag.d.ts +332 -0
- package/dist/workflows/v3/dag.d.ts.map +1 -0
- package/dist/workflows/v3/dag.js +1040 -0
- package/dist/workflows/v3/dag.js.map +1 -0
- package/dist/workflows/v3/ephemeral-pool.d.ts +29 -0
- package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -0
- package/dist/workflows/v3/ephemeral-pool.js +331 -0
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -0
- package/dist/workflows/v3/grill-state.d.ts +92 -0
- package/dist/workflows/v3/grill-state.d.ts.map +1 -0
- package/dist/workflows/v3/grill-state.js +151 -0
- package/dist/workflows/v3/grill-state.js.map +1 -0
- package/dist/workflows/v3/host.d.ts +88 -0
- package/dist/workflows/v3/host.d.ts.map +1 -0
- package/dist/workflows/v3/host.js +349 -0
- package/dist/workflows/v3/host.js.map +1 -0
- package/dist/workflows/v3/human-gate.d.ts +85 -0
- package/dist/workflows/v3/human-gate.d.ts.map +1 -0
- package/dist/workflows/v3/human-gate.js +153 -0
- package/dist/workflows/v3/human-gate.js.map +1 -0
- package/dist/workflows/v3/journal.d.ts +207 -0
- package/dist/workflows/v3/journal.d.ts.map +1 -0
- package/dist/workflows/v3/journal.js +74 -0
- package/dist/workflows/v3/journal.js.map +1 -0
- package/dist/workflows/v3/manifest.d.ts +17 -0
- package/dist/workflows/v3/manifest.d.ts.map +1 -0
- package/dist/workflows/v3/manifest.js +266 -0
- package/dist/workflows/v3/manifest.js.map +1 -0
- package/dist/workflows/v3/ops-projection.d.ts +110 -0
- package/dist/workflows/v3/ops-projection.d.ts.map +1 -0
- package/dist/workflows/v3/ops-projection.js +0 -0
- package/dist/workflows/v3/ops-projection.js.map +1 -0
- package/dist/workflows/v3/orchestrator.d.ts +168 -0
- package/dist/workflows/v3/orchestrator.d.ts.map +1 -0
- package/dist/workflows/v3/orchestrator.js +417 -0
- package/dist/workflows/v3/orchestrator.js.map +1 -0
- package/dist/workflows/v3/runtime.d.ts +193 -0
- package/dist/workflows/v3/runtime.d.ts.map +1 -0
- package/dist/workflows/v3/runtime.js +1284 -0
- package/dist/workflows/v3/runtime.js.map +1 -0
- package/dist/workflows/v3/spec.d.ts +32 -0
- package/dist/workflows/v3/spec.d.ts.map +1 -0
- package/dist/workflows/v3/spec.js +173 -0
- package/dist/workflows/v3/spec.js.map +1 -0
- package/dist/workflows/v3/state.d.ts +74 -0
- package/dist/workflows/v3/state.d.ts.map +1 -0
- package/dist/workflows/v3/state.js +353 -0
- package/dist/workflows/v3/state.js.map +1 -0
- package/package.json +2 -2
- package/dist/dashboard/web/workflow-catalog.d.ts +0 -2
- package/dist/dashboard/web/workflow-catalog.d.ts.map +0 -1
- package/dist/dashboard/web/workflow-catalog.js +0 -323
- package/dist/dashboard/web/workflow-catalog.js.map +0 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 loop 追加一轮卡点击处理 —— card-handler 的 v3 分支(与
|
|
3
|
+
* `v3-blocked-card-handler` 同骨架)。把一次「➕ 追加 1 轮」点击翻译成:
|
|
4
|
+
* 权限校验 → `requestV3LoopGrant`(幂等:pendingGrant → already-granted)
|
|
5
|
+
* → 冻结卡 / toast + 触发 `driveV3Run` 跑新一轮。
|
|
6
|
+
*
|
|
7
|
+
* 纯逻辑 + 注入 seam(requestGrant / driveRun / canResolve),单测友好。
|
|
8
|
+
*/
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { V3_LOOP_GRANT_ACTION, buildV3LoopGrantCard, v3LoopGrantCardNonce, } from './v3-loop-grant-card.js';
|
|
11
|
+
import { requestV3LoopGrant, loopExhaustedInfoFor } from '../../workflows/v3/daemon-run.js';
|
|
12
|
+
import { readJournal } from '../../workflows/v3/journal.js';
|
|
13
|
+
import { readGrillState, defaultBaseDir, } from '../../workflows/v3/grill-state.js';
|
|
14
|
+
import { isValidRunId } from '../../workflows/v3/ops-projection.js';
|
|
15
|
+
export function isV3LoopGrantAction(action) {
|
|
16
|
+
return action === V3_LOOP_GRANT_ACTION;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Handle a v3 loop-grant card click. Returns the Lark card-action response:
|
|
20
|
+
* a frozen「已追加」card, or a `{ toast }`. Triggers `driveRun` on success.
|
|
21
|
+
*/
|
|
22
|
+
export async function handleV3LoopGrantAction(value, operatorOpenId, deps) {
|
|
23
|
+
const baseDir = deps.baseDir ?? defaultBaseDir();
|
|
24
|
+
if (!isValidRunId(value.runId)) {
|
|
25
|
+
return { toast: { type: 'warning', content: '追加已失效(非法 run)' } };
|
|
26
|
+
}
|
|
27
|
+
// 飞书卡片 value 回传可能把 number 落成 string —— 先归一化再比 nonce。
|
|
28
|
+
const iteration = typeof value.iteration === 'number' ? value.iteration : parseInt(String(value.iteration), 10);
|
|
29
|
+
if (!Number.isInteger(iteration) || iteration < 1) {
|
|
30
|
+
return { toast: { type: 'warning', content: '追加卡已失效(轮数非法)' } };
|
|
31
|
+
}
|
|
32
|
+
// iteration 入 nonce:grant 被消费 / 新一轮再耗尽后,旧卡 nonce 对不上 → stale。
|
|
33
|
+
if (value.nonce !== v3LoopGrantCardNonce(value.runId, value.loopId, iteration)) {
|
|
34
|
+
return { toast: { type: 'warning', content: '追加卡已失效(nonce 不匹配)' } };
|
|
35
|
+
}
|
|
36
|
+
const runDir = join(baseDir, value.runId);
|
|
37
|
+
const grill = readGrillState(runDir);
|
|
38
|
+
const binding = grill?.chatBinding;
|
|
39
|
+
if (deps.canResolve && !deps.canResolve(binding, operatorOpenId)) {
|
|
40
|
+
return { toast: { type: 'warning', content: '你没有权限给这个 loop 追加轮数' } };
|
|
41
|
+
}
|
|
42
|
+
const requestGrant = deps.requestGrant ?? requestV3LoopGrant;
|
|
43
|
+
let outcome;
|
|
44
|
+
try {
|
|
45
|
+
// expectedIteration(expectedAttemptId 的同款教训):nonce 只证明这张卡
|
|
46
|
+
// 自身没被改,证不了它指向的耗尽轮还是"当前这次耗尽"——core 必须再比一次。
|
|
47
|
+
outcome = requestGrant(baseDir, value.runId, {
|
|
48
|
+
loopId: value.loopId,
|
|
49
|
+
expectedIteration: iteration,
|
|
50
|
+
by: operatorOpenId,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return {
|
|
55
|
+
toast: {
|
|
56
|
+
type: 'error',
|
|
57
|
+
content: `追加失败,请再试:${err instanceof Error ? err.message : String(err)}`,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (outcome.kind === 'stale-run') {
|
|
62
|
+
return {
|
|
63
|
+
toast: {
|
|
64
|
+
type: 'warning',
|
|
65
|
+
content: outcome.reason === 'missing' ? '该 run 不存在或已清理'
|
|
66
|
+
: outcome.reason === 'stale-iteration' ? '该 loop 已进入新一轮,这张旧卡失效(看最新那张卡)'
|
|
67
|
+
: '该 loop 已不在耗尽状态,追加卡失效',
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (outcome.kind === 'already-granted') {
|
|
72
|
+
// Idempotent: a prior click already reserved the extra round — make sure
|
|
73
|
+
// the run is actually moving (covers click → daemon crash → click after restart).
|
|
74
|
+
deps.driveRun(value.runId);
|
|
75
|
+
return { toast: { type: 'info', content: '已在追加重跑中' } };
|
|
76
|
+
}
|
|
77
|
+
// granted → drive the run (fresh replay starts iteration N+1) + freeze this card.
|
|
78
|
+
deps.driveRun(value.runId);
|
|
79
|
+
const events = readJournal(join(runDir, 'journal.ndjson'));
|
|
80
|
+
const info = loopExhaustedInfoFor(events, value.loopId);
|
|
81
|
+
const frozen = buildV3LoopGrantCard({
|
|
82
|
+
runId: value.runId,
|
|
83
|
+
loopId: value.loopId,
|
|
84
|
+
iteration,
|
|
85
|
+
detail: info.detail,
|
|
86
|
+
grantedNow: { nextIteration: outcome.nextIteration, by: operatorOpenId },
|
|
87
|
+
});
|
|
88
|
+
return JSON.parse(frozen);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=v3-loop-grant-card-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-loop-grant-card-handler.js","sourceRoot":"","sources":["../../../src/im/lark/v3-loop-grant-card-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 耗尽 loop 追加一轮卡 —— loop 跑满 maxIterations 仍没达成 exit 条件时
|
|
3
|
+
* (decision=exhausted → loop blocked)的飞书入口。和 blocked 重试卡是两张卡、
|
|
4
|
+
* 两个 action:这里没有任何东西"失败",只是不收敛——按钮语义是「追加 1 轮」
|
|
5
|
+
* (append loopIterationGranted)而不是「重跑某 attempt」。
|
|
6
|
+
*
|
|
7
|
+
* stale 防护与 blocked 卡同构(expectedAttemptId 的同款教训):nonce 以
|
|
8
|
+
* `iteration` 为 freshness key —— 一旦 grant 被消费 / 新一轮再次耗尽,旧卡的
|
|
9
|
+
* iteration 对不上 core 的 expectedIteration 比对,天然失效。
|
|
10
|
+
*/
|
|
11
|
+
export declare const V3_LOOP_GRANT_ACTION = "v3_loop_grant";
|
|
12
|
+
/** card 按钮回传的 value 形态——v3-loop-grant-card-handler 据此解析。 */
|
|
13
|
+
export interface V3LoopGrantActionValue {
|
|
14
|
+
action: typeof V3_LOOP_GRANT_ACTION;
|
|
15
|
+
runId: string;
|
|
16
|
+
loopId: string;
|
|
17
|
+
/** 耗尽时的 iteration —— nonce + core expectedIteration 的 freshness key。 */
|
|
18
|
+
iteration: number;
|
|
19
|
+
nonce: string;
|
|
20
|
+
}
|
|
21
|
+
export interface V3LoopGrantCardInput {
|
|
22
|
+
runId: string;
|
|
23
|
+
loopId: string;
|
|
24
|
+
/** 耗尽时的 iteration。 */
|
|
25
|
+
iteration: number;
|
|
26
|
+
/** 编排时的轮数上限(展示用,可缺)。 */
|
|
27
|
+
maxIterations?: number;
|
|
28
|
+
/** 已追加过的轮数。 */
|
|
29
|
+
granted?: number;
|
|
30
|
+
/** 最后一轮 decision detail(如 `result.passed=false (iteration 3/3)`)。 */
|
|
31
|
+
detail?: string;
|
|
32
|
+
/** 省略则按 runId/loopId/iteration 推导。 */
|
|
33
|
+
nonce?: string;
|
|
34
|
+
webDetailUrl?: string;
|
|
35
|
+
detailMaxChars?: number;
|
|
36
|
+
/** 有值 → 渲染冻结的「已追加」卡(无按钮,防 stale UI 重复提交)。 */
|
|
37
|
+
grantedNow?: {
|
|
38
|
+
nextIteration: number;
|
|
39
|
+
by?: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** 稳定 nonce:同一 run 同一 loop 同一耗尽轮的卡 nonce 固定(重发卡一致);
|
|
43
|
+
* iteration 入 nonce —— 追加被消费后旧卡对不上新耗尽轮,不会误触。 */
|
|
44
|
+
export declare function v3LoopGrantCardNonce(runId: string, loopId: string, iteration: number): string;
|
|
45
|
+
export declare function buildV3LoopGrantCard(input: V3LoopGrantCardInput): string;
|
|
46
|
+
//# sourceMappingURL=v3-loop-grant-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-loop-grant-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/v3-loop-grant-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAID;iDACiD;AACjD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7F;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CA2FxE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 耗尽 loop 追加一轮卡 —— loop 跑满 maxIterations 仍没达成 exit 条件时
|
|
3
|
+
* (decision=exhausted → loop blocked)的飞书入口。和 blocked 重试卡是两张卡、
|
|
4
|
+
* 两个 action:这里没有任何东西"失败",只是不收敛——按钮语义是「追加 1 轮」
|
|
5
|
+
* (append loopIterationGranted)而不是「重跑某 attempt」。
|
|
6
|
+
*
|
|
7
|
+
* stale 防护与 blocked 卡同构(expectedAttemptId 的同款教训):nonce 以
|
|
8
|
+
* `iteration` 为 freshness key —— 一旦 grant 被消费 / 新一轮再次耗尽,旧卡的
|
|
9
|
+
* iteration 对不上 core 的 expectedIteration 比对,天然失效。
|
|
10
|
+
*/
|
|
11
|
+
import { config } from '../../config.js';
|
|
12
|
+
export const V3_LOOP_GRANT_ACTION = 'v3_loop_grant';
|
|
13
|
+
const DEFAULT_DETAIL_MAX_CHARS = 500;
|
|
14
|
+
/** 稳定 nonce:同一 run 同一 loop 同一耗尽轮的卡 nonce 固定(重发卡一致);
|
|
15
|
+
* iteration 入 nonce —— 追加被消费后旧卡对不上新耗尽轮,不会误触。 */
|
|
16
|
+
export function v3LoopGrantCardNonce(runId, loopId, iteration) {
|
|
17
|
+
return `v3loopgrant:${runId}:${loopId}:${iteration}`;
|
|
18
|
+
}
|
|
19
|
+
function v3RunDetailUrl(runId) {
|
|
20
|
+
return `http://${config.dashboard.externalHost}:${config.dashboard.port}/#/v3/${encodeURIComponent(runId)}`;
|
|
21
|
+
}
|
|
22
|
+
export function buildV3LoopGrantCard(input) {
|
|
23
|
+
const nonce = input.nonce ?? v3LoopGrantCardNonce(input.runId, input.loopId, input.iteration);
|
|
24
|
+
const webDetailUrl = input.webDetailUrl ?? v3RunDetailUrl(input.runId);
|
|
25
|
+
const detailMax = input.detailMaxChars ?? DEFAULT_DETAIL_MAX_CHARS;
|
|
26
|
+
const granted = input.grantedNow;
|
|
27
|
+
const title = granted ? `已追加一轮:loop ${input.loopId}` : `loop 轮数耗尽:${input.loopId}`;
|
|
28
|
+
// 与 blocked 重试卡同款语义色:耗尽=橙(可恢复),追加后转绿。
|
|
29
|
+
const template = granted ? 'green' : 'orange';
|
|
30
|
+
const budget = input.maxIterations !== undefined
|
|
31
|
+
? `${input.iteration}/${input.maxIterations + (input.granted ?? 0)}`
|
|
32
|
+
: `${input.iteration}`;
|
|
33
|
+
const elements = [
|
|
34
|
+
{
|
|
35
|
+
tag: 'div',
|
|
36
|
+
fields: [
|
|
37
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**Run**\n${escapeMd(short(input.runId, 24))}` } },
|
|
38
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**Loop / 轮数**\n${escapeMd(input.loopId)} · ${escapeMd(budget)}` } },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{ tag: 'hr' },
|
|
42
|
+
{
|
|
43
|
+
tag: 'div',
|
|
44
|
+
text: {
|
|
45
|
+
tag: 'lark_md',
|
|
46
|
+
content: `**最后一轮结果**\n未达成 exit 条件` +
|
|
47
|
+
(input.detail ? `\n${escapeMd(truncate(input.detail, detailMax))}` : ''),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
if (granted) {
|
|
52
|
+
elements.push({ tag: 'hr' });
|
|
53
|
+
elements.push({
|
|
54
|
+
tag: 'div',
|
|
55
|
+
text: {
|
|
56
|
+
tag: 'lark_md',
|
|
57
|
+
content: `➕ 已追加 → 第 ${granted.nextIteration} 轮` +
|
|
58
|
+
(granted.by ? ` · by ${escapeMd(short(granted.by, 20))}` : ''),
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
elements.push({
|
|
64
|
+
tag: 'div',
|
|
65
|
+
text: {
|
|
66
|
+
tag: 'lark_md',
|
|
67
|
+
content: '点「追加 1 轮」会带着上一轮反馈再跑一轮;若结果已无修复价值,留着不点即可(run 保持受阻)。',
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
elements.push({
|
|
71
|
+
tag: 'action',
|
|
72
|
+
actions: [
|
|
73
|
+
{
|
|
74
|
+
tag: 'button',
|
|
75
|
+
text: { tag: 'plain_text', content: '➕ 追加 1 轮' },
|
|
76
|
+
type: 'primary',
|
|
77
|
+
value: {
|
|
78
|
+
action: V3_LOOP_GRANT_ACTION,
|
|
79
|
+
runId: input.runId,
|
|
80
|
+
loopId: input.loopId,
|
|
81
|
+
iteration: input.iteration,
|
|
82
|
+
nonce,
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
elements.push({
|
|
89
|
+
tag: 'action',
|
|
90
|
+
actions: [
|
|
91
|
+
{
|
|
92
|
+
tag: 'button',
|
|
93
|
+
text: { tag: 'plain_text', content: 'Web 详情' },
|
|
94
|
+
type: 'default',
|
|
95
|
+
multi_url: {
|
|
96
|
+
url: webDetailUrl, pc_url: webDetailUrl, android_url: webDetailUrl, ios_url: webDetailUrl,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
return JSON.stringify({
|
|
102
|
+
config: { wide_screen_mode: true },
|
|
103
|
+
header: { template, title: { tag: 'plain_text', content: title } },
|
|
104
|
+
elements,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function truncate(s, max) {
|
|
108
|
+
if (s.length <= max)
|
|
109
|
+
return s;
|
|
110
|
+
return `${s.slice(0, max)}…(截断,完整见 Web 详情)`;
|
|
111
|
+
}
|
|
112
|
+
function short(s, max) {
|
|
113
|
+
return s.length <= max ? s : `${s.slice(0, max)}…`;
|
|
114
|
+
}
|
|
115
|
+
/** 转义 lark_md 里会被解析的字符,防 detail 注入破坏卡片结构。 */
|
|
116
|
+
function escapeMd(s) {
|
|
117
|
+
return s.replace(/[\\*_~`\[\]]/g, (c) => `\\${c}`);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=v3-loop-grant-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-loop-grant-card.js","sourceRoot":"","sources":["../../../src/im/lark/v3-loop-grant-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AA+BpD,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC;iDACiD;AACjD,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,MAAc,EAAE,SAAiB;IACnF,OAAO,eAAe,KAAK,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,UAAU,MAAM,CAAC,SAAS,CAAC,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,IAAI,wBAAwB,CAAC;IACnE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC;IAEjC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,MAAM,EAAE,CAAC;IACnF,sCAAsC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE9C,MAAM,MAAM,GACV,KAAK,CAAC,aAAa,KAAK,SAAS;QAC/B,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE;QACpE,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAmC;QAC/C;YACE,GAAG,EAAE,KAAK;YACV,MAAM,EAAE;gBACN,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE;gBACrG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE;aACxH;SACF;QACD,EAAE,GAAG,EAAE,IAAI,EAAE;QACb;YACE,GAAG,EAAE,KAAK;YACV,IAAI,EAAE;gBACJ,GAAG,EAAE,SAAS;gBACd,OAAO,EACL,yBAAyB;oBACzB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E;SACF;KACF,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,KAAK;YACV,IAAI,EAAE;gBACJ,GAAG,EAAE,SAAS;gBACd,OAAO,EACL,aAAa,OAAO,CAAC,aAAa,IAAI;oBACtC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjE;SACF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,KAAK;YACV,IAAI,EAAE;gBACJ,GAAG,EAAE,SAAS;gBACd,OAAO,EAAE,mDAAmD;aAC7D;SACF,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE;gBACP;oBACE,GAAG,EAAE,QAAQ;oBACb,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE;oBAChD,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE;wBACL,MAAM,EAAE,oBAAoB;wBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,KAAK;qBAC2B;iBACnC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;QACZ,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE;YACP;gBACE,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE;gBAC9C,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE;oBACT,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY;iBAC1F;aACF;SACF;KACF,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;QAClC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAClE,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,GAAW;IACtC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,kBAAkB,CAAC;AAC9C,CAAC;AAED,SAAS,KAAK,CAAC,CAAS,EAAE,GAAW;IACnC,OAAO,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AACrD,CAAC;AAED,6CAA6C;AAC7C,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 回溯预算准许卡点击处理 —— card-handler 的 v3 分支(与
|
|
3
|
+
* `v3-loop-grant-card-handler` 同骨架)。把一次「➕ 准许回溯 +1」点击翻译成:
|
|
4
|
+
* 权限校验 → `requestRevisitGrant`(原子 grant + retry;幂等:已恢复 →
|
|
5
|
+
* not-budget-blocked) → 冻结卡 / toast + 触发 `driveV3Run` 重跑被卡节点。
|
|
6
|
+
*
|
|
7
|
+
* scope 正确性:按钮 value 带 tier —— pair grant 带 source/target,run grant
|
|
8
|
+
* 都不带,交给 core 的 partial-pair / pair-source-mismatch 守卫兜底。
|
|
9
|
+
*/
|
|
10
|
+
import { type V3RevisitGrantActionValue } from './v3-revisit-grant-card.js';
|
|
11
|
+
import { requestRevisitGrant } from '../../workflows/v3/daemon-run.js';
|
|
12
|
+
import { type RunChatBinding } from '../../workflows/v3/grill-state.js';
|
|
13
|
+
export declare function isV3RevisitGrantAction(action: unknown): boolean;
|
|
14
|
+
export interface V3RevisitGrantCardHandlerDeps {
|
|
15
|
+
baseDir?: string;
|
|
16
|
+
/** Re-enter the run after grant + retry. Fire-and-forget (daemon logs errors). */
|
|
17
|
+
driveRun: (runId: string) => void;
|
|
18
|
+
/** Permission: may this operator grant revisits of this run? Same semantics
|
|
19
|
+
* as the gate/blocked/loop-grant handlers' canResolve. */
|
|
20
|
+
canResolve?: (binding: RunChatBinding | undefined, operatorOpenId: string | undefined) => boolean;
|
|
21
|
+
/** Injectable for tests. Default = real requestRevisitGrant. */
|
|
22
|
+
requestGrant?: typeof requestRevisitGrant;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle a v3 revisit-grant card click. Returns the Lark card-action response:
|
|
26
|
+
* a frozen「已准许」card, or a `{ toast }`. Triggers `driveRun` on success.
|
|
27
|
+
*/
|
|
28
|
+
export declare function handleV3RevisitGrantAction(value: V3RevisitGrantActionValue, operatorOpenId: string | undefined, deps: V3RevisitGrantCardHandlerDeps): Promise<unknown>;
|
|
29
|
+
//# sourceMappingURL=v3-revisit-grant-card-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-revisit-grant-card-handler.d.ts","sourceRoot":"","sources":["../../../src/im/lark/v3-revisit-grant-card-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAA+B,MAAM,kCAAkC,CAAC;AAEpG,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,mCAAmC,CAAC;AAG3C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAE/D;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;+DAC2D;IAC3D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;IAClG,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,yBAAyB,EAChC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,OAAO,CAAC,CA2ElB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 回溯预算准许卡点击处理 —— card-handler 的 v3 分支(与
|
|
3
|
+
* `v3-loop-grant-card-handler` 同骨架)。把一次「➕ 准许回溯 +1」点击翻译成:
|
|
4
|
+
* 权限校验 → `requestRevisitGrant`(原子 grant + retry;幂等:已恢复 →
|
|
5
|
+
* not-budget-blocked) → 冻结卡 / toast + 触发 `driveV3Run` 重跑被卡节点。
|
|
6
|
+
*
|
|
7
|
+
* scope 正确性:按钮 value 带 tier —— pair grant 带 source/target,run grant
|
|
8
|
+
* 都不带,交给 core 的 partial-pair / pair-source-mismatch 守卫兜底。
|
|
9
|
+
*/
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { V3_REVISIT_GRANT_ACTION, buildV3RevisitGrantCard, v3RevisitGrantCardNonce, } from './v3-revisit-grant-card.js';
|
|
12
|
+
import { requestRevisitGrant, revisitBudgetBlockedInfoFor } from '../../workflows/v3/daemon-run.js';
|
|
13
|
+
import { readJournal } from '../../workflows/v3/journal.js';
|
|
14
|
+
import { readGrillState, defaultBaseDir, } from '../../workflows/v3/grill-state.js';
|
|
15
|
+
import { isValidRunId } from '../../workflows/v3/ops-projection.js';
|
|
16
|
+
export function isV3RevisitGrantAction(action) {
|
|
17
|
+
return action === V3_REVISIT_GRANT_ACTION;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Handle a v3 revisit-grant card click. Returns the Lark card-action response:
|
|
21
|
+
* a frozen「已准许」card, or a `{ toast }`. Triggers `driveRun` on success.
|
|
22
|
+
*/
|
|
23
|
+
export async function handleV3RevisitGrantAction(value, operatorOpenId, deps) {
|
|
24
|
+
const baseDir = deps.baseDir ?? defaultBaseDir();
|
|
25
|
+
if (!isValidRunId(value.runId)) {
|
|
26
|
+
return { toast: { type: 'warning', content: '准许已失效(非法 run)' } };
|
|
27
|
+
}
|
|
28
|
+
// attemptId 入 nonce:grant+retry 消费后节点进入新 attempt,旧卡 nonce 对不上 → stale。
|
|
29
|
+
if (value.nonce !== v3RevisitGrantCardNonce(value.runId, value.sourceNodeId, value.attemptId)) {
|
|
30
|
+
return { toast: { type: 'warning', content: '准许卡已失效(nonce 不匹配,看最新那张卡)' } };
|
|
31
|
+
}
|
|
32
|
+
const tier = value.tier === 'run' ? 'run' : 'pair';
|
|
33
|
+
const runDir = join(baseDir, value.runId);
|
|
34
|
+
const grill = readGrillState(runDir);
|
|
35
|
+
const binding = grill?.chatBinding;
|
|
36
|
+
if (deps.canResolve && !deps.canResolve(binding, operatorOpenId)) {
|
|
37
|
+
return { toast: { type: 'warning', content: '你没有权限准许这个 run 的回溯' } };
|
|
38
|
+
}
|
|
39
|
+
const requestGrant = deps.requestGrant ?? requestRevisitGrant;
|
|
40
|
+
let outcome;
|
|
41
|
+
try {
|
|
42
|
+
// pair grant 带 source/target;run grant 都不带。expectedAttemptId(同
|
|
43
|
+
// expectedAttemptId 教训):nonce 只证卡自身没改,证不了它指向的耗尽 attempt
|
|
44
|
+
// 还是"当前这次"——core 必须再比一次。
|
|
45
|
+
outcome = requestGrant(baseDir, value.runId, {
|
|
46
|
+
...(tier === 'pair' ? { sourceNodeId: value.sourceNodeId, toNodeId: value.toNodeId } : {}),
|
|
47
|
+
by: operatorOpenId ?? 'system',
|
|
48
|
+
expectedAttemptId: value.attemptId,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return {
|
|
53
|
+
toast: { type: 'error', content: `准许失败,请再试:${err instanceof Error ? err.message : String(err)}` },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (outcome.kind === 'invalid') {
|
|
57
|
+
return {
|
|
58
|
+
toast: {
|
|
59
|
+
type: 'warning',
|
|
60
|
+
content: outcome.reason === 'partial-pair' ? '准许卡参数不完整(pair 信息缺失)' : '准许卡与当前受阻节点不匹配',
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (outcome.kind === 'stale-run') {
|
|
65
|
+
// Idempotent recovery (codex nit #13): `not-budget-blocked` means a prior
|
|
66
|
+
// grant already extended the budget and the node is no longer blocked. If
|
|
67
|
+
// that grant's driveRun didn't land (transient), a re-click should re-drive
|
|
68
|
+
// rather than dead-end at a warning. driveRun is terminal-safe, so re-driving
|
|
69
|
+
// a run that genuinely moved on (or finished) is harmless. This mirrors the
|
|
70
|
+
// blocked/loop grant handlers' already-granted branch.
|
|
71
|
+
if (outcome.reason === 'not-budget-blocked')
|
|
72
|
+
deps.driveRun(value.runId);
|
|
73
|
+
return {
|
|
74
|
+
toast: {
|
|
75
|
+
type: 'warning',
|
|
76
|
+
content: outcome.reason === 'missing' ? '该 run 不存在或已清理'
|
|
77
|
+
: outcome.reason === 'stale-attempt' ? '该节点已进入新一次尝试,这张旧卡失效(看最新那张卡)'
|
|
78
|
+
: '该 run 已不在回溯预算受阻状态,准许卡失效',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// granted → drive the run (blocked node retries within extended budget) + freeze card.
|
|
83
|
+
deps.driveRun(value.runId);
|
|
84
|
+
const info = revisitBudgetBlockedInfoFor(readJournal(join(runDir, 'journal.ndjson')), value.sourceNodeId);
|
|
85
|
+
const frozen = buildV3RevisitGrantCard({
|
|
86
|
+
runId: value.runId,
|
|
87
|
+
sourceNodeId: value.sourceNodeId,
|
|
88
|
+
toNodeId: value.toNodeId,
|
|
89
|
+
tier,
|
|
90
|
+
attemptId: value.attemptId,
|
|
91
|
+
detail: info?.detail,
|
|
92
|
+
grantedNow: { by: operatorOpenId },
|
|
93
|
+
});
|
|
94
|
+
return JSON.parse(frozen);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=v3-revisit-grant-card-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-revisit-grant-card-handler.js","sourceRoot":"","sources":["../../../src/im/lark/v3-revisit-grant-card-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 回溯预算耗尽卡 —— 一个节点想回溯某祖先,但 per-pair / per-run 预算用尽
|
|
3
|
+
* (nodeBlocked errorCode=REVISIT_BUDGET_EXHAUSTED → run blocked)时的飞书入口。
|
|
4
|
+
* 和 blocked 重试卡是两张卡:这里没有"失败",只是回溯次数到顶——按钮语义是
|
|
5
|
+
* 「准许再回溯 1 次」(append revisitBudgetGranted + 原子 retry blocked 节点),
|
|
6
|
+
* 不是「重跑某 attempt」。
|
|
7
|
+
*
|
|
8
|
+
* stale 防护与 loop grant 卡同构:nonce 以 blocked `attemptId` 为 freshness key
|
|
9
|
+
* —— grant+retry 后 blocked 节点进入新 attempt,旧卡 attemptId 对不上 core 的
|
|
10
|
+
* expectedAttemptId 比对,天然失效。
|
|
11
|
+
*
|
|
12
|
+
* scope 正确性(菲菲 review):卡片明确标出耗尽的是 pair 还是 run-wide,并据此
|
|
13
|
+
* 让按钮带对应 scope —— pair grant 带 source/target,run grant 都不带。给错
|
|
14
|
+
* scope 会出现"grant 了但 retry 后又因另一层预算继续 blocked"。
|
|
15
|
+
*/
|
|
16
|
+
export declare const V3_REVISIT_GRANT_ACTION = "v3_revisit_grant";
|
|
17
|
+
/** card 按钮回传的 value 形态——v3-revisit-grant-card-handler 据此解析。 */
|
|
18
|
+
export interface V3RevisitGrantActionValue {
|
|
19
|
+
action: typeof V3_REVISIT_GRANT_ACTION;
|
|
20
|
+
runId: string;
|
|
21
|
+
/** 发起回溯(被 blocked)的节点。 */
|
|
22
|
+
sourceNodeId: string;
|
|
23
|
+
/** 回溯目标祖先。 */
|
|
24
|
+
toNodeId: string;
|
|
25
|
+
/** 耗尽的层级 —— 决定 grant scope:'pair' 带 source/target,'run' 都不带。 */
|
|
26
|
+
tier: 'pair' | 'run';
|
|
27
|
+
/** blocked attemptId —— nonce + core expectedAttemptId 的 freshness key。 */
|
|
28
|
+
attemptId: string;
|
|
29
|
+
nonce: string;
|
|
30
|
+
}
|
|
31
|
+
export interface V3RevisitGrantCardInput {
|
|
32
|
+
runId: string;
|
|
33
|
+
sourceNodeId: string;
|
|
34
|
+
toNodeId: string;
|
|
35
|
+
tier: 'pair' | 'run';
|
|
36
|
+
attemptId: string;
|
|
37
|
+
/** 预算耗尽 detail(如 `... (1/1) — grant +1 ...`)。 */
|
|
38
|
+
detail?: string;
|
|
39
|
+
/** 省略则按 runId/sourceNodeId/attemptId 推导。 */
|
|
40
|
+
nonce?: string;
|
|
41
|
+
webDetailUrl?: string;
|
|
42
|
+
detailMaxChars?: number;
|
|
43
|
+
/** 有值 → 渲染冻结的「已准许」卡(无按钮,防 stale UI 重复提交)。 */
|
|
44
|
+
grantedNow?: {
|
|
45
|
+
by?: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** 稳定 nonce:同一 run 同一节点同一 blocked attempt 的卡 nonce 固定(重发一致);
|
|
49
|
+
* attemptId 入 nonce —— grant+retry 消费后 blocked 节点进入新 attempt,旧卡失效。 */
|
|
50
|
+
export declare function v3RevisitGrantCardNonce(runId: string, sourceNodeId: string, attemptId: string): string;
|
|
51
|
+
export declare function buildV3RevisitGrantCard(input: V3RevisitGrantCardInput): string;
|
|
52
|
+
//# sourceMappingURL=v3-revisit-grant-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-revisit-grant-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/v3-revisit-grant-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,eAAO,MAAM,uBAAuB,qBAAqB,CAAC;AAE1D,+DAA+D;AAC/D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,OAAO,uBAAuB,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAID;uEACuE;AACvE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtG;AAMD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAuF9E"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3 回溯预算耗尽卡 —— 一个节点想回溯某祖先,但 per-pair / per-run 预算用尽
|
|
3
|
+
* (nodeBlocked errorCode=REVISIT_BUDGET_EXHAUSTED → run blocked)时的飞书入口。
|
|
4
|
+
* 和 blocked 重试卡是两张卡:这里没有"失败",只是回溯次数到顶——按钮语义是
|
|
5
|
+
* 「准许再回溯 1 次」(append revisitBudgetGranted + 原子 retry blocked 节点),
|
|
6
|
+
* 不是「重跑某 attempt」。
|
|
7
|
+
*
|
|
8
|
+
* stale 防护与 loop grant 卡同构:nonce 以 blocked `attemptId` 为 freshness key
|
|
9
|
+
* —— grant+retry 后 blocked 节点进入新 attempt,旧卡 attemptId 对不上 core 的
|
|
10
|
+
* expectedAttemptId 比对,天然失效。
|
|
11
|
+
*
|
|
12
|
+
* scope 正确性(菲菲 review):卡片明确标出耗尽的是 pair 还是 run-wide,并据此
|
|
13
|
+
* 让按钮带对应 scope —— pair grant 带 source/target,run grant 都不带。给错
|
|
14
|
+
* scope 会出现"grant 了但 retry 后又因另一层预算继续 blocked"。
|
|
15
|
+
*/
|
|
16
|
+
import { config } from '../../config.js';
|
|
17
|
+
export const V3_REVISIT_GRANT_ACTION = 'v3_revisit_grant';
|
|
18
|
+
const DEFAULT_DETAIL_MAX_CHARS = 500;
|
|
19
|
+
/** 稳定 nonce:同一 run 同一节点同一 blocked attempt 的卡 nonce 固定(重发一致);
|
|
20
|
+
* attemptId 入 nonce —— grant+retry 消费后 blocked 节点进入新 attempt,旧卡失效。 */
|
|
21
|
+
export function v3RevisitGrantCardNonce(runId, sourceNodeId, attemptId) {
|
|
22
|
+
return `v3revisitgrant:${runId}:${sourceNodeId}:${attemptId}`;
|
|
23
|
+
}
|
|
24
|
+
function v3RunDetailUrl(runId) {
|
|
25
|
+
return `http://${config.dashboard.externalHost}:${config.dashboard.port}/#/v3/${encodeURIComponent(runId)}`;
|
|
26
|
+
}
|
|
27
|
+
export function buildV3RevisitGrantCard(input) {
|
|
28
|
+
const nonce = input.nonce ?? v3RevisitGrantCardNonce(input.runId, input.sourceNodeId, input.attemptId);
|
|
29
|
+
const webDetailUrl = input.webDetailUrl ?? v3RunDetailUrl(input.runId);
|
|
30
|
+
const detailMax = input.detailMaxChars ?? DEFAULT_DETAIL_MAX_CHARS;
|
|
31
|
+
const granted = input.grantedNow;
|
|
32
|
+
const scopeLabel = input.tier === 'pair' ? `${input.sourceNodeId} → ${input.toNodeId}` : '整个 run';
|
|
33
|
+
const title = granted ? `已准许回溯:${scopeLabel}` : `回溯预算耗尽:${scopeLabel}`;
|
|
34
|
+
// 与 loop grant 卡同款语义色:耗尽=橙(可恢复),准许后转绿。
|
|
35
|
+
const template = granted ? 'green' : 'orange';
|
|
36
|
+
const elements = [
|
|
37
|
+
{
|
|
38
|
+
tag: 'div',
|
|
39
|
+
fields: [
|
|
40
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**Run**\n${escapeMd(short(input.runId, 24))}` } },
|
|
41
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**回溯**\n${escapeMd(input.sourceNodeId)} → ${escapeMd(input.toNodeId)}` } },
|
|
42
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**耗尽层级**\n${input.tier === 'pair' ? 'per-pair(这条边)' : 'per-run(全局)'}` } },
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
{ tag: 'hr' },
|
|
46
|
+
{
|
|
47
|
+
tag: 'div',
|
|
48
|
+
text: {
|
|
49
|
+
tag: 'lark_md',
|
|
50
|
+
content: `**情况**\n节点 ${escapeMd(input.sourceNodeId)} 想回溯到 ${escapeMd(input.toNodeId)},但回溯次数已到上限` +
|
|
51
|
+
(input.detail ? `\n${escapeMd(truncate(input.detail, detailMax))}` : ''),
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
if (granted) {
|
|
56
|
+
elements.push({ tag: 'hr' });
|
|
57
|
+
elements.push({
|
|
58
|
+
tag: 'div',
|
|
59
|
+
text: {
|
|
60
|
+
tag: 'lark_md',
|
|
61
|
+
content: `➕ 已准许再回溯 1 次(${input.tier === 'pair' ? '本边' : '全局'})` +
|
|
62
|
+
(granted.by ? ` · by ${escapeMd(short(granted.by, 20))}` : ''),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
elements.push({
|
|
68
|
+
tag: 'div',
|
|
69
|
+
text: {
|
|
70
|
+
tag: 'lark_md',
|
|
71
|
+
content: '点「准许回溯 +1」会放行这次回溯并自动重跑该节点;若觉得不该再回溯,留着不点即可(run 保持受阻)。',
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
elements.push({
|
|
75
|
+
tag: 'action',
|
|
76
|
+
actions: [
|
|
77
|
+
{
|
|
78
|
+
tag: 'button',
|
|
79
|
+
text: { tag: 'plain_text', content: '➕ 准许回溯 +1' },
|
|
80
|
+
type: 'primary',
|
|
81
|
+
value: {
|
|
82
|
+
action: V3_REVISIT_GRANT_ACTION,
|
|
83
|
+
runId: input.runId,
|
|
84
|
+
sourceNodeId: input.sourceNodeId,
|
|
85
|
+
toNodeId: input.toNodeId,
|
|
86
|
+
tier: input.tier,
|
|
87
|
+
attemptId: input.attemptId,
|
|
88
|
+
nonce,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
elements.push({
|
|
95
|
+
tag: 'action',
|
|
96
|
+
actions: [
|
|
97
|
+
{
|
|
98
|
+
tag: 'button',
|
|
99
|
+
text: { tag: 'plain_text', content: 'Web 详情' },
|
|
100
|
+
type: 'default',
|
|
101
|
+
multi_url: { url: webDetailUrl, pc_url: webDetailUrl, android_url: webDetailUrl, ios_url: webDetailUrl },
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
});
|
|
105
|
+
return JSON.stringify({
|
|
106
|
+
config: { wide_screen_mode: true },
|
|
107
|
+
header: { template, title: { tag: 'plain_text', content: title } },
|
|
108
|
+
elements,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function truncate(s, max) {
|
|
112
|
+
if (s.length <= max)
|
|
113
|
+
return s;
|
|
114
|
+
return `${s.slice(0, max)}…(截断,完整见 Web 详情)`;
|
|
115
|
+
}
|
|
116
|
+
function short(s, max) {
|
|
117
|
+
return s.length <= max ? s : `${s.slice(0, max)}…`;
|
|
118
|
+
}
|
|
119
|
+
/** 转义 lark_md 里会被解析的字符,防 detail 注入破坏卡片结构。 */
|
|
120
|
+
function escapeMd(s) {
|
|
121
|
+
return s.replace(/[\\*_~`\[\]]/g, (c) => `\\${c}`);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=v3-revisit-grant-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-revisit-grant-card.js","sourceRoot":"","sources":["../../../src/im/lark/v3-revisit-grant-card.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-cards.d.ts","sourceRoot":"","sources":["../../../src/im/lark/workflow-cards.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAGjE,eAAO,MAAM,uBAAuB,eAAe,CAAC;AACpD,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAClD,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAClD,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAIzD,MAAM,MAAM,8BAA8B,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEnF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,8BAA8B,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;sEAEkE;IAClE,UAAU,CAAC,EAAE,8BAA8B,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;yDAEqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf;;wEAEoE;IACpE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;
|
|
1
|
+
{"version":3,"file":"workflow-cards.d.ts","sourceRoot":"","sources":["../../../src/im/lark/workflow-cards.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAGjE,eAAO,MAAM,uBAAuB,eAAe,CAAC;AACpD,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAClD,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAClD,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAIzD,MAAM,MAAM,8BAA8B,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEnF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,8BAA8B,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;sEAEkE;IAClE,UAAU,CAAC,EAAE,8BAA8B,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;yDAEqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf;;wEAEoE;IACpE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,2BAAgC,GACrC,2BAA2B,CAmC7B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,2BAAgC,EACtC,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAgIR"}
|
|
@@ -10,8 +10,12 @@ const DEFAULT_PROMPT_MAX_CHARS = 500;
|
|
|
10
10
|
export function workflowApprovalCardNonce(runId, activityId, attemptId) {
|
|
11
11
|
return `wf:${runId}:${activityId}:${attemptId}`;
|
|
12
12
|
}
|
|
13
|
+
// v2 (v0.2) workflow runs live at the legacy detail route now that the main
|
|
14
|
+
// `#/workflows` URL belongs to the v3 runs page. v2 runs are not in the v3 runs
|
|
15
|
+
// directory, so pointing these cards at `#/workflows/<id>` would 404 against
|
|
16
|
+
// `/api/v3/runs/<id>`; `#/legacy-workflow/<id>` renders the v2 detail page.
|
|
13
17
|
export function workflowRunDetailUrl(runId) {
|
|
14
|
-
return `http://${config.dashboard.externalHost}:${config.dashboard.port}/#/
|
|
18
|
+
return `http://${config.dashboard.externalHost}:${config.dashboard.port}/#/legacy-workflow/${encodeURIComponent(runId)}`;
|
|
15
19
|
}
|
|
16
20
|
export function getWorkflowApprovalCardContext(event, snapshot, opts = {}) {
|
|
17
21
|
if (isPayloadRef(event.payload)) {
|