@h-rig/runtime 0.0.6-alpha.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 +27 -0
- package/dist/bin/rig-agent-dispatch.js +9615 -0
- package/dist/bin/rig-agent.js +9512 -0
- package/dist/bin/rig-browser-tool.js +269 -0
- package/dist/src/agent-mode.js +48 -0
- package/dist/src/baked-secrets.js +121 -0
- package/dist/src/binary-build-worker.js +312 -0
- package/dist/src/binary-run.js +540 -0
- package/dist/src/boundaries.js +1 -0
- package/dist/src/build-time-config.js +25 -0
- package/dist/src/control-plane/agent-roles.js +27 -0
- package/dist/src/control-plane/agent-wrapper.js +9621 -0
- package/dist/src/control-plane/authority-files.js +582 -0
- package/dist/src/control-plane/browser-contract.js +135 -0
- package/dist/src/control-plane/controlled-bash.js +1111 -0
- package/dist/src/control-plane/errors.js +13 -0
- package/dist/src/control-plane/harness-main.js +10828 -0
- package/dist/src/control-plane/hook-materializer.js +75 -0
- package/dist/src/control-plane/hooks/audit-trail.js +353 -0
- package/dist/src/control-plane/hooks/completion-verification.js +7552 -0
- package/dist/src/control-plane/hooks/import-guard.js +890 -0
- package/dist/src/control-plane/hooks/inject-context.js +4189 -0
- package/dist/src/control-plane/hooks/post-edit-lint.js +43 -0
- package/dist/src/control-plane/hooks/safety-guard.js +910 -0
- package/dist/src/control-plane/hooks/scope-guard.js +907 -0
- package/dist/src/control-plane/hooks/shared.js +44 -0
- package/dist/src/control-plane/hooks/submodule-branch.js +7797 -0
- package/dist/src/control-plane/hooks/task-runtime-start.js +7799 -0
- package/dist/src/control-plane/hooks/test-integrity-guard.js +891 -0
- package/dist/src/control-plane/materialize-task-config.js +453 -0
- package/dist/src/control-plane/memory-sync/cli.js +2019 -0
- package/dist/src/control-plane/memory-sync/db.js +753 -0
- package/dist/src/control-plane/memory-sync/embed.js +281 -0
- package/dist/src/control-plane/memory-sync/index.js +2049 -0
- package/dist/src/control-plane/memory-sync/query.js +294 -0
- package/dist/src/control-plane/memory-sync/read.js +784 -0
- package/dist/src/control-plane/memory-sync/types.js +6 -0
- package/dist/src/control-plane/memory-sync/write.js +1547 -0
- package/dist/src/control-plane/native/git-native.js +490 -0
- package/dist/src/control-plane/native/git-ops.js +2860 -0
- package/dist/src/control-plane/native/harness-cli.js +9721 -0
- package/dist/src/control-plane/native/pr-automation.js +373 -0
- package/dist/src/control-plane/native/profile-ops.js +481 -0
- package/dist/src/control-plane/native/repo-ops.js +2342 -0
- package/dist/src/control-plane/native/root-resolver.js +66 -0
- package/dist/src/control-plane/native/run-ops.js +3281 -0
- package/dist/src/control-plane/native/runtime-native-sidecar.js +299 -0
- package/dist/src/control-plane/native/runtime-native.js +392 -0
- package/dist/src/control-plane/native/scope-rules.js +17 -0
- package/dist/src/control-plane/native/task-ops.js +6320 -0
- package/dist/src/control-plane/native/task-state.js +1512 -0
- package/dist/src/control-plane/native/utils.js +535 -0
- package/dist/src/control-plane/native/validator-binaries.js +889 -0
- package/dist/src/control-plane/native/validator.js +2197 -0
- package/dist/src/control-plane/native/verifier.js +3249 -0
- package/dist/src/control-plane/native/workspace-ops.js +1635 -0
- package/dist/src/control-plane/plugin-host-context.js +334 -0
- package/dist/src/control-plane/project-main-pre-run-sync.js +630 -0
- package/dist/src/control-plane/provider/claude-stream-records.js +158 -0
- package/dist/src/control-plane/provider/codex-app-server.js +885 -0
- package/dist/src/control-plane/provider/codex-exec-records.js +203 -0
- package/dist/src/control-plane/provider/rig-task-run-skill.js +39 -0
- package/dist/src/control-plane/provider/runtime-instructions.js +96 -0
- package/dist/src/control-plane/remote.js +854 -0
- package/dist/src/control-plane/repos/index.js +473 -0
- package/dist/src/control-plane/repos/layout.js +124 -0
- package/dist/src/control-plane/repos/mirror/bootstrap.js +268 -0
- package/dist/src/control-plane/repos/mirror/refresh.js +398 -0
- package/dist/src/control-plane/repos/mirror/state.js +167 -0
- package/dist/src/control-plane/repos/registry.js +77 -0
- package/dist/src/control-plane/repos/types.js +1 -0
- package/dist/src/control-plane/runtime/agent-mode.js +48 -0
- package/dist/src/control-plane/runtime/baked-secrets.js +120 -0
- package/dist/src/control-plane/runtime/claude-tool-router-binary.js +343 -0
- package/dist/src/control-plane/runtime/claude-tool-router.js +520 -0
- package/dist/src/control-plane/runtime/context.js +216 -0
- package/dist/src/control-plane/runtime/events.js +218 -0
- package/dist/src/control-plane/runtime/guard-types.js +6 -0
- package/dist/src/control-plane/runtime/guard.js +880 -0
- package/dist/src/control-plane/runtime/image/fingerprint-sidecar.js +1194 -0
- package/dist/src/control-plane/runtime/image/index.js +2255 -0
- package/dist/src/control-plane/runtime/image-fingerprint-sidecar.js +1191 -0
- package/dist/src/control-plane/runtime/image.js +2255 -0
- package/dist/src/control-plane/runtime/index.js +8511 -0
- package/dist/src/control-plane/runtime/isolation/discovery.js +599 -0
- package/dist/src/control-plane/runtime/isolation/home.js +1217 -0
- package/dist/src/control-plane/runtime/isolation/index.js +8193 -0
- package/dist/src/control-plane/runtime/isolation/runner.js +2651 -0
- package/dist/src/control-plane/runtime/isolation/shared.js +501 -0
- package/dist/src/control-plane/runtime/isolation/toolchain.js +1892 -0
- package/dist/src/control-plane/runtime/isolation/types.js +1 -0
- package/dist/src/control-plane/runtime/isolation/worktree.js +509 -0
- package/dist/src/control-plane/runtime/isolation.js +8193 -0
- package/dist/src/control-plane/runtime/overlay.js +67 -0
- package/dist/src/control-plane/runtime/plugin-mode.js +41 -0
- package/dist/src/control-plane/runtime/plugins.js +1131 -0
- package/dist/src/control-plane/runtime/provisioning-env.js +220 -0
- package/dist/src/control-plane/runtime/queue.js +8358 -0
- package/dist/src/control-plane/runtime/rig-shell.js +205 -0
- package/dist/src/control-plane/runtime/rig-tools.js +182 -0
- package/dist/src/control-plane/runtime/runner-context.js +1 -0
- package/dist/src/control-plane/runtime/runtime-paths.js +184 -0
- package/dist/src/control-plane/runtime/sandbox/backend-bwrap.js +311 -0
- package/dist/src/control-plane/runtime/sandbox/backend-none.js +21 -0
- package/dist/src/control-plane/runtime/sandbox/backend-seatbelt.js +268 -0
- package/dist/src/control-plane/runtime/sandbox/backend.js +1718 -0
- package/dist/src/control-plane/runtime/sandbox/orchestrator.js +1745 -0
- package/dist/src/control-plane/runtime/sandbox/utils.js +137 -0
- package/dist/src/control-plane/runtime/sandbox-backend-bwrap.js +311 -0
- package/dist/src/control-plane/runtime/sandbox-backend-none.js +21 -0
- package/dist/src/control-plane/runtime/sandbox-backend-seatbelt.js +268 -0
- package/dist/src/control-plane/runtime/sandbox-backend.js +1718 -0
- package/dist/src/control-plane/runtime/sandbox-orchestrator.js +1745 -0
- package/dist/src/control-plane/runtime/sandbox-utils.js +137 -0
- package/dist/src/control-plane/runtime/snapshot/index.js +454 -0
- package/dist/src/control-plane/runtime/snapshot/sidecar.js +502 -0
- package/dist/src/control-plane/runtime/snapshot/task-run.js +1578 -0
- package/dist/src/control-plane/runtime/snapshot-sidecar.js +498 -0
- package/dist/src/control-plane/runtime/snapshot.js +454 -0
- package/dist/src/control-plane/runtime/task-run-snapshot.js +1578 -0
- package/dist/src/control-plane/runtime/tool-gateway.js +422 -0
- package/dist/src/control-plane/runtime/tooling/browser-tools.js +32 -0
- package/dist/src/control-plane/runtime/tooling/claude-router-binary.js +343 -0
- package/dist/src/control-plane/runtime/tooling/claude-router.js +524 -0
- package/dist/src/control-plane/runtime/tooling/file-tools.js +182 -0
- package/dist/src/control-plane/runtime/tooling/gateway.js +422 -0
- package/dist/src/control-plane/runtime/tooling/index.js +1290 -0
- package/dist/src/control-plane/runtime/tooling/shell.js +205 -0
- package/dist/src/control-plane/runtime/types.js +1 -0
- package/dist/src/control-plane/setup-version.js +14 -0
- package/dist/src/control-plane/state-sync/index.js +1509 -0
- package/dist/src/control-plane/state-sync/read.js +856 -0
- package/dist/src/control-plane/state-sync/reconcile.js +260 -0
- package/dist/src/control-plane/state-sync/repo.js +302 -0
- package/dist/src/control-plane/state-sync/types.js +111 -0
- package/dist/src/control-plane/state-sync/write.js +1469 -0
- package/dist/src/control-plane/task-fields.js +38 -0
- package/dist/src/control-plane/task-source-bootstrap.js +46 -0
- package/dist/src/control-plane/task-source.js +30 -0
- package/dist/src/control-plane/tasks/legacy-task-config-source.js +130 -0
- package/dist/src/control-plane/tasks/plugin-task-source.js +103 -0
- package/dist/src/control-plane/tasks/source-aware-task-config-source.js +611 -0
- package/dist/src/control-plane/tasks/source-lifecycle.js +1093 -0
- package/dist/src/control-plane/tasks/task-record-reader.js +9 -0
- package/dist/src/control-plane/validators/boundary/public-apis.js +107 -0
- package/dist/src/control-plane/validators/integration/_shared.js +51 -0
- package/dist/src/control-plane/validators/integration/adm-audit-http.js +85 -0
- package/dist/src/control-plane/validators/integration/adm-auth-http.js +78 -0
- package/dist/src/control-plane/validators/integration/adm-issuer-http.js +80 -0
- package/dist/src/control-plane/validators/integration/adm-migration.js +78 -0
- package/dist/src/control-plane/validators/integration/adm-scaffold.js +78 -0
- package/dist/src/control-plane/validators/runtime-registration.js +64 -0
- package/dist/src/control-plane/validators/shared.js +683 -0
- package/dist/src/events.js +218 -0
- package/dist/src/execution.js +35 -0
- package/dist/src/index.js +1633 -0
- package/dist/src/layout.js +145 -0
- package/dist/src/local-server.js +202 -0
- package/dist/src/plugins.js +329 -0
- package/dist/src/remote-http.js +83 -0
- package/dist/src/runtime-context.js +216 -0
- package/dist/src/types.js +1 -0
- package/native/darwin-arm64/bin/rig-git +0 -0
- package/native/darwin-arm64/bin/rig-shell +0 -0
- package/native/darwin-arm64/bin/rig-tools +0 -0
- package/native/darwin-arm64/lib/runtime-native-darwin-arm64.dylib +0 -0
- package/native/darwin-arm64/lib/runtime-native.dylib +0 -0
- package/native/darwin-arm64/manifest.json +1 -0
- package/native/linux-x64/bin/rig-git +0 -0
- package/native/linux-x64/bin/rig-shell +0 -0
- package/native/linux-x64/bin/rig-tools +0 -0
- package/native/linux-x64/lib/runtime-native-linux-x64.so +0 -0
- package/native/linux-x64/lib/runtime-native.so +0 -0
- package/native/linux-x64/manifest.json +1 -0
- package/package.json +74 -0
- package/skills/rig-task-run.md +71 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/runtime/src/control-plane/runtime/context.ts
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
4
|
+
import { dirname, resolve } from "path";
|
|
5
|
+
var RUNTIME_CONTEXT_ENV = "RIG_RUNTIME_CONTEXT_FILE";
|
|
6
|
+
var DEFAULT_RUNTIME_MEMORY_RETRIEVAL = {
|
|
7
|
+
topK: 5,
|
|
8
|
+
lexicalWeight: 0.35,
|
|
9
|
+
vectorWeight: 0.45,
|
|
10
|
+
recencyWeight: 0.1,
|
|
11
|
+
confidenceWeight: 0.1
|
|
12
|
+
};
|
|
13
|
+
var runtimeContextStringFields = [
|
|
14
|
+
"runtimeId",
|
|
15
|
+
"taskId",
|
|
16
|
+
"role",
|
|
17
|
+
"workspaceDir",
|
|
18
|
+
"stateDir",
|
|
19
|
+
"logsDir",
|
|
20
|
+
"sessionDir",
|
|
21
|
+
"sessionFile",
|
|
22
|
+
"policyFile",
|
|
23
|
+
"binDir",
|
|
24
|
+
"createdAt"
|
|
25
|
+
];
|
|
26
|
+
var runtimeContextArrayFields = ["scopes", "validation"];
|
|
27
|
+
var runtimeContextOptionalStringFields = [
|
|
28
|
+
"artifactRoot",
|
|
29
|
+
"hostProjectRoot",
|
|
30
|
+
"monorepoMainRoot",
|
|
31
|
+
"monorepoBaseRef",
|
|
32
|
+
"monorepoBaseCommit"
|
|
33
|
+
];
|
|
34
|
+
function writeRuntimeContext(path, ctx) {
|
|
35
|
+
const absPath = resolve(path);
|
|
36
|
+
const dir = dirname(absPath);
|
|
37
|
+
if (!existsSync(dir)) {
|
|
38
|
+
mkdirSync(dir, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
writeFileSync(absPath, JSON.stringify(ctx, null, 2), "utf8");
|
|
41
|
+
}
|
|
42
|
+
function loadRuntimeContext(path) {
|
|
43
|
+
const absPath = resolve(path);
|
|
44
|
+
if (!existsSync(absPath)) {
|
|
45
|
+
throw new Error(`RuntimeTaskContext file not found: ${absPath}`);
|
|
46
|
+
}
|
|
47
|
+
let raw;
|
|
48
|
+
try {
|
|
49
|
+
raw = JSON.parse(readFileSync(absPath, "utf8"));
|
|
50
|
+
} catch (err) {
|
|
51
|
+
throw new Error(`Failed to parse RuntimeTaskContext at ${absPath}: ${String(err)}`);
|
|
52
|
+
}
|
|
53
|
+
if (typeof raw !== "object" || raw === null) {
|
|
54
|
+
throw new Error(`RuntimeTaskContext at ${absPath} is not an object`);
|
|
55
|
+
}
|
|
56
|
+
const obj = raw;
|
|
57
|
+
for (const field of runtimeContextStringFields) {
|
|
58
|
+
if (typeof obj[field] !== "string" || obj[field].length === 0) {
|
|
59
|
+
throw new Error(`RuntimeTaskContext field "${field}" must be a non-empty string (at ${absPath})`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const field of runtimeContextArrayFields) {
|
|
63
|
+
if (!Array.isArray(obj[field])) {
|
|
64
|
+
throw new Error(`RuntimeTaskContext field "${field}" must be an array (at ${absPath})`);
|
|
65
|
+
}
|
|
66
|
+
if (!obj[field].every((entry) => typeof entry === "string")) {
|
|
67
|
+
throw new Error(`RuntimeTaskContext field "${field}" must be a string[] (at ${absPath})`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const field of runtimeContextOptionalStringFields) {
|
|
71
|
+
if (field in obj && obj[field] !== undefined && typeof obj[field] !== "string") {
|
|
72
|
+
throw new Error(`RuntimeTaskContext field "${field}" must be a string when present (at ${absPath})`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (obj.browser !== undefined) {
|
|
76
|
+
if (typeof obj.browser !== "object" || obj.browser === null || Array.isArray(obj.browser)) {
|
|
77
|
+
throw new Error(`RuntimeTaskContext field "browser" must be an object when present (at ${absPath})`);
|
|
78
|
+
}
|
|
79
|
+
const browser = obj.browser;
|
|
80
|
+
for (const field of [
|
|
81
|
+
"preset",
|
|
82
|
+
"mode",
|
|
83
|
+
"stateDir",
|
|
84
|
+
"defaultProfile",
|
|
85
|
+
"effectiveProfile",
|
|
86
|
+
"defaultAttachUrl",
|
|
87
|
+
"effectiveAttachUrl",
|
|
88
|
+
"launchHelper",
|
|
89
|
+
"checkHelper",
|
|
90
|
+
"attachInfoHelper",
|
|
91
|
+
"e2eHelper",
|
|
92
|
+
"resetProfileHelper"
|
|
93
|
+
]) {
|
|
94
|
+
if (typeof browser[field] !== "string" || browser[field].length === 0) {
|
|
95
|
+
throw new Error(`RuntimeTaskContext field "browser.${field}" must be a non-empty string (at ${absPath})`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
for (const field of ["devCommand", "launchCommand", "checkCommand", "e2eCommand"]) {
|
|
99
|
+
if (browser[field] !== undefined && typeof browser[field] !== "string") {
|
|
100
|
+
throw new Error(`RuntimeTaskContext field "browser.${field}" must be a string when present (at ${absPath})`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (typeof browser.required !== "boolean") {
|
|
104
|
+
throw new Error(`RuntimeTaskContext field "browser.required" must be a boolean (at ${absPath})`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (obj.memory !== undefined) {
|
|
108
|
+
if (typeof obj.memory !== "object" || obj.memory === null || Array.isArray(obj.memory)) {
|
|
109
|
+
throw new Error(`RuntimeTaskContext field "memory" must be an object when present (at ${absPath})`);
|
|
110
|
+
}
|
|
111
|
+
const memory = obj.memory;
|
|
112
|
+
for (const field of ["canonicalPath", "canonicalRef", "canonicalBaseOid", "hydratedPath"]) {
|
|
113
|
+
if (typeof memory[field] !== "string" || memory[field].length === 0) {
|
|
114
|
+
throw new Error(`RuntimeTaskContext field "memory.${field}" must be a non-empty string (at ${absPath})`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (typeof memory.createdFresh !== "boolean") {
|
|
118
|
+
throw new Error(`RuntimeTaskContext field "memory.createdFresh" must be a boolean (at ${absPath})`);
|
|
119
|
+
}
|
|
120
|
+
if (typeof memory.retrieval !== "object" || memory.retrieval === null || Array.isArray(memory.retrieval)) {
|
|
121
|
+
throw new Error(`RuntimeTaskContext field "memory.retrieval" must be an object (at ${absPath})`);
|
|
122
|
+
}
|
|
123
|
+
const retrieval = memory.retrieval;
|
|
124
|
+
for (const field of ["topK", "lexicalWeight", "vectorWeight", "recencyWeight", "confidenceWeight"]) {
|
|
125
|
+
if (typeof retrieval[field] !== "number" || Number.isNaN(retrieval[field])) {
|
|
126
|
+
throw new Error(`RuntimeTaskContext field "memory.retrieval.${field}" must be a number (at ${absPath})`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (obj.initialDirtyFiles !== undefined) {
|
|
131
|
+
if (typeof obj.initialDirtyFiles !== "object" || obj.initialDirtyFiles === null || Array.isArray(obj.initialDirtyFiles)) {
|
|
132
|
+
throw new Error(`RuntimeTaskContext field "initialDirtyFiles" must be an object when present (at ${absPath})`);
|
|
133
|
+
}
|
|
134
|
+
const dirtyFiles = obj.initialDirtyFiles;
|
|
135
|
+
for (const key of ["project", "monorepo"]) {
|
|
136
|
+
if (dirtyFiles[key] === undefined) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!Array.isArray(dirtyFiles[key]) || !dirtyFiles[key].every((entry) => typeof entry === "string")) {
|
|
140
|
+
throw new Error(`RuntimeTaskContext field "initialDirtyFiles.${key}" must be a string[] when present (at ${absPath})`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (obj.initialHeadCommits !== undefined) {
|
|
145
|
+
if (typeof obj.initialHeadCommits !== "object" || obj.initialHeadCommits === null || Array.isArray(obj.initialHeadCommits)) {
|
|
146
|
+
throw new Error(`RuntimeTaskContext field "initialHeadCommits" must be an object when present (at ${absPath})`);
|
|
147
|
+
}
|
|
148
|
+
const headCommits = obj.initialHeadCommits;
|
|
149
|
+
for (const key of ["project", "monorepo"]) {
|
|
150
|
+
if (headCommits[key] === undefined) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (typeof headCommits[key] !== "string") {
|
|
154
|
+
throw new Error(`RuntimeTaskContext field "initialHeadCommits.${key}" must be a string when present (at ${absPath})`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return obj;
|
|
159
|
+
}
|
|
160
|
+
function runtimeMemoryEnvFromContext(ctx) {
|
|
161
|
+
if (!ctx?.memory) {
|
|
162
|
+
return {};
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
RIG_MEMORY_DB_PATH: ctx.memory.hydratedPath,
|
|
166
|
+
RIG_MEMORY_CANONICAL_PATH: ctx.memory.canonicalPath,
|
|
167
|
+
RIG_MEMORY_CANONICAL_REF: ctx.memory.canonicalRef,
|
|
168
|
+
RIG_MEMORY_CANONICAL_BASE_OID: ctx.memory.canonicalBaseOid,
|
|
169
|
+
RIG_MEMORY_CREATED_FRESH: ctx.memory.createdFresh ? "1" : "0",
|
|
170
|
+
RIG_MEMORY_RETRIEVAL_TOP_K: String(ctx.memory.retrieval.topK),
|
|
171
|
+
RIG_MEMORY_RETRIEVAL_LEXICAL_WEIGHT: String(ctx.memory.retrieval.lexicalWeight),
|
|
172
|
+
RIG_MEMORY_RETRIEVAL_VECTOR_WEIGHT: String(ctx.memory.retrieval.vectorWeight),
|
|
173
|
+
RIG_MEMORY_RETRIEVAL_RECENCY_WEIGHT: String(ctx.memory.retrieval.recencyWeight),
|
|
174
|
+
RIG_MEMORY_RETRIEVAL_CONFIDENCE_WEIGHT: String(ctx.memory.retrieval.confidenceWeight)
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function loadRuntimeContextFromEnv(env = process.env) {
|
|
178
|
+
const contextFile = env[RUNTIME_CONTEXT_ENV];
|
|
179
|
+
if (contextFile) {
|
|
180
|
+
return loadRuntimeContext(contextFile);
|
|
181
|
+
}
|
|
182
|
+
const inferred = findRuntimeContextFile(process.cwd());
|
|
183
|
+
if (!inferred) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return loadRuntimeContext(inferred);
|
|
187
|
+
}
|
|
188
|
+
function findRuntimeContextFile(startPath) {
|
|
189
|
+
let current = resolve(startPath);
|
|
190
|
+
while (true) {
|
|
191
|
+
const candidate = resolve(current, "runtime-context.json");
|
|
192
|
+
if (existsSync(candidate) && isAgentRuntimeContextPath(candidate)) {
|
|
193
|
+
return candidate;
|
|
194
|
+
}
|
|
195
|
+
const parent = dirname(current);
|
|
196
|
+
if (parent === current) {
|
|
197
|
+
return "";
|
|
198
|
+
}
|
|
199
|
+
current = parent;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function isAgentRuntimeContextPath(path) {
|
|
203
|
+
const normalized = path.replace(/\\/g, "/");
|
|
204
|
+
return /\/\.rig\/runtime-context\.json$/.test(normalized);
|
|
205
|
+
}
|
|
206
|
+
export {
|
|
207
|
+
writeRuntimeContext,
|
|
208
|
+
runtimeMemoryEnvFromContext,
|
|
209
|
+
runtimeContextStringFields,
|
|
210
|
+
runtimeContextOptionalStringFields,
|
|
211
|
+
runtimeContextArrayFields,
|
|
212
|
+
loadRuntimeContextFromEnv,
|
|
213
|
+
loadRuntimeContext,
|
|
214
|
+
RUNTIME_CONTEXT_ENV,
|
|
215
|
+
DEFAULT_RUNTIME_MEMORY_RETRIEVAL
|
|
216
|
+
};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/runtime/src/control-plane/runtime/events.ts
|
|
3
|
+
import { appendFile, mkdir } from "fs/promises";
|
|
4
|
+
import { randomUUID } from "crypto";
|
|
5
|
+
import { dirname as dirname2, resolve as resolve2 } from "path";
|
|
6
|
+
|
|
7
|
+
// packages/runtime/src/layout.ts
|
|
8
|
+
import { existsSync } from "fs";
|
|
9
|
+
import { basename, dirname, resolve } from "path";
|
|
10
|
+
var RIG_DEFINITION_DIRNAME = "rig";
|
|
11
|
+
var RIG_ARTIFACTS_DIRNAME = "artifacts";
|
|
12
|
+
function resolveMonorepoRoot(projectRoot) {
|
|
13
|
+
const normalizedProjectRoot = resolve(projectRoot);
|
|
14
|
+
const explicit = process.env.MONOREPO_ROOT?.trim();
|
|
15
|
+
if (explicit) {
|
|
16
|
+
const explicitRoot = resolve(explicit);
|
|
17
|
+
const explicitParent = dirname(explicitRoot);
|
|
18
|
+
if (basename(explicitParent) === ".worktrees") {
|
|
19
|
+
const owner = dirname(explicitParent);
|
|
20
|
+
const ownerHasGit = existsSync(resolve(owner, ".git"));
|
|
21
|
+
const ownerHasTaskConfig = existsSync(resolve(owner, ".rig", "task-config.json"));
|
|
22
|
+
const ownerHasRigConfig = existsSync(resolve(owner, "rig.config.ts"));
|
|
23
|
+
if (ownerHasGit && (ownerHasTaskConfig || ownerHasRigConfig)) {
|
|
24
|
+
return owner;
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`MONOREPO_ROOT points to worktree ${explicitRoot}, but the owner checkout is incomplete at ${owner}.`);
|
|
27
|
+
}
|
|
28
|
+
if (!existsSync(resolve(explicitRoot, ".git"))) {
|
|
29
|
+
throw new Error(`MONOREPO_ROOT points to ${explicitRoot}, but no git checkout was found there.`);
|
|
30
|
+
}
|
|
31
|
+
const hasTaskConfig = existsSync(resolve(explicitRoot, ".rig", "task-config.json"));
|
|
32
|
+
const hasRigConfig = existsSync(resolve(explicitRoot, "rig.config.ts"));
|
|
33
|
+
if (!hasTaskConfig && !hasRigConfig) {
|
|
34
|
+
throw new Error(`MONOREPO_ROOT points to ${explicitRoot}, but neither .rig/task-config.json nor rig.config.ts exists there.`);
|
|
35
|
+
}
|
|
36
|
+
return explicitRoot;
|
|
37
|
+
}
|
|
38
|
+
const projectParent = dirname(normalizedProjectRoot);
|
|
39
|
+
if (basename(projectParent) === ".worktrees") {
|
|
40
|
+
const worktreeOwner = dirname(projectParent);
|
|
41
|
+
const ownerHasGit = existsSync(resolve(worktreeOwner, ".git"));
|
|
42
|
+
const ownerHasTaskConfig = existsSync(resolve(worktreeOwner, ".rig", "task-config.json"));
|
|
43
|
+
const ownerHasRigConfig = existsSync(resolve(worktreeOwner, "rig.config.ts"));
|
|
44
|
+
if (ownerHasGit && (ownerHasTaskConfig || ownerHasRigConfig)) {
|
|
45
|
+
return worktreeOwner;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return normalizedProjectRoot;
|
|
49
|
+
}
|
|
50
|
+
function resolveRuntimeWorkspaceLayout(workspaceDir) {
|
|
51
|
+
const root = resolve(workspaceDir);
|
|
52
|
+
const rigRoot = resolve(root, ".rig");
|
|
53
|
+
const logsDir = resolve(rigRoot, "logs");
|
|
54
|
+
const stateDir = resolve(rigRoot, "state");
|
|
55
|
+
const runtimeDir = resolve(rigRoot, "runtime");
|
|
56
|
+
const binDir = resolve(rigRoot, "bin");
|
|
57
|
+
return {
|
|
58
|
+
workspaceDir: root,
|
|
59
|
+
rigRoot,
|
|
60
|
+
stateDir,
|
|
61
|
+
logsDir,
|
|
62
|
+
artifactsRoot: resolve(root, RIG_ARTIFACTS_DIRNAME),
|
|
63
|
+
runtimeDir,
|
|
64
|
+
homeDir: resolve(rigRoot, "home"),
|
|
65
|
+
tmpDir: resolve(rigRoot, "tmp"),
|
|
66
|
+
cacheDir: resolve(rigRoot, "cache"),
|
|
67
|
+
sessionDir: resolve(rigRoot, "session"),
|
|
68
|
+
binDir,
|
|
69
|
+
distDir: resolve(rigRoot, "dist"),
|
|
70
|
+
pluginBinDir: resolve(binDir, "plugins"),
|
|
71
|
+
contextPath: resolve(rigRoot, "runtime-context.json"),
|
|
72
|
+
controlPlaneEventsFile: resolve(logsDir, "control-plane.events.jsonl")
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function resolveActiveRuntimeWorkspaceRoot(monorepoRoot) {
|
|
76
|
+
const explicit = process.env.RIG_TASK_WORKSPACE?.trim();
|
|
77
|
+
if (!explicit) {
|
|
78
|
+
throw new Error("No active runtime workspace. Set RIG_TASK_WORKSPACE or provision a task runtime first.");
|
|
79
|
+
}
|
|
80
|
+
return resolve(explicit);
|
|
81
|
+
}
|
|
82
|
+
function resolveRigLayout(projectRoot) {
|
|
83
|
+
const monorepoRoot = resolveMonorepoRoot(projectRoot);
|
|
84
|
+
const definitionRoot = resolve(projectRoot, RIG_DEFINITION_DIRNAME);
|
|
85
|
+
const runtimeWorkspaceRoot = resolveActiveRuntimeWorkspaceRoot(monorepoRoot);
|
|
86
|
+
const runtimeLayout = resolveRuntimeWorkspaceLayout(runtimeWorkspaceRoot);
|
|
87
|
+
const policyDir = resolve(definitionRoot, "policy");
|
|
88
|
+
return {
|
|
89
|
+
projectRoot,
|
|
90
|
+
monorepoRoot,
|
|
91
|
+
definitionRoot,
|
|
92
|
+
runtimeWorkspaceRoot,
|
|
93
|
+
stateRoot: runtimeLayout.rigRoot,
|
|
94
|
+
artifactsRoot: runtimeLayout.artifactsRoot,
|
|
95
|
+
configPath: resolve(definitionRoot, "config.sh"),
|
|
96
|
+
taskConfigPath: resolve(runtimeWorkspaceRoot, ".rig", "task-config.json"),
|
|
97
|
+
policyDir,
|
|
98
|
+
policyFile: resolve(policyDir, "policy.json"),
|
|
99
|
+
pluginsDir: resolve(definitionRoot, "plugins"),
|
|
100
|
+
hooksDir: resolve(definitionRoot, "hooks"),
|
|
101
|
+
toolsDir: resolve(definitionRoot, "tools"),
|
|
102
|
+
templatesDir: resolve(definitionRoot, "templates"),
|
|
103
|
+
validationDir: resolve(definitionRoot, "validation"),
|
|
104
|
+
stateDir: runtimeLayout.stateDir,
|
|
105
|
+
logsDir: runtimeLayout.logsDir,
|
|
106
|
+
notificationsDir: resolve(definitionRoot, "notifications"),
|
|
107
|
+
runtimeDir: runtimeLayout.runtimeDir,
|
|
108
|
+
distDir: runtimeLayout.distDir,
|
|
109
|
+
binDir: runtimeLayout.binDir,
|
|
110
|
+
pluginBinDir: runtimeLayout.pluginBinDir,
|
|
111
|
+
keybindingsPath: resolve(definitionRoot, "keybindings.json"),
|
|
112
|
+
controlPlaneEventsFile: runtimeLayout.controlPlaneEventsFile
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// packages/runtime/src/control-plane/runtime/events.ts
|
|
117
|
+
async function appendEvent(eventsFile, event) {
|
|
118
|
+
await mkdir(dirname2(eventsFile), { recursive: true });
|
|
119
|
+
await appendFile(eventsFile, `${JSON.stringify(event)}
|
|
120
|
+
`, "utf-8");
|
|
121
|
+
}
|
|
122
|
+
function createEvent(runId, type, payload) {
|
|
123
|
+
return {
|
|
124
|
+
id: randomUUID(),
|
|
125
|
+
runId,
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
type,
|
|
128
|
+
payload
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
class RuntimeEventBus {
|
|
133
|
+
runId;
|
|
134
|
+
eventsFile;
|
|
135
|
+
memoryEvents = [];
|
|
136
|
+
constructor(options) {
|
|
137
|
+
this.runId = options.runId || randomUUID();
|
|
138
|
+
this.eventsFile = options.eventsFile ?? resolveRigLayout(options.projectRoot).controlPlaneEventsFile;
|
|
139
|
+
}
|
|
140
|
+
getRunId() {
|
|
141
|
+
return this.runId;
|
|
142
|
+
}
|
|
143
|
+
getEventsFile() {
|
|
144
|
+
return this.eventsFile;
|
|
145
|
+
}
|
|
146
|
+
getMemoryEvents() {
|
|
147
|
+
return [...this.memoryEvents];
|
|
148
|
+
}
|
|
149
|
+
async attachRuntimeBus(runtimeBus) {
|
|
150
|
+
if (runtimeBus.getEventsFile() === this.eventsFile) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
for (const event of this.memoryEvents) {
|
|
154
|
+
await runtimeBus.ingest(event);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async attachRuntimeWorkspace(projectRoot) {
|
|
158
|
+
const runtimeBus = new RuntimeEventBus({ projectRoot, runId: this.runId });
|
|
159
|
+
await this.attachRuntimeBus(runtimeBus);
|
|
160
|
+
return runtimeBus;
|
|
161
|
+
}
|
|
162
|
+
async ingest(event) {
|
|
163
|
+
this.memoryEvents.push(event);
|
|
164
|
+
await appendEvent(this.eventsFile, event);
|
|
165
|
+
}
|
|
166
|
+
async emit(type, payload) {
|
|
167
|
+
const event = createEvent(this.runId, type, payload);
|
|
168
|
+
await this.ingest(event);
|
|
169
|
+
return event;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
class GeneralCliEventBus {
|
|
174
|
+
runId;
|
|
175
|
+
eventsFile;
|
|
176
|
+
memoryEvents = [];
|
|
177
|
+
runtimeBuses = new Map;
|
|
178
|
+
constructor(options) {
|
|
179
|
+
this.runId = options.runId || randomUUID();
|
|
180
|
+
this.eventsFile = options.eventsFile ?? resolve2(options.projectRoot, ".rig", "logs", "control-plane.events.jsonl");
|
|
181
|
+
}
|
|
182
|
+
getRunId() {
|
|
183
|
+
return this.runId;
|
|
184
|
+
}
|
|
185
|
+
getEventsFile() {
|
|
186
|
+
return this.eventsFile;
|
|
187
|
+
}
|
|
188
|
+
getMemoryEvents() {
|
|
189
|
+
return [...this.memoryEvents];
|
|
190
|
+
}
|
|
191
|
+
async attachRuntimeBus(runtimeBus) {
|
|
192
|
+
const key = runtimeBus.getEventsFile();
|
|
193
|
+
if (this.runtimeBuses.has(key)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
this.runtimeBuses.set(key, runtimeBus);
|
|
197
|
+
for (const event of this.memoryEvents) {
|
|
198
|
+
await runtimeBus.ingest(event);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async attachRuntimeWorkspace(projectRoot) {
|
|
202
|
+
const runtimeBus = new RuntimeEventBus({ projectRoot, runId: this.runId });
|
|
203
|
+
await this.attachRuntimeBus(runtimeBus);
|
|
204
|
+
return runtimeBus;
|
|
205
|
+
}
|
|
206
|
+
async emit(type, payload) {
|
|
207
|
+
const event = createEvent(this.runId, type, payload);
|
|
208
|
+
this.memoryEvents.push(event);
|
|
209
|
+
await appendEvent(this.eventsFile, event);
|
|
210
|
+
await Promise.all(Array.from(this.runtimeBuses.values()).map((bus) => bus.ingest(event)));
|
|
211
|
+
return event;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export {
|
|
215
|
+
RuntimeEventBus,
|
|
216
|
+
GeneralCliEventBus,
|
|
217
|
+
GeneralCliEventBus as EventBus
|
|
218
|
+
};
|