@intutic/sync-daemon 2.9.0 → 3.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/dist/disconnect/harnesses.d.ts.map +1 -1
- package/dist/disconnect/harnesses.js +4 -3
- package/dist/disconnect/harnesses.js.map +1 -1
- package/dist/disconnect/plan.d.ts +6 -1
- package/dist/disconnect/plan.d.ts.map +1 -1
- package/dist/disconnect/plan.js +4 -2
- package/dist/disconnect/plan.js.map +1 -1
- package/dist/harness/antigravityCliHooks.js +3 -3
- package/dist/harness/antigravityCliHooks.js.map +1 -1
- package/dist/harness/antigravityHooks.d.ts +8 -0
- package/dist/harness/antigravityHooks.d.ts.map +1 -1
- package/dist/harness/antigravityHooks.js +27 -5
- package/dist/harness/antigravityHooks.js.map +1 -1
- package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
- package/dist/harness/claudeCodeHooks.js +58 -16
- package/dist/harness/claudeCodeHooks.js.map +1 -1
- package/dist/harness/clineHooks.d.ts.map +1 -1
- package/dist/harness/clineHooks.js +4 -2
- package/dist/harness/clineHooks.js.map +1 -1
- package/dist/harness/codexHooks.d.ts.map +1 -1
- package/dist/harness/codexHooks.js +4 -2
- package/dist/harness/codexHooks.js.map +1 -1
- package/dist/harness/cursorHooks.d.ts.map +1 -1
- package/dist/harness/cursorHooks.js +8 -3
- package/dist/harness/cursorHooks.js.map +1 -1
- package/dist/harness/gateBody.d.ts +177 -4
- package/dist/harness/gateBody.d.ts.map +1 -1
- package/dist/harness/gateBody.js +1658 -26
- package/dist/harness/gateBody.js.map +1 -1
- package/dist/harness/githubCopilotHooks.js +3 -3
- package/dist/harness/githubCopilotHooks.js.map +1 -1
- package/dist/harness/gooseHooks.d.ts.map +1 -1
- package/dist/harness/gooseHooks.js +8 -1
- package/dist/harness/gooseHooks.js.map +1 -1
- package/dist/harness/grokHooks.js +2 -2
- package/dist/harness/hermesHooks.js +1 -1
- package/dist/harness/hermesHooks.js.map +1 -1
- package/dist/harness/museHooks.d.ts.map +1 -1
- package/dist/harness/museHooks.js +4 -2
- package/dist/harness/museHooks.js.map +1 -1
- package/dist/harness/n8nHooks.js +1 -1
- package/dist/harness/openCodeHooks.d.ts.map +1 -1
- package/dist/harness/openCodeHooks.js +32 -8
- package/dist/harness/openCodeHooks.js.map +1 -1
- package/dist/harness/openclawHooks.d.ts.map +1 -1
- package/dist/harness/openclawHooks.js +19 -8
- package/dist/harness/openclawHooks.js.map +1 -1
- package/dist/harness/piHooks.js +7 -7
- package/dist/harness/windsurfHooks.js +2 -2
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/approvedBypasses.d.ts +17 -4
- package/dist/lib/approvedBypasses.d.ts.map +1 -1
- package/dist/lib/approvedBypasses.js +17 -4
- package/dist/lib/approvedBypasses.js.map +1 -1
- package/dist/lib/approvedPlans.d.ts +73 -0
- package/dist/lib/approvedPlans.d.ts.map +1 -0
- package/dist/lib/approvedPlans.js +124 -0
- package/dist/lib/approvedPlans.js.map +1 -0
- package/dist/lib/decideLogs.d.ts +46 -0
- package/dist/lib/decideLogs.d.ts.map +1 -0
- package/dist/lib/decideLogs.js +160 -0
- package/dist/lib/decideLogs.js.map +1 -0
- package/dist/lib/policySnapshot.d.ts +143 -3
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +480 -14
- package/dist/lib/policySnapshot.js.map +1 -1
- package/dist/lib/refusalDetailPy.d.ts +11 -0
- package/dist/lib/refusalDetailPy.d.ts.map +1 -0
- package/dist/lib/refusalDetailPy.js +109 -0
- package/dist/lib/refusalDetailPy.js.map +1 -0
- package/dist/lib/ruleRecordPy.d.ts +11 -0
- package/dist/lib/ruleRecordPy.d.ts.map +1 -0
- package/dist/lib/ruleRecordPy.js +277 -0
- package/dist/lib/ruleRecordPy.js.map +1 -0
- package/dist/lib/scopeMatchPy.d.ts +11 -0
- package/dist/lib/scopeMatchPy.d.ts.map +1 -0
- package/dist/lib/scopeMatchPy.js +278 -0
- package/dist/lib/scopeMatchPy.js.map +1 -0
- package/dist/lib/sopFiles.d.ts.map +1 -1
- package/dist/lib/sopFiles.js +5 -3
- package/dist/lib/sopFiles.js.map +1 -1
- package/dist/lib/testOutcomePy.d.ts +11 -0
- package/dist/lib/testOutcomePy.d.ts.map +1 -0
- package/dist/lib/testOutcomePy.js +371 -0
- package/dist/lib/testOutcomePy.js.map +1 -0
- package/dist/skillWriter.d.ts +1 -1
- package/dist/skillWriter.d.ts.map +1 -1
- package/dist/skillWriter.js +7 -0
- package/dist/skillWriter.js.map +1 -1
- package/dist/syncCycle.d.ts +15 -2
- package/dist/syncCycle.d.ts.map +1 -1
- package/dist/syncCycle.js +15 -3
- package/dist/syncCycle.js.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
|
-
export { syncOfflineTraces, refreshGateCaches, localHoldTokensFor, applySkillOptEdits, reportHarnessAgents, emitSkillFlaggedEvents, APPLIED_SUGGESTIONS_RELATIVE_PATH, } from './syncCycle.js';
|
|
12
|
+
export { syncOfflineTraces, refreshGateCaches, localHoldTokensFor, localGateSopsFor, applySkillOptEdits, reportHarnessAgents, emitSkillFlaggedEvents, APPLIED_SUGGESTIONS_RELATIVE_PATH, } from './syncCycle.js';
|
|
13
13
|
export { collectAgentReport, reportAgent, fetchLocalProxyInstanceId } from './agentReporter.js';
|
|
14
14
|
export { collectDeviceInventory, reportDeviceInventory } from './inventory.js';
|
|
15
15
|
export { startHarnessSession, endAllOpenSessions, readGitInfo } from './sessionReporter.js';
|
|
@@ -45,7 +45,13 @@ export { mergeCodexConfig } from './harness/codexConfigMerger.js';
|
|
|
45
45
|
export { writeGithubCopilotHooks } from './harness/githubCopilotHooks.js';
|
|
46
46
|
// WS-A & WS-F — runtime env writer and compliance probes
|
|
47
47
|
export { writeRuntimeEnv } from './lib/runtimeEnv.js';
|
|
48
|
-
export { refreshPolicySnapshot, writePolicySnapshot, writeLocalPolicySnapshot, localResolvedPolicy, offlineHoldReason, snapshotRulesVerify, fetchResolvedPolicy, buildSnapshotRules, validateRule, DEFAULT_SNAPSHOT_DIR, DESTRUCTIVE_TIER_SEVERITY, SNAPSHOT_JSON, SNAPSHOT_RULES, VERIFIED_SNAPSHOT_DIR, } from './lib/policySnapshot.js';
|
|
48
|
+
export { refreshPolicySnapshot, writePolicySnapshot, writeLocalPolicySnapshot, localResolvedPolicy, localDecideRules, DEFAULT_DECIDE_DIR, DECIDE_DISABLED_FILE, decideLocallyDisabled, offlineHoldReason, snapshotRulesVerify, fetchResolvedPolicy, buildSnapshotRules, validateRule, DEFAULT_SNAPSHOT_DIR, DESTRUCTIVE_TIER_SEVERITY, SNAPSHOT_JSON, SNAPSHOT_RULES, VERIFIED_SNAPSHOT_DIR, } from './lib/policySnapshot.js';
|
|
49
|
+
export { compileGateRecords, parseServedGateRecords } from './lib/policySnapshot.js';
|
|
50
|
+
// 3.0 — the approved-plans cache. The rule records, test outcomes, scope
|
|
51
|
+
// match and lanes are @intutic/shared-types' (gateRuleRecord.ts,
|
|
52
|
+
// testOutcome.ts, scopeMatch.ts, lanes.ts); import them from there.
|
|
53
|
+
export { refreshApprovedPlans, writeApprovedPlans, fetchApprovedPlans, APPROVED_PLANS_FILE, APPROVED_PLANS_TTL_INTERVALS, } from './lib/approvedPlans.js';
|
|
54
|
+
export { pruneDecideLogs, uploadDecideLogs, DECIDE_UPLOAD_CURSOR, DECIDE_UPLOAD_BATCH } from './lib/decideLogs.js';
|
|
49
55
|
export { findGateFile, GATE_ARTIFACTS } from './harness/gateArtifacts.js';
|
|
50
56
|
export { runComplianceProbes } from './lib/complianceProbes.js';
|
|
51
57
|
export { getActiveAgentProcesses } from './lib/processPoller.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,10 +27,23 @@
|
|
|
27
27
|
* valid bypasses" (fail closed toward the hold); it can never resurrect an
|
|
28
28
|
* entry whose own TTL has passed.
|
|
29
29
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
30
|
+
* Every hook gate that can hold reads it. The hold and the
|
|
31
|
+
* bypass check live in the shared gate bodies since gate body v8:
|
|
32
|
+
* `intuticApprovedBypass` in the JS body (`gateBody.ts`), emitted into all
|
|
33
|
+
* twelve JS gates (claude-code, codex, cursor, github-copilot, grok,
|
|
34
|
+
* antigravity-cli, muse-code, windsurf, cline, and the in-process opencode,
|
|
35
|
+
* pi and openclaw gates), and `intutic_bypass`/`intutic_hold` in the bash body,
|
|
36
|
+
* emitted into the four bash gates (antigravity/Gemini CLI, goose, hermes,
|
|
37
|
+
* openhands). It covers every hold rule id the snapshot carries:
|
|
38
|
+
* `REQUIRE_APPROVAL:` SOP rules, `sop.local.review_before.*`, and since v23
|
|
39
|
+
* the lane holds `sop.lane.<class>.<token>` and revert holds
|
|
40
|
+
* `revert.<subject>`. The n8n workflow gate and the Open WebUI filter refuse
|
|
41
|
+
* a hold outright by design: neither has a developer to approve one or a
|
|
42
|
+
* tool call to retry. The SDK gates (`@intutic/gate`, dsh, intutic-clawde) and
|
|
43
|
+
* the MCP proxy do not read this file; they ask
|
|
44
|
+
* `GET /api/v1/decisions/approved-bypasses` themselves. Each family's key
|
|
45
|
+
* matches only its own holds, because the control plane copies the key from
|
|
46
|
+
* the gate's own hold record.
|
|
34
47
|
*
|
|
35
48
|
* @module
|
|
36
49
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvedBypasses.d.ts","sourceRoot":"","sources":["../../src/lib/approvedBypasses.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"approvedBypasses.d.ts","sourceRoot":"","sources":["../../src/lib/approvedBypasses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAYH,eAAO,MAAM,wBAAwB,QAA+C,CAAA;AACpF,eAAO,MAAM,sBAAsB,4BAA4B,CAAA;AAE/D,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAmBD;;gEAEgE;AAChE,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAmCvC;AAED;;kCAEkC;AAClC,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB5C;AAED;;;sCAGsC;AACtC,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CASnD"}
|
|
@@ -27,10 +27,23 @@
|
|
|
27
27
|
* valid bypasses" (fail closed toward the hold); it can never resurrect an
|
|
28
28
|
* entry whose own TTL has passed.
|
|
29
29
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
30
|
+
* Every hook gate that can hold reads it. The hold and the
|
|
31
|
+
* bypass check live in the shared gate bodies since gate body v8:
|
|
32
|
+
* `intuticApprovedBypass` in the JS body (`gateBody.ts`), emitted into all
|
|
33
|
+
* twelve JS gates (claude-code, codex, cursor, github-copilot, grok,
|
|
34
|
+
* antigravity-cli, muse-code, windsurf, cline, and the in-process opencode,
|
|
35
|
+
* pi and openclaw gates), and `intutic_bypass`/`intutic_hold` in the bash body,
|
|
36
|
+
* emitted into the four bash gates (antigravity/Gemini CLI, goose, hermes,
|
|
37
|
+
* openhands). It covers every hold rule id the snapshot carries:
|
|
38
|
+
* `REQUIRE_APPROVAL:` SOP rules, `sop.local.review_before.*`, and since v23
|
|
39
|
+
* the lane holds `sop.lane.<class>.<token>` and revert holds
|
|
40
|
+
* `revert.<subject>`. The n8n workflow gate and the Open WebUI filter refuse
|
|
41
|
+
* a hold outright by design: neither has a developer to approve one or a
|
|
42
|
+
* tool call to retry. The SDK gates (`@intutic/gate`, dsh, intutic-clawde) and
|
|
43
|
+
* the MCP proxy do not read this file; they ask
|
|
44
|
+
* `GET /api/v1/decisions/approved-bypasses` themselves. Each family's key
|
|
45
|
+
* matches only its own holds, because the control plane copies the key from
|
|
46
|
+
* the gate's own hold record.
|
|
34
47
|
*
|
|
35
48
|
* @module
|
|
36
49
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvedBypasses.js","sourceRoot":"","sources":["../../src/lib/approvedBypasses.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"approvedBypasses.js","sourceRoot":"","sources":["../../src/lib/approvedBypasses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* approvedPlans.ts — ships the workspace's approved plans *to* the machine,
|
|
3
|
+
* for `plan_approval:` at the hook gates, as
|
|
4
|
+
* `approvedBypasses.ts` ships approved bypasses.
|
|
5
|
+
*
|
|
6
|
+
* # The contract with the gate
|
|
7
|
+
*
|
|
8
|
+
* `~/.intutic/hooks/approved-plans.jsonl` — the directory every gate already
|
|
9
|
+
* refuses an agent's write to (`UNIVERSAL_PROTECTED_PATHS`). One JSON line
|
|
10
|
+
* per APPROVED or EXECUTING plan updated in the last seven days, as
|
|
11
|
+
* `GET /api/v1/plans/approved` returns it: `{sessionId, planId, state, tools,
|
|
12
|
+
* updatedAt}`, where `tools` is the plan's steps flattened to tool names by
|
|
13
|
+
* the control plane, so a gate compares names only. Header lines carry
|
|
14
|
+
* integrity exactly as the bypass cache does: `#digest` (sha256 of the body,
|
|
15
|
+
* first 32 hex chars) and `#workspace`. And `#expires`: three sync intervals
|
|
16
|
+
* after the write. A plan that was approved and then rejected must stop
|
|
17
|
+
* counting within a bounded time even if the daemon dies, so a gate reads a
|
|
18
|
+
* cache past `#expires` — or missing, or failing either check — as "no plan
|
|
19
|
+
* approved", which refuses. That is the opposite direction from the policy
|
|
20
|
+
* snapshot, whose staleness only alerts: there, stale rules still refuse;
|
|
21
|
+
* here, a stale cache could only allow.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
import { APPROVED_PLANS_FILE } from '../harness/gateBody.js';
|
|
26
|
+
export declare const DEFAULT_PLAN_CACHE_DIR: string;
|
|
27
|
+
export { APPROVED_PLANS_FILE };
|
|
28
|
+
/** The daemon's default sync interval (`intutic connect --interval`). */
|
|
29
|
+
export declare const DEFAULT_SYNC_INTERVAL_MS = 30000;
|
|
30
|
+
/** How many sync intervals a written cache counts for. */
|
|
31
|
+
export declare const APPROVED_PLANS_TTL_INTERVALS = 3;
|
|
32
|
+
/** One approved plan, as `GET /api/v1/plans/approved` returns it. */
|
|
33
|
+
export interface ApprovedPlanEntry {
|
|
34
|
+
sessionId: string;
|
|
35
|
+
planId: string;
|
|
36
|
+
state: 'APPROVED' | 'EXECUTING';
|
|
37
|
+
tools: string[];
|
|
38
|
+
updatedAt: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ApprovedPlanOptions {
|
|
41
|
+
controlPlaneUrl: string;
|
|
42
|
+
apiKey: string;
|
|
43
|
+
workspaceId: string;
|
|
44
|
+
/** Override the directory (tests). */
|
|
45
|
+
cacheDir?: string;
|
|
46
|
+
/** The sync interval the cache must outlive; `#expires` is three of them. */
|
|
47
|
+
syncIntervalMs?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The workspace's approved plans, or null on any failure: the caller keeps
|
|
51
|
+
* the previous cache, which expires on its own.
|
|
52
|
+
*/
|
|
53
|
+
export declare function fetchApprovedPlans(opts: ApprovedPlanOptions): Promise<ApprovedPlanEntry[] | null>;
|
|
54
|
+
/** Writes the cache atomically, read-only, with its digest, workspace and expiry headers. */
|
|
55
|
+
export declare function writeApprovedPlans(entries: ApprovedPlanEntry[], workspaceId: string, cacheDir?: string, opts?: {
|
|
56
|
+
now?: Date;
|
|
57
|
+
syncIntervalMs?: number;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
digest: string;
|
|
60
|
+
count: number;
|
|
61
|
+
expiresAt: string;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Fetch and write in one call, on every sync cycle. Never throws; a failed
|
|
65
|
+
* poll leaves the previous cache, which a gate stops trusting at its
|
|
66
|
+
* `#expires`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function refreshApprovedPlans(opts: ApprovedPlanOptions): Promise<{
|
|
69
|
+
digest: string;
|
|
70
|
+
count: number;
|
|
71
|
+
expiresAt: string;
|
|
72
|
+
} | null>;
|
|
73
|
+
//# sourceMappingURL=approvedPlans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvedPlans.d.ts","sourceRoot":"","sources":["../../src/lib/approvedPlans.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAI5D,eAAO,MAAM,sBAAsB,QAA+C,CAAA;AAClF,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,QAAS,CAAA;AAE9C,0DAA0D;AAC1D,eAAO,MAAM,4BAA4B,IAAI,CAAA;AAE7C,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,UAAU,GAAG,WAAW,CAAA;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAQD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAqCvG;AAED,6FAA6F;AAC7F,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAA+B,EACzC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAWtE"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* approvedPlans.ts — ships the workspace's approved plans *to* the machine,
|
|
3
|
+
* for `plan_approval:` at the hook gates, as
|
|
4
|
+
* `approvedBypasses.ts` ships approved bypasses.
|
|
5
|
+
*
|
|
6
|
+
* # The contract with the gate
|
|
7
|
+
*
|
|
8
|
+
* `~/.intutic/hooks/approved-plans.jsonl` — the directory every gate already
|
|
9
|
+
* refuses an agent's write to (`UNIVERSAL_PROTECTED_PATHS`). One JSON line
|
|
10
|
+
* per APPROVED or EXECUTING plan updated in the last seven days, as
|
|
11
|
+
* `GET /api/v1/plans/approved` returns it: `{sessionId, planId, state, tools,
|
|
12
|
+
* updatedAt}`, where `tools` is the plan's steps flattened to tool names by
|
|
13
|
+
* the control plane, so a gate compares names only. Header lines carry
|
|
14
|
+
* integrity exactly as the bypass cache does: `#digest` (sha256 of the body,
|
|
15
|
+
* first 32 hex chars) and `#workspace`. And `#expires`: three sync intervals
|
|
16
|
+
* after the write. A plan that was approved and then rejected must stop
|
|
17
|
+
* counting within a bounded time even if the daemon dies, so a gate reads a
|
|
18
|
+
* cache past `#expires` — or missing, or failing either check — as "no plan
|
|
19
|
+
* approved", which refuses. That is the opposite direction from the policy
|
|
20
|
+
* snapshot, whose staleness only alerts: there, stale rules still refuse;
|
|
21
|
+
* here, a stale cache could only allow.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'node:fs/promises';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import * as os from 'node:os';
|
|
28
|
+
import { createHash } from 'node:crypto';
|
|
29
|
+
import { createLogger } from '@intutic/logger';
|
|
30
|
+
import { writeFileAtomic } from './atomicWrite.js';
|
|
31
|
+
import { APPROVED_PLANS_FILE } from '../harness/gateBody.js';
|
|
32
|
+
const log = createLogger('sync-approved-plans');
|
|
33
|
+
export const DEFAULT_PLAN_CACHE_DIR = path.join(os.homedir(), '.intutic', 'hooks');
|
|
34
|
+
export { APPROVED_PLANS_FILE };
|
|
35
|
+
/** The daemon's default sync interval (`intutic connect --interval`). */
|
|
36
|
+
export const DEFAULT_SYNC_INTERVAL_MS = 30_000;
|
|
37
|
+
/** How many sync intervals a written cache counts for. */
|
|
38
|
+
export const APPROVED_PLANS_TTL_INTERVALS = 3;
|
|
39
|
+
function trimTrailingSlashes(s) {
|
|
40
|
+
let end = s.length;
|
|
41
|
+
while (end > 0 && s.charCodeAt(end - 1) === 47 /* '/' */)
|
|
42
|
+
end--;
|
|
43
|
+
return s.slice(0, end);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The workspace's approved plans, or null on any failure: the caller keeps
|
|
47
|
+
* the previous cache, which expires on its own.
|
|
48
|
+
*/
|
|
49
|
+
export async function fetchApprovedPlans(opts) {
|
|
50
|
+
const url = `${trimTrailingSlashes(opts.controlPlaneUrl)}/api/v1/plans/approved?workspaceId=${encodeURIComponent(opts.workspaceId)}`;
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch(url, {
|
|
53
|
+
headers: { Authorization: `Bearer ${opts.apiKey}` },
|
|
54
|
+
signal: AbortSignal.timeout(10_000),
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok) {
|
|
57
|
+
log.warn({ action: 'approved_plans_fetch_failed', status: res.status }, 'plans/approved returned non-OK');
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const body = (await res.json());
|
|
61
|
+
if (typeof body !== 'object' || body === null)
|
|
62
|
+
return null;
|
|
63
|
+
const rows = body.plans;
|
|
64
|
+
if (!Array.isArray(rows))
|
|
65
|
+
return null;
|
|
66
|
+
return rows
|
|
67
|
+
.filter((r) => typeof r === 'object' && r !== null)
|
|
68
|
+
.filter((r) => typeof r.sessionId === 'string' &&
|
|
69
|
+
r.sessionId !== '' &&
|
|
70
|
+
typeof r.planId === 'string' &&
|
|
71
|
+
(r.state === 'APPROVED' || r.state === 'EXECUTING') &&
|
|
72
|
+
Array.isArray(r.tools) &&
|
|
73
|
+
typeof r.updatedAt === 'string')
|
|
74
|
+
.map((r) => ({
|
|
75
|
+
sessionId: r.sessionId,
|
|
76
|
+
planId: r.planId,
|
|
77
|
+
state: r.state,
|
|
78
|
+
tools: r.tools.filter((t) => typeof t === 'string'),
|
|
79
|
+
updatedAt: r.updatedAt,
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
log.warn({ action: 'approved_plans_fetch_failed', err }, 'plans/approved unreachable');
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Writes the cache atomically, read-only, with its digest, workspace and expiry headers. */
|
|
88
|
+
export async function writeApprovedPlans(entries, workspaceId, cacheDir = DEFAULT_PLAN_CACHE_DIR, opts = {}) {
|
|
89
|
+
const now = opts.now ?? new Date();
|
|
90
|
+
const interval = opts.syncIntervalMs ?? DEFAULT_SYNC_INTERVAL_MS;
|
|
91
|
+
const expiresAt = new Date(now.getTime() + APPROVED_PLANS_TTL_INTERVALS * interval).toISOString();
|
|
92
|
+
const lines = entries.map((e) => JSON.stringify(e));
|
|
93
|
+
const digest = createHash('sha256').update(lines.join('\n')).digest('hex').slice(0, 32);
|
|
94
|
+
const text = `# Intutic approved plans (plan_approval:) — auto-generated. DO NOT EDIT.\n` +
|
|
95
|
+
`#digest ${digest}\n` +
|
|
96
|
+
`#workspace ${workspaceId}\n` +
|
|
97
|
+
`#generated ${now.toISOString()}\n` +
|
|
98
|
+
`#expires ${expiresAt}\n` +
|
|
99
|
+
(lines.length > 0 ? lines.join('\n') + '\n' : '');
|
|
100
|
+
await fs.mkdir(cacheDir, { recursive: true });
|
|
101
|
+
await writeFileAtomic(path.join(cacheDir, APPROVED_PLANS_FILE), text, { mode: 0o444 });
|
|
102
|
+
log.debug({ action: 'approved_plans_written', digest, count: entries.length, dir: cacheDir }, 'Approved-plans cache refreshed');
|
|
103
|
+
return { digest, count: entries.length, expiresAt };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Fetch and write in one call, on every sync cycle. Never throws; a failed
|
|
107
|
+
* poll leaves the previous cache, which a gate stops trusting at its
|
|
108
|
+
* `#expires`.
|
|
109
|
+
*/
|
|
110
|
+
export async function refreshApprovedPlans(opts) {
|
|
111
|
+
const entries = await fetchApprovedPlans(opts);
|
|
112
|
+
if (entries === null)
|
|
113
|
+
return null;
|
|
114
|
+
try {
|
|
115
|
+
return await writeApprovedPlans(entries, opts.workspaceId, opts.cacheDir ?? DEFAULT_PLAN_CACHE_DIR, {
|
|
116
|
+
syncIntervalMs: opts.syncIntervalMs,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
log.warn({ action: 'approved_plans_write_failed', err }, 'Could not write the approved-plans cache');
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=approvedPlans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvedPlans.js","sourceRoot":"","sources":["../../src/lib/approvedPlans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Housekeeping for the decide log (`~/.intutic/logs/decide-YYYY-MM-DD.jsonl`).
|
|
3
|
+
*
|
|
4
|
+
* The gates append to it; this module only ages it out and, when the
|
|
5
|
+
* workspace asks, uploads it:
|
|
6
|
+
*
|
|
7
|
+
* - {@link pruneDecideLogs} deletes decide log files (and `--log-state`
|
|
8
|
+
* files) whose UTC date is more than {@link DECIDE_LOG_RETENTION_DAYS}
|
|
9
|
+
* days old. The drift alarm needs the history, which is why the log is not
|
|
10
|
+
* a trace file: the trace upload deletes what it sends (`syncOfflineTraces`
|
|
11
|
+
* matches `traces-*.jsonl` only).
|
|
12
|
+
* - {@link uploadDecideLogs} sends new lines to the control plane only when
|
|
13
|
+
* the workspace setting `decideLogUploadEnabled` is true, and the
|
|
14
|
+
* arguments excerpt only when `decideLogUploadArgs` is too. It reads from a
|
|
15
|
+
* cursor file and never deletes a log. With both settings off, nothing new
|
|
16
|
+
* leaves the machine.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
/** The cursor the upload resumes from, beside the logs. */
|
|
21
|
+
export declare const DECIDE_UPLOAD_CURSOR = "decide-upload.cursor";
|
|
22
|
+
/** The most rows one upload request carries. */
|
|
23
|
+
export declare const DECIDE_UPLOAD_BATCH = 500;
|
|
24
|
+
/** Deletes decide log files older than the retention window. Returns the names deleted. Never throws. */
|
|
25
|
+
export declare function pruneDecideLogs(opts?: {
|
|
26
|
+
logsDir?: string;
|
|
27
|
+
nowMs?: number;
|
|
28
|
+
days?: number;
|
|
29
|
+
}): Promise<string[]>;
|
|
30
|
+
export interface DecideUploadOptions {
|
|
31
|
+
controlPlaneUrl: string;
|
|
32
|
+
apiKey: string;
|
|
33
|
+
/** The workspace settings the last sync carried. */
|
|
34
|
+
settings: Record<string, unknown> | undefined;
|
|
35
|
+
logsDir?: string;
|
|
36
|
+
fetchImpl?: typeof fetch;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Uploads the decide log lines written since the cursor, in batches of at
|
|
40
|
+
* most {@link DECIDE_UPLOAD_BATCH}, to `POST /api/v1/decide/events`. Returns
|
|
41
|
+
* the rows sent, or null when the workspace has not opted in. Stops at the
|
|
42
|
+
* first failed request, leaving the cursor after the last batch that landed.
|
|
43
|
+
* Never deletes a log; never throws.
|
|
44
|
+
*/
|
|
45
|
+
export declare function uploadDecideLogs(opts: DecideUploadOptions): Promise<number | null>;
|
|
46
|
+
//# sourceMappingURL=decideLogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decideLogs.d.ts","sourceRoot":"","sources":["../../src/lib/decideLogs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,yBAAyB,CAAA;AAC1D,gDAAgD;AAChD,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAMtC,yGAAyG;AACzG,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBvH;AAgBD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoExF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Housekeeping for the decide log (`~/.intutic/logs/decide-YYYY-MM-DD.jsonl`).
|
|
3
|
+
*
|
|
4
|
+
* The gates append to it; this module only ages it out and, when the
|
|
5
|
+
* workspace asks, uploads it:
|
|
6
|
+
*
|
|
7
|
+
* - {@link pruneDecideLogs} deletes decide log files (and `--log-state`
|
|
8
|
+
* files) whose UTC date is more than {@link DECIDE_LOG_RETENTION_DAYS}
|
|
9
|
+
* days old. The drift alarm needs the history, which is why the log is not
|
|
10
|
+
* a trace file: the trace upload deletes what it sends (`syncOfflineTraces`
|
|
11
|
+
* matches `traces-*.jsonl` only).
|
|
12
|
+
* - {@link uploadDecideLogs} sends new lines to the control plane only when
|
|
13
|
+
* the workspace setting `decideLogUploadEnabled` is true, and the
|
|
14
|
+
* arguments excerpt only when `decideLogUploadArgs` is too. It reads from a
|
|
15
|
+
* cursor file and never deletes a log. With both settings off, nothing new
|
|
16
|
+
* leaves the machine.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs/promises';
|
|
21
|
+
import * as os from 'node:os';
|
|
22
|
+
import * as path from 'node:path';
|
|
23
|
+
import { createLogger } from '@intutic/logger';
|
|
24
|
+
import { DECIDE_LOG_RETENTION_DAYS, decideLogFileDate } from '@intutic/shared-types';
|
|
25
|
+
import { writeFileAtomic } from './atomicWrite.js';
|
|
26
|
+
const log = createLogger('sync-daemon:decide-logs');
|
|
27
|
+
/** The cursor the upload resumes from, beside the logs. */
|
|
28
|
+
export const DECIDE_UPLOAD_CURSOR = 'decide-upload.cursor';
|
|
29
|
+
/** The most rows one upload request carries. */
|
|
30
|
+
export const DECIDE_UPLOAD_BATCH = 500;
|
|
31
|
+
function defaultLogsDir() {
|
|
32
|
+
return path.join(os.homedir(), '.intutic', 'logs');
|
|
33
|
+
}
|
|
34
|
+
/** Deletes decide log files older than the retention window. Returns the names deleted. Never throws. */
|
|
35
|
+
export async function pruneDecideLogs(opts = {}) {
|
|
36
|
+
const dir = opts.logsDir ?? defaultLogsDir();
|
|
37
|
+
const cutoff = (opts.nowMs ?? Date.now()) - (opts.days ?? DECIDE_LOG_RETENTION_DAYS) * 86_400_000;
|
|
38
|
+
const names = await fs.readdir(dir).catch(() => []);
|
|
39
|
+
const removed = [];
|
|
40
|
+
for (const name of names) {
|
|
41
|
+
const day = decideLogFileDate(name);
|
|
42
|
+
// A file's day ends at the next midnight; it is old once that end is past the cutoff.
|
|
43
|
+
if (day === null || day + 86_400_000 > cutoff)
|
|
44
|
+
continue;
|
|
45
|
+
try {
|
|
46
|
+
await fs.unlink(path.join(dir, name));
|
|
47
|
+
removed.push(name);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
log.debug({ action: 'decide_log_prune_failed', file: name, err }, 'Could not delete an old decide log');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (removed.length > 0)
|
|
54
|
+
log.debug({ action: 'decide_logs_pruned', files: removed }, 'Deleted decide logs past retention');
|
|
55
|
+
return removed;
|
|
56
|
+
}
|
|
57
|
+
async function readCursor(dir) {
|
|
58
|
+
try {
|
|
59
|
+
const c = JSON.parse(await fs.readFile(path.join(dir, DECIDE_UPLOAD_CURSOR), 'utf-8'));
|
|
60
|
+
return typeof c.file === 'string' && typeof c.offset === 'number' && c.offset >= 0 ? { file: c.file, offset: c.offset } : null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Uploads the decide log lines written since the cursor, in batches of at
|
|
68
|
+
* most {@link DECIDE_UPLOAD_BATCH}, to `POST /api/v1/decide/events`. Returns
|
|
69
|
+
* the rows sent, or null when the workspace has not opted in. Stops at the
|
|
70
|
+
* first failed request, leaving the cursor after the last batch that landed.
|
|
71
|
+
* Never deletes a log; never throws.
|
|
72
|
+
*/
|
|
73
|
+
export async function uploadDecideLogs(opts) {
|
|
74
|
+
if (opts.settings?.decideLogUploadEnabled !== true)
|
|
75
|
+
return null;
|
|
76
|
+
const withArgs = opts.settings.decideLogUploadArgs === true;
|
|
77
|
+
const dir = opts.logsDir ?? defaultLogsDir();
|
|
78
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
79
|
+
const names = (await fs.readdir(dir).catch(() => []))
|
|
80
|
+
.filter((n) => /^decide-[0-9]{4}-[0-9]{2}-[0-9]{2}\.jsonl$/.test(n))
|
|
81
|
+
.sort();
|
|
82
|
+
const cursor = await readCursor(dir);
|
|
83
|
+
let sent = 0;
|
|
84
|
+
for (const name of names) {
|
|
85
|
+
if (cursor && name < cursor.file)
|
|
86
|
+
continue;
|
|
87
|
+
const start = cursor && name === cursor.file ? cursor.offset : 0;
|
|
88
|
+
let buf;
|
|
89
|
+
try {
|
|
90
|
+
buf = await fs.readFile(path.join(dir, name));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Whole lines only: a line a gate is still writing waits for the next cycle.
|
|
96
|
+
const end = buf.lastIndexOf(0x0a) + 1;
|
|
97
|
+
if (end <= start)
|
|
98
|
+
continue;
|
|
99
|
+
const lines = buf.subarray(start, end).toString('utf-8').split('\n');
|
|
100
|
+
let offset = start;
|
|
101
|
+
let batch = [];
|
|
102
|
+
const flush = async () => {
|
|
103
|
+
if (batch.length === 0)
|
|
104
|
+
return true;
|
|
105
|
+
try {
|
|
106
|
+
const res = await doFetch(`${trimTrailingSlashes(opts.controlPlaneUrl)}/api/v1/decide/events`, {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.apiKey}` },
|
|
109
|
+
body: JSON.stringify({ events: batch.map((b) => b.row) }),
|
|
110
|
+
signal: AbortSignal.timeout(10_000),
|
|
111
|
+
});
|
|
112
|
+
if (!res.ok) {
|
|
113
|
+
log.debug({ action: 'decide_upload_failed', status: res.status }, 'Decide log upload refused; will retry');
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
log.debug({ action: 'decide_upload_failed', err }, 'Decide log upload failed; will retry');
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
sent += batch.length;
|
|
122
|
+
try {
|
|
123
|
+
await writeFileAtomic(path.join(dir, DECIDE_UPLOAD_CURSOR), JSON.stringify({ file: name, offset: batch[batch.length - 1].next }) + '\n', { mode: 0o600 });
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
// The rows landed but the cursor did not move: the next cycle sends them again rather than skipping any.
|
|
127
|
+
log.debug({ action: 'decide_upload_cursor_failed', err }, 'Could not move the decide upload cursor');
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
batch = [];
|
|
131
|
+
return true;
|
|
132
|
+
};
|
|
133
|
+
for (const line of lines.slice(0, -1)) {
|
|
134
|
+
offset += Buffer.byteLength(line, 'utf-8') + 1;
|
|
135
|
+
let row;
|
|
136
|
+
try {
|
|
137
|
+
row = JSON.parse(line);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!withArgs)
|
|
143
|
+
delete row.argsExcerpt;
|
|
144
|
+
batch.push({ row, next: offset });
|
|
145
|
+
if (batch.length >= DECIDE_UPLOAD_BATCH && !(await flush()))
|
|
146
|
+
return sent;
|
|
147
|
+
}
|
|
148
|
+
if (!(await flush()))
|
|
149
|
+
return sent;
|
|
150
|
+
}
|
|
151
|
+
return sent;
|
|
152
|
+
}
|
|
153
|
+
/** Trailing slashes trimmed by a scan, not a `/+$` regex, which is quadratic on a run of slashes. */
|
|
154
|
+
function trimTrailingSlashes(url) {
|
|
155
|
+
let end = url.length;
|
|
156
|
+
while (end > 0 && url.charCodeAt(end - 1) === 0x2f)
|
|
157
|
+
end--;
|
|
158
|
+
return url.slice(0, end);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=decideLogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decideLogs.js","sourceRoot":"","sources":["../../src/lib/decideLogs.ts"],"names":[],"mappings":"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"}
|