@intutic/sync-daemon 2.1.0 → 2.3.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 +1 -1
- package/dist/agentReporter.d.ts +24 -11
- package/dist/agentReporter.d.ts.map +1 -1
- package/dist/agentReporter.js +20 -13
- package/dist/agentReporter.js.map +1 -1
- package/dist/configReader.d.ts +45 -25
- package/dist/configReader.d.ts.map +1 -1
- package/dist/configReader.js +70 -46
- package/dist/configReader.js.map +1 -1
- package/dist/configWriter.d.ts +32 -45
- package/dist/configWriter.d.ts.map +1 -1
- package/dist/configWriter.js +52 -686
- package/dist/configWriter.js.map +1 -1
- package/dist/disconnect/harnesses.d.ts +29 -0
- package/dist/disconnect/harnesses.d.ts.map +1 -0
- package/dist/disconnect/harnesses.js +805 -0
- package/dist/disconnect/harnesses.js.map +1 -0
- package/dist/disconnect/index.d.ts +25 -0
- package/dist/disconnect/index.d.ts.map +1 -0
- package/dist/disconnect/index.js +92 -0
- package/dist/disconnect/index.js.map +1 -0
- package/dist/disconnect/mcp.d.ts +81 -0
- package/dist/disconnect/mcp.d.ts.map +1 -0
- package/dist/disconnect/mcp.js +354 -0
- package/dist/disconnect/mcp.js.map +1 -0
- package/dist/disconnect/originals.d.ts +88 -0
- package/dist/disconnect/originals.d.ts.map +1 -0
- package/dist/disconnect/originals.js +257 -0
- package/dist/disconnect/originals.js.map +1 -0
- package/dist/disconnect/plan.d.ts +175 -0
- package/dist/disconnect/plan.d.ts.map +1 -0
- package/dist/disconnect/plan.js +580 -0
- package/dist/disconnect/plan.js.map +1 -0
- package/dist/disconnect/recognise.d.ts +43 -0
- package/dist/disconnect/recognise.d.ts.map +1 -0
- package/dist/disconnect/recognise.js +108 -0
- package/dist/disconnect/recognise.js.map +1 -0
- package/dist/disconnect/tomlLines.d.ts +39 -0
- package/dist/disconnect/tomlLines.d.ts.map +1 -0
- package/dist/disconnect/tomlLines.js +105 -0
- package/dist/disconnect/tomlLines.js.map +1 -0
- package/dist/harness/aiderConfigMerger.d.ts +29 -8
- package/dist/harness/aiderConfigMerger.d.ts.map +1 -1
- package/dist/harness/aiderConfigMerger.js +63 -12
- package/dist/harness/aiderConfigMerger.js.map +1 -1
- package/dist/harness/antigravityCliHooks.d.ts +61 -0
- package/dist/harness/antigravityCliHooks.d.ts.map +1 -0
- package/dist/harness/antigravityCliHooks.js +207 -0
- package/dist/harness/antigravityCliHooks.js.map +1 -0
- package/dist/harness/antigravityHooks.d.ts +12 -2
- package/dist/harness/antigravityHooks.d.ts.map +1 -1
- package/dist/harness/antigravityHooks.js +38 -16
- package/dist/harness/antigravityHooks.js.map +1 -1
- package/dist/harness/antigravityProducts.d.ts +40 -0
- package/dist/harness/antigravityProducts.d.ts.map +1 -0
- package/dist/harness/antigravityProducts.js +109 -0
- package/dist/harness/antigravityProducts.js.map +1 -0
- package/dist/harness/claudeAgentsMd.d.ts +29 -0
- package/dist/harness/claudeAgentsMd.d.ts.map +1 -0
- package/dist/harness/claudeAgentsMd.js +80 -0
- package/dist/harness/claudeAgentsMd.js.map +1 -0
- package/dist/harness/claudeCodeHooks.d.ts +6 -6
- package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
- package/dist/harness/claudeCodeHooks.js +115 -28
- package/dist/harness/claudeCodeHooks.js.map +1 -1
- package/dist/harness/claudeProjectApproval.d.ts +53 -0
- package/dist/harness/claudeProjectApproval.d.ts.map +1 -0
- package/dist/harness/claudeProjectApproval.js +159 -0
- package/dist/harness/claudeProjectApproval.js.map +1 -0
- package/dist/harness/clineHooks.d.ts +0 -1
- package/dist/harness/clineHooks.d.ts.map +1 -1
- package/dist/harness/clineHooks.js +13 -4
- package/dist/harness/clineHooks.js.map +1 -1
- package/dist/harness/codexConfigMerger.d.ts.map +1 -1
- package/dist/harness/codexConfigMerger.js +4 -0
- package/dist/harness/codexConfigMerger.js.map +1 -1
- package/dist/harness/codexHooks.d.ts +2 -0
- package/dist/harness/codexHooks.d.ts.map +1 -1
- package/dist/harness/codexHooks.js +15 -4
- package/dist/harness/codexHooks.js.map +1 -1
- package/dist/harness/continueConfigMerger.d.ts.map +1 -1
- package/dist/harness/continueConfigMerger.js +4 -0
- package/dist/harness/continueConfigMerger.js.map +1 -1
- package/dist/harness/cursorHooks.d.ts +5 -2
- package/dist/harness/cursorHooks.d.ts.map +1 -1
- package/dist/harness/cursorHooks.js +12 -3
- package/dist/harness/cursorHooks.js.map +1 -1
- package/dist/harness/dshHooks.d.ts +5 -5
- package/dist/harness/dshHooks.d.ts.map +1 -1
- package/dist/harness/dshHooks.js +12 -5
- package/dist/harness/dshHooks.js.map +1 -1
- package/dist/harness/gateArtifacts.d.ts +35 -0
- package/dist/harness/gateArtifacts.d.ts.map +1 -0
- package/dist/harness/gateArtifacts.js +88 -0
- package/dist/harness/gateArtifacts.js.map +1 -0
- package/dist/harness/gateBody.d.ts +195 -69
- package/dist/harness/gateBody.d.ts.map +1 -1
- package/dist/harness/gateBody.js +847 -182
- package/dist/harness/gateBody.js.map +1 -1
- package/dist/harness/gateSightings.d.ts +47 -0
- package/dist/harness/gateSightings.d.ts.map +1 -0
- package/dist/harness/gateSightings.js +159 -0
- package/dist/harness/gateSightings.js.map +1 -0
- package/dist/harness/githubCopilotHooks.d.ts.map +1 -1
- package/dist/harness/githubCopilotHooks.js +11 -10
- package/dist/harness/githubCopilotHooks.js.map +1 -1
- package/dist/harness/gooseHardener.d.ts +0 -1
- package/dist/harness/gooseHardener.d.ts.map +1 -1
- package/dist/harness/gooseHardener.js +1 -1
- package/dist/harness/gooseHardener.js.map +1 -1
- package/dist/harness/gooseHooks.d.ts +29 -1
- package/dist/harness/gooseHooks.d.ts.map +1 -1
- package/dist/harness/gooseHooks.js +107 -69
- package/dist/harness/gooseHooks.js.map +1 -1
- package/dist/harness/grokHooks.d.ts +2 -2
- package/dist/harness/grokHooks.d.ts.map +1 -1
- package/dist/harness/grokHooks.js +20 -18
- package/dist/harness/grokHooks.js.map +1 -1
- package/dist/harness/hermesHooks.d.ts +18 -8
- package/dist/harness/hermesHooks.d.ts.map +1 -1
- package/dist/harness/hermesHooks.js +55 -19
- package/dist/harness/hermesHooks.js.map +1 -1
- package/dist/harness/holdRedaction.d.ts +4 -1
- package/dist/harness/holdRedaction.d.ts.map +1 -1
- package/dist/harness/holdRedaction.js +32 -8
- package/dist/harness/holdRedaction.js.map +1 -1
- package/dist/harness/jetbrainsXmlConfig.d.ts +20 -0
- package/dist/harness/jetbrainsXmlConfig.d.ts.map +1 -1
- package/dist/harness/jetbrainsXmlConfig.js +39 -18
- package/dist/harness/jetbrainsXmlConfig.js.map +1 -1
- package/dist/harness/mcpAutoWrite.d.ts +62 -25
- package/dist/harness/mcpAutoWrite.d.ts.map +1 -1
- package/dist/harness/mcpAutoWrite.js +406 -95
- package/dist/harness/mcpAutoWrite.js.map +1 -1
- package/dist/harness/museHooks.d.ts +3 -3
- package/dist/harness/museHooks.d.ts.map +1 -1
- package/dist/harness/museHooks.js +15 -7
- package/dist/harness/museHooks.js.map +1 -1
- package/dist/harness/n8nHooks.d.ts +0 -1
- package/dist/harness/n8nHooks.d.ts.map +1 -1
- package/dist/harness/n8nHooks.js +4 -1
- package/dist/harness/n8nHooks.js.map +1 -1
- package/dist/harness/openCodeHooks.d.ts +2 -2
- package/dist/harness/openCodeHooks.d.ts.map +1 -1
- package/dist/harness/openCodeHooks.js +9 -8
- package/dist/harness/openCodeHooks.js.map +1 -1
- package/dist/harness/openWebuiHooks.d.ts +0 -1
- package/dist/harness/openWebuiHooks.d.ts.map +1 -1
- package/dist/harness/openWebuiHooks.js +11 -3
- package/dist/harness/openWebuiHooks.js.map +1 -1
- package/dist/harness/openclawHooks.d.ts +75 -18
- package/dist/harness/openclawHooks.d.ts.map +1 -1
- package/dist/harness/openclawHooks.js +214 -160
- package/dist/harness/openclawHooks.js.map +1 -1
- package/dist/harness/openhandsHooks.d.ts +37 -11
- package/dist/harness/openhandsHooks.d.ts.map +1 -1
- package/dist/harness/openhandsHooks.js +148 -97
- package/dist/harness/openhandsHooks.js.map +1 -1
- package/dist/harness/piHooks.d.ts +52 -17
- package/dist/harness/piHooks.d.ts.map +1 -1
- package/dist/harness/piHooks.js +177 -163
- package/dist/harness/piHooks.js.map +1 -1
- package/dist/harness/protectedPaths.d.ts +107 -25
- package/dist/harness/protectedPaths.d.ts.map +1 -1
- package/dist/harness/protectedPaths.js +342 -48
- package/dist/harness/protectedPaths.js.map +1 -1
- package/dist/harness/rulesSection.d.ts +62 -0
- package/dist/harness/rulesSection.d.ts.map +1 -0
- package/dist/harness/rulesSection.js +145 -0
- package/dist/harness/rulesSection.js.map +1 -0
- package/dist/harness/windsurfHooks.d.ts +18 -3
- package/dist/harness/windsurfHooks.d.ts.map +1 -1
- package/dist/harness/windsurfHooks.js +41 -8
- package/dist/harness/windsurfHooks.js.map +1 -1
- package/dist/harness/windsurfJetBrainsProxy.d.ts +1 -1
- package/dist/harness/windsurfJetBrainsProxy.d.ts.map +1 -1
- package/dist/harness/windsurfJetBrainsProxy.js +5 -1
- package/dist/harness/windsurfJetBrainsProxy.js.map +1 -1
- package/dist/index.d.ts +21 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -19
- package/dist/index.js.map +1 -1
- package/dist/inventory.d.ts +53 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/inventory.js +133 -0
- package/dist/inventory.js.map +1 -0
- package/dist/lib/complianceProbes.d.ts +2 -1
- package/dist/lib/complianceProbes.d.ts.map +1 -1
- package/dist/lib/complianceProbes.js +1 -1
- package/dist/lib/complianceProbes.js.map +1 -1
- package/dist/lib/decisionsDigest.d.ts +35 -17
- package/dist/lib/decisionsDigest.d.ts.map +1 -1
- package/dist/lib/decisionsDigest.js +106 -47
- package/dist/lib/decisionsDigest.js.map +1 -1
- package/dist/lib/egressPolicy.d.ts +2 -2
- package/dist/lib/egressPolicy.js +2 -2
- package/dist/lib/mcpRegistryPy.d.ts +11 -0
- package/dist/lib/mcpRegistryPy.d.ts.map +1 -0
- package/dist/lib/mcpRegistryPy.js +173 -0
- package/dist/lib/mcpRegistryPy.js.map +1 -0
- package/dist/lib/phrasesPy.d.ts +11 -0
- package/dist/lib/phrasesPy.d.ts.map +1 -0
- package/dist/lib/phrasesPy.js +351 -0
- package/dist/lib/phrasesPy.js.map +1 -0
- package/dist/lib/policySnapshot.d.ts +63 -9
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +269 -45
- package/dist/lib/policySnapshot.js.map +1 -1
- package/dist/lib/processPoller.d.ts.map +1 -1
- package/dist/lib/processPoller.js +9 -2
- package/dist/lib/processPoller.js.map +1 -1
- package/dist/lib/regexLinearity.d.ts +43 -0
- package/dist/lib/regexLinearity.d.ts.map +1 -0
- package/dist/lib/regexLinearity.js +275 -0
- package/dist/lib/regexLinearity.js.map +1 -0
- package/dist/lib/runtimeEnv.d.ts +1 -3
- package/dist/lib/runtimeEnv.d.ts.map +1 -1
- package/dist/lib/runtimeEnv.js +0 -2
- package/dist/lib/runtimeEnv.js.map +1 -1
- package/dist/lib/sequencePy.d.ts +10 -0
- package/dist/lib/sequencePy.d.ts.map +1 -0
- package/dist/lib/sequencePy.js +102 -0
- package/dist/lib/sequencePy.js.map +1 -0
- package/dist/sessionReporter.d.ts +18 -12
- package/dist/sessionReporter.d.ts.map +1 -1
- package/dist/sessionReporter.js +37 -24
- package/dist/sessionReporter.js.map +1 -1
- package/dist/skillWriter.d.ts +23 -5
- package/dist/skillWriter.d.ts.map +1 -1
- package/dist/skillWriter.js +159 -16
- package/dist/skillWriter.js.map +1 -1
- package/dist/syncCycle.d.ts +142 -0
- package/dist/syncCycle.d.ts.map +1 -0
- package/dist/syncCycle.js +327 -0
- package/dist/syncCycle.js.map +1 -0
- package/dist/trajectoryMonitor.d.ts +2 -4
- package/dist/trajectoryMonitor.d.ts.map +1 -1
- package/dist/trajectoryMonitor.js +2 -5
- package/dist/trajectoryMonitor.js.map +1 -1
- package/dist/watcher/driftWatcher.d.ts +0 -1
- package/dist/watcher/driftWatcher.d.ts.map +1 -1
- package/dist/watcher/driftWatcher.js +1 -2
- package/dist/watcher/driftWatcher.js.map +1 -1
- package/dist/watcher/settingsGuard.d.ts +36 -7
- package/dist/watcher/settingsGuard.d.ts.map +1 -1
- package/dist/watcher/settingsGuard.js +397 -60
- package/dist/watcher/settingsGuard.js.map +1 -1
- package/dist/watcher/vscodeHookSettings.d.ts +30 -0
- package/dist/watcher/vscodeHookSettings.d.ts.map +1 -0
- package/dist/watcher/vscodeHookSettings.js +170 -0
- package/dist/watcher/vscodeHookSettings.js.map +1 -0
- package/dist/wsClient.d.ts +0 -1
- package/dist/wsClient.d.ts.map +1 -1
- package/dist/wsClient.js +0 -1
- package/dist/wsClient.js.map +1 -1
- package/package.json +5 -5
- package/dist/harness/claudeDesktopHooks.d.ts +0 -30
- package/dist/harness/claudeDesktopHooks.d.ts.map +0 -1
- package/dist/harness/claudeDesktopHooks.js +0 -254
- package/dist/harness/claudeDesktopHooks.js.map +0 -1
- package/dist/harness/continueHooks.d.ts +0 -63
- package/dist/harness/continueHooks.d.ts.map +0 -1
- package/dist/harness/continueHooks.js +0 -247
- package/dist/harness/continueHooks.js.map +0 -1
- package/dist/harness/gateKind.d.ts +0 -164
- package/dist/harness/gateKind.d.ts.map +0 -1
- package/dist/harness/gateKind.js +0 -144
- package/dist/harness/gateKind.js.map +0 -1
- package/dist/harness/rooCodeHooks.d.ts +0 -31
- package/dist/harness/rooCodeHooks.d.ts.map +0 -1
- package/dist/harness/rooCodeHooks.js +0 -286
- package/dist/harness/rooCodeHooks.js.map +0 -1
- package/dist/hashReporter.d.ts +0 -33
- package/dist/hashReporter.d.ts.map +0 -1
- package/dist/hashReporter.js +0 -69
- package/dist/hashReporter.js.map +0 -1
- package/dist/integrityStore.d.ts +0 -35
- package/dist/integrityStore.d.ts.map +0 -1
- package/dist/integrityStore.js +0 -71
- package/dist/integrityStore.js.map +0 -1
- package/dist/lib/gitWorktrees.d.ts +0 -140
- package/dist/lib/gitWorktrees.d.ts.map +0 -1
- package/dist/lib/gitWorktrees.js +0 -191
- package/dist/lib/gitWorktrees.js.map +0 -1
- package/dist/syncLoop.d.ts +0 -172
- package/dist/syncLoop.d.ts.map +0 -1
- package/dist/syncLoop.js +0 -878
- package/dist/syncLoop.js.map +0 -1
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The phrase matcher in Python, for the gates that run Python: the bash gates
|
|
3
|
+
* (their extractor already requires python3) and the Open WebUI filter.
|
|
4
|
+
*
|
|
5
|
+
* Byte-identical to `packages/intutic-clawde/intutic_clawde/gate/phrases.py`,
|
|
6
|
+
* which a test compares; edit that file and copy it here. It is the
|
|
7
|
+
* transliteration of `@intutic/shared-types`'s phrases.ts, and both run the
|
|
8
|
+
* shared vectors.
|
|
9
|
+
*/
|
|
10
|
+
export const PHRASES_PY_SOURCE = String.raw `"""Phrase matching for shell commands and SQL in linear time.
|
|
11
|
+
|
|
12
|
+
A transliteration of packages/shared-types/src/phrases.ts; read that module's
|
|
13
|
+
docstring for what counts as a separator and why no regex searches the input.
|
|
14
|
+
The rules are the same; the walk is organised for CPython, which is slow per
|
|
15
|
+
step: runs of ordinary characters, spaces and backslashes are consumed by
|
|
16
|
+
anchored character-class matches (one pass each, nothing to backtrack into),
|
|
17
|
+
and a phrase is checked only at the words that can start it.
|
|
18
|
+
|
|
19
|
+
Every classifier runs the shared vectors in
|
|
20
|
+
packages/proxy/src/plugins/anomaly/action_vectors.json, and the hook gates
|
|
21
|
+
emit this file verbatim (services/sync-daemon/src/lib/phrasesPy.ts holds a
|
|
22
|
+
byte-identical copy, which a test compares). It must stay self-contained: the
|
|
23
|
+
standard library only, no module state beyond the constants below, and no
|
|
24
|
+
backtick or dollar-brace, which the TypeScript copy cannot hold.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import re
|
|
28
|
+
from bisect import bisect_left
|
|
29
|
+
|
|
30
|
+
_SPACE_CHARS = (
|
|
31
|
+
" \t\n\r\v\f\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007"
|
|
32
|
+
"\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000\ufeff"
|
|
33
|
+
)
|
|
34
|
+
_SPACES = frozenset(_SPACE_CHARS)
|
|
35
|
+
_WORD = frozenset("abcdefghijklmnopqrstuvwxyz0123456789_")
|
|
36
|
+
# One anchored match per piece of the text. Every alternative starts with a
|
|
37
|
+
# character no other alternative can start with, so exactly one can match at
|
|
38
|
+
# a position and it matches one run of its class: nothing to backtrack into.
|
|
39
|
+
_PIECE = re.compile(
|
|
40
|
+
"(?P<plain>[^" + _SPACE_CHARS + "\\\\/;&|-]+)"
|
|
41
|
+
"|(?P<space>[" + _SPACE_CHARS + "]+)"
|
|
42
|
+
"|(?P<dash>-+)"
|
|
43
|
+
"|(?P<backslash>\\\\+)"
|
|
44
|
+
"|(?P<other>[/;&|])"
|
|
45
|
+
)
|
|
46
|
+
# A run of words that need no decision, each followed by one plain space:
|
|
47
|
+
# ordinary characters, after at most a leading run of dashes. Consumed in one
|
|
48
|
+
# match and split in C — most of a long command is this.
|
|
49
|
+
_BULK = re.compile("(?:(?:[^" + _SPACE_CHARS + "\\\\/;&|-]+|-+[^" + _SPACE_CHARS + "\\\\/;&|-]*) )+")
|
|
50
|
+
_BULK_NO_COMMENT = re.compile("(?:(?:[^" + _SPACE_CHARS + "\\\\;&|-]+|-+[^" + _SPACE_CHARS + "\\\\;&|-]*) )+")
|
|
51
|
+
# A run of line continuations or escaped spaces between words: one break.
|
|
52
|
+
_CONTINUATIONS = re.compile("(?:\\\\[" + _SPACE_CHARS + "])+")
|
|
53
|
+
# The same once no "*/" is left in the text: no "/*" can open a comment, so a
|
|
54
|
+
# slash is an ordinary character.
|
|
55
|
+
_PIECE_NO_COMMENT = re.compile(
|
|
56
|
+
"(?P<plain>[^" + _SPACE_CHARS + "\\\\;&|-]+)"
|
|
57
|
+
"|(?P<space>[" + _SPACE_CHARS + "]+)"
|
|
58
|
+
"|(?P<dash>-+)"
|
|
59
|
+
"|(?P<backslash>\\\\+)"
|
|
60
|
+
"|(?P<other>[;&|])"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class PhraseText:
|
|
65
|
+
"""A text cut into words, ready for any number of has_phrase calls."""
|
|
66
|
+
|
|
67
|
+
__slots__ = ("raw", "joined", "toks", "sep", "nl", "eol", "dash", "bar", "tail", "memo")
|
|
68
|
+
|
|
69
|
+
def __init__(self):
|
|
70
|
+
self.raw = ""
|
|
71
|
+
self.joined = ""
|
|
72
|
+
self.toks = []
|
|
73
|
+
self.sep = []
|
|
74
|
+
self.nl = []
|
|
75
|
+
self.eol = []
|
|
76
|
+
self.dash = []
|
|
77
|
+
self.bar = []
|
|
78
|
+
self.tail = False
|
|
79
|
+
self.memo = {}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def phrase_text(value):
|
|
83
|
+
"""Cut value into words in one pass (see phraseText in phrases.ts)."""
|
|
84
|
+
s = ("" if value is None else str(value)).lower()
|
|
85
|
+
n = len(s)
|
|
86
|
+
t = PhraseText()
|
|
87
|
+
t.raw = s
|
|
88
|
+
toks, sep, nl, eol, dash, bar = t.toks, t.sep, t.nl, t.eol, t.dash, t.bar
|
|
89
|
+
start = -1
|
|
90
|
+
tok_bar = False
|
|
91
|
+
pend_sep = pend_nl = pend_eol = False
|
|
92
|
+
close = -2 if "*/" in s else -1 # the next "*/" at or after the last search; -1 once none is left
|
|
93
|
+
piece = _PIECE if close != -1 else _PIECE_NO_COMMENT
|
|
94
|
+
bulk = _BULK if close != -1 else _BULK_NO_COMMENT
|
|
95
|
+
i = 0
|
|
96
|
+
while i < n:
|
|
97
|
+
if start < 0:
|
|
98
|
+
m = bulk.match(s, i)
|
|
99
|
+
if m is not None:
|
|
100
|
+
words = m.group().split(" ")
|
|
101
|
+
words.pop()
|
|
102
|
+
rest = len(words) - 1
|
|
103
|
+
toks.extend(words)
|
|
104
|
+
sep.append(pend_sep)
|
|
105
|
+
sep.extend([True] * rest)
|
|
106
|
+
nl.append(pend_nl)
|
|
107
|
+
nl.extend([False] * rest)
|
|
108
|
+
eol.append(pend_eol)
|
|
109
|
+
eol.extend([False] * rest)
|
|
110
|
+
dash.extend([w.startswith("--") for w in words])
|
|
111
|
+
bar.extend([False] * (rest + 1))
|
|
112
|
+
pend_sep = True
|
|
113
|
+
pend_nl = pend_eol = False
|
|
114
|
+
i = m.end()
|
|
115
|
+
continue
|
|
116
|
+
m = _CONTINUATIONS.match(s, i)
|
|
117
|
+
if m is not None:
|
|
118
|
+
pend_sep = True
|
|
119
|
+
i = m.end()
|
|
120
|
+
continue
|
|
121
|
+
m = piece.match(s, i)
|
|
122
|
+
kind = m.lastgroup
|
|
123
|
+
j = m.end()
|
|
124
|
+
if kind == "plain":
|
|
125
|
+
if start < 0:
|
|
126
|
+
start = i
|
|
127
|
+
i = j
|
|
128
|
+
continue
|
|
129
|
+
word_break = False
|
|
130
|
+
newline = eol_here = False
|
|
131
|
+
nxt = j
|
|
132
|
+
if kind == "space":
|
|
133
|
+
newline = eol_here = "\n" in m.group()
|
|
134
|
+
word_break = True
|
|
135
|
+
elif kind == "dash":
|
|
136
|
+
# A "--" inside a word starts a new one, glued to it: it can open a
|
|
137
|
+
# comment or an option run but cannot stand for a plain gap.
|
|
138
|
+
if j - i > 1 and start >= 0:
|
|
139
|
+
toks.append(s[start:i])
|
|
140
|
+
sep.append(pend_sep)
|
|
141
|
+
nl.append(pend_nl)
|
|
142
|
+
eol.append(pend_eol)
|
|
143
|
+
dash.append(s.startswith("--", start))
|
|
144
|
+
bar.append(tok_bar)
|
|
145
|
+
start = -1
|
|
146
|
+
tok_bar = False
|
|
147
|
+
pend_sep = pend_nl = pend_eol = False
|
|
148
|
+
if start < 0:
|
|
149
|
+
start = i
|
|
150
|
+
i = j
|
|
151
|
+
continue
|
|
152
|
+
elif kind == "backslash":
|
|
153
|
+
# Every backslash but the last is followed by a backslash: a
|
|
154
|
+
# literal character. The last one decides.
|
|
155
|
+
last = j - 1
|
|
156
|
+
d = s[j] if j < n else ""
|
|
157
|
+
if d in ("n", "t", "r") or (d != "" and d in _SPACES):
|
|
158
|
+
if last > i and start < 0:
|
|
159
|
+
start = i
|
|
160
|
+
word_break = True
|
|
161
|
+
eol_here = d == "n"
|
|
162
|
+
nxt = j + 1
|
|
163
|
+
if last > i:
|
|
164
|
+
# the literal backslashes end the word before the escape
|
|
165
|
+
toks.append(s[start:last])
|
|
166
|
+
sep.append(pend_sep)
|
|
167
|
+
nl.append(pend_nl)
|
|
168
|
+
eol.append(pend_eol)
|
|
169
|
+
dash.append(s.startswith("--", start))
|
|
170
|
+
bar.append(tok_bar)
|
|
171
|
+
start = -1
|
|
172
|
+
tok_bar = False
|
|
173
|
+
pend_sep = pend_nl = pend_eol = False
|
|
174
|
+
else:
|
|
175
|
+
if start < 0:
|
|
176
|
+
start = i
|
|
177
|
+
i = j
|
|
178
|
+
continue
|
|
179
|
+
else:
|
|
180
|
+
c = s[i]
|
|
181
|
+
if c == "/" and j < n and s[j] == "*" and close != -1:
|
|
182
|
+
if close < i + 2:
|
|
183
|
+
close = s.find("*/", i + 2)
|
|
184
|
+
if close == -1:
|
|
185
|
+
piece = _PIECE_NO_COMMENT
|
|
186
|
+
bulk = _BULK_NO_COMMENT
|
|
187
|
+
if close != -1:
|
|
188
|
+
word_break = True
|
|
189
|
+
nxt = close + 2
|
|
190
|
+
if not word_break:
|
|
191
|
+
if start < 0:
|
|
192
|
+
start = i
|
|
193
|
+
if c != "/":
|
|
194
|
+
tok_bar = True
|
|
195
|
+
i = j
|
|
196
|
+
continue
|
|
197
|
+
if start >= 0:
|
|
198
|
+
toks.append(s[start:i])
|
|
199
|
+
sep.append(pend_sep)
|
|
200
|
+
nl.append(pend_nl)
|
|
201
|
+
eol.append(pend_eol)
|
|
202
|
+
dash.append(s.startswith("--", start))
|
|
203
|
+
bar.append(tok_bar)
|
|
204
|
+
start = -1
|
|
205
|
+
tok_bar = False
|
|
206
|
+
pend_sep = pend_nl = pend_eol = False
|
|
207
|
+
pend_sep = True
|
|
208
|
+
if newline:
|
|
209
|
+
pend_nl = True
|
|
210
|
+
if eol_here:
|
|
211
|
+
pend_eol = True
|
|
212
|
+
i = nxt
|
|
213
|
+
if start >= 0:
|
|
214
|
+
toks.append(s[start:n])
|
|
215
|
+
sep.append(pend_sep)
|
|
216
|
+
nl.append(pend_nl)
|
|
217
|
+
eol.append(pend_eol)
|
|
218
|
+
dash.append(s.startswith("--", start))
|
|
219
|
+
bar.append(tok_bar)
|
|
220
|
+
pend_sep = False
|
|
221
|
+
t.tail = pend_sep
|
|
222
|
+
t.joined = " ".join(toks)
|
|
223
|
+
return t
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _next_index(t):
|
|
227
|
+
"""Per word x: the first word at or after x containing ;&|, with a real
|
|
228
|
+
newline before it, and with any newline before it. Built once per text."""
|
|
229
|
+
ix = t.memo.get("#next")
|
|
230
|
+
if ix is None:
|
|
231
|
+
T = len(t.toks)
|
|
232
|
+
nb = [T] * (T + 1)
|
|
233
|
+
nn = [T] * (T + 1)
|
|
234
|
+
ne = [T] * (T + 1)
|
|
235
|
+
b = n_ = e = T
|
|
236
|
+
bar, nl, eol = t.bar, t.nl, t.eol
|
|
237
|
+
for x in range(T - 1, -1, -1):
|
|
238
|
+
if bar[x]:
|
|
239
|
+
b = x
|
|
240
|
+
if nl[x]:
|
|
241
|
+
n_ = x
|
|
242
|
+
if eol[x]:
|
|
243
|
+
e = x
|
|
244
|
+
nb[x] = b
|
|
245
|
+
nn[x] = n_
|
|
246
|
+
ne[x] = e
|
|
247
|
+
ix = (nb, nn, ne)
|
|
248
|
+
t.memo["#next"] = ix
|
|
249
|
+
return ix
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def has_phrase(t, needle, bounded=False):
|
|
253
|
+
"""Whether t contains needle (see hasPhrase in phrases.ts)."""
|
|
254
|
+
words = needle.lower().split(" ")
|
|
255
|
+
if len(words) == 1:
|
|
256
|
+
return words[0] in t.raw
|
|
257
|
+
trailing_gap = words[-1] == ""
|
|
258
|
+
if trailing_gap:
|
|
259
|
+
words.pop()
|
|
260
|
+
for w in words:
|
|
261
|
+
if w == "" or w not in t.joined:
|
|
262
|
+
return False
|
|
263
|
+
toks, sep, dash, tail = t.toks, t.sep, t.dash, t.tail
|
|
264
|
+
T = len(toks)
|
|
265
|
+
k = len(words)
|
|
266
|
+
|
|
267
|
+
def positions(i):
|
|
268
|
+
"""The words that word i of the phrase can be, by its position."""
|
|
269
|
+
w = words[i]
|
|
270
|
+
first = i == 0
|
|
271
|
+
last = i == k - 1 and not trailing_gap
|
|
272
|
+
key = ("f" if first else "") + ("l" if last else "") + ("b" if bounded else "") + ":" + w
|
|
273
|
+
hit = t.memo.get(key)
|
|
274
|
+
if hit is not None:
|
|
275
|
+
return hit
|
|
276
|
+
lw = len(w)
|
|
277
|
+
if first:
|
|
278
|
+
out = [q for q, tok in enumerate(toks) if tok.endswith(w)]
|
|
279
|
+
elif last:
|
|
280
|
+
out = [q for q, tok in enumerate(toks) if tok.startswith(w)]
|
|
281
|
+
else:
|
|
282
|
+
out = [q for q, tok in enumerate(toks) if tok == w]
|
|
283
|
+
if bounded:
|
|
284
|
+
kept = []
|
|
285
|
+
for q in out:
|
|
286
|
+
tok = toks[q]
|
|
287
|
+
if first and len(tok) > lw and tok[len(tok) - lw - 1] in _WORD:
|
|
288
|
+
continue
|
|
289
|
+
if last and len(tok) > lw and (tok[lw] in _WORD or tok[lw] == "."):
|
|
290
|
+
continue
|
|
291
|
+
kept.append(q)
|
|
292
|
+
out = kept
|
|
293
|
+
t.memo[key] = out
|
|
294
|
+
return out
|
|
295
|
+
|
|
296
|
+
# The words at which the rest of the phrase matches, ascending.
|
|
297
|
+
ok = positions(k - 1)
|
|
298
|
+
if trailing_gap:
|
|
299
|
+
kept = []
|
|
300
|
+
for q in ok:
|
|
301
|
+
r = q + 1
|
|
302
|
+
if r < T:
|
|
303
|
+
if sep[r] or (dash[r] and not t.bar[r] and (r + 1 < T or tail)):
|
|
304
|
+
kept.append(q)
|
|
305
|
+
elif tail:
|
|
306
|
+
kept.append(q)
|
|
307
|
+
ok = kept
|
|
308
|
+
if k == 1:
|
|
309
|
+
return bool(ok)
|
|
310
|
+
nb, nn, ne = _next_index(t)
|
|
311
|
+
for i in range(k - 2, -1, -1):
|
|
312
|
+
ok_sep = [q for q in ok if sep[q]]
|
|
313
|
+
ok_set = set(ok_sep)
|
|
314
|
+
memo = {}
|
|
315
|
+
|
|
316
|
+
def option(r):
|
|
317
|
+
# An option run reaches any word before a ;&| word or a real newline.
|
|
318
|
+
j = bisect_left(ok_sep, r + 1)
|
|
319
|
+
return j < len(ok_sep) and ok_sep[j] <= min(nb[r], nn[r + 1], T - 1)
|
|
320
|
+
|
|
321
|
+
def reach(r):
|
|
322
|
+
# The gap that starts at word r leads into the rest of the phrase:
|
|
323
|
+
# directly, after an option run, or after -- comments, each of
|
|
324
|
+
# which runs to the next newline.
|
|
325
|
+
path = []
|
|
326
|
+
cur = r
|
|
327
|
+
while True:
|
|
328
|
+
if cur >= T:
|
|
329
|
+
val = False
|
|
330
|
+
break
|
|
331
|
+
if cur in memo:
|
|
332
|
+
val = memo[cur]
|
|
333
|
+
break
|
|
334
|
+
if cur in ok_set or (dash[cur] and option(cur)):
|
|
335
|
+
val = memo[cur] = True
|
|
336
|
+
break
|
|
337
|
+
if not dash[cur]:
|
|
338
|
+
val = memo[cur] = False
|
|
339
|
+
break
|
|
340
|
+
path.append(cur)
|
|
341
|
+
cur = ne[cur + 1]
|
|
342
|
+
for x in path:
|
|
343
|
+
memo[x] = val
|
|
344
|
+
return val
|
|
345
|
+
|
|
346
|
+
ok = [p for p in positions(i) if reach(p + 1)]
|
|
347
|
+
if not ok:
|
|
348
|
+
return False
|
|
349
|
+
return bool(ok)
|
|
350
|
+
`;
|
|
351
|
+
//# sourceMappingURL=phrasesPy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phrasesPy.js","sourceRoot":"","sources":["../../src/lib/phrasesPy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoV1C,CAAA"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* # Why
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* `POST /api/v1/hook-gate` was called by two of thirteen gates, so DLP,
|
|
8
8
|
* `BLOCK:` SOPs, SSO policy and promoted findings reached two of thirteen. The
|
|
9
9
|
* obvious repair — route the other eleven through the gate — is the wrong one:
|
|
10
10
|
* those eleven enforce locally and **fail closed**, the two network callers were
|
|
@@ -54,12 +54,28 @@
|
|
|
54
54
|
*
|
|
55
55
|
* @module
|
|
56
56
|
*/
|
|
57
|
+
import { type McpRegistryRecord, type SsoGroupPolicy } from '@intutic/shared-types';
|
|
57
58
|
import { type GuardPattern } from '../harness/protectedPaths.js';
|
|
58
59
|
/** Directory every gate looks in. Inside `.intutic/hooks`, which is already
|
|
59
60
|
* protected — see the module note. */
|
|
60
61
|
export declare const DEFAULT_SNAPSHOT_DIR: string;
|
|
61
62
|
export declare const SNAPSHOT_JSON = "policy-snapshot.json";
|
|
62
63
|
export declare const SNAPSHOT_RULES = "policy-snapshot.rules";
|
|
64
|
+
/**
|
|
65
|
+
* The subdirectory of the snapshot directory holding the last snapshot the
|
|
66
|
+
* daemon wrote and so verified: both artifacts, byte for byte, read-only.
|
|
67
|
+
* Inside `.intutic/hooks`, which every gate refuses to touch. The settings
|
|
68
|
+
* guard compares the live snapshot with it and restores it when they differ
|
|
69
|
+
* ({@link restoreVerifiedSnapshot}), the way a policy agent keeps its last
|
|
70
|
+
* verified bundle active when a new one fails verification.
|
|
71
|
+
*/
|
|
72
|
+
export declare const VERIFIED_SNAPSHOT_DIR = "verified";
|
|
73
|
+
/**
|
|
74
|
+
* Whether a `.rules` text verifies: it carries a `#digest` line, and the
|
|
75
|
+
* digest of its data lines matches it — the check every gate makes. A
|
|
76
|
+
* missing digest fails, since the writer always writes one.
|
|
77
|
+
*/
|
|
78
|
+
export declare function snapshotRulesVerify(text: string): boolean;
|
|
63
79
|
/**
|
|
64
80
|
* Whether the destructive tier ships as `block` or as `warn`.
|
|
65
81
|
*
|
|
@@ -93,10 +109,9 @@ export declare const DESTRUCTIVE_TIER_SEVERITY: 'block' | 'warn';
|
|
|
93
109
|
* is not that kind of rule: it does not run `scanSkillContent` or judge
|
|
94
110
|
* anything about what a skill file says, only WHERE a write's target path
|
|
95
111
|
* points — `.agents/skills/**` or `.claude/skills/**`, a deterministic,
|
|
96
|
-
* zero-ambiguity match.
|
|
97
|
-
* that distinction: "Path-matching is the one exception, and it is not
|
|
112
|
+
* zero-ambiguity match. Path-matching is the one exception, and it is not
|
|
98
113
|
* actually an exception to the measurement requirement — it never needed
|
|
99
|
-
* one.
|
|
114
|
+
* one. There is no false-positive rate to earn a promotion by measuring,
|
|
100
115
|
* because there is nothing probabilistic here to measure in the first place.
|
|
101
116
|
*
|
|
102
117
|
* The second half of the argument is what `warn` actually buys on this
|
|
@@ -131,7 +146,7 @@ export declare const SKILL_SURFACE_TIER_SEVERITY: 'block' | 'warn';
|
|
|
131
146
|
* ships as `block` or as `warn`.
|
|
132
147
|
*
|
|
133
148
|
* `block`, licensed by a measurement rather than by argument, unlike
|
|
134
|
-
* `SKILL_SURFACE_TIER_SEVERITY` above.
|
|
149
|
+
* `SKILL_SURFACE_TIER_SEVERITY` above. Content enforcement was held at warn
|
|
135
150
|
* until `scanSkillContent`'s false-positive rate on real benign skills had been
|
|
136
151
|
* measured. It now has: 350 vendored SKILL.md files
|
|
137
152
|
* (`packages/shared-types/src/__tests__/corpus/skills/`), and the nine patterns
|
|
@@ -159,7 +174,7 @@ export interface ResolvedPolicy {
|
|
|
159
174
|
action: string;
|
|
160
175
|
reason: string;
|
|
161
176
|
/**
|
|
162
|
-
*
|
|
177
|
+
* `'guardrail'` on rules the control plane projects from a cited
|
|
163
178
|
* policy guardrail. The only origin for which `action: 'warn'` is shipped
|
|
164
179
|
* (at severity `warn`, report-only); every other warn rule is still
|
|
165
180
|
* dropped, the HIGH/CRITICAL catch-all included.
|
|
@@ -174,9 +189,9 @@ export interface ResolvedPolicy {
|
|
|
174
189
|
* this same field name off `workspaces.settings`, so this is not a new
|
|
175
190
|
* name invented for the snapshot). Absent/empty means unrestricted — the
|
|
176
191
|
* MCP proxy already reads it that way (`packages/mcp-proxy/src/policy.ts`),
|
|
177
|
-
* and the gate-side
|
|
192
|
+
* and the gate-side `@mcp_allowlist` record this field feeds
|
|
178
193
|
* (`writePolicySnapshot` below) preserves the same convention: an empty
|
|
179
|
-
* list
|
|
194
|
+
* list writes no record rather than a deny-everything one.
|
|
180
195
|
*/
|
|
181
196
|
mcpAllowedServers: string[];
|
|
182
197
|
/**
|
|
@@ -187,6 +202,29 @@ export interface ResolvedPolicy {
|
|
|
187
202
|
* here degrades in.
|
|
188
203
|
*/
|
|
189
204
|
sqlDropStrictBlock: boolean;
|
|
205
|
+
/**
|
|
206
|
+
* The workspace's `sso_group_policy`, as `GET /api/v1/policy/resolve`
|
|
207
|
+
* serves it (`ssoGroupPolicy`). Absent or null: the workspace has none, and
|
|
208
|
+
* the snapshot is byte-identical to one written before group rules existed.
|
|
209
|
+
*/
|
|
210
|
+
ssoGroupPolicy?: SsoGroupPolicy | null;
|
|
211
|
+
/**
|
|
212
|
+
* The member the daemon's API key resolves to, with their SSO groups as the
|
|
213
|
+
* control plane read them for this response (`principal`). Null when the
|
|
214
|
+
* control plane named no member, which every gate reads as "groups unknown".
|
|
215
|
+
*/
|
|
216
|
+
principal?: {
|
|
217
|
+
memberId: string;
|
|
218
|
+
ssoGroups: string[];
|
|
219
|
+
} | null;
|
|
220
|
+
/**
|
|
221
|
+
* The workspace's MCP server registry decisions (`mcpRegistry`): blocked,
|
|
222
|
+
* held and approved servers, disabled tools and `mcpDefaultPolicy`. Written
|
|
223
|
+
* as an `@mcp_registry` record so the hook gates apply them to every
|
|
224
|
+
* `mcp__<server>__<tool>` call, not only the calls an MCP proxy fronts.
|
|
225
|
+
* Absent or null: an older control plane, and no record is written.
|
|
226
|
+
*/
|
|
227
|
+
mcpRegistry?: McpRegistryRecord | null;
|
|
190
228
|
}
|
|
191
229
|
export interface PolicySnapshotOptions {
|
|
192
230
|
controlPlaneUrl: string;
|
|
@@ -198,7 +236,7 @@ export interface PolicySnapshotOptions {
|
|
|
198
236
|
* `review_before:` tokens from the workspace's local SOPs and settings
|
|
199
237
|
* (`parseSopConstraints(...).reviewBefore`). Each becomes a `hold` rule,
|
|
200
238
|
* `sop.local.review_before.<token>`, so every gate holds on them — not only
|
|
201
|
-
* the Claude Code hook that used to bake them in
|
|
239
|
+
* the Claude Code hook that used to bake them in.
|
|
202
240
|
*/
|
|
203
241
|
localHoldTokens?: readonly string[];
|
|
204
242
|
}
|
|
@@ -228,6 +266,20 @@ export declare function writePolicySnapshot(policy: ResolvedPolicy, snapshotDir?
|
|
|
228
266
|
digest: string;
|
|
229
267
|
ruleCount: number;
|
|
230
268
|
}>;
|
|
269
|
+
/**
|
|
270
|
+
* Puts the last verified snapshot back when the live one differs from it.
|
|
271
|
+
*
|
|
272
|
+
* `'intact'`: the live snapshot is the verified one, or there is nothing to
|
|
273
|
+
* compare (no snapshot written yet, or a live one from before the verified
|
|
274
|
+
* copy existed that still verifies). `'restored'`: either live artifact was
|
|
275
|
+
* edited, replaced or deleted, and both are the verified copy again.
|
|
276
|
+
* `'unverifiable'`: the live `.rules` fails its digest and there is no
|
|
277
|
+
* verified copy to restore, so the caller fetches a fresh snapshot. Any
|
|
278
|
+
* difference counts, a valid-looking one included: the daemon is the only
|
|
279
|
+
* writer of these files, so an older snapshot copied back in is tampering
|
|
280
|
+
* too. Never throws.
|
|
281
|
+
*/
|
|
282
|
+
export declare function restoreVerifiedSnapshot(snapshotDir?: string): Promise<'intact' | 'restored' | 'unverifiable'>;
|
|
231
283
|
/**
|
|
232
284
|
* Fetch and write in one call. Safe to run on every sync cycle.
|
|
233
285
|
*
|
|
@@ -235,6 +287,8 @@ export declare function writePolicySnapshot(policy: ResolvedPolicy, snapshotDir?
|
|
|
235
287
|
* failed fetch leaves the previous snapshot in place, which is the correct
|
|
236
288
|
* degradation — stale rules stay enforced. If they expired into permissiveness,
|
|
237
289
|
* "kill the daemon and wait" would be a supported way to disarm governance.
|
|
290
|
+
* The one thing a failed fetch does change: when the control plane refuses
|
|
291
|
+
* the key itself, the member's SSO groups are forgotten (`forgetSnapshotMember`).
|
|
238
292
|
*/
|
|
239
293
|
export declare function refreshPolicySnapshot(opts: PolicySnapshotOptions): Promise<{
|
|
240
294
|
digest: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policySnapshot.d.ts","sourceRoot":"","sources":["../../src/lib/policySnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;
|
|
1
|
+
{"version":3,"file":"policySnapshot.d.ts","sourceRoot":"","sources":["../../src/lib/policySnapshot.ts"],"names":[],"mappings":"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"}
|