@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclawHooks.js","sourceRoot":"","sources":["../../src/harness/openclawHooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openclawHooks.js","sourceRoot":"","sources":["../../src/harness/openclawHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAEpE,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAA;AAE/C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAA;AAEtD,uDAAuD;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,kBAAkB,MAAM,CAAC,CAAA;AAE3G,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,qCAAqC,CAAA;AAE3E,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;AAC9D,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAA;AACtD,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,aAAqB,EAAE,WAAmB;IAC9F,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAA;IACzF,OAAO;KACJ,sBAAsB;;YAEf,QAAQ;gBACJ,MAAM,EAAE;;;;;;;;;;;;;;;;gFAgBwD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;;;EAWzG,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;sBAoB/H,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4D3C,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;;;;8DAIoB,oBAAoB,GAAG,IAAI;;;CAGxF,CAAA;AACD,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,0BAA0B;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,2CAA2C;IAC3C,IAAI,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA4B,CAAA;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,sDAAsD;IACtD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA4B,CAAA;AACxD,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAU,EAA2B,EAAE,CACvD,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAA;AAEhG;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAiC,EAAE,UAAkB;IACvF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACtE,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE;YACP,GAAG,OAAO;YACV,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtH,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,UAAU,CAAC,EAAE;SACtF;KACF,CAAA;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,kBAAkB,CAAC,MAA+B;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxC,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,0BAA0B,CAAA;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,OAAO,sBAAsB,kBAAkB,EAAE,CAAA;IAC/H,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,mBAAmB,kBAAkB,mBAAmB,CAAA;IAC9I,OAAO,IAAI,CAAA;AACb,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,aAAqB,EACrB,QAAgB,EAChB,WAAW,GAAG,EAAE;IAEhB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnF,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAA;IACvC,MAAM,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;IAC1G,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,oCAAoC,CAAC,CAAA;IAEvG,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAA;IACvC,IAAI,GAAG,GAAkB,IAAI,CAAA;IAC7B,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,UAAU,mBAAmB,CAAC,CAAA;YACnI,OAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,GAA4B,EAAE,CAAA;IAC1C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CACN,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,EACpD,GAAG,UAAU,yFAAyF,CACvG,CAAA;YACD,OAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,8CAA8C,OAAO,EAAE,CAAC,CAAA;IAC9I,CAAC;IAED,MAAM,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,UAAU,GAAG,cAAc,CAAA;IACvC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3G,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAChC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,wBAAwB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,wDAAwD,CAAC,CAAA;AAC5H,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;IACzB,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/G,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QACrG,MAAM,MAAM,GAAG,GAAG,CAAC,MAA4D,CAAA;QAC/E,MAAM,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAA;QAC9C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;IAClD,IAAI,OAAO;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -7,14 +7,25 @@
|
|
|
7
7
|
* The hooks file lives within the agent's sandbox working directory,
|
|
8
8
|
* so we also register it with the drift watcher.
|
|
9
9
|
*
|
|
10
|
-
* LLD #14 — Phase 3 cross-harness defence
|
|
11
10
|
* HLD §3.14 — Three-Tier Defense Cascade
|
|
12
11
|
*
|
|
13
12
|
* @module
|
|
14
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* `.openhands/hooks.json` in the OpenHands SDK's schema (\`HookConfig\`): each
|
|
16
|
+
* event a list of matchers, each with its hook definitions. Earlier versions
|
|
17
|
+
* wrote a flat list of \`{type: 'PreToolUse', command, failClosed}\`, which the
|
|
18
|
+
* SDK cannot load, and had extra top-level keys beside \`hooks\`, which it
|
|
19
|
+
* drops with a warning; the marker that tells disconnect the file is ours is
|
|
20
|
+
* now each hook's \`name\`. OpenHands runs a call whose hook times out, and
|
|
21
|
+
* has no setting to refuse instead, so the gate refuses at its own deadline,
|
|
22
|
+
* inside the \`timeout\` set here (default 60 s).
|
|
23
|
+
*/
|
|
24
|
+
export declare function openHandsHooksConfig(hookScriptPath: string): Record<string, unknown>;
|
|
15
25
|
/**
|
|
16
26
|
* Write .openhands/hooks.json and the pre-tool-check shell script.
|
|
17
|
-
* Also
|
|
27
|
+
* Also points `[llm] base_url` in ~/.openhands/config.toml at the proxy when
|
|
28
|
+
* that file exists.
|
|
18
29
|
*
|
|
19
30
|
* @param workspaceRoot - Absolute workspace root.
|
|
20
31
|
* @param proxyUrl - Intutic proxy URL.
|
|
@@ -22,16 +33,31 @@
|
|
|
22
33
|
*/
|
|
23
34
|
export declare function writeOpenHandsHooks(workspaceRoot: string, proxyUrl: string, workspaceId?: string): Promise<void>;
|
|
24
35
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
* Whether `config.toml` text is an OpenHands configuration. A file named
|
|
37
|
+
* `config.toml` is also every Hugo site's and many other tools', so the name
|
|
38
|
+
* alone is not evidence.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isOpenHandsConfig(raw: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Point `[llm] base_url` in an OpenHands `config.toml` at the proxy and keep
|
|
43
|
+
* the rest of the file. Returns `null` when the text is not valid TOML.
|
|
44
|
+
*/
|
|
45
|
+
export declare function mergeOpenHandsBaseUrl(raw: string, proxyUrl: string): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Point `[llm] base_url` in the workspace's OpenHands `config.toml` at the
|
|
48
|
+
* proxy, in the form the configured model's SDK expects (LiteLLM appends
|
|
49
|
+
* `/v1/messages` to an Anthropic base and `/chat/completions` to an
|
|
50
|
+
* OpenAI-style one), and keep the rest of the file.
|
|
51
|
+
*
|
|
52
|
+
* Earlier versions also wrote the rule sets into an `[intutic]` table, which
|
|
53
|
+
* OpenHands never reads (the rules now go into a microagent, see the
|
|
54
|
+
* adapter); that table is dropped. Earlier still, versions replaced the
|
|
55
|
+
* whole file, so a file starting with their header holds nothing of the
|
|
56
|
+
* user's and is regenerated.
|
|
30
57
|
*
|
|
31
58
|
* Edited line by line so the user's own settings and comments survive; the
|
|
32
|
-
* result is parsed before it is returned.
|
|
33
|
-
* file
|
|
34
|
-
* is regenerated. Returns `null` when the existing file is not valid TOML.
|
|
59
|
+
* result is parsed before it is returned. Returns `null` when the existing
|
|
60
|
+
* file is not valid TOML.
|
|
35
61
|
*/
|
|
36
|
-
export declare function mergeOpenHandsToml(raw: string, proxyUrl: string
|
|
62
|
+
export declare function mergeOpenHandsToml(raw: string, proxyUrl: string): string | null;
|
|
37
63
|
//# sourceMappingURL=openhandsHooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openhandsHooks.d.ts","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openhandsHooks.d.ts","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQpF;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAwGf;AAqDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAItD;AAuCD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUlF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU/E"}
|
|
@@ -7,22 +7,43 @@
|
|
|
7
7
|
* The hooks file lives within the agent's sandbox working directory,
|
|
8
8
|
* so we also register it with the drift watcher.
|
|
9
9
|
*
|
|
10
|
-
* LLD #14 — Phase 3 cross-harness defence
|
|
11
10
|
* HLD §3.14 — Three-Tier Defense Cascade
|
|
12
11
|
*
|
|
13
12
|
* @module
|
|
14
13
|
*/
|
|
15
14
|
import * as fs from 'node:fs/promises';
|
|
16
15
|
import * as path from 'node:path';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
17
|
import { createLogger } from '@intutic/logger';
|
|
18
|
+
import { keepOriginal, noteWritten } from '../disconnect/originals.js';
|
|
18
19
|
import { newIso } from '@intutic/id';
|
|
19
|
-
import { emitShellGate, SHELL_EXTRACT,
|
|
20
|
+
import { emitShellGate, SHELL_EXTRACT, emitShellFailClosed } from './gateBody.js';
|
|
20
21
|
import { parse as parseToml } from 'smol-toml';
|
|
21
|
-
import { anthropicBaseUrl, openaiBaseUrl } from '@intutic/shared-types';
|
|
22
|
+
import { anthropicBaseUrl, openaiBaseUrl, HOOK_TIMEOUT_SECONDS } from '@intutic/shared-types';
|
|
22
23
|
const log = createLogger('sync-openhands-hooks');
|
|
24
|
+
/**
|
|
25
|
+
* `.openhands/hooks.json` in the OpenHands SDK's schema (\`HookConfig\`): each
|
|
26
|
+
* event a list of matchers, each with its hook definitions. Earlier versions
|
|
27
|
+
* wrote a flat list of \`{type: 'PreToolUse', command, failClosed}\`, which the
|
|
28
|
+
* SDK cannot load, and had extra top-level keys beside \`hooks\`, which it
|
|
29
|
+
* drops with a warning; the marker that tells disconnect the file is ours is
|
|
30
|
+
* now each hook's \`name\`. OpenHands runs a call whose hook times out, and
|
|
31
|
+
* has no setting to refuse instead, so the gate refuses at its own deadline,
|
|
32
|
+
* inside the \`timeout\` set here (default 60 s).
|
|
33
|
+
*/
|
|
34
|
+
export function openHandsHooksConfig(hookScriptPath) {
|
|
35
|
+
const hook = (command) => ({ type: 'command', name: 'Intutic governance hook', command, timeout: HOOK_TIMEOUT_SECONDS });
|
|
36
|
+
return {
|
|
37
|
+
hooks: {
|
|
38
|
+
PreToolUse: [{ matcher: '*', hooks: [hook(hookScriptPath)] }],
|
|
39
|
+
Stop: [{ matcher: '*', hooks: [hook(`${hookScriptPath} --event stop`)] }],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
23
43
|
/**
|
|
24
44
|
* Write .openhands/hooks.json and the pre-tool-check shell script.
|
|
25
|
-
* Also
|
|
45
|
+
* Also points `[llm] base_url` in ~/.openhands/config.toml at the proxy when
|
|
46
|
+
* that file exists.
|
|
26
47
|
*
|
|
27
48
|
* @param workspaceRoot - Absolute workspace root.
|
|
28
49
|
* @param proxyUrl - Intutic proxy URL.
|
|
@@ -30,6 +51,9 @@ const log = createLogger('sync-openhands-hooks');
|
|
|
30
51
|
*/
|
|
31
52
|
export async function writeOpenHandsHooks(workspaceRoot, proxyUrl, workspaceId = '') {
|
|
32
53
|
const openhandsDir = path.join(workspaceRoot, '.openhands');
|
|
54
|
+
const hooksPath = path.join(openhandsDir, 'hooks.json');
|
|
55
|
+
// Written whole, over whatever hooks the user had there: kept for disconnect.
|
|
56
|
+
await keepOriginal(hooksPath, workspaceRoot);
|
|
33
57
|
await fs.mkdir(openhandsDir, { recursive: true });
|
|
34
58
|
const hookScriptDir = path.join(workspaceRoot, '.intutic', 'hooks');
|
|
35
59
|
await fs.mkdir(hookScriptDir, { recursive: true });
|
|
@@ -46,7 +70,7 @@ export async function writeOpenHandsHooks(workspaceRoot, proxyUrl, workspaceId =
|
|
|
46
70
|
# Proxy: ${proxyUrl}
|
|
47
71
|
# Generated: ${newIso()}
|
|
48
72
|
set -euo pipefail
|
|
49
|
-
${
|
|
73
|
+
${emitShellFailClosed('openhands')}
|
|
50
74
|
INPUT="$(cat)"
|
|
51
75
|
${SHELL_EXTRACT}
|
|
52
76
|
|
|
@@ -86,7 +110,11 @@ log_event() {
|
|
|
86
110
|
ws="\${ws//\\\\/\\\\\\\\}"; ws="\${ws//\\"/\\\\\\"}"; ws="\${ws//[\$'\\x01'-\$'\\x1f']/ }"
|
|
87
111
|
local ts; ts="\$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
88
112
|
local incident_id; incident_id="\$(printf '%s' "\${ts}\${tool}\${INTUTIC_WORKSPACE_ID}" | sha1sum 2>/dev/null | cut -c1-16 || echo \"\$(date +%s)\")"
|
|
89
|
-
|
|
113
|
+
# The event's id: random, made once here, and resent with the line it is
|
|
114
|
+
# written into, so the control plane processes the event once.
|
|
115
|
+
local event_id; event_id="\$(od -An -N16 -tx1 /dev/urandom 2>/dev/null | tr -d ' \\n' || true)"
|
|
116
|
+
[ -n "\$event_id" ] || event_id="\$(date +%s)\$\$\${RANDOM}\${RANDOM}\${RANDOM}"
|
|
117
|
+
local entry="{\\"event\\":\\"\${verdict}\\",\\"toolName\\":\\"\${tool}\\",\\"reason\\":\\"\${reason}\\",\\"workspaceId\\":\\"\${ws}\\",\\"harnessType\\":\\"openhands\\",\\"timestamp\\":\\"\${ts}\\",\\"incidentId\\":\\"\${incident_id}\\",\\"eventId\\":\\"\${event_id}\\"}"
|
|
90
118
|
# Path B: reliable file append
|
|
91
119
|
printf '%s\\n' "\$entry" >> "\$HOOK_EVENTS_LOG" 2>/dev/null || true
|
|
92
120
|
# Path A: fire-and-forget HTTP (non-blocking, near-real-time)
|
|
@@ -108,68 +136,46 @@ exit 0
|
|
|
108
136
|
await fs.rename(tmpScript, hookScriptPath);
|
|
109
137
|
await fs.chmod(hookScriptPath, 0o755);
|
|
110
138
|
// ── .openhands/hooks.json ──────────────────────────────────────────
|
|
111
|
-
const
|
|
112
|
-
_comment: 'Intutic governance hooks — auto-generated. DO NOT EDIT.',
|
|
113
|
-
_lastSync: newIso(),
|
|
114
|
-
hooks: [
|
|
115
|
-
{
|
|
116
|
-
type: 'PreToolUse',
|
|
117
|
-
command: hookScriptPath,
|
|
118
|
-
failClosed: true,
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
type: 'Stop',
|
|
122
|
-
command: `${hookScriptPath} --event stop`,
|
|
123
|
-
failClosed: false,
|
|
124
|
-
},
|
|
125
|
-
],
|
|
126
|
-
};
|
|
127
|
-
const hooksPath = path.join(openhandsDir, 'hooks.json');
|
|
139
|
+
const hooksJson = JSON.stringify(openHandsHooksConfig(hookScriptPath), null, 2) + '\n';
|
|
128
140
|
const tmpHooks = hooksPath + '.intutic-tmp';
|
|
129
|
-
await fs.writeFile(tmpHooks,
|
|
141
|
+
await fs.writeFile(tmpHooks, hooksJson, 'utf-8');
|
|
130
142
|
await fs.rename(tmpHooks, hooksPath);
|
|
143
|
+
await noteWritten(hooksPath, workspaceRoot, hooksJson);
|
|
131
144
|
log.info({ action: 'openhands_hooks_written', path: hooksPath }, 'OpenHands hooks written');
|
|
132
|
-
// ── config.toml llm.base_url
|
|
133
|
-
|
|
145
|
+
// ── user-level config.toml llm.base_url ───────────────────────────
|
|
146
|
+
// The workspace config.toml is the adapter's: it merges `[llm] base_url`
|
|
147
|
+
// there (`mergeOpenHandsToml`).
|
|
148
|
+
await mergeUserOpenHandsConfig(proxyUrl);
|
|
134
149
|
}
|
|
135
150
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
151
|
+
* Point `[llm] base_url` in `~/.openhands/config.toml` at the proxy, when that
|
|
152
|
+
* file exists. Only that key is set; a file that does not parse is left alone.
|
|
153
|
+
* An empty `proxyUrl` (the settings guard restoring hooks.json) changes
|
|
154
|
+
* nothing.
|
|
138
155
|
*/
|
|
139
|
-
async function
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
// Inject or update [llm] section with base_url
|
|
155
|
-
if (existing.includes('[llm]')) {
|
|
156
|
-
// Update existing [llm] section
|
|
157
|
-
if (existing.includes('base_url')) {
|
|
158
|
-
existing = existing.replace(/^base_url\s*=\s*.*/m, `base_url = "${proxyUrl}"`);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
existing = existing.replace(/\[llm\]/, `[llm]\nbase_url = "${proxyUrl}"`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
existing += `\n[llm]\nbase_url = "${proxyUrl}"\n`;
|
|
166
|
-
}
|
|
167
|
-
const tmpConfig = configPath + '.intutic-tmp';
|
|
168
|
-
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
169
|
-
await fs.writeFile(tmpConfig, existing, 'utf-8');
|
|
170
|
-
await fs.rename(tmpConfig, configPath);
|
|
171
|
-
log.info({ action: 'openhands_config_written', path: configPath }, 'OpenHands config.toml updated with proxy base_url');
|
|
156
|
+
async function mergeUserOpenHandsConfig(proxyUrl) {
|
|
157
|
+
if (!proxyUrl)
|
|
158
|
+
return;
|
|
159
|
+
const configPath = path.join(os.homedir(), '.openhands', 'config.toml');
|
|
160
|
+
let raw;
|
|
161
|
+
try {
|
|
162
|
+
raw = await fs.readFile(configPath, 'utf-8');
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const next = mergeOpenHandsBaseUrl(raw, proxyUrl);
|
|
168
|
+
if (next === null) {
|
|
169
|
+
log.warn({ action: 'openhands_config_merge_skipped', path: configPath }, `${configPath} is not valid TOML — left untouched`);
|
|
170
|
+
return;
|
|
172
171
|
}
|
|
172
|
+
if (next === raw)
|
|
173
|
+
return;
|
|
174
|
+
const tmpConfig = configPath + '.intutic-tmp';
|
|
175
|
+
await keepOriginal(configPath, os.homedir());
|
|
176
|
+
await fs.writeFile(tmpConfig, next, 'utf-8');
|
|
177
|
+
await fs.rename(tmpConfig, configPath);
|
|
178
|
+
log.info({ action: 'openhands_config_written', path: configPath }, 'OpenHands config.toml updated with proxy base_url');
|
|
173
179
|
}
|
|
174
180
|
// ─── config.toml merge ───────────────────────────────────────────────────────
|
|
175
181
|
/** First line of the file earlier adapter versions wrote over config.toml. */
|
|
@@ -182,6 +188,26 @@ function parsesAsToml(text) {
|
|
|
182
188
|
return null;
|
|
183
189
|
}
|
|
184
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Tables only OpenHands' own `config.toml` uses, from its configuration
|
|
193
|
+
* template (https://github.com/OpenHands/OpenHands/blob/0.59.0/config.template.toml:
|
|
194
|
+
* `[core]`, `[llm]`, `[agent]`, `[sandbox]`, `[security]`, `[condenser]`,
|
|
195
|
+
* `[kubernetes]`, `[mcp]`, `[model_routing]`). `[llm]`, `[mcp]` and
|
|
196
|
+
* `[security]` are left out: other tools use those names too. `[intutic]` is
|
|
197
|
+
* the table an earlier `intutic connect` wrote.
|
|
198
|
+
*/
|
|
199
|
+
const OPENHANDS_TABLES = ['core', 'agent', 'sandbox', 'condenser', 'intutic'];
|
|
200
|
+
/**
|
|
201
|
+
* Whether `config.toml` text is an OpenHands configuration. A file named
|
|
202
|
+
* `config.toml` is also every Hugo site's and many other tools', so the name
|
|
203
|
+
* alone is not evidence.
|
|
204
|
+
*/
|
|
205
|
+
export function isOpenHandsConfig(raw) {
|
|
206
|
+
const parsed = parsesAsToml(raw);
|
|
207
|
+
if (parsed === null)
|
|
208
|
+
return false;
|
|
209
|
+
return OPENHANDS_TABLES.some((t) => typeof parsed[t] === 'object' && parsed[t] !== null && !Array.isArray(parsed[t]));
|
|
210
|
+
}
|
|
185
211
|
/** Index of the line that starts table `name`, or -1. */
|
|
186
212
|
function tableStart(lines, name) {
|
|
187
213
|
return lines.findIndex((l) => l.trim() === `[${name}]`);
|
|
@@ -191,52 +217,77 @@ function tableEnd(lines, start) {
|
|
|
191
217
|
const next = lines.findIndex((l, i) => i > start && /^\s*\[/.test(l));
|
|
192
218
|
return next === -1 ? lines.length : next;
|
|
193
219
|
}
|
|
194
|
-
/**
|
|
195
|
-
|
|
196
|
-
* - `[llm] base_url` — the proxy, in the form the configured model's SDK
|
|
197
|
-
* expects (LiteLLM appends `/v1/messages` to an Anthropic base and
|
|
198
|
-
* `/chat/completions` to an OpenAI-style one);
|
|
199
|
-
* - an `[intutic]` table carrying the SOP text, replaced whole each sync.
|
|
200
|
-
*
|
|
201
|
-
* Edited line by line so the user's own settings and comments survive; the
|
|
202
|
-
* result is parsed before it is returned. Earlier versions replaced the whole
|
|
203
|
-
* file, so a file starting with their header holds nothing of the user's and
|
|
204
|
-
* is regenerated. Returns `null` when the existing file is not valid TOML.
|
|
205
|
-
*/
|
|
206
|
-
export function mergeOpenHandsToml(raw, proxyUrl, instructions) {
|
|
207
|
-
const source = raw.startsWith(LEGACY_HEADER) ? '' : raw;
|
|
208
|
-
const parsed = parsesAsToml(source);
|
|
209
|
-
if (parsed === null)
|
|
210
|
-
return null;
|
|
220
|
+
/** The proxy URL in the form the configured model's SDK expects. */
|
|
221
|
+
function llmBaseUrl(parsed, proxyUrl) {
|
|
211
222
|
const llm = (parsed['llm'] ?? {});
|
|
212
223
|
const model = typeof llm['model'] === 'string' ? llm['model'] : '';
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
224
|
+
return /^(anthropic\/|claude)/.test(model) ? anthropicBaseUrl(proxyUrl) : openaiBaseUrl(proxyUrl);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Set `base_url` inside the `[llm]` table only, adding the table when there
|
|
228
|
+
* is none. A `base_url` in any other table (`[llm.<name>]`, `[mcp]`, …) is
|
|
229
|
+
* not this key and is left as it is.
|
|
230
|
+
*/
|
|
231
|
+
function setLlmBaseUrl(lines, baseUrl) {
|
|
219
232
|
const baseLine = `base_url = ${JSON.stringify(baseUrl)}`;
|
|
220
233
|
const llmStart = tableStart(lines, 'llm');
|
|
221
234
|
if (llmStart === -1) {
|
|
222
|
-
lines.
|
|
235
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === '')
|
|
236
|
+
lines.pop();
|
|
237
|
+
lines.push('', '[llm]', baseLine, '');
|
|
238
|
+
return;
|
|
223
239
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
240
|
+
const end = tableEnd(lines, llmStart);
|
|
241
|
+
const existing = lines.findIndex((l, i) => i > llmStart && i < end && /^\s*base_url\s*=/.test(l));
|
|
242
|
+
if (existing !== -1)
|
|
243
|
+
lines[existing] = baseLine;
|
|
244
|
+
else
|
|
245
|
+
lines.splice(llmStart + 1, 0, baseLine);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Point `[llm] base_url` in an OpenHands `config.toml` at the proxy and keep
|
|
249
|
+
* the rest of the file. Returns `null` when the text is not valid TOML.
|
|
250
|
+
*/
|
|
251
|
+
export function mergeOpenHandsBaseUrl(raw, proxyUrl) {
|
|
252
|
+
const parsed = parsesAsToml(raw);
|
|
253
|
+
if (parsed === null)
|
|
254
|
+
return null;
|
|
255
|
+
const baseUrl = llmBaseUrl(parsed, proxyUrl);
|
|
256
|
+
const lines = raw.split('\n');
|
|
257
|
+
setLlmBaseUrl(lines, baseUrl);
|
|
236
258
|
const next = (lines[0] === '' ? lines.slice(1) : lines).join('\n');
|
|
237
259
|
const check = parsesAsToml(next);
|
|
238
260
|
if (check === null || check['llm']?.['base_url'] !== baseUrl)
|
|
239
261
|
return null;
|
|
240
262
|
return next;
|
|
241
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Point `[llm] base_url` in the workspace's OpenHands `config.toml` at the
|
|
266
|
+
* proxy, in the form the configured model's SDK expects (LiteLLM appends
|
|
267
|
+
* `/v1/messages` to an Anthropic base and `/chat/completions` to an
|
|
268
|
+
* OpenAI-style one), and keep the rest of the file.
|
|
269
|
+
*
|
|
270
|
+
* Earlier versions also wrote the rule sets into an `[intutic]` table, which
|
|
271
|
+
* OpenHands never reads (the rules now go into a microagent, see the
|
|
272
|
+
* adapter); that table is dropped. Earlier still, versions replaced the
|
|
273
|
+
* whole file, so a file starting with their header holds nothing of the
|
|
274
|
+
* user's and is regenerated.
|
|
275
|
+
*
|
|
276
|
+
* Edited line by line so the user's own settings and comments survive; the
|
|
277
|
+
* result is parsed before it is returned. Returns `null` when the existing
|
|
278
|
+
* file is not valid TOML.
|
|
279
|
+
*/
|
|
280
|
+
export function mergeOpenHandsToml(raw, proxyUrl) {
|
|
281
|
+
const source = raw.startsWith(LEGACY_HEADER) ? '' : raw;
|
|
282
|
+
if (parsesAsToml(source) === null)
|
|
283
|
+
return null;
|
|
284
|
+
const lines = source.split('\n');
|
|
285
|
+
const oldIntutic = tableStart(lines, 'intutic');
|
|
286
|
+
if (oldIntutic !== -1) {
|
|
287
|
+
lines.splice(oldIntutic, tableEnd(lines, oldIntutic) - oldIntutic);
|
|
288
|
+
while (lines.length > 1 && lines[lines.length - 1].trim() === '' && lines[lines.length - 2].trim() === '')
|
|
289
|
+
lines.pop();
|
|
290
|
+
}
|
|
291
|
+
return mergeOpenHandsBaseUrl(lines.join('\n'), proxyUrl);
|
|
292
|
+
}
|
|
242
293
|
//# sourceMappingURL=openhandsHooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openhandsHooks.js","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openhandsHooks.js","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,54 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* piHooks.ts — Pi (earendil-works/pi)
|
|
2
|
+
* piHooks.ts — Pi (earendil-works/pi) extension gate and provider routing.
|
|
3
3
|
*
|
|
4
|
-
* Pi
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Pi has no hook file. Its hooks are extensions: TypeScript or JavaScript
|
|
5
|
+
* modules it loads into its own process from `~/.pi/agent/extensions/` (and a
|
|
6
|
+
* trusted project's `.pi/extensions/`), each a default-exported factory that
|
|
7
|
+
* receives the `ExtensionAPI`. Earlier versions of this writer registered a
|
|
8
|
+
* Claude-Code-style `PreToolUse` hook in `~/.pi/hooks.json`, a file Pi never
|
|
9
|
+
* reads, and pointed providers at the proxy in `~/.pi/models.json`, where Pi
|
|
10
|
+
* does not look either: both live in the agent directory, `~/.pi/agent`.
|
|
11
|
+
* Sources, at earendil-works/pi 6fb2e7815167e6b19006fc526d1a5d0f5f998787:
|
|
7
12
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
+
* - discovery: `packages/coding-agent/src/core/extensions/loader.ts`
|
|
14
|
+
* (`discoverExtensionsInDir`: direct `*.ts`/`*.js` files, or `<dir>/index.*`;
|
|
15
|
+
* loaded with jiti, `{ default: true }`, and the default export must be a
|
|
16
|
+
* function), `packages/coding-agent/docs/configuration.md` (the agent
|
|
17
|
+
* directory and `models.json`);
|
|
18
|
+
* - the hook: `pi.on("tool_call", handler)`, with
|
|
19
|
+
* `event = { type: "tool_call", toolName, toolCallId, input }`, refused by
|
|
20
|
+
* returning `{ block: true, reason }` (`core/extensions/types.ts`,
|
|
21
|
+
* `ToolCallEventResult`). The agent loop turns the reason into the error
|
|
22
|
+
* result the model reads (`packages/agent/src/agent-loop.ts`).
|
|
23
|
+
* - failure: "A `tool_call` handler failure blocks the tool as a fail-safe"
|
|
24
|
+
* (`docs/extensions.md`); `ExtensionRunner.emitToolCall` awaits each
|
|
25
|
+
* handler with no timeout (`core/extensions/runner.ts`), so a handler that
|
|
26
|
+
* hangs hangs Pi. The gate body therefore runs under its own deadline
|
|
27
|
+
* (`gateDeadlineMs('pi')`), from the start of each call, and refuses past it.
|
|
13
28
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
29
|
+
* The extension embeds the shared `emitJsGate` body (`'throw'` contract) and
|
|
30
|
+
* returns Pi's block result for the refusal it throws; any other fault is a
|
|
31
|
+
* block too. Pi names MCP tools `mcp__<server>__<tool>` already
|
|
32
|
+
* (`docs/mcp.md`), and calls a tool makes through `ctx.executeTool()` pass
|
|
33
|
+
* through `tool_call` handlers like the model's own (`docs/extensions.md`).
|
|
34
|
+
*
|
|
35
|
+
* The file is ESM with `createRequire`, the shape the OpenCode plugin uses:
|
|
36
|
+
* Node (Pi needs 22.19 or later) detects the module syntax, and jiti
|
|
37
|
+
* transforms the file where native loading fails and in Pi's compiled binary
|
|
38
|
+
* (`core/extensions/jiti-loader.ts`, `loader.ts`).
|
|
39
|
+
*
|
|
40
|
+
* Only the default agent directory is written. A user who moves it with
|
|
41
|
+
* `PI_CODING_AGENT_DIR` copies the extension there (the Pi integration page
|
|
42
|
+
* says so).
|
|
17
43
|
*
|
|
18
44
|
* @module
|
|
19
45
|
*/
|
|
46
|
+
/** Pi's default agent directory, relative to the home directory. */
|
|
47
|
+
export declare const PI_AGENT_DIR: string;
|
|
48
|
+
/** The extension file, relative to the home directory. */
|
|
49
|
+
export declare const PI_EXTENSION_FILE: string;
|
|
50
|
+
/** The first line of the extension's header, which disconnect recognises it by. */
|
|
51
|
+
export declare const PI_EXTENSION_MARKER = "Intutic Pi governance extension.";
|
|
20
52
|
interface PiProvider {
|
|
21
53
|
baseUrl?: string;
|
|
22
54
|
[key: string]: unknown;
|
|
@@ -25,20 +57,23 @@ interface PiModelsConfig {
|
|
|
25
57
|
providers?: Record<string, PiProvider>;
|
|
26
58
|
[key: string]: unknown;
|
|
27
59
|
}
|
|
60
|
+
export declare function buildPiExtension(proxyUrl: string, workspaceRoot: string, workspaceId: string): string;
|
|
28
61
|
/**
|
|
29
62
|
* Merge Pi models.json — point the anthropic and openai providers at the
|
|
30
63
|
* proxy, each with the base URL its SDK expects (the Anthropic SDK appends
|
|
31
64
|
* `/v1/messages`, the OpenAI one `/chat/completions`). Google is left alone:
|
|
32
65
|
* the proxy does not serve the Gemini API, so routing it there would break it.
|
|
33
|
-
* Every other provider and key is kept.
|
|
66
|
+
* Every other provider and key is kept. A provider entry may carry `baseUrl`
|
|
67
|
+
* alone (`ProviderConfigSchema` in `packages/coding-agent/src/core/model-config.ts`).
|
|
34
68
|
*/
|
|
35
69
|
export declare function mergePiModels(existing: PiModelsConfig, proxyUrl: string): PiModelsConfig;
|
|
36
70
|
/**
|
|
37
|
-
* Write the Pi governance
|
|
38
|
-
*
|
|
71
|
+
* Write the Pi governance extension into `~/.pi/agent/extensions/` and merge
|
|
72
|
+
* the proxy routing into `~/.pi/agent/models.json`.
|
|
39
73
|
*
|
|
40
|
-
* Safe to call repeatedly
|
|
41
|
-
*
|
|
74
|
+
* Safe to call repeatedly: atomic renames and a fixed file name, so repeated
|
|
75
|
+
* syncs replace rather than stack. Pi discovers the extension by scanning the
|
|
76
|
+
* directory; nothing registers it.
|
|
42
77
|
*
|
|
43
78
|
* @param workspaceRoot - Absolute workspace root path.
|
|
44
79
|
* @param proxyUrl - Intutic proxy URL for LLM provider routing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piHooks.d.ts","sourceRoot":"","sources":["../../src/harness/piHooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"piHooks.d.ts","sourceRoot":"","sources":["../../src/harness/piHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAcH,oEAAoE;AACpE,eAAO,MAAM,YAAY,QAA4B,CAAA;AAErD,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,QAAiE,CAAA;AAE/F,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,qCAAqC,CAAA;AAErE,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyHrG;AAID;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAmBxF;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|