@intutic/sync-daemon 2.0.0 → 2.2.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/agentReporter.d.ts +5 -12
- package/dist/agentReporter.d.ts.map +1 -1
- package/dist/agentReporter.js +25 -4
- package/dist/agentReporter.js.map +1 -1
- package/dist/configReader.d.ts +44 -22
- package/dist/configReader.d.ts.map +1 -1
- package/dist/configReader.js +70 -44
- package/dist/configReader.js.map +1 -1
- package/dist/configWriter.d.ts +29 -41
- package/dist/configWriter.d.ts.map +1 -1
- package/dist/configWriter.js +28 -625
- package/dist/configWriter.js.map +1 -1
- package/dist/disconnect/harnesses.d.ts +31 -0
- package/dist/disconnect/harnesses.d.ts.map +1 -0
- package/dist/disconnect/harnesses.js +728 -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 +82 -0
- package/dist/disconnect/index.js.map +1 -0
- package/dist/disconnect/mcp.d.ts +60 -0
- package/dist/disconnect/mcp.d.ts.map +1 -0
- package/dist/disconnect/mcp.js +283 -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 +98 -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 +42 -5
- package/dist/harness/aiderConfigMerger.d.ts.map +1 -1
- package/dist/harness/aiderConfigMerger.js +113 -86
- package/dist/harness/aiderConfigMerger.js.map +1 -1
- package/dist/harness/antigravityHooks.d.ts +13 -8
- package/dist/harness/antigravityHooks.d.ts.map +1 -1
- package/dist/harness/antigravityHooks.js +53 -39
- package/dist/harness/antigravityHooks.js.map +1 -1
- package/dist/harness/claudeCodeHooks.d.ts +1 -2
- package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
- package/dist/harness/claudeCodeHooks.js +61 -34
- package/dist/harness/claudeCodeHooks.js.map +1 -1
- package/dist/harness/claudeDesktopHooks.d.ts +3 -0
- package/dist/harness/claudeDesktopHooks.d.ts.map +1 -1
- package/dist/harness/claudeDesktopHooks.js +3 -1
- package/dist/harness/claudeDesktopHooks.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 +39 -9
- package/dist/harness/clineHooks.d.ts.map +1 -1
- package/dist/harness/clineHooks.js +142 -60
- package/dist/harness/clineHooks.js.map +1 -1
- package/dist/harness/codexConfigMerger.d.ts +38 -0
- package/dist/harness/codexConfigMerger.d.ts.map +1 -0
- package/dist/harness/codexConfigMerger.js +105 -0
- package/dist/harness/codexConfigMerger.js.map +1 -0
- package/dist/harness/codexHooks.d.ts +4 -2
- package/dist/harness/codexHooks.d.ts.map +1 -1
- package/dist/harness/codexHooks.js +14 -11
- package/dist/harness/codexHooks.js.map +1 -1
- package/dist/harness/continueConfigMerger.d.ts +46 -0
- package/dist/harness/continueConfigMerger.d.ts.map +1 -0
- package/dist/harness/continueConfigMerger.js +94 -0
- package/dist/harness/continueConfigMerger.js.map +1 -0
- package/dist/harness/continueHooks.d.ts +15 -25
- package/dist/harness/continueHooks.d.ts.map +1 -1
- package/dist/harness/continueHooks.js +25 -119
- package/dist/harness/continueHooks.js.map +1 -1
- package/dist/harness/cursorHooks.d.ts +33 -16
- package/dist/harness/cursorHooks.d.ts.map +1 -1
- package/dist/harness/cursorHooks.js +69 -25
- package/dist/harness/cursorHooks.js.map +1 -1
- package/dist/harness/dshHooks.d.ts +59 -52
- package/dist/harness/dshHooks.d.ts.map +1 -1
- package/dist/harness/dshHooks.js +152 -147
- package/dist/harness/dshHooks.js.map +1 -1
- package/dist/harness/gateBody.d.ts +11 -2
- package/dist/harness/gateBody.d.ts.map +1 -1
- package/dist/harness/gateBody.js +33 -6
- package/dist/harness/gateBody.js.map +1 -1
- package/dist/harness/gateKind.d.ts.map +1 -1
- package/dist/harness/gateKind.js +1 -0
- package/dist/harness/gateKind.js.map +1 -1
- package/dist/harness/githubCopilotHooks.d.ts.map +1 -1
- package/dist/harness/githubCopilotHooks.js +5 -10
- package/dist/harness/githubCopilotHooks.js.map +1 -1
- package/dist/harness/gooseHooks.d.ts +15 -0
- package/dist/harness/gooseHooks.d.ts.map +1 -1
- package/dist/harness/gooseHooks.js +55 -43
- package/dist/harness/gooseHooks.js.map +1 -1
- package/dist/harness/grokHooks.d.ts.map +1 -1
- package/dist/harness/grokHooks.js +14 -12
- package/dist/harness/grokHooks.js.map +1 -1
- package/dist/harness/hermesHooks.d.ts +9 -0
- package/dist/harness/hermesHooks.d.ts.map +1 -1
- package/dist/harness/hermesHooks.js +39 -33
- 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/jsonMergeTarget.d.ts +23 -0
- package/dist/harness/jsonMergeTarget.d.ts.map +1 -0
- package/dist/harness/jsonMergeTarget.js +50 -0
- package/dist/harness/jsonMergeTarget.js.map +1 -0
- package/dist/harness/mcpAutoWrite.d.ts +64 -20
- package/dist/harness/mcpAutoWrite.d.ts.map +1 -1
- package/dist/harness/mcpAutoWrite.js +429 -85
- package/dist/harness/mcpAutoWrite.js.map +1 -1
- package/dist/harness/museHooks.d.ts.map +1 -1
- package/dist/harness/museHooks.js +6 -2
- package/dist/harness/museHooks.js.map +1 -1
- package/dist/harness/n8nHooks.d.ts.map +1 -1
- package/dist/harness/n8nHooks.js +6 -7
- package/dist/harness/n8nHooks.js.map +1 -1
- package/dist/harness/openCodeHooks.d.ts +37 -6
- package/dist/harness/openCodeHooks.d.ts.map +1 -1
- package/dist/harness/openCodeHooks.js +103 -13
- package/dist/harness/openCodeHooks.js.map +1 -1
- package/dist/harness/openWebuiHooks.d.ts.map +1 -1
- package/dist/harness/openWebuiHooks.js +10 -5
- package/dist/harness/openWebuiHooks.js.map +1 -1
- package/dist/harness/openclawHooks.d.ts +5 -0
- package/dist/harness/openclawHooks.d.ts.map +1 -1
- package/dist/harness/openclawHooks.js +3 -1
- package/dist/harness/openclawHooks.js.map +1 -1
- package/dist/harness/openhandsHooks.d.ts +26 -1
- package/dist/harness/openhandsHooks.d.ts.map +1 -1
- package/dist/harness/openhandsHooks.js +160 -40
- package/dist/harness/openhandsHooks.js.map +1 -1
- package/dist/harness/piHooks.d.ts +17 -0
- package/dist/harness/piHooks.d.ts.map +1 -1
- package/dist/harness/piHooks.js +31 -29
- package/dist/harness/piHooks.js.map +1 -1
- package/dist/harness/protectedPaths.d.ts +64 -6
- package/dist/harness/protectedPaths.d.ts.map +1 -1
- package/dist/harness/protectedPaths.js +161 -11
- package/dist/harness/protectedPaths.js.map +1 -1
- package/dist/harness/rooCodeHooks.d.ts.map +1 -1
- package/dist/harness/rooCodeHooks.js +5 -10
- package/dist/harness/rooCodeHooks.js.map +1 -1
- package/dist/harness/windsurfHooks.d.ts +21 -3
- package/dist/harness/windsurfHooks.d.ts.map +1 -1
- package/dist/harness/windsurfHooks.js +96 -44
- package/dist/harness/windsurfHooks.js.map +1 -1
- package/dist/harness/windsurfJetBrainsProxy.d.ts +10 -7
- package/dist/harness/windsurfJetBrainsProxy.d.ts.map +1 -1
- package/dist/harness/windsurfJetBrainsProxy.js +22 -7
- package/dist/harness/windsurfJetBrainsProxy.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/decisionsDigest.d.ts +1 -1
- package/dist/lib/decisionsDigest.js +1 -1
- package/dist/lib/policySnapshot.d.ts +37 -0
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +170 -8
- package/dist/lib/policySnapshot.js.map +1 -1
- package/dist/sessionReporter.d.ts +2 -2
- package/dist/sessionReporter.js +2 -2
- package/dist/syncCycle.d.ts +142 -0
- package/dist/syncCycle.d.ts.map +1 -0
- package/dist/syncCycle.js +315 -0
- package/dist/syncCycle.js.map +1 -0
- package/dist/trajectoryMonitor.d.ts +1 -1
- package/dist/trajectoryMonitor.d.ts.map +1 -1
- package/dist/trajectoryMonitor.js +1 -1
- package/dist/trajectoryMonitor.js.map +1 -1
- package/dist/watcher/settingsGuard.d.ts +4 -1
- package/dist/watcher/settingsGuard.d.ts.map +1 -1
- package/dist/watcher/settingsGuard.js +42 -18
- package/dist/watcher/settingsGuard.js.map +1 -1
- package/package.json +6 -6
- 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
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
*
|
|
20
20
|
* @module
|
|
21
21
|
*/
|
|
22
|
+
/**
|
|
23
|
+
* Attempt to parse a JSON5-like string by progressively stripping
|
|
24
|
+
* non-standard syntax. Returns a plain JS object or throws if unparseable.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseJson5Like(raw: string): Record<string, unknown>;
|
|
22
27
|
/**
|
|
23
28
|
* Write the Openclaw governance hook script and merge hook configuration
|
|
24
29
|
* into `~/.openclaw/openclaw.json`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclawHooks.d.ts","sourceRoot":"","sources":["../../src/harness/openclawHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"openclawHooks.d.ts","sourceRoot":"","sources":["../../src/harness/openclawHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAkJH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBnE;AAmCD;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
|
@@ -25,6 +25,7 @@ import * as os from 'node:os';
|
|
|
25
25
|
import { exec } from 'node:child_process';
|
|
26
26
|
import { promisify } from 'node:util';
|
|
27
27
|
import { createLogger } from '@intutic/logger';
|
|
28
|
+
import { keepOriginal } from '../disconnect/originals.js';
|
|
28
29
|
import { newIso } from '@intutic/id';
|
|
29
30
|
import { emitJsGate, emitJsFailClosedPrelude } from './gateBody.js';
|
|
30
31
|
const log = createLogger('sync-openclaw-hooks');
|
|
@@ -155,7 +156,7 @@ process.stdin.on('end', () => {
|
|
|
155
156
|
* Attempt to parse a JSON5-like string by progressively stripping
|
|
156
157
|
* non-standard syntax. Returns a plain JS object or throws if unparseable.
|
|
157
158
|
*/
|
|
158
|
-
function parseJson5Like(raw) {
|
|
159
|
+
export function parseJson5Like(raw) {
|
|
159
160
|
// Attempt 1: vanilla JSON
|
|
160
161
|
try {
|
|
161
162
|
return JSON.parse(raw);
|
|
@@ -219,6 +220,7 @@ export async function writeOpenclawHooks(workspaceRoot, proxyUrl, workspaceId =
|
|
|
219
220
|
const hookEventsDir = path.join(workspaceRoot, '.intutic', 'events');
|
|
220
221
|
const envDir = path.join(workspaceRoot, '.intutic', 'env');
|
|
221
222
|
const openclawDir = path.join(os.homedir(), '.openclaw');
|
|
223
|
+
await keepOriginal(OPENCLAW_CONFIG, workspaceRoot);
|
|
222
224
|
await Promise.all([
|
|
223
225
|
fs.mkdir(globalHookDir, { recursive: true }),
|
|
224
226
|
fs.mkdir(hookEventsDir, { recursive: true }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclawHooks.js","sourceRoot":"","sources":["../../src/harness/openclawHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAEnE,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAA;AAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AAEjC,+CAA+C;AAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;AAE7E,8DAA8D;AAE9D,gFAAgF;AAEhF,SAAS,wBAAwB,CAC/B,aAAqB,EACrB,WAAmB,EACnB,QAAgB;IAEhB,OAAO;;;;YAIG,QAAQ;gBACJ,MAAM,EAAE;gBACR,WAAW;;;EAGzB,uBAAuB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;;;;;;;;;gFASW,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;;;EAWzG,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;wBAyBhC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DpD,CAAA;AACD,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"openclawHooks.js","sourceRoot":"","sources":["../../src/harness/openclawHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,36 @@
|
|
|
14
14
|
*/
|
|
15
15
|
/**
|
|
16
16
|
* Write .openhands/hooks.json and the pre-tool-check shell script.
|
|
17
|
-
* Also
|
|
17
|
+
* Also points `[llm] base_url` in ~/.openhands/config.toml at the proxy when
|
|
18
|
+
* that file exists.
|
|
18
19
|
*
|
|
19
20
|
* @param workspaceRoot - Absolute workspace root.
|
|
20
21
|
* @param proxyUrl - Intutic proxy URL.
|
|
21
22
|
* @param workspaceId - Workspace ID embedded in hook event payloads.
|
|
22
23
|
*/
|
|
23
24
|
export declare function writeOpenHandsHooks(workspaceRoot: string, proxyUrl: string, workspaceId?: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Whether `config.toml` text is an OpenHands configuration. A file named
|
|
27
|
+
* `config.toml` is also every Hugo site's and many other tools', so the name
|
|
28
|
+
* alone is not evidence.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isOpenHandsConfig(raw: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Point `[llm] base_url` in an OpenHands `config.toml` at the proxy and keep
|
|
33
|
+
* the rest of the file. Returns `null` when the text is not valid TOML.
|
|
34
|
+
*/
|
|
35
|
+
export declare function mergeOpenHandsBaseUrl(raw: string, proxyUrl: string): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Merge Intutic's keys into an OpenHands `config.toml`:
|
|
38
|
+
* - `[llm] base_url` — the proxy, in the form the configured model's SDK
|
|
39
|
+
* expects (LiteLLM appends `/v1/messages` to an Anthropic base and
|
|
40
|
+
* `/chat/completions` to an OpenAI-style one);
|
|
41
|
+
* - an `[intutic]` table carrying the SOP text, replaced whole each sync.
|
|
42
|
+
*
|
|
43
|
+
* Edited line by line so the user's own settings and comments survive; the
|
|
44
|
+
* result is parsed before it is returned. Earlier versions replaced the whole
|
|
45
|
+
* file, so a file starting with their header holds nothing of the user's and
|
|
46
|
+
* is regenerated. Returns `null` when the existing file is not valid TOML.
|
|
47
|
+
*/
|
|
48
|
+
export declare function mergeOpenHandsToml(raw: string, proxyUrl: string, instructions: string): string | null;
|
|
24
49
|
//# sourceMappingURL=openhandsHooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openhandsHooks.d.ts","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"openhandsHooks.d.ts","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAqHf;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;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBrG"}
|
|
@@ -14,13 +14,18 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import * as fs from 'node:fs/promises';
|
|
16
16
|
import * as path from 'node:path';
|
|
17
|
+
import * as os from 'node:os';
|
|
17
18
|
import { createLogger } from '@intutic/logger';
|
|
19
|
+
import { keepOriginal, noteWritten } from '../disconnect/originals.js';
|
|
18
20
|
import { newIso } from '@intutic/id';
|
|
19
21
|
import { emitShellGate, SHELL_EXTRACT, SHELL_FAIL_CLOSED } from './gateBody.js';
|
|
22
|
+
import { parse as parseToml } from 'smol-toml';
|
|
23
|
+
import { anthropicBaseUrl, openaiBaseUrl } from '@intutic/shared-types';
|
|
20
24
|
const log = createLogger('sync-openhands-hooks');
|
|
21
25
|
/**
|
|
22
26
|
* Write .openhands/hooks.json and the pre-tool-check shell script.
|
|
23
|
-
* Also
|
|
27
|
+
* Also points `[llm] base_url` in ~/.openhands/config.toml at the proxy when
|
|
28
|
+
* that file exists.
|
|
24
29
|
*
|
|
25
30
|
* @param workspaceRoot - Absolute workspace root.
|
|
26
31
|
* @param proxyUrl - Intutic proxy URL.
|
|
@@ -28,6 +33,9 @@ const log = createLogger('sync-openhands-hooks');
|
|
|
28
33
|
*/
|
|
29
34
|
export async function writeOpenHandsHooks(workspaceRoot, proxyUrl, workspaceId = '') {
|
|
30
35
|
const openhandsDir = path.join(workspaceRoot, '.openhands');
|
|
36
|
+
const hooksPath = path.join(openhandsDir, 'hooks.json');
|
|
37
|
+
// Written whole, over whatever hooks the user had there: kept for disconnect.
|
|
38
|
+
await keepOriginal(hooksPath, workspaceRoot);
|
|
31
39
|
await fs.mkdir(openhandsDir, { recursive: true });
|
|
32
40
|
const hookScriptDir = path.join(workspaceRoot, '.intutic', 'hooks');
|
|
33
41
|
await fs.mkdir(hookScriptDir, { recursive: true });
|
|
@@ -122,51 +130,163 @@ exit 0
|
|
|
122
130
|
},
|
|
123
131
|
],
|
|
124
132
|
};
|
|
125
|
-
const
|
|
133
|
+
const hooksJson = JSON.stringify(hooksConfig, null, 2) + '\n';
|
|
126
134
|
const tmpHooks = hooksPath + '.intutic-tmp';
|
|
127
|
-
await fs.writeFile(tmpHooks,
|
|
135
|
+
await fs.writeFile(tmpHooks, hooksJson, 'utf-8');
|
|
128
136
|
await fs.rename(tmpHooks, hooksPath);
|
|
137
|
+
await noteWritten(hooksPath, workspaceRoot, hooksJson);
|
|
129
138
|
log.info({ action: 'openhands_hooks_written', path: hooksPath }, 'OpenHands hooks written');
|
|
130
|
-
// ── config.toml llm.base_url
|
|
131
|
-
|
|
139
|
+
// ── user-level config.toml llm.base_url ───────────────────────────
|
|
140
|
+
// The workspace config.toml is the adapter's: it merges `[llm] base_url`
|
|
141
|
+
// and the `[intutic]` table there (`mergeOpenHandsToml`).
|
|
142
|
+
await mergeUserOpenHandsConfig(proxyUrl);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Point `[llm] base_url` in `~/.openhands/config.toml` at the proxy, when that
|
|
146
|
+
* file exists. Only that key is set; a file that does not parse is left alone.
|
|
147
|
+
* An empty `proxyUrl` (the settings guard restoring hooks.json) changes
|
|
148
|
+
* nothing.
|
|
149
|
+
*/
|
|
150
|
+
async function mergeUserOpenHandsConfig(proxyUrl) {
|
|
151
|
+
if (!proxyUrl)
|
|
152
|
+
return;
|
|
153
|
+
const configPath = path.join(os.homedir(), '.openhands', 'config.toml');
|
|
154
|
+
let raw;
|
|
155
|
+
try {
|
|
156
|
+
raw = await fs.readFile(configPath, 'utf-8');
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const next = mergeOpenHandsBaseUrl(raw, proxyUrl);
|
|
162
|
+
if (next === null) {
|
|
163
|
+
log.warn({ action: 'openhands_config_merge_skipped', path: configPath }, `${configPath} is not valid TOML — left untouched`);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (next === raw)
|
|
167
|
+
return;
|
|
168
|
+
const tmpConfig = configPath + '.intutic-tmp';
|
|
169
|
+
await keepOriginal(configPath, os.homedir());
|
|
170
|
+
await fs.writeFile(tmpConfig, next, 'utf-8');
|
|
171
|
+
await fs.rename(tmpConfig, configPath);
|
|
172
|
+
log.info({ action: 'openhands_config_written', path: configPath }, 'OpenHands config.toml updated with proxy base_url');
|
|
173
|
+
}
|
|
174
|
+
// ─── config.toml merge ───────────────────────────────────────────────────────
|
|
175
|
+
/** First line of the file earlier adapter versions wrote over config.toml. */
|
|
176
|
+
const LEGACY_HEADER = '# Intutic Governance Rules (auto-generated)';
|
|
177
|
+
function parsesAsToml(text) {
|
|
178
|
+
try {
|
|
179
|
+
return parseToml(text);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Tables only OpenHands' own `config.toml` uses, from its configuration
|
|
187
|
+
* template (https://github.com/OpenHands/OpenHands/blob/0.59.0/config.template.toml:
|
|
188
|
+
* `[core]`, `[llm]`, `[agent]`, `[sandbox]`, `[security]`, `[condenser]`,
|
|
189
|
+
* `[kubernetes]`, `[mcp]`, `[model_routing]`). `[llm]`, `[mcp]` and
|
|
190
|
+
* `[security]` are left out: other tools use those names too. `[intutic]` is
|
|
191
|
+
* the table an earlier `intutic connect` wrote.
|
|
192
|
+
*/
|
|
193
|
+
const OPENHANDS_TABLES = ['core', 'agent', 'sandbox', 'condenser', 'intutic'];
|
|
194
|
+
/**
|
|
195
|
+
* Whether `config.toml` text is an OpenHands configuration. A file named
|
|
196
|
+
* `config.toml` is also every Hugo site's and many other tools', so the name
|
|
197
|
+
* alone is not evidence.
|
|
198
|
+
*/
|
|
199
|
+
export function isOpenHandsConfig(raw) {
|
|
200
|
+
const parsed = parsesAsToml(raw);
|
|
201
|
+
if (parsed === null)
|
|
202
|
+
return false;
|
|
203
|
+
return OPENHANDS_TABLES.some((t) => typeof parsed[t] === 'object' && parsed[t] !== null && !Array.isArray(parsed[t]));
|
|
204
|
+
}
|
|
205
|
+
/** Index of the line that starts table `name`, or -1. */
|
|
206
|
+
function tableStart(lines, name) {
|
|
207
|
+
return lines.findIndex((l) => l.trim() === `[${name}]`);
|
|
208
|
+
}
|
|
209
|
+
/** Index just past the last line of the table starting at `start`. */
|
|
210
|
+
function tableEnd(lines, start) {
|
|
211
|
+
const next = lines.findIndex((l, i) => i > start && /^\s*\[/.test(l));
|
|
212
|
+
return next === -1 ? lines.length : next;
|
|
213
|
+
}
|
|
214
|
+
/** The proxy URL in the form the configured model's SDK expects. */
|
|
215
|
+
function llmBaseUrl(parsed, proxyUrl) {
|
|
216
|
+
const llm = (parsed['llm'] ?? {});
|
|
217
|
+
const model = typeof llm['model'] === 'string' ? llm['model'] : '';
|
|
218
|
+
return /^(anthropic\/|claude)/.test(model) ? anthropicBaseUrl(proxyUrl) : openaiBaseUrl(proxyUrl);
|
|
132
219
|
}
|
|
133
220
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
221
|
+
* Set `base_url` inside the `[llm]` table only, adding the table when there
|
|
222
|
+
* is none. A `base_url` in any other table (`[llm.<name>]`, `[mcp]`, …) is
|
|
223
|
+
* not this key and is left as it is.
|
|
136
224
|
*/
|
|
137
|
-
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
existing = await fs.readFile(configPath, 'utf-8');
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
// File doesn't exist (or is unreadable) — deliberate fail-open: fall
|
|
149
|
-
// through with `existing` at its '' initialiser so the block below
|
|
150
|
-
// creates a minimal config instead of aborting the whole sync.
|
|
151
|
-
}
|
|
152
|
-
// Inject or update [llm] section with base_url
|
|
153
|
-
if (existing.includes('[llm]')) {
|
|
154
|
-
// Update existing [llm] section
|
|
155
|
-
if (existing.includes('base_url')) {
|
|
156
|
-
existing = existing.replace(/^base_url\s*=\s*.*/m, `base_url = "${proxyUrl}"`);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
existing = existing.replace(/\[llm\]/, `[llm]\nbase_url = "${proxyUrl}"`);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
existing += `\n[llm]\nbase_url = "${proxyUrl}"\n`;
|
|
164
|
-
}
|
|
165
|
-
const tmpConfig = configPath + '.intutic-tmp';
|
|
166
|
-
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
167
|
-
await fs.writeFile(tmpConfig, existing, 'utf-8');
|
|
168
|
-
await fs.rename(tmpConfig, configPath);
|
|
169
|
-
log.info({ action: 'openhands_config_written', path: configPath }, 'OpenHands config.toml updated with proxy base_url');
|
|
225
|
+
function setLlmBaseUrl(lines, baseUrl) {
|
|
226
|
+
const baseLine = `base_url = ${JSON.stringify(baseUrl)}`;
|
|
227
|
+
const llmStart = tableStart(lines, 'llm');
|
|
228
|
+
if (llmStart === -1) {
|
|
229
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === '')
|
|
230
|
+
lines.pop();
|
|
231
|
+
lines.push('', '[llm]', baseLine, '');
|
|
232
|
+
return;
|
|
170
233
|
}
|
|
234
|
+
const end = tableEnd(lines, llmStart);
|
|
235
|
+
const existing = lines.findIndex((l, i) => i > llmStart && i < end && /^\s*base_url\s*=/.test(l));
|
|
236
|
+
if (existing !== -1)
|
|
237
|
+
lines[existing] = baseLine;
|
|
238
|
+
else
|
|
239
|
+
lines.splice(llmStart + 1, 0, baseLine);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Point `[llm] base_url` in an OpenHands `config.toml` at the proxy and keep
|
|
243
|
+
* the rest of the file. Returns `null` when the text is not valid TOML.
|
|
244
|
+
*/
|
|
245
|
+
export function mergeOpenHandsBaseUrl(raw, proxyUrl) {
|
|
246
|
+
const parsed = parsesAsToml(raw);
|
|
247
|
+
if (parsed === null)
|
|
248
|
+
return null;
|
|
249
|
+
const baseUrl = llmBaseUrl(parsed, proxyUrl);
|
|
250
|
+
const lines = raw.split('\n');
|
|
251
|
+
setLlmBaseUrl(lines, baseUrl);
|
|
252
|
+
const next = (lines[0] === '' ? lines.slice(1) : lines).join('\n');
|
|
253
|
+
const check = parsesAsToml(next);
|
|
254
|
+
if (check === null || check['llm']?.['base_url'] !== baseUrl)
|
|
255
|
+
return null;
|
|
256
|
+
return next;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Merge Intutic's keys into an OpenHands `config.toml`:
|
|
260
|
+
* - `[llm] base_url` — the proxy, in the form the configured model's SDK
|
|
261
|
+
* expects (LiteLLM appends `/v1/messages` to an Anthropic base and
|
|
262
|
+
* `/chat/completions` to an OpenAI-style one);
|
|
263
|
+
* - an `[intutic]` table carrying the SOP text, replaced whole each sync.
|
|
264
|
+
*
|
|
265
|
+
* Edited line by line so the user's own settings and comments survive; the
|
|
266
|
+
* result is parsed before it is returned. Earlier versions replaced the whole
|
|
267
|
+
* file, so a file starting with their header holds nothing of the user's and
|
|
268
|
+
* is regenerated. Returns `null` when the existing file is not valid TOML.
|
|
269
|
+
*/
|
|
270
|
+
export function mergeOpenHandsToml(raw, proxyUrl, instructions) {
|
|
271
|
+
const source = raw.startsWith(LEGACY_HEADER) ? '' : raw;
|
|
272
|
+
const parsed = parsesAsToml(source);
|
|
273
|
+
if (parsed === null)
|
|
274
|
+
return null;
|
|
275
|
+
const baseUrl = llmBaseUrl(parsed, proxyUrl);
|
|
276
|
+
let lines = source.split('\n');
|
|
277
|
+
// Drop the previous [intutic] table; it is rewritten whole below.
|
|
278
|
+
const oldIntutic = tableStart(lines, 'intutic');
|
|
279
|
+
if (oldIntutic !== -1)
|
|
280
|
+
lines.splice(oldIntutic, tableEnd(lines, oldIntutic) - oldIntutic);
|
|
281
|
+
setLlmBaseUrl(lines, baseUrl);
|
|
282
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === '')
|
|
283
|
+
lines.pop();
|
|
284
|
+
const escaped = instructions.replace(/\\/g, '\\\\').replace(/"""/g, '\\"\\"\\"');
|
|
285
|
+
lines = [...lines, '', '[intutic]', `proxy_url = ${JSON.stringify(proxyUrl)}`, `instructions = """\n${escaped}\n"""`, ''];
|
|
286
|
+
const next = (lines[0] === '' ? lines.slice(1) : lines).join('\n');
|
|
287
|
+
const check = parsesAsToml(next);
|
|
288
|
+
if (check === null || check['llm']?.['base_url'] !== baseUrl)
|
|
289
|
+
return null;
|
|
290
|
+
return next;
|
|
171
291
|
}
|
|
172
292
|
//# sourceMappingURL=openhandsHooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openhandsHooks.js","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"openhandsHooks.js","sourceRoot":"","sources":["../../src/harness/openhandsHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,22 @@
|
|
|
17
17
|
*
|
|
18
18
|
* @module
|
|
19
19
|
*/
|
|
20
|
+
interface PiProvider {
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
interface PiModelsConfig {
|
|
25
|
+
providers?: Record<string, PiProvider>;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Merge Pi models.json — point the anthropic and openai providers at the
|
|
30
|
+
* proxy, each with the base URL its SDK expects (the Anthropic SDK appends
|
|
31
|
+
* `/v1/messages`, the OpenAI one `/chat/completions`). Google is left alone:
|
|
32
|
+
* the proxy does not serve the Gemini API, so routing it there would break it.
|
|
33
|
+
* Every other provider and key is kept.
|
|
34
|
+
*/
|
|
35
|
+
export declare function mergePiModels(existing: PiModelsConfig, proxyUrl: string): PiModelsConfig;
|
|
20
36
|
/**
|
|
21
37
|
* Write the Pi governance hook script, merge hooks.json and models.json,
|
|
22
38
|
* and write the env snippet.
|
|
@@ -29,4 +45,5 @@
|
|
|
29
45
|
* @param workspaceId - Workspace ID embedded in every hook event payload.
|
|
30
46
|
*/
|
|
31
47
|
export declare function writePiHooks(workspaceRoot: string, proxyUrl: string, workspaceId?: string): Promise<void>;
|
|
48
|
+
export {};
|
|
32
49
|
//# sourceMappingURL=piHooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piHooks.d.ts","sourceRoot":"","sources":["../../src/harness/piHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"piHooks.d.ts","sourceRoot":"","sources":["../../src/harness/piHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyCH,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;AAyHD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAmBxF;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CA+Ef"}
|
package/dist/harness/piHooks.js
CHANGED
|
@@ -21,8 +21,11 @@ import * as fs from 'node:fs/promises';
|
|
|
21
21
|
import * as path from 'node:path';
|
|
22
22
|
import * as os from 'node:os';
|
|
23
23
|
import { createLogger } from '@intutic/logger';
|
|
24
|
+
import { keepOriginal } from '../disconnect/originals.js';
|
|
24
25
|
import { newIso } from '@intutic/id';
|
|
25
26
|
import { emitShellGate, SHELL_EXTRACT, SHELL_FAIL_CLOSED } from './gateBody.js';
|
|
27
|
+
import { readJsonObjectForMerge } from './jsonMergeTarget.js';
|
|
28
|
+
import { anthropicBaseUrl, openaiBaseUrl } from '@intutic/shared-types';
|
|
26
29
|
const log = createLogger('sync-pi-hooks');
|
|
27
30
|
/** Path to the Pi hooks config. */
|
|
28
31
|
const PI_HOOKS_CONFIG = path.join(os.homedir(), '.pi', 'hooks.json');
|
|
@@ -134,18 +137,23 @@ function mergePiHooks(existing, hookScriptPath) {
|
|
|
134
137
|
}
|
|
135
138
|
// ─── Pi models.json merge ─────────────────────────────────────────────────────
|
|
136
139
|
/**
|
|
137
|
-
* Merge Pi models.json —
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
+
* Merge Pi models.json — point the anthropic and openai providers at the
|
|
141
|
+
* proxy, each with the base URL its SDK expects (the Anthropic SDK appends
|
|
142
|
+
* `/v1/messages`, the OpenAI one `/chat/completions`). Google is left alone:
|
|
143
|
+
* the proxy does not serve the Gemini API, so routing it there would break it.
|
|
144
|
+
* Every other provider and key is kept.
|
|
140
145
|
*/
|
|
141
|
-
function mergePiModels(existing, proxyUrl) {
|
|
146
|
+
export function mergePiModels(existing, proxyUrl) {
|
|
142
147
|
const providers = existing.providers ?? {};
|
|
143
|
-
const
|
|
148
|
+
const targets = {
|
|
149
|
+
anthropic: anthropicBaseUrl(proxyUrl),
|
|
150
|
+
openai: openaiBaseUrl(proxyUrl),
|
|
151
|
+
};
|
|
144
152
|
const mergedProviders = { ...providers };
|
|
145
|
-
for (const provider of
|
|
153
|
+
for (const [provider, baseUrl] of Object.entries(targets)) {
|
|
146
154
|
mergedProviders[provider] = {
|
|
147
155
|
...(providers[provider] ?? {}),
|
|
148
|
-
baseUrl
|
|
156
|
+
baseUrl,
|
|
149
157
|
};
|
|
150
158
|
}
|
|
151
159
|
return {
|
|
@@ -171,6 +179,8 @@ export async function writePiHooks(workspaceRoot, proxyUrl, workspaceId = '') {
|
|
|
171
179
|
const hookEventsDir = path.join(workspaceRoot, '.intutic', 'events');
|
|
172
180
|
const envDir = path.join(workspaceRoot, '.intutic', 'env');
|
|
173
181
|
const piDir = path.join(os.homedir(), '.pi');
|
|
182
|
+
await keepOriginal(PI_HOOKS_CONFIG, workspaceRoot);
|
|
183
|
+
await keepOriginal(PI_MODELS_CONFIG, workspaceRoot);
|
|
174
184
|
await Promise.all([
|
|
175
185
|
fs.mkdir(globalHookDir, { recursive: true }),
|
|
176
186
|
fs.mkdir(hookEventsDir, { recursive: true }),
|
|
@@ -185,32 +195,24 @@ export async function writePiHooks(workspaceRoot, proxyUrl, workspaceId = '') {
|
|
|
185
195
|
await fs.chmod(hookScriptPath, 0o755);
|
|
186
196
|
log.info({ action: 'pi_hook_script_written', path: hookScriptPath }, 'Pi hook script written');
|
|
187
197
|
// ── 3. Write/merge ~/.pi/hooks.json ───────────────────────────────────────
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
198
|
+
// A file that is not a plain JSON object is left untouched (and reported)
|
|
199
|
+
// rather than replaced with only the Intutic entries.
|
|
200
|
+
const existingHooks = await readJsonObjectForMerge(PI_HOOKS_CONFIG);
|
|
201
|
+
if (existingHooks !== null) {
|
|
202
|
+
const mergedHooks = mergePiHooks(existingHooks, hookScriptPath);
|
|
203
|
+
const tmpHooks = PI_HOOKS_CONFIG + '.intutic-tmp';
|
|
204
|
+
await fs.writeFile(tmpHooks, JSON.stringify(mergedHooks, null, 2) + '\n', 'utf-8');
|
|
205
|
+
await fs.rename(tmpHooks, PI_HOOKS_CONFIG);
|
|
195
206
|
}
|
|
196
|
-
const mergedHooks = mergePiHooks(existingHooks, hookScriptPath);
|
|
197
|
-
const tmpHooks = PI_HOOKS_CONFIG + '.intutic-tmp';
|
|
198
|
-
await fs.writeFile(tmpHooks, JSON.stringify(mergedHooks, null, 2) + '\n', 'utf-8');
|
|
199
|
-
await fs.rename(tmpHooks, PI_HOOKS_CONFIG);
|
|
200
207
|
log.info({ action: 'pi_hooks_written', path: PI_HOOKS_CONFIG }, 'Pi hooks.json written');
|
|
201
208
|
// ── 4. Write/merge ~/.pi/models.json ──────────────────────────────────────
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
// File doesn't exist or is unparseable — start fresh
|
|
209
|
+
const existingModels = await readJsonObjectForMerge(PI_MODELS_CONFIG);
|
|
210
|
+
if (existingModels !== null) {
|
|
211
|
+
const mergedModels = mergePiModels(existingModels, proxyUrl);
|
|
212
|
+
const tmpModels = PI_MODELS_CONFIG + '.intutic-tmp';
|
|
213
|
+
await fs.writeFile(tmpModels, JSON.stringify(mergedModels, null, 2) + '\n', 'utf-8');
|
|
214
|
+
await fs.rename(tmpModels, PI_MODELS_CONFIG);
|
|
209
215
|
}
|
|
210
|
-
const mergedModels = mergePiModels(existingModels, proxyUrl);
|
|
211
|
-
const tmpModels = PI_MODELS_CONFIG + '.intutic-tmp';
|
|
212
|
-
await fs.writeFile(tmpModels, JSON.stringify(mergedModels, null, 2) + '\n', 'utf-8');
|
|
213
|
-
await fs.rename(tmpModels, PI_MODELS_CONFIG);
|
|
214
216
|
log.info({ action: 'pi_models_written', path: PI_MODELS_CONFIG }, 'Pi models.json written');
|
|
215
217
|
// ── 5. Write env snippet ───────────────────────────────────────────────────
|
|
216
218
|
const envSnippet = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piHooks.js","sourceRoot":"","sources":["../../src/harness/piHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"piHooks.js","sourceRoot":"","sources":["../../src/harness/piHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -304,14 +304,72 @@ export declare const SECRET_CONTENT_PATTERNS: readonly GuardPattern[];
|
|
|
304
304
|
* exists to flag — narrower than `UNIVERSAL_PROTECTED_PATHS`'s "any mention"
|
|
305
305
|
* rule on purpose, since that rule blocks and this one only advises.
|
|
306
306
|
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
* same policy-snapshot channel the way this path-tier promotion and
|
|
311
|
-
* `DESTRUCTIVE_COMMAND_PATTERNS` both do, so it too is retractable in a sync
|
|
312
|
-
* cycle rather than a release if the measurement turns out wrong.
|
|
307
|
+
* Blocking on skill CONTENT (not path) is a separate table,
|
|
308
|
+
* {@link SKILL_CONTENT_PATTERNS}, licensed by the benign-corpus measurement
|
|
309
|
+
* TD-358 asked for and shipped only through the policy snapshot.
|
|
313
310
|
*/
|
|
314
311
|
export declare const SKILL_SURFACE_PATTERNS: readonly GuardPattern[];
|
|
312
|
+
/**
|
|
313
|
+
* Rewrites a case-insensitive JS `RegExp` source into a case-SENSITIVE one that
|
|
314
|
+
* means the same thing in JS and Python `re`, for use as an `argPattern`.
|
|
315
|
+
*
|
|
316
|
+
* Why: an `argPattern` is compiled with no flags by every gate family
|
|
317
|
+
* (`new RegExp(p)` in the JS gates, `re.compile(p)` in the bash gates'
|
|
318
|
+
* python3 helper), and there is no inline case-insensitive flag both engines
|
|
319
|
+
* accept — JS rejects a leading `(?i)`. The `skillScan.ts` patterns are matched
|
|
320
|
+
* case-insensitively, so each ASCII letter becomes `[xX]`.
|
|
321
|
+
*
|
|
322
|
+
* Also rewrites `\s` outside a character class to `(?:\s|\\[nrt])`. An
|
|
323
|
+
* argPattern sees `JSON.stringify(tool_input)`, where a newline in the content
|
|
324
|
+
* is the two characters `\n`; without this, `do not\ntell the user` would stop
|
|
325
|
+
* matching the moment the words wrap. Known residual gap: a `\b` directly after
|
|
326
|
+
* such an escape sees `n` as a word character, so a few line-wrapped phrasings
|
|
327
|
+
* still slip. That costs recall, not precision.
|
|
328
|
+
*
|
|
329
|
+
* Throws on a letter range inside a class (`[a-z]`). None of the scan patterns
|
|
330
|
+
* has one, and folding one correctly is more code than the case deserves.
|
|
331
|
+
*/
|
|
332
|
+
export declare function caseFoldedArgSource(source: string): string;
|
|
333
|
+
/**
|
|
334
|
+
* Skill-CONTENT block tier (TD-358): a write into a skill directory whose
|
|
335
|
+
* written text matches one of the `skillScan.ts` patterns measured at zero
|
|
336
|
+
* false positives on the benign-skill corpus (`SKILL_CONTENT_BLOCK_PATTERN_IDS`;
|
|
337
|
+
* `packages/shared-types/src/__tests__/corpus/skills/`, 350 real skills).
|
|
338
|
+
* `read-sensitive-path` fired on 11 of them and is not here.
|
|
339
|
+
*
|
|
340
|
+
* Each rule is two conditions, which a GuardPattern can express: `source`
|
|
341
|
+
* matches the write's target path against the skill surface (subject
|
|
342
|
+
* `target`, as in {@link SKILL_SURFACE_PATTERNS}), and `argPattern`, which
|
|
343
|
+
* every gate family already evaluates for SOP WHERE clauses, matches the
|
|
344
|
+
* pattern inside the value of a {@link WRITTEN_CONTENT_KEYS} key of the
|
|
345
|
+
* serialized tool input.
|
|
346
|
+
*
|
|
347
|
+
* **Snapshot-only, never in `staticFloorPatterns()`**, as TD-358 required: a
|
|
348
|
+
* content judgement ships where one sync cycle retracts it
|
|
349
|
+
* (`SKILL_CONTENT_TIER_SEVERITY` in `lib/policySnapshot.ts`). The table's own
|
|
350
|
+
* `warn` is a placeholder the snapshot builder always overrides.
|
|
351
|
+
*
|
|
352
|
+
* **What it adds over the path tier.** In steady state
|
|
353
|
+
* `skill_surface.*.tier` already refuses every write under a skill directory,
|
|
354
|
+
* so today this tier mostly changes the reason the developer reads. It
|
|
355
|
+
* becomes the only refusal if the path tier is retracted to `warn`. That
|
|
356
|
+
* independence is the point: the blanket path block and the narrow content
|
|
357
|
+
* block can each be retracted without the other. One exception: the
|
|
358
|
+
* `@intutic/gate-js` and `intutic-clawde` snapshot readers do not read the
|
|
359
|
+
* `.rules` argPattern column (true of every WHERE rule shipped this way), so
|
|
360
|
+
* in those two the content rules act as path-only blocks — the same calls
|
|
361
|
+
* `skill_surface.*.tier` already refuses. Retracting only the path tier would
|
|
362
|
+
* not unblock benign skill writes there; flip both constants.
|
|
363
|
+
*
|
|
364
|
+
* **What it does not catch.** A write through a shell redirect or heredoc
|
|
365
|
+
* (`cat > .claude/skills/x/SKILL.md`). `subject: 'command'` cannot tell that
|
|
366
|
+
* from a `grep '<system>' .claude/skills/`, and the corpus measured skill
|
|
367
|
+
* files, not commands. It also misses diff-shaped editors (see
|
|
368
|
+
* {@link WRITTEN_CONTENT_KEYS}), symlinked or relative-walk targets (the same
|
|
369
|
+
* limits as the path tier), and some line-wrapped phrasings (see
|
|
370
|
+
* {@link caseFoldedArgSource}).
|
|
371
|
+
*/
|
|
372
|
+
export declare const SKILL_CONTENT_PATTERNS: readonly GuardPattern[];
|
|
315
373
|
/**
|
|
316
374
|
* Commands that destroy the machine or its data irrecoverably.
|
|
317
375
|
*
|