@intutic/cli 2.2.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 +8 -8
- package/dist/cli.d.ts +0 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +481 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/apiCommand.d.ts +40 -0
- package/dist/commands/apiCommand.d.ts.map +1 -0
- package/dist/commands/apiCommand.js +88 -0
- package/dist/commands/apiCommand.js.map +1 -0
- package/dist/commands/budget.d.ts +4 -0
- package/dist/commands/budget.d.ts.map +1 -1
- package/dist/commands/budget.js +8 -0
- package/dist/commands/budget.js.map +1 -1
- package/dist/commands/compliance.d.ts +122 -0
- package/dist/commands/compliance.d.ts.map +1 -0
- package/dist/commands/compliance.js +278 -0
- package/dist/commands/compliance.js.map +1 -0
- package/dist/commands/connect.d.ts +26 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +109 -51
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/credentials.d.ts +1 -1
- package/dist/commands/credentials.js +1 -1
- package/dist/commands/decision.d.ts +4 -4
- package/dist/commands/decision.js +4 -4
- package/dist/commands/disconnect.d.ts +4 -0
- package/dist/commands/disconnect.d.ts.map +1 -1
- package/dist/commands/disconnect.js +17 -3
- package/dist/commands/disconnect.js.map +1 -1
- package/dist/commands/doctor.d.ts +0 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +0 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/enforce.d.ts +1 -1
- package/dist/commands/enforce.js +1 -1
- package/dist/commands/enterprise.d.ts +3 -2
- package/dist/commands/enterprise.d.ts.map +1 -1
- package/dist/commands/enterprise.js +11 -3
- package/dist/commands/enterprise.js.map +1 -1
- package/dist/commands/env.js +1 -1
- package/dist/commands/exec.d.ts +2 -3
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +4 -5
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/gateLiveness.d.ts +15 -0
- package/dist/commands/gateLiveness.d.ts.map +1 -0
- package/dist/commands/gateLiveness.js +34 -0
- package/dist/commands/gateLiveness.js.map +1 -0
- package/dist/commands/gateway.d.ts +14 -4
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +34 -4
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/github.d.ts +20 -0
- package/dist/commands/github.d.ts.map +1 -0
- package/dist/commands/github.js +41 -0
- package/dist/commands/github.js.map +1 -0
- package/dist/commands/guardrails.d.ts +28 -2
- package/dist/commands/guardrails.d.ts.map +1 -1
- package/dist/commands/guardrails.js +233 -24
- package/dist/commands/guardrails.js.map +1 -1
- package/dist/commands/init.d.ts +1 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install-daemon.d.ts +1 -1
- package/dist/commands/install-daemon.js +2 -2
- package/dist/commands/integrity.d.ts +10 -2
- package/dist/commands/integrity.d.ts.map +1 -1
- package/dist/commands/integrity.js +3 -3
- package/dist/commands/integrity.js.map +1 -1
- package/dist/commands/inventory.d.ts +60 -0
- package/dist/commands/inventory.d.ts.map +1 -0
- package/dist/commands/inventory.js +141 -0
- package/dist/commands/inventory.js.map +1 -0
- package/dist/commands/judge.d.ts +1 -1
- package/dist/commands/judge.js +2 -2
- package/dist/commands/judge.js.map +1 -1
- package/dist/commands/login.d.ts +0 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +0 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +0 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +0 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/mcp.d.ts +31 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +65 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/notifications.d.ts +54 -0
- package/dist/commands/notifications.d.ts.map +1 -0
- package/dist/commands/notifications.js +151 -0
- package/dist/commands/notifications.js.map +1 -0
- package/dist/commands/org.d.ts +3 -3
- package/dist/commands/org.js +3 -3
- package/dist/commands/policy.d.ts +6 -1
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +77 -37
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/rollback.d.ts.map +1 -1
- package/dist/commands/rollback.js +3 -1
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/routing.d.ts +1 -1
- package/dist/commands/routing.js +1 -1
- package/dist/commands/rules.d.ts +74 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +283 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/settings.d.ts +43 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +108 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/siem.d.ts +53 -0
- package/dist/commands/siem.d.ts.map +1 -0
- package/dist/commands/siem.js +132 -0
- package/dist/commands/siem.js.map +1 -0
- package/dist/commands/skill.d.ts +5 -5
- package/dist/commands/skill.js +7 -7
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/status.d.ts +0 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/syncContext.d.ts +0 -1
- package/dist/commands/syncContext.d.ts.map +1 -1
- package/dist/commands/syncContext.js +0 -1
- package/dist/commands/syncContext.js.map +1 -1
- package/dist/commands/team.d.ts +2 -2
- package/dist/commands/team.js +2 -2
- package/dist/commands/traces.d.ts +0 -3
- package/dist/commands/traces.d.ts.map +1 -1
- package/dist/commands/traces.js +0 -3
- package/dist/commands/traces.js.map +1 -1
- package/dist/commands/usage.d.ts +41 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +129 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/whoami.d.ts +0 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +0 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config/keychain.d.ts +0 -1
- package/dist/config/keychain.d.ts.map +1 -1
- package/dist/config/keychain.js +0 -1
- package/dist/config/keychain.js.map +1 -1
- package/dist/config/paths.d.ts +0 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +0 -1
- package/dist/config/paths.js.map +1 -1
- package/dist/config/store.d.ts +0 -1
- package/dist/config/store.d.ts.map +1 -1
- package/dist/config/store.js +0 -1
- package/dist/config/store.js.map +1 -1
- package/dist/harness/ag2.d.ts +1 -1
- package/dist/harness/ag2.js +1 -1
- package/dist/harness/agentFramework.d.ts +1 -1
- package/dist/harness/agentFramework.js +1 -1
- package/dist/harness/agenticOrchestrator.d.ts +1 -1
- package/dist/harness/agenticOrchestrator.js +2 -2
- package/dist/harness/agenticOrchestrator.js.map +1 -1
- package/dist/harness/agentsMd.d.ts +24 -0
- package/dist/harness/agentsMd.d.ts.map +1 -0
- package/dist/harness/agentsMd.js +28 -0
- package/dist/harness/agentsMd.js.map +1 -0
- package/dist/harness/aider.d.ts +3 -1
- package/dist/harness/aider.d.ts.map +1 -1
- package/dist/harness/aider.js +9 -7
- package/dist/harness/aider.js.map +1 -1
- package/dist/harness/antigravity.d.ts +23 -5
- package/dist/harness/antigravity.d.ts.map +1 -1
- package/dist/harness/antigravity.js +45 -55
- package/dist/harness/antigravity.js.map +1 -1
- package/dist/harness/autogen.d.ts +1 -1
- package/dist/harness/autogen.js +2 -2
- package/dist/harness/autogen.js.map +1 -1
- package/dist/harness/claudeCode.d.ts +22 -1
- package/dist/harness/claudeCode.d.ts.map +1 -1
- package/dist/harness/claudeCode.js +47 -3
- package/dist/harness/claudeCode.js.map +1 -1
- package/dist/harness/cline.d.ts.map +1 -1
- package/dist/harness/cline.js +14 -23
- package/dist/harness/cline.js.map +1 -1
- package/dist/harness/codex.d.ts +6 -1
- package/dist/harness/codex.d.ts.map +1 -1
- package/dist/harness/codex.js +23 -21
- package/dist/harness/codex.js.map +1 -1
- package/dist/harness/continue.d.ts +10 -4
- package/dist/harness/continue.d.ts.map +1 -1
- package/dist/harness/continue.js +22 -22
- package/dist/harness/continue.js.map +1 -1
- package/dist/harness/cursor.d.ts +5 -2
- package/dist/harness/cursor.d.ts.map +1 -1
- package/dist/harness/cursor.js +19 -23
- package/dist/harness/cursor.js.map +1 -1
- package/dist/harness/detector.d.ts +0 -1
- package/dist/harness/detector.d.ts.map +1 -1
- package/dist/harness/detector.js +0 -1
- package/dist/harness/detector.js.map +1 -1
- package/dist/harness/dsh.d.ts +5 -3
- package/dist/harness/dsh.d.ts.map +1 -1
- package/dist/harness/dsh.js +17 -29
- package/dist/harness/dsh.js.map +1 -1
- package/dist/harness/eve.d.ts +3 -4
- package/dist/harness/eve.d.ts.map +1 -1
- package/dist/harness/eve.js +3 -4
- package/dist/harness/eve.js.map +1 -1
- package/dist/harness/githubCopilot.d.ts +4 -1
- package/dist/harness/githubCopilot.d.ts.map +1 -1
- package/dist/harness/githubCopilot.js +12 -20
- package/dist/harness/githubCopilot.js.map +1 -1
- package/dist/harness/goose.d.ts +7 -3
- package/dist/harness/goose.d.ts.map +1 -1
- package/dist/harness/goose.js +18 -21
- package/dist/harness/goose.js.map +1 -1
- package/dist/harness/grok.d.ts +2 -2
- package/dist/harness/grok.d.ts.map +1 -1
- package/dist/harness/grok.js +13 -24
- package/dist/harness/grok.js.map +1 -1
- package/dist/harness/hermes.d.ts +6 -0
- package/dist/harness/hermes.d.ts.map +1 -1
- package/dist/harness/hermes.js +17 -16
- package/dist/harness/hermes.js.map +1 -1
- package/dist/harness/muse.d.ts +3 -7
- package/dist/harness/muse.d.ts.map +1 -1
- package/dist/harness/muse.js +15 -35
- package/dist/harness/muse.js.map +1 -1
- package/dist/harness/n8n.d.ts +13 -14
- package/dist/harness/n8n.d.ts.map +1 -1
- package/dist/harness/n8n.js +21 -181
- package/dist/harness/n8n.js.map +1 -1
- package/dist/harness/openWebUI.d.ts.map +1 -1
- package/dist/harness/openWebUI.js +5 -4
- package/dist/harness/openWebUI.js.map +1 -1
- package/dist/harness/openaiAgents.d.ts +1 -1
- package/dist/harness/openaiAgents.js +2 -2
- package/dist/harness/openaiAgents.js.map +1 -1
- package/dist/harness/openclaw.d.ts +8 -0
- package/dist/harness/openclaw.d.ts.map +1 -1
- package/dist/harness/openclaw.js +27 -12
- package/dist/harness/openclaw.js.map +1 -1
- package/dist/harness/opencode.d.ts +4 -5
- package/dist/harness/opencode.d.ts.map +1 -1
- package/dist/harness/opencode.js +15 -30
- package/dist/harness/opencode.js.map +1 -1
- package/dist/harness/openhands.d.ts +9 -3
- package/dist/harness/openhands.d.ts.map +1 -1
- package/dist/harness/openhands.js +30 -24
- package/dist/harness/openhands.js.map +1 -1
- package/dist/harness/pi.d.ts +7 -2
- package/dist/harness/pi.d.ts.map +1 -1
- package/dist/harness/pi.js +19 -18
- package/dist/harness/pi.js.map +1 -1
- package/dist/harness/rooCode.d.ts +12 -5
- package/dist/harness/rooCode.d.ts.map +1 -1
- package/dist/harness/rooCode.js +23 -39
- package/dist/harness/rooCode.js.map +1 -1
- package/dist/harness/rulesFiles.d.ts +53 -0
- package/dist/harness/rulesFiles.d.ts.map +1 -0
- package/dist/harness/rulesFiles.js +106 -0
- package/dist/harness/rulesFiles.js.map +1 -0
- package/dist/harness/smolagents.d.ts +2 -2
- package/dist/harness/smolagents.js +3 -3
- package/dist/harness/smolagents.js.map +1 -1
- package/dist/harness/types.d.ts +20 -6
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +1 -95
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/windsurf.d.ts +6 -1
- package/dist/harness/windsurf.d.ts.map +1 -1
- package/dist/harness/windsurf.js +21 -24
- package/dist/harness/windsurf.js.map +1 -1
- package/dist/harness/xirp.d.ts +1 -2
- package/dist/harness/xirp.d.ts.map +1 -1
- package/dist/harness/xirp.js +2 -3
- package/dist/harness/xirp.js.map +1 -1
- package/dist/lib/api.d.ts +27 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +55 -18
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/ciscoScanner.d.ts +1 -1
- package/dist/lib/ciscoScanner.js +1 -1
- package/dist/lib/decisionsLogRefresh.d.ts.map +1 -1
- package/dist/lib/decisionsLogRefresh.js +6 -7
- package/dist/lib/decisionsLogRefresh.js.map +1 -1
- package/dist/lib/deviceReport.d.ts +15 -0
- package/dist/lib/deviceReport.d.ts.map +1 -1
- package/dist/lib/deviceReport.js +30 -0
- package/dist/lib/deviceReport.js.map +1 -1
- package/dist/lib/gitHooks.d.ts +0 -1
- package/dist/lib/gitHooks.d.ts.map +1 -1
- package/dist/lib/gitHooks.js +8 -9
- package/dist/lib/gitHooks.js.map +1 -1
- package/dist/lib/gracefulShutdown.d.ts +1 -1
- package/dist/lib/gracefulShutdown.js +1 -1
- package/dist/lib/hash.d.ts +0 -1
- package/dist/lib/hash.d.ts.map +1 -1
- package/dist/lib/hash.js +0 -1
- package/dist/lib/hash.js.map +1 -1
- package/dist/lib/inventory.d.ts +47 -0
- package/dist/lib/inventory.d.ts.map +1 -0
- package/dist/lib/inventory.js +106 -0
- package/dist/lib/inventory.js.map +1 -0
- package/dist/lib/logger.d.ts +0 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +0 -1
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/mdmManifest.d.ts +30 -2
- package/dist/lib/mdmManifest.d.ts.map +1 -1
- package/dist/lib/mdmManifest.js +50 -2
- package/dist/lib/mdmManifest.js.map +1 -1
- package/dist/lib/onboarding.d.ts +0 -1
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +1 -2
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/policySnapshot.d.ts +3 -2
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +6 -3
- package/dist/lib/policySnapshot.js.map +1 -1
- package/dist/lib/process.d.ts +5 -1
- package/dist/lib/process.d.ts.map +1 -1
- package/dist/lib/process.js +13 -4
- package/dist/lib/process.js.map +1 -1
- package/dist/lib/providerProbe.d.ts +2 -2
- package/dist/lib/providerProbe.js +2 -2
- package/dist/lib/sandbox/firecracker.d.ts +3 -3
- package/dist/lib/sandbox/firecracker.js +3 -3
- package/dist/lib/sandbox/index.d.ts +2 -2
- package/dist/lib/sandbox/index.js +2 -2
- package/dist/lib/sandbox/oci.d.ts +1 -1
- package/dist/lib/sandbox/oci.js +1 -1
- package/dist/lib/sandbox/types.d.ts +1 -1
- package/dist/lib/sandbox/types.js +1 -1
- package/dist/lib/sopFrontMatter.d.ts +1 -1
- package/dist/lib/sopFrontMatter.js +1 -1
- package/package.json +6 -5
- package/resources/sandbox/Dockerfile +1 -1
- package/resources/sandbox/entrypoint.sh +4 -4
- package/resources/sandbox/firecracker-launch.sh +1 -1
- package/dist/harness/base.d.ts +0 -24
- package/dist/harness/base.d.ts.map +0 -1
- package/dist/harness/base.js +0 -74
- package/dist/harness/base.js.map +0 -1
package/dist/harness/n8n.js
CHANGED
|
@@ -1,39 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* n8n adapter —
|
|
2
|
+
* n8n adapter — the workflow-level gate.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* to inject Intutic proxy URL and SOP governance rules as workflow variables,
|
|
6
|
-
* and writes the external-hook gate module (`~/.intutic/hooks/
|
|
4
|
+
* Writes the external-hook gate module (`~/.intutic/hooks/
|
|
7
5
|
* n8n-governance-hook.js`) with its INSTALL.md — see n8nHooks.ts. The gate
|
|
8
6
|
* takes effect only once the n8n operator sets EXTERNAL_HOOK_FILES to it.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Rule sets are not written anywhere for n8n: n8n has no file or setting it
|
|
9
|
+
* loads as standing instructions. An AI Agent node's system message is a
|
|
10
|
+
* parameter of that node, written by whoever builds the workflow. Earlier
|
|
11
|
+
* versions put the rule sets in each workflow's `settings.variables` through
|
|
12
|
+
* `PUT /api/v1/workflows/{id}`, but the public API's workflow-settings schema
|
|
13
|
+
* has had `additionalProperties: false` since the API was introduced, with no
|
|
14
|
+
* free-text field, so every one of those updates was refused with a 400
|
|
15
|
+
* (https://github.com/n8n-io/n8n/blob/6fc0aeda35ea62ee353dd80b0f8d3e0f1f4e50d0/packages/cli/src/public-api/v1/handlers/workflows/spec/schemas/workflowSettings.yml).
|
|
16
|
+
* n8n's instance variables are no substitute: a value is capped at 1,000
|
|
17
|
+
* characters and the feature needs a paid licence
|
|
18
|
+
* (https://github.com/n8n-io/n8n/blob/6fc0aeda35ea62ee353dd80b0f8d3e0f1f4e50d0/packages/@n8n/api-types/src/dto/variables/base.dto.ts).
|
|
12
19
|
*
|
|
13
20
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
14
|
-
* Tech Debt: TD-037 — n8n API Adapter
|
|
15
21
|
*
|
|
16
22
|
* @module
|
|
17
23
|
*/
|
|
18
|
-
import { createHash } from 'node:crypto';
|
|
19
24
|
import { HarnessType } from '@intutic/shared-types';
|
|
20
25
|
import { loadCredentials } from '../config/store.js';
|
|
21
26
|
import { writeN8nHooks } from '@intutic/sync-daemon';
|
|
22
|
-
// Format SOPs for n8n parameters
|
|
23
|
-
function buildSopsMarkdown(sops) {
|
|
24
|
-
if (sops.length === 0)
|
|
25
|
-
return '';
|
|
26
|
-
return sops.map((sop) => `## ${sop.title}\n\n${sop.content}`).join('\n\n---\n\n') + '\n';
|
|
27
|
-
}
|
|
28
|
-
function getHeaders() {
|
|
29
|
-
const headers = {
|
|
30
|
-
'Content-Type': 'application/json',
|
|
31
|
-
};
|
|
32
|
-
if (process.env.N8N_API_TOKEN) {
|
|
33
|
-
headers['X-N8N-API-KEY'] = process.env.N8N_API_TOKEN;
|
|
34
|
-
}
|
|
35
|
-
return headers;
|
|
36
|
-
}
|
|
37
27
|
export const n8nAdapter = {
|
|
38
28
|
type: HarnessType.N8N,
|
|
39
29
|
configFileName: '',
|
|
@@ -47,167 +37,17 @@ export const n8nAdapter = {
|
|
|
47
37
|
return !!process.env.N8N_API_TOKEN;
|
|
48
38
|
}
|
|
49
39
|
},
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// is local, and an unreachable n8n API must not stop it being refreshed.
|
|
40
|
+
/** The local external-hook gate. */
|
|
41
|
+
async installGate(workspaceRoot, proxyUrl) {
|
|
53
42
|
const creds = await loadCredentials();
|
|
54
43
|
await writeN8nHooks(workspaceRoot, proxyUrl, creds?.workspaceId || 'local');
|
|
55
|
-
const n8nUrl = process.env.N8N_URL || 'http://localhost:5678';
|
|
56
|
-
const sopsMarkdown = buildSopsMarkdown(sops);
|
|
57
|
-
try {
|
|
58
|
-
// 1. Get list of workflows
|
|
59
|
-
const listRes = await fetch(`${n8nUrl}/api/v1/workflows`, {
|
|
60
|
-
headers: getHeaders(),
|
|
61
|
-
signal: AbortSignal.timeout(5000),
|
|
62
|
-
});
|
|
63
|
-
if (!listRes.ok) {
|
|
64
|
-
throw new Error(`Failed to list workflows: ${listRes.statusText}`);
|
|
65
|
-
}
|
|
66
|
-
const listData = (await listRes.json());
|
|
67
|
-
const workflows = listData.data || [];
|
|
68
|
-
if (workflows.length === 0) {
|
|
69
|
-
return 'n8n:no_workflows';
|
|
70
|
-
}
|
|
71
|
-
// 2. Inject parameters into variables of each workflow
|
|
72
|
-
let updated = 0;
|
|
73
|
-
for (const w of workflows) {
|
|
74
|
-
const detailRes = await fetch(`${n8nUrl}/api/v1/workflows/${w.id}`, {
|
|
75
|
-
headers: getHeaders(),
|
|
76
|
-
signal: AbortSignal.timeout(5000),
|
|
77
|
-
});
|
|
78
|
-
if (!detailRes.ok)
|
|
79
|
-
continue;
|
|
80
|
-
const detail = (await detailRes.json());
|
|
81
|
-
// Inject Intutic values, preserving the workflow's own settings and
|
|
82
|
-
// any variables it already had.
|
|
83
|
-
const settings = {
|
|
84
|
-
...detail.settings,
|
|
85
|
-
variables: {
|
|
86
|
-
...detail.settings?.variables,
|
|
87
|
-
intutic_proxy_url: proxyUrl,
|
|
88
|
-
intutic_governance_rules: sopsMarkdown,
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
// Only the writable fields — see N8nWorkflowUpdateBody. Echoing the
|
|
92
|
-
// whole GET payload back (which is what this used to do) is rejected
|
|
93
|
-
// by the API's additionalProperties check.
|
|
94
|
-
const body = {
|
|
95
|
-
name: detail.name ?? w.name ?? 'Untitled',
|
|
96
|
-
nodes: detail.nodes ?? [],
|
|
97
|
-
connections: detail.connections ?? {},
|
|
98
|
-
settings,
|
|
99
|
-
};
|
|
100
|
-
if (detail.staticData !== undefined) {
|
|
101
|
-
body.staticData = detail.staticData;
|
|
102
|
-
}
|
|
103
|
-
// Save updated workflow
|
|
104
|
-
const updateRes = await fetch(`${n8nUrl}/api/v1/workflows/${w.id}`, {
|
|
105
|
-
method: 'PUT',
|
|
106
|
-
headers: getHeaders(),
|
|
107
|
-
body: JSON.stringify(body),
|
|
108
|
-
signal: AbortSignal.timeout(5000),
|
|
109
|
-
});
|
|
110
|
-
if (!updateRes.ok) {
|
|
111
|
-
console.warn(`[n8n-adapter] workflow ${w.id} was not updated: HTTP ${updateRes.status} ${updateRes.statusText}`);
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
updated++;
|
|
115
|
-
}
|
|
116
|
-
// Reporting a write that every workflow rejected as a success left the
|
|
117
|
-
// sync daemon recording a config version it had never applied.
|
|
118
|
-
if (updated === 0)
|
|
119
|
-
return null;
|
|
120
|
-
return `n8n:${updated}_workflows`;
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
console.warn(`[n8n-adapter] failed to sync parameters:`, err);
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
44
|
},
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
});
|
|
134
|
-
if (!listRes.ok)
|
|
135
|
-
return null;
|
|
136
|
-
const listData = (await listRes.json());
|
|
137
|
-
const workflows = listData.data || [];
|
|
138
|
-
if (workflows.length === 0)
|
|
139
|
-
return null;
|
|
140
|
-
// Fetch the first workflow's variables to compute the hash
|
|
141
|
-
const firstId = workflows[0].id;
|
|
142
|
-
const detailRes = await fetch(`${n8nUrl}/api/v1/workflows/${firstId}`, {
|
|
143
|
-
headers: getHeaders(),
|
|
144
|
-
signal: AbortSignal.timeout(3000),
|
|
145
|
-
});
|
|
146
|
-
if (!detailRes.ok)
|
|
147
|
-
return null;
|
|
148
|
-
const detail = (await detailRes.json());
|
|
149
|
-
const rules = detail.settings?.variables?.intutic_governance_rules ?? '';
|
|
150
|
-
if (!rules)
|
|
151
|
-
return null;
|
|
152
|
-
return createHash('sha256').update(rules, 'utf-8').digest('hex');
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
45
|
+
/** No rules file: see the module doc. */
|
|
46
|
+
async writeConfig() {
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
49
|
+
async readCurrentHash() {
|
|
50
|
+
return null;
|
|
157
51
|
},
|
|
158
52
|
};
|
|
159
|
-
/** The workflow variables `writeConfig` sets; `intutic disconnect` takes them out again. */
|
|
160
|
-
const INTUTIC_VARIABLES = ['intutic_proxy_url', 'intutic_governance_rules'];
|
|
161
|
-
/**
|
|
162
|
-
* Plans removing the two variables `writeConfig` sets on every workflow in
|
|
163
|
-
* the local n8n. Read-only until the plan is applied; an n8n that does not
|
|
164
|
-
* answer gets a note instead.
|
|
165
|
-
*/
|
|
166
|
-
export async function planN8nDisconnect(plan) {
|
|
167
|
-
const n8nUrl = process.env.N8N_URL || 'http://localhost:5678';
|
|
168
|
-
let workflows;
|
|
169
|
-
try {
|
|
170
|
-
const listRes = await fetch(`${n8nUrl}/api/v1/workflows`, { headers: getHeaders(), signal: AbortSignal.timeout(5000) });
|
|
171
|
-
if (!listRes.ok)
|
|
172
|
-
throw new Error(`HTTP ${listRes.status}`);
|
|
173
|
-
workflows = (await listRes.json()).data ?? [];
|
|
174
|
-
}
|
|
175
|
-
catch (err) {
|
|
176
|
-
plan.note(n8nUrl, `n8n did not answer (${err instanceof Error ? err.message : String(err)}), so its workflows were not checked for the ${INTUTIC_VARIABLES.join(' and ')} variables`);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
for (const w of workflows) {
|
|
180
|
-
const detailRes = await fetch(`${n8nUrl}/api/v1/workflows/${w.id}`, { headers: getHeaders(), signal: AbortSignal.timeout(5000) });
|
|
181
|
-
if (!detailRes.ok)
|
|
182
|
-
continue;
|
|
183
|
-
const detail = (await detailRes.json());
|
|
184
|
-
const variables = detail.settings?.variables;
|
|
185
|
-
if (!variables || !INTUTIC_VARIABLES.some((k) => k in variables))
|
|
186
|
-
continue;
|
|
187
|
-
plan.change(`${n8nUrl}/api/v1/workflows/${w.id}`, `remove the Intutic variables from workflow "${detail.name ?? w.name ?? w.id}"`, async () => {
|
|
188
|
-
const kept = Object.fromEntries(Object.entries(variables).filter(([k]) => !INTUTIC_VARIABLES.includes(k)));
|
|
189
|
-
const settings = { ...detail.settings };
|
|
190
|
-
if (Object.keys(kept).length > 0)
|
|
191
|
-
settings.variables = kept;
|
|
192
|
-
else
|
|
193
|
-
delete settings.variables;
|
|
194
|
-
const body = {
|
|
195
|
-
name: detail.name ?? w.name ?? 'Untitled',
|
|
196
|
-
nodes: detail.nodes ?? [],
|
|
197
|
-
connections: detail.connections ?? {},
|
|
198
|
-
settings,
|
|
199
|
-
};
|
|
200
|
-
if (detail.staticData !== undefined)
|
|
201
|
-
body.staticData = detail.staticData;
|
|
202
|
-
const res = await fetch(`${n8nUrl}/api/v1/workflows/${w.id}`, {
|
|
203
|
-
method: 'PUT',
|
|
204
|
-
headers: getHeaders(),
|
|
205
|
-
body: JSON.stringify(body),
|
|
206
|
-
signal: AbortSignal.timeout(5000),
|
|
207
|
-
});
|
|
208
|
-
if (!res.ok)
|
|
209
|
-
throw new Error(`n8n refused the update to workflow ${w.id}: HTTP ${res.status}`);
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
53
|
//# sourceMappingURL=n8n.js.map
|
package/dist/harness/n8n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"n8n.js","sourceRoot":"","sources":["../../src/harness/n8n.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"n8n.js","sourceRoot":"","sources":["../../src/harness/n8n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAoB;IACzC,IAAI,EAAE,WAAW,CAAC,GAAG;IACrB,cAAc,EAAE,EAAE;IAElB,KAAK,CAAC,MAAM,CAAC,cAAsB;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAuB,CAAA;QAC7D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACzF,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAA;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;QACpC,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,aAAa,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC,CAAA;IAC7E,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openWebUI.d.ts","sourceRoot":"","sources":["../../src/harness/openWebUI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"openWebUI.d.ts","sourceRoot":"","sources":["../../src/harness/openWebUI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjD,eAAO,MAAM,gBAAgB,EAAE,eAqB9B,CAAA"}
|
|
@@ -13,8 +13,6 @@
|
|
|
13
13
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
14
14
|
* @module
|
|
15
15
|
*/
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
import { homedir } from 'node:os';
|
|
18
16
|
import { HarnessType } from '@intutic/shared-types';
|
|
19
17
|
import { loadCredentials } from '../config/store.js';
|
|
20
18
|
import { writeOpenWebuiHooks } from '@intutic/sync-daemon';
|
|
@@ -24,10 +22,13 @@ export const openWebUIAdapter = {
|
|
|
24
22
|
async detect(_workspaceRoot) {
|
|
25
23
|
return false;
|
|
26
24
|
},
|
|
27
|
-
async
|
|
25
|
+
async installGate(workspaceRoot, proxyUrl) {
|
|
28
26
|
const creds = await loadCredentials();
|
|
29
27
|
await writeOpenWebuiHooks(workspaceRoot, proxyUrl, creds?.workspaceId || 'local');
|
|
30
|
-
|
|
28
|
+
},
|
|
29
|
+
/** No rules file: the filter an admin installs is this harness's governance. */
|
|
30
|
+
async writeConfig() {
|
|
31
|
+
return null;
|
|
31
32
|
},
|
|
32
33
|
async readCurrentHash() {
|
|
33
34
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openWebUI.js","sourceRoot":"","sources":["../../src/harness/openWebUI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openWebUI.js","sourceRoot":"","sources":["../../src/harness/openWebUI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,WAAW,CAAC,UAAU;IAC5B,cAAc,EAAE,EAAE;IAElB,KAAK,CAAC,MAAM,CAAC,cAAsB;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,mBAAmB,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC,CAAA;IACnF,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA"}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* pointer comment differs. A workspace detected as TypeScript-only gets the
|
|
30
30
|
* `@intutic/gate/openai` pointer; Python-only gets the Python pointer; a
|
|
31
31
|
* monorepo with both gets the Python file with the TypeScript pointer
|
|
32
|
-
* appended (
|
|
32
|
+
* appended (until 2026-09-22 the TS half was only reachable
|
|
33
33
|
* through the docs page).
|
|
34
34
|
*
|
|
35
35
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* pointer comment differs. A workspace detected as TypeScript-only gets the
|
|
30
30
|
* `@intutic/gate/openai` pointer; Python-only gets the Python pointer; a
|
|
31
31
|
* monorepo with both gets the Python file with the TypeScript pointer
|
|
32
|
-
* appended (
|
|
32
|
+
* appended (until 2026-09-22 the TS half was only reachable
|
|
33
33
|
* through the docs page).
|
|
34
34
|
*
|
|
35
35
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
@@ -87,7 +87,7 @@ export const openaiAgentsAdapter = {
|
|
|
87
87
|
}
|
|
88
88
|
const filePath = await pythonAdapter.writeConfig(workspaceRoot, sops, proxyUrl);
|
|
89
89
|
if (filePath && js) {
|
|
90
|
-
// Both ecosystems in one workspace
|
|
90
|
+
// Both ecosystems in one workspace: the file is the
|
|
91
91
|
// Python adapter's, so its pointer named only the Python gate and the
|
|
92
92
|
// TypeScript half of the monorepo was left to find `@intutic/gate`
|
|
93
93
|
// through the docs page. Say it here too.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openaiAgents.js","sourceRoot":"","sources":["../../src/harness/openaiAgents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAE9D;wEACwE;AACxE,MAAM,aAAa,GAAG,mBAAmB,CAAC;IACxC,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,CAAC,eAAe,CAAC;IAC3B,UAAU,EAAE,+BAA+B;IAC3C,UAAU,EAAE,+EAA+E;IAC3F,YAAY,EACV,mFAAmF;QACnF,iDAAiD;IACnD,QAAQ,EAAE,eAAe;CAC1B,CAAC,CAAA;AAEF;;;;;0DAK0D;AAC1D,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACtC,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,KAAK,EAAE,gCAAgC;IACvC,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,gBAAgB;IAChC,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,qEAAqE;IACjF,YAAY,EACV,4FAA4F;QAC5F,2FAA2F;QAC3F,wFAAwF;QACxF,gCAAgC;IAClC,QAAQ,EAAE,eAAe;CAC1B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,cAAc,EAAE,cAAc;IAE9B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,OAAO,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ;QAC7C,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC;YACnC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;SAChC,CAAC,CAAA;QACF,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC/E,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YACnB,
|
|
1
|
+
{"version":3,"file":"openaiAgents.js","sourceRoot":"","sources":["../../src/harness/openaiAgents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAE9D;wEACwE;AACxE,MAAM,aAAa,GAAG,mBAAmB,CAAC;IACxC,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,CAAC,eAAe,CAAC;IAC3B,UAAU,EAAE,+BAA+B;IAC3C,UAAU,EAAE,+EAA+E;IAC3F,YAAY,EACV,mFAAmF;QACnF,iDAAiD;IACnD,QAAQ,EAAE,eAAe;CAC1B,CAAC,CAAA;AAEF;;;;;0DAK0D;AAC1D,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACtC,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,KAAK,EAAE,gCAAgC;IACvC,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,gBAAgB;IAChC,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,qEAAqE;IACjF,YAAY,EACV,4FAA4F;QAC5F,2FAA2F;QAC3F,wFAAwF;QACxF,gCAAgC;IAClC,QAAQ,EAAE,eAAe;CAC1B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,cAAc,EAAE,cAAc;IAE9B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,OAAO,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ;QAC7C,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC;YACnC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;SAChC,CAAC,CAAA;QACF,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC/E,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YACnB,oDAAoD;YACpD,sEAAsE;YACtE,mEAAmE;YACnE,0CAA0C;YAC1C,MAAM,UAAU,CACd,QAAQ,EACR;gBACE,+EAA+E;gBAC/E,8EAA8E;gBAC9E,+BAA+B;gBAC/B,yEAAyE;gBACzE,0DAA0D;gBAC1D,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,OAAO,CACR,CAAA;YACD,mGAAmG;YACnG,MAAM,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;QAC/E,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,sEAAsE;IACtE,eAAe,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC;CACjF,CAAA"}
|
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
* Detects OpenClaw presence and invokes the sync-daemon hooks compiler
|
|
5
5
|
* to inject Intutic pre-tool use gates.
|
|
6
6
|
*
|
|
7
|
+
* OpenClaw loads standing instructions only from its own agent workspace
|
|
8
|
+
* (`AGENTS.md` and the other bootstrap files), never from a project, even
|
|
9
|
+
* when it works in one. The rule sets therefore go into a marked section of
|
|
10
|
+
* that workspace's `AGENTS.md` (see `openclawAgentWorkspace`), and the rest
|
|
11
|
+
* of the file stays the user's. OpenClaw truncates a bootstrap file past
|
|
12
|
+
* 20,000 characters
|
|
13
|
+
* (https://github.com/openclaw/openclaw/blob/98457908cf3e4fbbd0354b530e0aa0d15b560158/docs/gateway/config-agents/workspace-and-bootstrap.md).
|
|
14
|
+
*
|
|
7
15
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
8
16
|
* @module
|
|
9
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/harness/openclaw.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/harness/openclaw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAQjD,eAAO,MAAM,eAAe,EAAE,eAqC7B,CAAA"}
|
package/dist/harness/openclaw.js
CHANGED
|
@@ -4,24 +4,34 @@
|
|
|
4
4
|
* Detects OpenClaw presence and invokes the sync-daemon hooks compiler
|
|
5
5
|
* to inject Intutic pre-tool use gates.
|
|
6
6
|
*
|
|
7
|
+
* OpenClaw loads standing instructions only from its own agent workspace
|
|
8
|
+
* (`AGENTS.md` and the other bootstrap files), never from a project, even
|
|
9
|
+
* when it works in one. The rule sets therefore go into a marked section of
|
|
10
|
+
* that workspace's `AGENTS.md` (see `openclawAgentWorkspace`), and the rest
|
|
11
|
+
* of the file stays the user's. OpenClaw truncates a bootstrap file past
|
|
12
|
+
* 20,000 characters
|
|
13
|
+
* (https://github.com/openclaw/openclaw/blob/98457908cf3e4fbbd0354b530e0aa0d15b560158/docs/gateway/config-agents/workspace-and-bootstrap.md).
|
|
14
|
+
*
|
|
7
15
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
8
16
|
* @module
|
|
9
17
|
*/
|
|
10
18
|
import { join } from 'node:path';
|
|
11
|
-
import { access } from 'node:fs/promises';
|
|
19
|
+
import { access, readFile } from 'node:fs/promises';
|
|
12
20
|
import { existsSync } from 'node:fs';
|
|
13
21
|
import { homedir } from 'node:os';
|
|
14
22
|
import { HarnessType } from '@intutic/shared-types';
|
|
15
|
-
import {
|
|
23
|
+
import { hashString } from '../lib/hash.js';
|
|
16
24
|
import { loadCredentials } from '../config/store.js';
|
|
17
|
-
import { writeOpenclawHooks } from '@intutic/sync-daemon';
|
|
18
|
-
|
|
25
|
+
import { openclawAgentWorkspace, rulesSectionOf, writeOpenclawHooks, writeRulesSection } from '@intutic/sync-daemon';
|
|
26
|
+
import { buildRulesBody } from './rulesFiles.js';
|
|
27
|
+
const DETECT_FILE = '.openclaw/openclaw.json';
|
|
19
28
|
export const openclawAdapter = {
|
|
20
29
|
type: HarnessType.OPENCLAW,
|
|
21
|
-
|
|
30
|
+
// The rules file is outside the workspace.
|
|
31
|
+
configFileName: '',
|
|
22
32
|
async detect(workspaceRoot) {
|
|
23
33
|
const globalOpenclaw = join(homedir(), '.openclaw');
|
|
24
|
-
const localOpenclaw = join(workspaceRoot,
|
|
34
|
+
const localOpenclaw = join(workspaceRoot, DETECT_FILE);
|
|
25
35
|
try {
|
|
26
36
|
if (existsSync(globalOpenclaw))
|
|
27
37
|
return true;
|
|
@@ -32,16 +42,21 @@ export const openclawAdapter = {
|
|
|
32
42
|
return false;
|
|
33
43
|
}
|
|
34
44
|
},
|
|
35
|
-
async
|
|
36
|
-
const filePath = join(workspaceRoot, CONFIG_FILE);
|
|
45
|
+
async installGate(workspaceRoot, proxyUrl) {
|
|
37
46
|
const creds = await loadCredentials();
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
await writeOpenclawHooks(workspaceRoot, proxyUrl, creds?.workspaceId || 'local');
|
|
48
|
+
},
|
|
49
|
+
async writeConfig(workspaceRoot, sops, proxyUrl) {
|
|
50
|
+
if (sops.length === 0)
|
|
51
|
+
return null;
|
|
52
|
+
const filePath = join(await openclawAgentWorkspace(), 'AGENTS.md');
|
|
53
|
+
await writeRulesSection(filePath, workspaceRoot, buildRulesBody(sops, proxyUrl, 'section'));
|
|
40
54
|
return filePath;
|
|
41
55
|
},
|
|
42
|
-
async readCurrentHash(
|
|
56
|
+
async readCurrentHash() {
|
|
43
57
|
try {
|
|
44
|
-
|
|
58
|
+
const section = rulesSectionOf(await readFile(join(await openclawAgentWorkspace(), 'AGENTS.md'), 'utf-8'));
|
|
59
|
+
return section === null ? null : hashString(section);
|
|
45
60
|
}
|
|
46
61
|
catch {
|
|
47
62
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/harness/openclaw.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/harness/openclaw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACpH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,MAAM,WAAW,GAAG,yBAAyB,CAAA;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,2CAA2C;IAC3C,cAAc,EAAE,EAAE;IAElB,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,cAAc,CAAC;gBAAE,OAAO,IAAI,CAAA;YAC3C,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC,CAAA;IAClF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,sBAAsB,EAAE,EAAE,WAAW,CAAC,CAAA;QAClE,MAAM,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;QAC3F,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,sBAAsB,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;YAC1G,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA"}
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
* binary `opencode`).
|
|
4
4
|
*
|
|
5
5
|
* OpenCode is a terminal coding agent whose instructions file is `AGENTS.md`
|
|
6
|
-
* (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md
|
|
7
|
-
*
|
|
8
|
-
* `AGENTS.md
|
|
9
|
-
* own.
|
|
6
|
+
* (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md`;
|
|
7
|
+
* https://opencode.ai/docs/rules/). The rule sets go there through the
|
|
8
|
+
* shared `AGENTS.md` writer (agentsMd.ts).
|
|
10
9
|
*
|
|
11
10
|
* The governance-critical half is a **plugin**, not a hook file: OpenCode
|
|
12
11
|
* loads `.opencode/plugins/*.js` into its own process and runs the plugin's
|
|
@@ -14,7 +13,7 @@
|
|
|
14
13
|
* every tool call; throwing refuses the call. That plugin is generated by
|
|
15
14
|
* `@intutic/sync-daemon`'s `openCodeHooks.ts`, the same split Muse and Grok
|
|
16
15
|
* use for their hook writers. This adapter does not write `opencode.json`;
|
|
17
|
-
* the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only
|
|
16
|
+
* the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only —
|
|
18
17
|
* see the writer's module doc.
|
|
19
18
|
*
|
|
20
19
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AASjD,eAAO,MAAM,eAAe,EAAE,eA+C7B,CAAA"}
|
package/dist/harness/opencode.js
CHANGED
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
* binary `opencode`).
|
|
4
4
|
*
|
|
5
5
|
* OpenCode is a terminal coding agent whose instructions file is `AGENTS.md`
|
|
6
|
-
* (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md
|
|
7
|
-
*
|
|
8
|
-
* `AGENTS.md
|
|
9
|
-
* own.
|
|
6
|
+
* (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md`;
|
|
7
|
+
* https://opencode.ai/docs/rules/). The rule sets go there through the
|
|
8
|
+
* shared `AGENTS.md` writer (agentsMd.ts).
|
|
10
9
|
*
|
|
11
10
|
* The governance-critical half is a **plugin**, not a hook file: OpenCode
|
|
12
11
|
* loads `.opencode/plugins/*.js` into its own process and runs the plugin's
|
|
@@ -14,7 +13,7 @@
|
|
|
14
13
|
* every tool call; throwing refuses the call. That plugin is generated by
|
|
15
14
|
* `@intutic/sync-daemon`'s `openCodeHooks.ts`, the same split Muse and Grok
|
|
16
15
|
* use for their hook writers. This adapter does not write `opencode.json`;
|
|
17
|
-
* the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only
|
|
16
|
+
* the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only —
|
|
18
17
|
* see the writer's module doc.
|
|
19
18
|
*
|
|
20
19
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
@@ -24,19 +23,15 @@ import { join } from 'node:path';
|
|
|
24
23
|
import { access } from 'node:fs/promises';
|
|
25
24
|
import { homedir } from 'node:os';
|
|
26
25
|
import { HarnessType } from '@intutic/shared-types';
|
|
27
|
-
import { hashFile } from '../lib/hash.js';
|
|
28
|
-
import { buildMarkdownContent } from './base.js';
|
|
29
26
|
import { writeOpenCodeHooks } from '@intutic/sync-daemon/harness/openCodeHooks';
|
|
30
|
-
import {
|
|
31
|
-
/** Workspace-relative rules file. OpenCode reads this, falling back to CLAUDE.md. */
|
|
32
|
-
const CONFIG_FILE = 'AGENTS.md';
|
|
27
|
+
import { AGENTS_MD, agentsMdHash, writeAgentsMd } from './agentsMd.js';
|
|
33
28
|
/** `$OPENCODE_CONFIG_DIR` or `~/.config/opencode` — the user-level config dir. */
|
|
34
29
|
function openCodeConfigDir() {
|
|
35
30
|
return process.env.OPENCODE_CONFIG_DIR || join(homedir(), '.config', 'opencode');
|
|
36
31
|
}
|
|
37
32
|
export const opencodeAdapter = {
|
|
38
33
|
type: HarnessType.OPENCODE,
|
|
39
|
-
configFileName:
|
|
34
|
+
configFileName: AGENTS_MD,
|
|
40
35
|
async detect(workspaceRoot) {
|
|
41
36
|
// 1. Project-local `.opencode/` directory or `opencode.json{,c}`. Not
|
|
42
37
|
// AGENTS.md alone — Muse and Grok read the same file.
|
|
@@ -70,27 +65,17 @@ export const opencodeAdapter = {
|
|
|
70
65
|
catch { /* ignore */ }
|
|
71
66
|
return false;
|
|
72
67
|
},
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (sops.length > 0) {
|
|
78
|
-
const content = buildMarkdownContent(sops, proxyUrl);
|
|
79
|
-
await writeOwnedFile(agentsPath, workspaceRoot, content);
|
|
80
|
-
}
|
|
81
|
-
// 2. The plugin gate. `intutic connect` has no workspace id in scope —
|
|
82
|
-
// same limitation `museAdapter` has — the sync daemon re-runs this
|
|
83
|
-
// with a real one on the next cycle.
|
|
68
|
+
/** The plugin gate. `intutic connect` has no workspace id in scope — same
|
|
69
|
+
* limitation `museAdapter` has — the sync daemon re-runs this with a real
|
|
70
|
+
* one on the next cycle. */
|
|
71
|
+
async installGate(workspaceRoot, proxyUrl) {
|
|
84
72
|
await writeOpenCodeHooks(workspaceRoot, proxyUrl, '');
|
|
85
|
-
return agentsPath;
|
|
86
73
|
},
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
74
|
+
writeConfig(workspaceRoot, sops, proxyUrl) {
|
|
75
|
+
return writeAgentsMd(workspaceRoot, sops, proxyUrl);
|
|
76
|
+
},
|
|
77
|
+
readCurrentHash(workspaceRoot) {
|
|
78
|
+
return agentsMdHash(workspaceRoot);
|
|
94
79
|
},
|
|
95
80
|
};
|
|
96
81
|
//# sourceMappingURL=opencode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEtE,kFAAkF;AAClF,SAAS,iBAAiB;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,SAAS;IAEzB,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,sEAAsE;QACtE,yDAAyD;QACzD,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;gBACzC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAA;YACjC,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAE1B,gEAAgE;QAChE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACzF,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;YAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC;wBAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBAAC,OAAO,IAAI,CAAA;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;iCAE6B;IAC7B,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QACvE,OAAO,aAAa,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;IAED,eAAe,CAAC,aAAqB;QACnC,OAAO,YAAY,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;CACF,CAAA"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* openhands.ts — OpenHands adapter (full implementation with hooks + llm.base_url).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* .
|
|
4
|
+
* - rules: `.openhands/microagents/intutic-governance.md`, a repository
|
|
5
|
+
* microagent with no triggers, which OpenHands keeps active in every
|
|
6
|
+
* conversation (V0's `microagent.py`: "no triggers -> REPO (always
|
|
7
|
+
* active)"; the V1 software-agent SDK loads the same directory as legacy
|
|
8
|
+
* skills, "no keywords -> always active"). Earlier versions put the rules
|
|
9
|
+
* in an `[intutic]` table of `config.toml`, which OpenHands never reads;
|
|
10
|
+
* connect drops that table and disconnect removes it;
|
|
11
|
+
* - `[llm] base_url` merged into `config.toml`, keeping the rest of the file;
|
|
12
|
+
* - the PreToolUse hook in `.openhands/hooks.json`.
|
|
7
13
|
*
|
|
8
14
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
9
15
|
* @module
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openhands.d.ts","sourceRoot":"","sources":["../../src/harness/openhands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openhands.d.ts","sourceRoot":"","sources":["../../src/harness/openhands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAUjD,eAAO,MAAM,gBAAgB,EAAE,eAwD9B,CAAA"}
|