@ttfw/envoi 1.0.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/README.md +238 -0
- package/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +31 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/autonomy.d.ts +6 -0
- package/dist/commands/autonomy.d.ts.map +1 -0
- package/dist/commands/autonomy.js +89 -0
- package/dist/commands/autonomy.js.map +1 -0
- package/dist/commands/builder.d.ts +13 -0
- package/dist/commands/builder.d.ts.map +1 -0
- package/dist/commands/builder.js +142 -0
- package/dist/commands/builder.js.map +1 -0
- package/dist/commands/idea.d.ts +12 -0
- package/dist/commands/idea.d.ts.map +1 -0
- package/dist/commands/idea.js +79 -0
- package/dist/commands/idea.js.map +1 -0
- package/dist/commands/init.d.ts +18 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +423 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mode.d.ts +13 -0
- package/dist/commands/mode.d.ts.map +1 -0
- package/dist/commands/mode.js +96 -0
- package/dist/commands/mode.js.map +1 -0
- package/dist/commands/onboard.d.ts +37 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +743 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/pr-note.d.ts +8 -0
- package/dist/commands/pr-note.d.ts.map +1 -0
- package/dist/commands/pr-note.js +27 -0
- package/dist/commands/pr-note.js.map +1 -0
- package/dist/commands/undo.d.ts +7 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +59 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +248 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants/report_codes.d.ts +29 -0
- package/dist/constants/report_codes.d.ts.map +1 -0
- package/dist/constants/report_codes.js +69 -0
- package/dist/constants/report_codes.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +675 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/autonomy.d.ts +16 -0
- package/dist/lib/autonomy.d.ts.map +1 -0
- package/dist/lib/autonomy.js +38 -0
- package/dist/lib/autonomy.js.map +1 -0
- package/dist/lib/blocked.d.ts +87 -0
- package/dist/lib/blocked.d.ts.map +1 -0
- package/dist/lib/blocked.js +134 -0
- package/dist/lib/blocked.js.map +1 -0
- package/dist/lib/branding.d.ts +13 -0
- package/dist/lib/branding.d.ts.map +1 -0
- package/dist/lib/branding.js +19 -0
- package/dist/lib/branding.js.map +1 -0
- package/dist/lib/claude.d.ts +42 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +291 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/config.d.ts +71 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +410 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/diff.d.ts +150 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +257 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/doctor.d.ts +67 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +211 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +27 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +116 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fs.d.ts +93 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +179 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/git.d.ts +177 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +355 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git_branching.d.ts +84 -0
- package/dist/lib/git_branching.d.ts.map +1 -0
- package/dist/lib/git_branching.js +327 -0
- package/dist/lib/git_branching.js.map +1 -0
- package/dist/lib/gitignore.d.ts +26 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +119 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/guardrails.d.ts +232 -0
- package/dist/lib/guardrails.d.ts.map +1 -0
- package/dist/lib/guardrails.js +323 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/history.d.ts +110 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +236 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/index.d.ts +29 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +29 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/json-extract.d.ts +42 -0
- package/dist/lib/json-extract.d.ts.map +1 -0
- package/dist/lib/json-extract.js +201 -0
- package/dist/lib/json-extract.js.map +1 -0
- package/dist/lib/judge.d.ts +237 -0
- package/dist/lib/judge.d.ts.map +1 -0
- package/dist/lib/judge.js +501 -0
- package/dist/lib/judge.js.map +1 -0
- package/dist/lib/lock.d.ts +79 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +254 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/migration.d.ts +9 -0
- package/dist/lib/migration.d.ts.map +1 -0
- package/dist/lib/migration.js +74 -0
- package/dist/lib/migration.js.map +1 -0
- package/dist/lib/paths.d.ts +18 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +27 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/preflight.d.ts +33 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +177 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prompt_budget.d.ts +18 -0
- package/dist/lib/prompt_budget.d.ts.map +1 -0
- package/dist/lib/prompt_budget.js +36 -0
- package/dist/lib/prompt_budget.js.map +1 -0
- package/dist/lib/report.d.ts +102 -0
- package/dist/lib/report.d.ts.map +1 -0
- package/dist/lib/report.js +347 -0
- package/dist/lib/report.js.map +1 -0
- package/dist/lib/reviewer-flow.d.ts +80 -0
- package/dist/lib/reviewer-flow.d.ts.map +1 -0
- package/dist/lib/reviewer-flow.js +138 -0
- package/dist/lib/reviewer-flow.js.map +1 -0
- package/dist/lib/reviewer.d.ts +53 -0
- package/dist/lib/reviewer.d.ts.map +1 -0
- package/dist/lib/reviewer.js +199 -0
- package/dist/lib/reviewer.js.map +1 -0
- package/dist/lib/risk.d.ts +127 -0
- package/dist/lib/risk.d.ts.map +1 -0
- package/dist/lib/risk.js +192 -0
- package/dist/lib/risk.js.map +1 -0
- package/dist/lib/rollback.d.ts +143 -0
- package/dist/lib/rollback.d.ts.map +1 -0
- package/dist/lib/rollback.js +244 -0
- package/dist/lib/rollback.js.map +1 -0
- package/dist/lib/schema.d.ts +47 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +91 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/scope.d.ts +89 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +135 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/self_update.d.ts +13 -0
- package/dist/lib/self_update.d.ts.map +1 -0
- package/dist/lib/self_update.js +172 -0
- package/dist/lib/self_update.js.map +1 -0
- package/dist/lib/state.d.ts +143 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +258 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/tick.d.ts +310 -0
- package/dist/lib/tick.d.ts.map +1 -0
- package/dist/lib/tick.js +424 -0
- package/dist/lib/tick.js.map +1 -0
- package/dist/lib/transport.d.ts +145 -0
- package/dist/lib/transport.d.ts.map +1 -0
- package/dist/lib/transport.js +237 -0
- package/dist/lib/transport.js.map +1 -0
- package/dist/lib/verdict_labels.d.ts +5 -0
- package/dist/lib/verdict_labels.d.ts.map +1 -0
- package/dist/lib/verdict_labels.js +25 -0
- package/dist/lib/verdict_labels.js.map +1 -0
- package/dist/lib/verify-safety.d.ts +63 -0
- package/dist/lib/verify-safety.d.ts.map +1 -0
- package/dist/lib/verify-safety.js +123 -0
- package/dist/lib/verify-safety.js.map +1 -0
- package/dist/lib/verify.d.ts +139 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +311 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/workspace_state.d.ts +79 -0
- package/dist/lib/workspace_state.d.ts.map +1 -0
- package/dist/lib/workspace_state.js +283 -0
- package/dist/lib/workspace_state.js.map +1 -0
- package/dist/runner/builder.d.ts +58 -0
- package/dist/runner/builder.d.ts.map +1 -0
- package/dist/runner/builder.js +775 -0
- package/dist/runner/builder.js.map +1 -0
- package/dist/runner/builder_parse.d.ts +37 -0
- package/dist/runner/builder_parse.d.ts.map +1 -0
- package/dist/runner/builder_parse.js +76 -0
- package/dist/runner/builder_parse.js.map +1 -0
- package/dist/runner/index.d.ts +9 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +7 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/loop.d.ts +51 -0
- package/dist/runner/loop.d.ts.map +1 -0
- package/dist/runner/loop.js +221 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/orchestrator.d.ts +67 -0
- package/dist/runner/orchestrator.d.ts.map +1 -0
- package/dist/runner/orchestrator.js +376 -0
- package/dist/runner/orchestrator.js.map +1 -0
- package/dist/runner/tick.d.ts +10 -0
- package/dist/runner/tick.d.ts.map +1 -0
- package/dist/runner/tick.js +1639 -0
- package/dist/runner/tick.js.map +1 -0
- package/dist/types/blocked.d.ts +52 -0
- package/dist/types/blocked.d.ts.map +1 -0
- package/dist/types/blocked.js +8 -0
- package/dist/types/blocked.js.map +1 -0
- package/dist/types/builder.d.ts +25 -0
- package/dist/types/builder.d.ts.map +1 -0
- package/dist/types/builder.js +7 -0
- package/dist/types/builder.js.map +1 -0
- package/dist/types/claude.d.ts +86 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +48 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/config.d.ts +384 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lock.d.ts +21 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +8 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/preflight.d.ts +49 -0
- package/dist/types/preflight.d.ts.map +1 -0
- package/dist/types/preflight.js +8 -0
- package/dist/types/preflight.js.map +1 -0
- package/dist/types/report.d.ts +161 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +8 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/reviewer.d.ts +66 -0
- package/dist/types/reviewer.d.ts.map +1 -0
- package/dist/types/reviewer.js +5 -0
- package/dist/types/reviewer.js.map +1 -0
- package/dist/types/state.d.ts +124 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +20 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/task.d.ts +117 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +7 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/workspace_state.d.ts +125 -0
- package/dist/types/workspace_state.d.ts.map +1 -0
- package/dist/types/workspace_state.js +10 -0
- package/dist/types/workspace_state.js.map +1 -0
- package/envoi.config.json +191 -0
- package/package.json +52 -0
- package/relais/prompts/.gitkeep +0 -0
- package/relais/prompts/builder.system.txt +13 -0
- package/relais/prompts/builder.user.txt +15 -0
- package/relais/prompts/orchestrator.system.txt +37 -0
- package/relais/prompts/orchestrator.user.txt +34 -0
- package/relais/prompts/reviewer.system.txt +33 -0
- package/relais/prompts/reviewer.user.txt +35 -0
- package/relais/schemas/.gitkeep +0 -0
- package/relais/schemas/builder_result.schema.json +29 -0
- package/relais/schemas/report.schema.json +195 -0
- package/relais/schemas/reviewer_result.schema.json +70 -0
- package/relais/schemas/task.schema.json +155 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EACV,SAAS,EAET,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAWrF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAG,SAAS,CAKhF;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAK5E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,SAAS,CAAC,gBAAgB,CAAC,GACzC,SAAS,CAKX;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,gBAAgB,GACtB,SAAS,CAiBX;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAY3D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAczD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,GAClB,SAAS,CAKX;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,GAClB,SAAS,CAMX;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAK9D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,kBAAkB,GACxB,SAAS,CASX;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAK/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,SAAS,CAOX;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAO3D"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State management utilities for tick execution.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to create and update tick state during execution.
|
|
5
|
+
*/
|
|
6
|
+
import { randomBytes } from 'node:crypto';
|
|
7
|
+
import { TickPhase } from '../types/state.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generates a unique run ID for a tick.
|
|
10
|
+
*
|
|
11
|
+
* @returns A unique identifier string
|
|
12
|
+
*/
|
|
13
|
+
export function generateRunId() {
|
|
14
|
+
// Generate 16 random bytes and encode as hex (32 chars)
|
|
15
|
+
return randomBytes(16).toString('hex');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Creates initial tick state.
|
|
19
|
+
*
|
|
20
|
+
* @param config - Envoi configuration
|
|
21
|
+
* @param baseCommit - Git HEAD commit SHA at start
|
|
22
|
+
* @returns Initial tick state
|
|
23
|
+
*/
|
|
24
|
+
export function createInitialState(config, baseCommit) {
|
|
25
|
+
return {
|
|
26
|
+
phase: TickPhase.LOCK,
|
|
27
|
+
run_id: generateRunId(),
|
|
28
|
+
started_at: new Date().toISOString(),
|
|
29
|
+
base_commit: baseCommit,
|
|
30
|
+
config,
|
|
31
|
+
task: null,
|
|
32
|
+
builder_result: null,
|
|
33
|
+
errors: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Transitions tick state to a new phase.
|
|
38
|
+
*
|
|
39
|
+
* @param state - Current tick state
|
|
40
|
+
* @param newPhase - Phase to transition to
|
|
41
|
+
* @returns Updated tick state
|
|
42
|
+
*/
|
|
43
|
+
export function transitionPhase(state, newPhase) {
|
|
44
|
+
return {
|
|
45
|
+
...state,
|
|
46
|
+
phase: newPhase,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Adds an error to the tick state.
|
|
51
|
+
*
|
|
52
|
+
* @param state - Current tick state
|
|
53
|
+
* @param error - Error message to add
|
|
54
|
+
* @returns Updated tick state
|
|
55
|
+
*/
|
|
56
|
+
export function addError(state, error) {
|
|
57
|
+
return {
|
|
58
|
+
...state,
|
|
59
|
+
errors: [...state.errors, error],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Updates task in tick state.
|
|
64
|
+
*
|
|
65
|
+
* @param state - Current tick state
|
|
66
|
+
* @param task - Task to set
|
|
67
|
+
* @returns Updated tick state
|
|
68
|
+
*/
|
|
69
|
+
export function setTask(state, task) {
|
|
70
|
+
return {
|
|
71
|
+
...state,
|
|
72
|
+
task,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Updates builder result in tick state.
|
|
77
|
+
*
|
|
78
|
+
* @param state - Current tick state
|
|
79
|
+
* @param builderResult - Builder result to set
|
|
80
|
+
* @returns Updated tick state
|
|
81
|
+
*/
|
|
82
|
+
export function setBuilderResult(state, builderResult) {
|
|
83
|
+
return {
|
|
84
|
+
...state,
|
|
85
|
+
builder_result: builderResult,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Appends a stop history entry to guardrail state, capping at 50 entries.
|
|
90
|
+
*
|
|
91
|
+
* @param state - Current tick state
|
|
92
|
+
* @param entry - Stop history entry to add
|
|
93
|
+
* @returns Updated tick state
|
|
94
|
+
*/
|
|
95
|
+
export function appendStopHistory(state, entry) {
|
|
96
|
+
const guardrail = state.guardrail ?? {
|
|
97
|
+
force_patch_until_success: false,
|
|
98
|
+
last_risk_flags: [],
|
|
99
|
+
stop_history: [],
|
|
100
|
+
};
|
|
101
|
+
// Add entry and cap to 50 entries (keep most recent)
|
|
102
|
+
const updatedHistory = [...guardrail.stop_history, entry].slice(-50);
|
|
103
|
+
return {
|
|
104
|
+
...state,
|
|
105
|
+
guardrail: {
|
|
106
|
+
...guardrail,
|
|
107
|
+
stop_history: updatedHistory,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Clears force patch flag (sets force_patch_until_success to false).
|
|
113
|
+
*
|
|
114
|
+
* Called when a patch succeeds to reset escalation state.
|
|
115
|
+
*
|
|
116
|
+
* @param state - Current tick state
|
|
117
|
+
* @returns Updated tick state
|
|
118
|
+
*/
|
|
119
|
+
export function clearForcePatch(state) {
|
|
120
|
+
if (!state.guardrail) {
|
|
121
|
+
return state;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
...state,
|
|
125
|
+
guardrail: {
|
|
126
|
+
...state.guardrail,
|
|
127
|
+
force_patch_until_success: false,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Sets force patch flag (sets force_patch_until_success to true).
|
|
133
|
+
*
|
|
134
|
+
* Called to enable escalation mode when guardrails trigger.
|
|
135
|
+
*
|
|
136
|
+
* @param state - Current tick state
|
|
137
|
+
* @returns Updated tick state
|
|
138
|
+
*/
|
|
139
|
+
export function setForcePatch(state) {
|
|
140
|
+
const guardrail = state.guardrail ?? {
|
|
141
|
+
force_patch_until_success: false,
|
|
142
|
+
last_risk_flags: [],
|
|
143
|
+
stop_history: [],
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
...state,
|
|
147
|
+
guardrail: {
|
|
148
|
+
...guardrail,
|
|
149
|
+
force_patch_until_success: true,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Updates the task fingerprint in tick state.
|
|
155
|
+
*
|
|
156
|
+
* @param state - Current tick state
|
|
157
|
+
* @param fingerprint - SHA256 fingerprint of the current task
|
|
158
|
+
* @returns Updated tick state
|
|
159
|
+
*/
|
|
160
|
+
export function updateTaskFingerprint(state, fingerprint) {
|
|
161
|
+
return {
|
|
162
|
+
...state,
|
|
163
|
+
task_fingerprint: fingerprint,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Updates failure tracking when a task fails.
|
|
168
|
+
*
|
|
169
|
+
* Increments failure_streak and updates last_failed_fingerprint.
|
|
170
|
+
*
|
|
171
|
+
* @param state - Current tick state
|
|
172
|
+
* @param fingerprint - SHA256 fingerprint of the failed task
|
|
173
|
+
* @returns Updated tick state
|
|
174
|
+
*/
|
|
175
|
+
export function recordTaskFailure(state, fingerprint) {
|
|
176
|
+
return {
|
|
177
|
+
...state,
|
|
178
|
+
last_failed_fingerprint: fingerprint,
|
|
179
|
+
failure_streak: (state.failure_streak ?? 0) + 1,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Resets failure streak when a task succeeds.
|
|
184
|
+
*
|
|
185
|
+
* @param state - Current tick state
|
|
186
|
+
* @returns Updated tick state
|
|
187
|
+
*/
|
|
188
|
+
export function resetFailureStreak(state) {
|
|
189
|
+
return {
|
|
190
|
+
...state,
|
|
191
|
+
failure_streak: 0,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Appends a verify history entry, capping at 50 entries.
|
|
196
|
+
*
|
|
197
|
+
* @param state - Current tick state
|
|
198
|
+
* @param entry - Verify history entry to add
|
|
199
|
+
* @returns Updated tick state
|
|
200
|
+
*/
|
|
201
|
+
export function appendVerifyHistory(state, entry) {
|
|
202
|
+
const currentHistory = state.verify_history ?? [];
|
|
203
|
+
// Add entry and cap to 50 entries (keep most recent)
|
|
204
|
+
const updatedHistory = [...currentHistory, entry].slice(-50);
|
|
205
|
+
return {
|
|
206
|
+
...state,
|
|
207
|
+
verify_history: updatedHistory,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Increments the retry count for transport stall recovery.
|
|
212
|
+
*
|
|
213
|
+
* @param state - Current tick state
|
|
214
|
+
* @returns Updated tick state with incremented retry_count
|
|
215
|
+
*/
|
|
216
|
+
export function incrementRetryCount(state) {
|
|
217
|
+
return {
|
|
218
|
+
...state,
|
|
219
|
+
retry_count: (state.retry_count ?? 0) + 1,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Records a transport stall error in state.
|
|
224
|
+
*
|
|
225
|
+
* Used to track the last error kind and request ID for debugging
|
|
226
|
+
* and retry policy decisions.
|
|
227
|
+
*
|
|
228
|
+
* @param state - Current tick state
|
|
229
|
+
* @param errorKind - Kind of error (e.g., 'transport_stalled')
|
|
230
|
+
* @param requestId - Request ID from the stall (for debugging)
|
|
231
|
+
* @returns Updated tick state
|
|
232
|
+
*/
|
|
233
|
+
export function recordTransportStall(state, errorKind, requestId) {
|
|
234
|
+
return {
|
|
235
|
+
...state,
|
|
236
|
+
last_error_kind: errorKind,
|
|
237
|
+
last_request_id: requestId,
|
|
238
|
+
retry_count: (state.retry_count ?? 0) + 1,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Resets retry state after a successful tick.
|
|
243
|
+
*
|
|
244
|
+
* Clears retry_count, last_error_kind, and last_request_id.
|
|
245
|
+
* Called when a tick completes successfully to reset recovery state.
|
|
246
|
+
*
|
|
247
|
+
* @param state - Current tick state
|
|
248
|
+
* @returns Updated tick state with cleared retry fields
|
|
249
|
+
*/
|
|
250
|
+
export function resetRetryState(state) {
|
|
251
|
+
return {
|
|
252
|
+
...state,
|
|
253
|
+
retry_count: 0,
|
|
254
|
+
last_error_kind: undefined,
|
|
255
|
+
last_request_id: undefined,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tick runner with transport stall handling and retry policy.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to handle transport stalls during ORCHESTRATE or BUILD phases.
|
|
5
|
+
* When a stall is detected:
|
|
6
|
+
* 1. Check if repo is dirty
|
|
7
|
+
* 2. Rollback if needed
|
|
8
|
+
* 3. Return BLOCKED_TRANSPORT_STALLED with evidence
|
|
9
|
+
*
|
|
10
|
+
* Retry policy (M21):
|
|
11
|
+
* - Attempt 1: Retry same task unchanged
|
|
12
|
+
* - Attempt 2: Retry with degraded settings
|
|
13
|
+
* - Attempt 3+: Block and require human action
|
|
14
|
+
*/
|
|
15
|
+
import type { TransportStallError, TransportStallStage } from '../types/preflight.js';
|
|
16
|
+
import type { RollbackResultNew } from './rollback.js';
|
|
17
|
+
import type { DiffLimits } from '../types/task.js';
|
|
18
|
+
import type { EnvoiConfig } from '../types/config.js';
|
|
19
|
+
import type { TickState } from '../types/state.js';
|
|
20
|
+
/**
|
|
21
|
+
* Maximum retry attempts before blocking.
|
|
22
|
+
*/
|
|
23
|
+
export declare const MAX_RETRY_ATTEMPTS = 3;
|
|
24
|
+
/**
|
|
25
|
+
* Recovery prompt to prepend when retrying after a transport stall.
|
|
26
|
+
*
|
|
27
|
+
* This prompt reminds the model that previous work may have been lost
|
|
28
|
+
* and to read files before making assumptions about their state.
|
|
29
|
+
*/
|
|
30
|
+
export declare const RECOVERY_PROMPT = "IMPORTANT: This is a retry after a transport stall. The previous attempt may have been interrupted.\n\nDo NOT assume your previous edits were applied. The connection may have stalled:\n- Before any changes were made\n- In the middle of changes (partial writes)\n- After changes were made but before confirmation\n\nBEFORE making any edits:\n1. Read the relevant files to verify their current state\n2. Check if your intended changes already exist\n3. Proceed based on the actual file contents, not your memory of what you tried to do\n\nIf the task appears completed, verify and report success. If not, complete it from the current state.";
|
|
31
|
+
/**
|
|
32
|
+
* Returns the recovery prompt to prepend when retrying.
|
|
33
|
+
*
|
|
34
|
+
* The recovery prompt is used on any retry (retry_unchanged or retry_degraded)
|
|
35
|
+
* to remind the model that previous work may have been lost.
|
|
36
|
+
*
|
|
37
|
+
* @param retryCount - Current retry count (0 = first attempt, no recovery prompt)
|
|
38
|
+
* @returns Recovery prompt string if retrying, empty string for first attempt
|
|
39
|
+
*/
|
|
40
|
+
export declare function getRecoveryPrompt(retryCount: number): string;
|
|
41
|
+
/**
|
|
42
|
+
* Builds the full prompt with optional recovery prefix.
|
|
43
|
+
*
|
|
44
|
+
* If retrying after a stall, prepends the recovery prompt to the original prompt.
|
|
45
|
+
*
|
|
46
|
+
* @param originalPrompt - The original prompt content
|
|
47
|
+
* @param retryCount - Current retry count (0 = first attempt)
|
|
48
|
+
* @returns Full prompt with recovery prefix if applicable
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildPromptWithRecovery(originalPrompt: string, retryCount: number): string;
|
|
51
|
+
/**
|
|
52
|
+
* Action to take based on retry count.
|
|
53
|
+
*/
|
|
54
|
+
export type RetryAction = 'retry_unchanged' | 'retry_degraded' | 'block';
|
|
55
|
+
/**
|
|
56
|
+
* Degraded settings applied on retry attempt 2.
|
|
57
|
+
*/
|
|
58
|
+
export interface DegradedSettings {
|
|
59
|
+
/** Reduced max_turns for builder (50% of original, minimum 5) */
|
|
60
|
+
max_turns: number;
|
|
61
|
+
/** Stricter diff limits (50% of original) */
|
|
62
|
+
diff_limits: DiffLimits;
|
|
63
|
+
/** Prefer patch mode if available */
|
|
64
|
+
prefer_patch_mode: boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Result of computing retry action.
|
|
68
|
+
*/
|
|
69
|
+
export interface RetryDecision {
|
|
70
|
+
/** The action to take */
|
|
71
|
+
action: RetryAction;
|
|
72
|
+
/** Current retry count (after this attempt) */
|
|
73
|
+
retry_count: number;
|
|
74
|
+
/** Degraded settings if action is 'retry_degraded' */
|
|
75
|
+
degraded_settings?: DegradedSettings;
|
|
76
|
+
/** Human-readable reason for the decision */
|
|
77
|
+
reason: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Computes the retry action based on the current retry count.
|
|
81
|
+
*
|
|
82
|
+
* Retry policy:
|
|
83
|
+
* - retry_count 0 or 1 → retry_unchanged (first failure, try again)
|
|
84
|
+
* - retry_count 2 → retry_degraded (second failure, use safer settings)
|
|
85
|
+
* - retry_count >= 3 → block (third failure, require human)
|
|
86
|
+
*
|
|
87
|
+
* @param retryCount - Current retry count from state (before this attempt)
|
|
88
|
+
* @returns The action to take
|
|
89
|
+
*/
|
|
90
|
+
export declare function getRetryAction(retryCount: number): RetryAction;
|
|
91
|
+
/**
|
|
92
|
+
* Computes the full retry decision including degraded settings if needed.
|
|
93
|
+
*
|
|
94
|
+
* @param retryCount - Current retry count from state
|
|
95
|
+
* @param originalMaxTurns - Original max_turns from config (default 50)
|
|
96
|
+
* @param originalDiffLimits - Original diff limits from config
|
|
97
|
+
* @returns Full retry decision with settings and reason
|
|
98
|
+
*/
|
|
99
|
+
export declare function computeRetryDecision(retryCount: number, originalMaxTurns?: number, originalDiffLimits?: DiffLimits): RetryDecision;
|
|
100
|
+
/**
|
|
101
|
+
* Computes degraded settings for retry attempt 2.
|
|
102
|
+
*
|
|
103
|
+
* Applies conservative reductions:
|
|
104
|
+
* - max_turns: 50% of original, minimum 5
|
|
105
|
+
* - max_files_touched: 50% of original, minimum 5
|
|
106
|
+
* - max_lines_changed: 50% of original, minimum 100
|
|
107
|
+
* - prefer_patch_mode: true
|
|
108
|
+
*
|
|
109
|
+
* @param originalMaxTurns - Original max_turns from config
|
|
110
|
+
* @param originalDiffLimits - Original diff limits from config
|
|
111
|
+
* @returns Degraded settings
|
|
112
|
+
*/
|
|
113
|
+
export declare function computeDegradedSettings(originalMaxTurns: number, originalDiffLimits: DiffLimits): DegradedSettings;
|
|
114
|
+
/**
|
|
115
|
+
* Checks if retry is allowed based on current retry count.
|
|
116
|
+
*
|
|
117
|
+
* @param retryCount - Current retry count
|
|
118
|
+
* @returns true if retry is allowed, false if blocked
|
|
119
|
+
*/
|
|
120
|
+
export declare function canRetry(retryCount: number): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Formats retry decision as human-readable message.
|
|
123
|
+
*
|
|
124
|
+
* @param decision - The retry decision
|
|
125
|
+
* @returns Formatted message
|
|
126
|
+
*/
|
|
127
|
+
export declare function formatRetryDecision(decision: RetryDecision): string;
|
|
128
|
+
/**
|
|
129
|
+
* Applies degraded settings to a EnvoiConfig.
|
|
130
|
+
*
|
|
131
|
+
* Used during retry attempt 2 to run with more conservative settings.
|
|
132
|
+
* Creates a new config object without mutating the original.
|
|
133
|
+
*
|
|
134
|
+
* Settings applied:
|
|
135
|
+
* - builder.claude_code.max_turns: reduced to degraded value
|
|
136
|
+
* - diff_limits.default_max_files_touched: reduced to degraded value
|
|
137
|
+
* - diff_limits.default_max_lines_changed: reduced to degraded value
|
|
138
|
+
* - builder.default_mode: set to 'patch' if allow_patch_mode is true and prefer_patch_mode is set
|
|
139
|
+
*
|
|
140
|
+
* @param config - Original EnvoiConfig
|
|
141
|
+
* @param degraded - Degraded settings to apply
|
|
142
|
+
* @returns New config with degraded settings applied
|
|
143
|
+
*/
|
|
144
|
+
export declare function applyDegradedConfig(config: EnvoiConfig, degraded: DegradedSettings): EnvoiConfig;
|
|
145
|
+
/**
|
|
146
|
+
* Extracts relevant settings from config for computing degraded settings.
|
|
147
|
+
*
|
|
148
|
+
* @param config - EnvoiConfig to extract from
|
|
149
|
+
* @returns Object with max_turns and diff_limits for degradation computation
|
|
150
|
+
*/
|
|
151
|
+
export declare function extractDegradationInputs(config: EnvoiConfig): {
|
|
152
|
+
max_turns: number;
|
|
153
|
+
diff_limits: DiffLimits;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Convenience function to degrade a config based on retry count.
|
|
157
|
+
*
|
|
158
|
+
* If retry action is 'retry_degraded', applies degraded settings to config.
|
|
159
|
+
* Otherwise, returns the original config unchanged.
|
|
160
|
+
*
|
|
161
|
+
* @param config - Original config
|
|
162
|
+
* @param retryCount - Current retry count
|
|
163
|
+
* @returns Degraded config if appropriate, original config otherwise
|
|
164
|
+
*/
|
|
165
|
+
export declare function getDegradedConfigIfNeeded(config: EnvoiConfig, retryCount: number): EnvoiConfig;
|
|
166
|
+
/**
|
|
167
|
+
* Tick outcome types for retry state management.
|
|
168
|
+
*/
|
|
169
|
+
export type TickOutcome = 'SUCCESS' | 'STOP' | 'BLOCKED_STALL' | 'BLOCKED_OTHER';
|
|
170
|
+
/**
|
|
171
|
+
* Determines if retry state should be reset based on tick outcome.
|
|
172
|
+
*
|
|
173
|
+
* Retry state is reset on:
|
|
174
|
+
* - SUCCESS: Task completed successfully
|
|
175
|
+
* - STOP: Task failed with a STOP code (not a transport issue)
|
|
176
|
+
*
|
|
177
|
+
* Retry state is NOT reset on:
|
|
178
|
+
* - BLOCKED_STALL: Transport stall, may retry
|
|
179
|
+
* - BLOCKED_OTHER: Other blocked conditions
|
|
180
|
+
*
|
|
181
|
+
* @param outcome - The tick outcome
|
|
182
|
+
* @returns true if retry state should be reset
|
|
183
|
+
*/
|
|
184
|
+
export declare function shouldResetRetryState(outcome: TickOutcome): boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Updates tick state based on completion outcome.
|
|
187
|
+
*
|
|
188
|
+
* On SUCCESS or STOP:
|
|
189
|
+
* - Resets retry_count to 0
|
|
190
|
+
* - Clears last_error_kind and last_request_id
|
|
191
|
+
*
|
|
192
|
+
* On BLOCKED_STALL:
|
|
193
|
+
* - Records the stall (increments retry_count, sets error fields)
|
|
194
|
+
*
|
|
195
|
+
* On BLOCKED_OTHER:
|
|
196
|
+
* - No changes to retry state
|
|
197
|
+
*
|
|
198
|
+
* @param state - Current tick state
|
|
199
|
+
* @param outcome - The tick outcome
|
|
200
|
+
* @param stallInfo - Stall info if outcome is BLOCKED_STALL
|
|
201
|
+
* @returns Updated tick state
|
|
202
|
+
*/
|
|
203
|
+
export declare function updateStateForOutcome(state: TickState, outcome: TickOutcome, stallInfo?: {
|
|
204
|
+
errorKind: string;
|
|
205
|
+
requestId: string | null;
|
|
206
|
+
}): TickState;
|
|
207
|
+
/**
|
|
208
|
+
* Convenience function to handle successful tick completion.
|
|
209
|
+
*
|
|
210
|
+
* Resets all retry state fields to clear recovery mode.
|
|
211
|
+
* Call this when a tick completes with SUCCESS verdict.
|
|
212
|
+
*
|
|
213
|
+
* @param state - Current tick state
|
|
214
|
+
* @returns Updated state with retry fields cleared
|
|
215
|
+
*/
|
|
216
|
+
export declare function handleTickSuccess(state: TickState): TickState;
|
|
217
|
+
/**
|
|
218
|
+
* Convenience function to handle tick failure with STOP code.
|
|
219
|
+
*
|
|
220
|
+
* Resets retry state because STOP is a definitive failure,
|
|
221
|
+
* not a transient transport issue that might benefit from retry.
|
|
222
|
+
*
|
|
223
|
+
* @param state - Current tick state
|
|
224
|
+
* @returns Updated state with retry fields cleared
|
|
225
|
+
*/
|
|
226
|
+
export declare function handleTickStop(state: TickState): TickState;
|
|
227
|
+
/**
|
|
228
|
+
* Convenience function to handle transport stall.
|
|
229
|
+
*
|
|
230
|
+
* Increments retry_count and records error information.
|
|
231
|
+
* Call this when a tick is blocked due to transport stall.
|
|
232
|
+
*
|
|
233
|
+
* @param state - Current tick state
|
|
234
|
+
* @param requestId - Request ID from the stall (for debugging)
|
|
235
|
+
* @returns Updated state with incremented retry count
|
|
236
|
+
*/
|
|
237
|
+
export declare function handleTickStall(state: TickState, requestId: string | null): TickState;
|
|
238
|
+
/**
|
|
239
|
+
* Result of handling a transport stall.
|
|
240
|
+
*/
|
|
241
|
+
export interface StallHandlingResult {
|
|
242
|
+
/** Always 'BLOCKED' for stall handling */
|
|
243
|
+
status: 'BLOCKED';
|
|
244
|
+
/** The blocked code */
|
|
245
|
+
blockedCode: 'BLOCKED_TRANSPORT_STALLED';
|
|
246
|
+
/** The stage where the stall occurred */
|
|
247
|
+
stage: TransportStallStage;
|
|
248
|
+
/** Request ID if available */
|
|
249
|
+
requestId: string | null;
|
|
250
|
+
/** Raw error message */
|
|
251
|
+
rawError: string;
|
|
252
|
+
/** Whether rollback was performed */
|
|
253
|
+
rollbackPerformed: boolean;
|
|
254
|
+
/** Rollback result if performed */
|
|
255
|
+
rollbackResult: RollbackResultNew | null;
|
|
256
|
+
/** Whether repo was dirty before rollback */
|
|
257
|
+
wasDirty: boolean;
|
|
258
|
+
/** Base commit used for rollback */
|
|
259
|
+
baseCommit: string;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Options for stall handling.
|
|
263
|
+
*/
|
|
264
|
+
export interface StallHandlingOptions {
|
|
265
|
+
/** Skip rollback (for testing) */
|
|
266
|
+
skipRollback?: boolean;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Handles a transport stall during tick execution.
|
|
270
|
+
*
|
|
271
|
+
* When a stall is detected:
|
|
272
|
+
* 1. Checks if the git worktree is dirty
|
|
273
|
+
* 2. If dirty, rolls back to the base commit
|
|
274
|
+
* 3. Returns a BLOCKED result with stall evidence
|
|
275
|
+
*
|
|
276
|
+
* @param stallError - The structured stall error
|
|
277
|
+
* @param baseCommit - The commit to rollback to if needed
|
|
278
|
+
* @param options - Optional handling options
|
|
279
|
+
* @returns StallHandlingResult with rollback status and stall evidence
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* const result = await invokeWithStallDetection(config, invocation, 'BUILD');
|
|
284
|
+
* if (!result.ok) {
|
|
285
|
+
* const stallResult = await handleTransportStall(result.error, baseCommit);
|
|
286
|
+
* // stallResult.blockedCode === 'BLOCKED_TRANSPORT_STALLED'
|
|
287
|
+
* }
|
|
288
|
+
* ```
|
|
289
|
+
*/
|
|
290
|
+
export declare function handleTransportStall(stallError: TransportStallError, baseCommit: string, options?: StallHandlingOptions): Promise<StallHandlingResult>;
|
|
291
|
+
/**
|
|
292
|
+
* Checks if a stall occurred and handles it if so.
|
|
293
|
+
*
|
|
294
|
+
* This is a convenience wrapper that combines stall detection with handling.
|
|
295
|
+
*
|
|
296
|
+
* @param error - Any error that might be a stall
|
|
297
|
+
* @param stage - The stage where the error occurred
|
|
298
|
+
* @param baseCommit - The commit to rollback to if needed
|
|
299
|
+
* @param options - Optional handling options
|
|
300
|
+
* @returns StallHandlingResult if stall detected, null otherwise
|
|
301
|
+
*/
|
|
302
|
+
export declare function checkAndHandleStall(stallError: TransportStallError | null, baseCommit: string, options?: StallHandlingOptions): Promise<StallHandlingResult | null>;
|
|
303
|
+
/**
|
|
304
|
+
* Creates a human-readable message for a stall handling result.
|
|
305
|
+
*
|
|
306
|
+
* @param result - The stall handling result
|
|
307
|
+
* @returns Formatted message string
|
|
308
|
+
*/
|
|
309
|
+
export declare function formatStallResult(result: StallHandlingResult): string;
|
|
310
|
+
//# sourceMappingURL=tick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../src/lib/tick.ts"],"names":[],"mappings":"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"}
|