@kindgi/cli 0.1.5 → 0.1.6-rc.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 +4 -1
- package/dist/build/defaults.d.ts.map +1 -1
- package/dist/build/defaults.js +6 -0
- package/dist/build/defaults.js.map +1 -1
- package/dist/build/java-image.d.ts +6 -0
- package/dist/build/java-image.d.ts.map +1 -1
- package/dist/build/java-image.js +4 -1
- package/dist/build/java-image.js.map +1 -1
- package/dist/build/runners.d.ts +2 -0
- package/dist/build/runners.d.ts.map +1 -1
- package/dist/build/scala-image.d.ts +6 -0
- package/dist/build/scala-image.d.ts.map +1 -1
- package/dist/build/scala-image.js +4 -1
- package/dist/build/scala-image.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +23 -7
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/approvals.d.ts.map +1 -1
- package/dist/commands/approvals.js +23 -3
- package/dist/commands/approvals.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +32 -3
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/deploy.js +1 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +128 -17
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +41 -6
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +53 -7
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/eval-runs.d.ts.map +1 -1
- package/dist/commands/eval-runs.js +27 -2
- package/dist/commands/eval-runs.js.map +1 -1
- package/dist/commands/eval-suites.d.ts.map +1 -1
- package/dist/commands/eval-suites.js +16 -6
- package/dist/commands/eval-suites.js.map +1 -1
- package/dist/commands/flows.d.ts.map +1 -1
- package/dist/commands/flows.js +23 -5
- package/dist/commands/flows.js.map +1 -1
- package/dist/commands/helpers.d.ts +10 -0
- package/dist/commands/helpers.d.ts.map +1 -1
- package/dist/commands/helpers.js +35 -0
- package/dist/commands/helpers.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +8 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +4 -4
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/proposals.d.ts.map +1 -1
- package/dist/commands/proposals.js +30 -10
- package/dist/commands/proposals.js.map +1 -1
- package/dist/commands/provenance.d.ts.map +1 -1
- package/dist/commands/provenance.js +3 -3
- package/dist/commands/provenance.js.map +1 -1
- package/dist/commands/providers.d.ts.map +1 -1
- package/dist/commands/providers.js +19 -2
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/run-waits.d.ts +28 -2
- package/dist/commands/run-waits.d.ts.map +1 -1
- package/dist/commands/run-waits.js +22 -3
- package/dist/commands/run-waits.js.map +1 -1
- package/dist/commands/runs.d.ts.map +1 -1
- package/dist/commands/runs.js +5 -1
- package/dist/commands/runs.js.map +1 -1
- package/dist/commands/schedules.d.ts.map +1 -1
- package/dist/commands/schedules.js +9 -4
- package/dist/commands/schedules.js.map +1 -1
- package/dist/commands/secrets-copy.d.ts +3 -0
- package/dist/commands/secrets-copy.d.ts.map +1 -0
- package/dist/commands/secrets-copy.js +164 -0
- package/dist/commands/secrets-copy.js.map +1 -0
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +19 -8
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/service-accounts.d.ts.map +1 -1
- package/dist/commands/service-accounts.js +1 -1
- package/dist/commands/service-accounts.js.map +1 -1
- package/dist/commands/sso.d.ts +2 -1
- package/dist/commands/sso.d.ts.map +1 -1
- package/dist/commands/sso.js +11 -72
- package/dist/commands/sso.js.map +1 -1
- package/dist/commands/tokens.d.ts +1 -1
- package/dist/commands/tokens.d.ts.map +1 -1
- package/dist/commands/tokens.js +7 -6
- package/dist/commands/tokens.js.map +1 -1
- package/dist/commands/tools.d.ts.map +1 -1
- package/dist/commands/tools.js +10 -5
- package/dist/commands/tools.js.map +1 -1
- package/dist/dev/defaults.d.ts +10 -0
- package/dist/dev/defaults.d.ts.map +1 -1
- package/dist/dev/defaults.js +126 -16
- package/dist/dev/defaults.js.map +1 -1
- package/dist/dev/pack-env.d.ts +27 -1
- package/dist/dev/pack-env.d.ts.map +1 -1
- package/dist/dev/pack-env.js +27 -4
- package/dist/dev/pack-env.js.map +1 -1
- package/dist/dev/pack-service.d.ts +8 -0
- package/dist/dev/pack-service.d.ts.map +1 -1
- package/dist/dev/pack-service.js +2 -0
- package/dist/dev/pack-service.js.map +1 -1
- package/dist/dev/paths.d.ts +6 -0
- package/dist/dev/paths.d.ts.map +1 -1
- package/dist/dev/paths.js +8 -0
- package/dist/dev/paths.js.map +1 -1
- package/dist/dev/runners.d.ts +24 -0
- package/dist/dev/runners.d.ts.map +1 -1
- package/dist/dev/runtime-image.d.ts +1 -1
- package/dist/dev/runtime-image.d.ts.map +1 -1
- package/dist/dev/runtime-image.js +1 -1
- package/dist/dev/runtime-image.js.map +1 -1
- package/dist/dev/sandbox/bwrap.d.ts +19 -0
- package/dist/dev/sandbox/bwrap.d.ts.map +1 -0
- package/dist/dev/sandbox/bwrap.js +164 -0
- package/dist/dev/sandbox/bwrap.js.map +1 -0
- package/dist/dev/sandbox/detect.d.ts +26 -0
- package/dist/dev/sandbox/detect.d.ts.map +1 -0
- package/dist/dev/sandbox/detect.js +84 -0
- package/dist/dev/sandbox/detect.js.map +1 -0
- package/dist/dev/sandbox/index.d.ts +44 -0
- package/dist/dev/sandbox/index.d.ts.map +1 -0
- package/dist/dev/sandbox/index.js +81 -0
- package/dist/dev/sandbox/index.js.map +1 -0
- package/dist/dev/sandbox/notices.d.ts +23 -0
- package/dist/dev/sandbox/notices.d.ts.map +1 -0
- package/dist/dev/sandbox/notices.js +95 -0
- package/dist/dev/sandbox/notices.js.map +1 -0
- package/dist/dev/sandbox/policy.d.ts +80 -0
- package/dist/dev/sandbox/policy.d.ts.map +1 -0
- package/dist/dev/sandbox/policy.js +313 -0
- package/dist/dev/sandbox/policy.js.map +1 -0
- package/dist/dev/sandbox/seatbelt.d.ts +3 -0
- package/dist/dev/sandbox/seatbelt.d.ts.map +1 -0
- package/dist/dev/sandbox/seatbelt.js +131 -0
- package/dist/dev/sandbox/seatbelt.js.map +1 -0
- package/dist/dev/sandbox/settings.d.ts +30 -0
- package/dist/dev/sandbox/settings.d.ts.map +1 -0
- package/dist/dev/sandbox/settings.js +97 -0
- package/dist/dev/sandbox/settings.js.map +1 -0
- package/dist/env/provider-keys.d.ts +35 -0
- package/dist/env/provider-keys.d.ts.map +1 -0
- package/dist/env/provider-keys.js +108 -0
- package/dist/env/provider-keys.js.map +1 -0
- package/dist/init/agent-access.d.ts +119 -0
- package/dist/init/agent-access.d.ts.map +1 -0
- package/dist/init/agent-access.js +339 -0
- package/dist/init/agent-access.js.map +1 -0
- package/dist/init/augment-scaffolder.d.ts +2 -0
- package/dist/init/augment-scaffolder.d.ts.map +1 -1
- package/dist/init/augment-scaffolder.js +11 -1
- package/dist/init/augment-scaffolder.js.map +1 -1
- package/dist/init/gitignore-patcher.d.ts.map +1 -1
- package/dist/init/gitignore-patcher.js +5 -3
- package/dist/init/gitignore-patcher.js.map +1 -1
- package/dist/init/java-augment.d.ts +2 -0
- package/dist/init/java-augment.d.ts.map +1 -1
- package/dist/init/java-augment.js +10 -0
- package/dist/init/java-augment.js.map +1 -1
- package/dist/init/python-augment.d.ts +2 -0
- package/dist/init/python-augment.d.ts.map +1 -1
- package/dist/init/python-augment.js +10 -0
- package/dist/init/python-augment.js.map +1 -1
- package/dist/init/scala-augment.d.ts +2 -0
- package/dist/init/scala-augment.d.ts.map +1 -1
- package/dist/init/scala-augment.js +12 -2
- package/dist/init/scala-augment.js.map +1 -1
- package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +8 -7
- package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +22 -16
- package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +14 -3
- package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-getting-started/SKILL.md +24 -2
- package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +3 -3
- package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +35 -12
- package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +29 -5
- package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +35 -9
- package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +28 -4
- package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +3 -3
- package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +35 -12
- package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +29 -5
- package/dist/templates/java/README.md.tmpl +1 -1
- package/dist/templates/minimal/README.md.tmpl +1 -1
- package/dist/templates/python/README.md.tmpl +1 -1
- package/dist/templates/sample/README.md.tmpl +1 -1
- package/dist/templates/sample/tools/fetch-httpbin/index.ts.tmpl +2 -1
- package/dist/templates/scala/README.md.tmpl +1 -1
- package/package.json +13 -13
package/dist/dev/runners.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import type { PackServiceSupervisor, PackServiceSupervisorEvent } from '@kindgi/handler-runtime/pack-service';
|
|
10
10
|
import type { ProjectDatabases } from './project-database.js';
|
|
11
11
|
import type { ProjectOutcome } from './project.js';
|
|
12
|
+
import type { ActiveDevSandbox, SandboxAvailability } from './sandbox/index.js';
|
|
12
13
|
import type { JvmPackCode, PackCode } from './pack-code.js';
|
|
13
14
|
/** The running Kindgi runtime `kindgi dev` talks to. */
|
|
14
15
|
export interface RunningApiServer {
|
|
@@ -140,6 +141,13 @@ export interface IndexerRunOptions {
|
|
|
140
141
|
* line as it comes; not the indexer's own result line.
|
|
141
142
|
*/
|
|
142
143
|
readonly onOutput?: (line: string, stream: 'stdout' | 'stderr') => void;
|
|
144
|
+
/**
|
|
145
|
+
* The sandbox the indexer child runs in (`dev/sandbox`): it imports every
|
|
146
|
+
* primitive's module, so it runs the pack's code too. Absent, none.
|
|
147
|
+
*/
|
|
148
|
+
readonly sandbox?: ActiveDevSandbox;
|
|
149
|
+
/** A notice for the user from starting the indexer in its sandbox. */
|
|
150
|
+
readonly onNotice?: (line: string) => void;
|
|
143
151
|
}
|
|
144
152
|
/** The local pack service `kindgi dev` runs the pack's code in. */
|
|
145
153
|
export interface DevPackServiceOptions {
|
|
@@ -158,6 +166,10 @@ export interface DevPackServiceOptions {
|
|
|
158
166
|
*/
|
|
159
167
|
readonly port?: number;
|
|
160
168
|
readonly token?: string;
|
|
169
|
+
/** The sandbox the pack service runs in (`dev/sandbox`); absent, none. */
|
|
170
|
+
readonly sandbox?: ActiveDevSandbox;
|
|
171
|
+
/** A notice for the user from starting the pack service (the sandbox's). */
|
|
172
|
+
readonly onNotice?: (line: string) => void;
|
|
161
173
|
}
|
|
162
174
|
/**
|
|
163
175
|
* The local pack service: the public supervisor, children behind a
|
|
@@ -196,6 +208,16 @@ export interface IndexOutcome {
|
|
|
196
208
|
readonly message: string;
|
|
197
209
|
readonly filePath?: string;
|
|
198
210
|
}[];
|
|
211
|
+
/**
|
|
212
|
+
* What the pack should change but that doesn't stop the build (for
|
|
213
|
+
* example a check id without the pack's prefix). Absent from an indexer
|
|
214
|
+
* that reports none.
|
|
215
|
+
*/
|
|
216
|
+
readonly warnings?: readonly {
|
|
217
|
+
readonly code: string;
|
|
218
|
+
readonly message: string;
|
|
219
|
+
readonly filePath?: string;
|
|
220
|
+
}[];
|
|
199
221
|
/**
|
|
200
222
|
* The parsed `index.json` payload — passed straight to the
|
|
201
223
|
* registration bridge. Kept as `unknown` because the CLI does not
|
|
@@ -291,6 +313,8 @@ export interface DevRunners {
|
|
|
291
313
|
}) => PackBuilder;
|
|
292
314
|
/** The local pack service (not yet started). */
|
|
293
315
|
readonly createPackService: (opts: DevPackServiceOptions) => DevPackService;
|
|
316
|
+
/** Whether this machine can sandbox the pack service, and with what (`dev/sandbox/detect.ts`). */
|
|
317
|
+
readonly detectSandbox: () => Promise<SandboxAvailability>;
|
|
294
318
|
/**
|
|
295
319
|
* Check a Python pack's interpreter can run pack code (`import kindgi`),
|
|
296
320
|
* with the pack's environment: a one-line description, or why not.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runners.d.ts","sourceRoot":"","sources":["../../src/dev/runners.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"runners.d.ts","sourceRoot":"","sources":["../../src/dev/runners.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE5D,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sGAAsG;IACtG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC/D,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,iHAAiH;IACjH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,kHAAkH;IAClH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;IACrE,gDAAgD;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GACjB;IACE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,0FAA0F;IAC1F,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/D,kFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;IACxE;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,mEAAmE;AACnE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9D,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC9D;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS;QAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,gBAAgB,GAAG,QAAQ,CAAC;IAClD,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpF;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,CACnB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,iBAAiB,KACxB,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE;QACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;QACrC,kGAAkG;QAClG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,mFAAmF;QACnF,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAC/D,KAAK,WAAW,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,cAAc,CAAC;IAC5E,kGAAkG;IAClG,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3D;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,CACxB,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EACtC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACrC,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CACR;QAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/C;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CACrD,CAAC;IACF;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,CACrB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACrC,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CACR;QAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/C;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CACrD,CAAC;IACF,wDAAwD;IACxD,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,IAAI,EACpB,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QACnC,gEAAgE;QAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;KACnD,KACE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B;;;;;;;;;;;;;;;;OAgBG;IACH;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE;QACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9B,0FAA0F;IAC1F,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IACrC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* The image is in private preview on Quay (pull credentials on request at
|
|
10
10
|
* contact@kindgi.com, then `kindgi auth registry --username <name>`).
|
|
11
11
|
*/
|
|
12
|
-
export declare const DEFAULT_RUNTIME_IMAGE = "quay.io/kindgi/runtime:0.1.
|
|
12
|
+
export declare const DEFAULT_RUNTIME_IMAGE = "quay.io/kindgi/runtime:0.1.6-rc.0@sha256:fac3374f8f8aefac5eb91e0ab9d95bd93966cb632a3faec2557b916a63ff9c6c";
|
|
13
13
|
/**
|
|
14
14
|
* The registry an image reference is pulled from, read the way Docker
|
|
15
15
|
* reads it: the first path component when it names a host (it has a `.`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-image.d.ts","sourceRoot":"","sources":["../../src/dev/runtime-image.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"runtime-image.d.ts","sourceRoot":"","sources":["../../src/dev/runtime-image.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,8GAC2E,CAAC;AAK9G;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED,iGAAiG;AACjG,eAAO,MAAM,sBAAsB,QAAoC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOvE"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* The image is in private preview on Quay (pull credentials on request at
|
|
12
12
|
* contact@kindgi.com, then `kindgi auth registry --username <name>`).
|
|
13
13
|
*/
|
|
14
|
-
export const DEFAULT_RUNTIME_IMAGE = 'quay.io/kindgi/runtime:0.1.
|
|
14
|
+
export const DEFAULT_RUNTIME_IMAGE = 'quay.io/kindgi/runtime:0.1.6-rc.0@sha256:fac3374f8f8aefac5eb91e0ab9d95bd93966cb632a3faec2557b916a63ff9c6c';
|
|
15
15
|
/** Docker Hub, the registry of a reference that names none (`busybox`, `library/busybox`). */
|
|
16
16
|
const DOCKER_HUB = 'docker.io';
|
|
17
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-image.js","sourceRoot":"","sources":["../../src/dev/runtime-image.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,
|
|
1
|
+
{"version":3,"file":"runtime-image.js","sourceRoot":"","sources":["../../src/dev/runtime-image.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,2GAA2G,CAAC;AAE9G,8FAA8F;AAC9F,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;AAClG,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAExE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAgB;IAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,sDAAsD;IACtD,OAAO,GAAG,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SandboxPolicy } from './policy.js';
|
|
2
|
+
export interface AppSecrets {
|
|
3
|
+
readonly files: readonly string[];
|
|
4
|
+
readonly dirs: readonly string[];
|
|
5
|
+
/** The search stopped at {@link MAX_ENTRIES}: secrets further down aren't masked. */
|
|
6
|
+
readonly truncated: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** The secret files and folders in the app, as they are now. Symlinks aren't followed. */
|
|
9
|
+
export declare function appSecrets(app: string): Promise<AppSecrets>;
|
|
10
|
+
/** bwrap's arguments for the policy, before `--` and the command. */
|
|
11
|
+
export declare function bwrapArgs(policy: SandboxPolicy, secrets: AppSecrets): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Runs bwrap with its arguments and forwards TERM and INT to the
|
|
14
|
+
* sandboxed process (bwrap reports its PID on `--info-fd`).
|
|
15
|
+
*
|
|
16
|
+
* sh kindgi-dev-sandbox <bwrap args…> -- <command…>
|
|
17
|
+
*/
|
|
18
|
+
export declare const BWRAP_WRAPPER = "#!/bin/sh\n# kindgi-dev-sandbox: written by kindgi dev at every start. Do not edit.\n# Runs the pack service in bwrap and forwards TERM and INT to it: bwrap\n# doesn't, and a reload must let the old service drain.\nset -u\ninfo=$(mktemp \"${TMPDIR:-/tmp}/kindgi-dev-sandbox.XXXXXX\")\nbwrap --info-fd 3 \"$@\" 3>\"$info\" &\nbw=$!\nforward() {\n child=$(sed -n 's/.*\"child-pid\": *\\([0-9][0-9]*\\).*/\\1/p' \"$info\")\n if [ -n \"$child\" ]; then kill \"-$1\" \"$child\" 2>/dev/null; else kill \"-$1\" \"$bw\" 2>/dev/null; fi\n}\ntrap 'forward TERM' TERM\ntrap 'forward INT' INT\nstatus=0\nwhile :; do\n wait \"$bw\"\n status=$?\n kill -0 \"$bw\" 2>/dev/null || break\ndone\nrm -f \"$info\"\nexit \"$status\"\n";
|
|
19
|
+
//# sourceMappingURL=bwrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bwrap.d.ts","sourceRoot":"","sources":["../../../src/dev/sandbox/bwrap.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAmBjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,qFAAqF;IACrF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,0FAA0F;AAC1F,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAejE;AAqBD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,CA6B9E;AAgBD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,ktBAsBzB,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* The pack service's bubblewrap sandbox on Linux.
|
|
5
|
+
*
|
|
6
|
+
* The root is bound read-only; the home folder, `/tmp`, `/var/tmp` and
|
|
7
|
+
* `/run` are replaced by empty tmpfs (keys, cloud credentials, the Docker
|
|
8
|
+
* socket, agents' sockets, other tools' temp files all gone); the runtime
|
|
9
|
+
* and the dependencies are bound back read-only, the app read-write.
|
|
10
|
+
* bwrap can't match names, so the secrets inside the app are found at
|
|
11
|
+
* every start and masked one by one (`.env*` and the like with
|
|
12
|
+
* `/dev/null`, `.git` and other `.kindgi` folders with an empty tmpfs;
|
|
13
|
+
* this app's `.kindgi` with a tmpfs and its dev outputs bound back). The
|
|
14
|
+
* service keeps the host's network (an outbound call, its loopback
|
|
15
|
+
* listener) and gets its own PID namespace, so it can't see other
|
|
16
|
+
* processes (or read their environment), and its own session, so it
|
|
17
|
+
* can't push keystrokes into the terminal `kindgi dev` runs in
|
|
18
|
+
* (`TIOCSTI`). The app's Kindgi configuration files are bound read-only
|
|
19
|
+
* (`kindgi dev` loads them, and they say how wide this is); the
|
|
20
|
+
* indexer's output folder is bound back read-write.
|
|
21
|
+
*
|
|
22
|
+
* bwrap doesn't forward signals, and its PID-namespace init ignores
|
|
23
|
+
* SIGTERM: a reload would never let the old service drain. So the service
|
|
24
|
+
* runs as PID 1 (`--as-pid-1`, it has its own handlers), started through
|
|
25
|
+
* a small `sh` wrapper ({@link BWRAP_WRAPPER}) that reads its PID from
|
|
26
|
+
* `--info-fd` and forwards TERM and INT to it.
|
|
27
|
+
*/
|
|
28
|
+
import { existsSync } from 'node:fs';
|
|
29
|
+
import { lstat, readdir } from 'node:fs/promises';
|
|
30
|
+
import { join } from 'node:path';
|
|
31
|
+
import { devBundleMapPath, devDistDir, devIndexPath, devJvmDir, devStagedIndexPath, devStagedPackIndexPath, } from '../paths.js';
|
|
32
|
+
/** File names masked wherever they are in the app. */
|
|
33
|
+
const SECRET_FILE = /^(\.env.*|kindgi\.env|pack\.env|\.kindgirc\.json|\.npmrc|\.pypirc|\.netrc)$/;
|
|
34
|
+
/** Folders masked whole wherever they are in the app. */
|
|
35
|
+
const SECRET_DIR = /^(\.git|\.kindgi)$/;
|
|
36
|
+
/** Folders not searched: dependencies and build output hold no secret of the app's. */
|
|
37
|
+
const SKIPPED_DIR = new Set([
|
|
38
|
+
'node_modules',
|
|
39
|
+
'.venv',
|
|
40
|
+
'venv',
|
|
41
|
+
'__pycache__',
|
|
42
|
+
'target',
|
|
43
|
+
'.next',
|
|
44
|
+
'.turbo',
|
|
45
|
+
]);
|
|
46
|
+
/** How many entries the search looks at, at most. */
|
|
47
|
+
const MAX_ENTRIES = 100_000;
|
|
48
|
+
/** The secret files and folders in the app, as they are now. Symlinks aren't followed. */
|
|
49
|
+
export async function appSecrets(app) {
|
|
50
|
+
const found = { files: [], dirs: [] };
|
|
51
|
+
let seen = 0;
|
|
52
|
+
const queue = [app];
|
|
53
|
+
while (queue.length > 0) {
|
|
54
|
+
const dir = queue.shift();
|
|
55
|
+
const entries = await readdir(dir).catch(() => []);
|
|
56
|
+
seen += entries.length;
|
|
57
|
+
if (seen > MAX_ENTRIES)
|
|
58
|
+
return { ...found, truncated: true };
|
|
59
|
+
for (const name of entries) {
|
|
60
|
+
const next = await classify(join(dir, name), name, found);
|
|
61
|
+
if (next !== undefined)
|
|
62
|
+
queue.push(next);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { ...found, truncated: false };
|
|
66
|
+
}
|
|
67
|
+
/** Records a secret; returns a folder to search next. */
|
|
68
|
+
async function classify(path, name, found) {
|
|
69
|
+
const info = await lstat(path).catch(() => undefined);
|
|
70
|
+
if (info === undefined || info.isSymbolicLink())
|
|
71
|
+
return undefined;
|
|
72
|
+
if (!info.isDirectory()) {
|
|
73
|
+
if (SECRET_FILE.test(name))
|
|
74
|
+
found.files.push(path);
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
if (SECRET_DIR.test(name)) {
|
|
78
|
+
found.dirs.push(path);
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return SKIPPED_DIR.has(name) ? undefined : path;
|
|
82
|
+
}
|
|
83
|
+
/** bwrap's arguments for the policy, before `--` and the command. */
|
|
84
|
+
export function bwrapArgs(policy, secrets) {
|
|
85
|
+
const { app, home } = policy;
|
|
86
|
+
const args = [
|
|
87
|
+
'--die-with-parent',
|
|
88
|
+
'--new-session',
|
|
89
|
+
'--unshare-pid',
|
|
90
|
+
'--as-pid-1',
|
|
91
|
+
'--unshare-ipc',
|
|
92
|
+
];
|
|
93
|
+
args.push('--ro-bind', '/', '/', '--dev', '/dev', '--proc', '/proc');
|
|
94
|
+
args.push('--tmpfs', home, '--tmpfs', '/tmp', '--tmpfs', '/var/tmp', '--tmpfs', '/run');
|
|
95
|
+
// DNS on a systemd-resolved host: resolv.conf points into /run.
|
|
96
|
+
const resolved = '/run/systemd/resolve';
|
|
97
|
+
const sockets = policy.allowUnixSockets.filter((s) => existsSync(s));
|
|
98
|
+
if (existsSync(resolved))
|
|
99
|
+
args.push('--ro-bind', resolved, resolved);
|
|
100
|
+
for (const socket of sockets)
|
|
101
|
+
args.push('--bind', socket, socket);
|
|
102
|
+
for (const root of policy.readRoots)
|
|
103
|
+
args.push('--ro-bind', root, root);
|
|
104
|
+
// The links what it runs resolves through, where a tmpfs took them away (the home folder).
|
|
105
|
+
for (const link of policy.links)
|
|
106
|
+
args.push('--symlink', link.target, link.path);
|
|
107
|
+
args.push('--bind', app, app);
|
|
108
|
+
for (const file of secrets.files)
|
|
109
|
+
args.push('--ro-bind', '/dev/null', file);
|
|
110
|
+
for (const dir of secrets.dirs)
|
|
111
|
+
args.push('--tmpfs', dir);
|
|
112
|
+
if (secrets.dirs.includes(join(app, '.kindgi')))
|
|
113
|
+
args.push(...devOutputBinds(app));
|
|
114
|
+
for (const dir of policy.writable.filter((d) => existsSync(d)))
|
|
115
|
+
args.push('--bind', dir, dir);
|
|
116
|
+
// A missing name can't be bound without creating it in the app: those stay writable here.
|
|
117
|
+
for (const file of policy.readOnly.filter((f) => existsSync(f)))
|
|
118
|
+
args.push('--ro-bind', file, file);
|
|
119
|
+
args.push('--chdir', app, '--setenv', 'TMPDIR', '/tmp');
|
|
120
|
+
return args;
|
|
121
|
+
}
|
|
122
|
+
/** The dev outputs the service runs, bound back over this app's masked `.kindgi`. */
|
|
123
|
+
function devOutputBinds(app) {
|
|
124
|
+
const outputs = [
|
|
125
|
+
devDistDir(app),
|
|
126
|
+
devJvmDir(app, 'java'),
|
|
127
|
+
devJvmDir(app, 'scala'),
|
|
128
|
+
devIndexPath(app),
|
|
129
|
+
devStagedIndexPath(app),
|
|
130
|
+
devStagedPackIndexPath(app),
|
|
131
|
+
devBundleMapPath(app),
|
|
132
|
+
];
|
|
133
|
+
return outputs.filter((p) => existsSync(p)).flatMap((p) => ['--ro-bind', p, p]);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Runs bwrap with its arguments and forwards TERM and INT to the
|
|
137
|
+
* sandboxed process (bwrap reports its PID on `--info-fd`).
|
|
138
|
+
*
|
|
139
|
+
* sh kindgi-dev-sandbox <bwrap args…> -- <command…>
|
|
140
|
+
*/
|
|
141
|
+
export const BWRAP_WRAPPER = `#!/bin/sh
|
|
142
|
+
# kindgi-dev-sandbox: written by kindgi dev at every start. Do not edit.
|
|
143
|
+
# Runs the pack service in bwrap and forwards TERM and INT to it: bwrap
|
|
144
|
+
# doesn't, and a reload must let the old service drain.
|
|
145
|
+
set -u
|
|
146
|
+
info=$(mktemp "\${TMPDIR:-/tmp}/kindgi-dev-sandbox.XXXXXX")
|
|
147
|
+
bwrap --info-fd 3 "$@" 3>"$info" &
|
|
148
|
+
bw=$!
|
|
149
|
+
forward() {
|
|
150
|
+
child=$(sed -n 's/.*"child-pid": *\\([0-9][0-9]*\\).*/\\1/p' "$info")
|
|
151
|
+
if [ -n "$child" ]; then kill "-$1" "$child" 2>/dev/null; else kill "-$1" "$bw" 2>/dev/null; fi
|
|
152
|
+
}
|
|
153
|
+
trap 'forward TERM' TERM
|
|
154
|
+
trap 'forward INT' INT
|
|
155
|
+
status=0
|
|
156
|
+
while :; do
|
|
157
|
+
wait "$bw"
|
|
158
|
+
status=$?
|
|
159
|
+
kill -0 "$bw" 2>/dev/null || break
|
|
160
|
+
done
|
|
161
|
+
rm -f "$info"
|
|
162
|
+
exit "$status"
|
|
163
|
+
`;
|
|
164
|
+
//# sourceMappingURL=bwrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bwrap.js","sourceRoot":"","sources":["../../../src/dev/sandbox/bwrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** The page that says how to set the sandbox up, and what it does, on this CLI's release line. */
|
|
2
|
+
export declare const DEV_SANDBOX_DOCS: string;
|
|
3
|
+
export type SandboxEngine = 'seatbelt' | 'bwrap';
|
|
4
|
+
export type SandboxAvailability = {
|
|
5
|
+
readonly kind: 'available';
|
|
6
|
+
readonly engine: SandboxEngine;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'unavailable';
|
|
9
|
+
/** Why, in a phrase: "bubblewrap (bwrap) isn't installed". */
|
|
10
|
+
readonly reason: string;
|
|
11
|
+
/** What would make it work, in a sentence. */
|
|
12
|
+
readonly fix: string;
|
|
13
|
+
};
|
|
14
|
+
/** A finished process: its exit code (`null` when it didn't start) and stderr. */
|
|
15
|
+
export interface ProbeResult {
|
|
16
|
+
readonly code: number | null;
|
|
17
|
+
readonly stderr: string;
|
|
18
|
+
/** The spawn error's code when it didn't start (`ENOENT`). */
|
|
19
|
+
readonly errorCode?: string;
|
|
20
|
+
}
|
|
21
|
+
export type ProbeRunner = (program: string, args: readonly string[]) => Promise<ProbeResult>;
|
|
22
|
+
export declare const SANDBOX_EXEC = "/usr/bin/sandbox-exec";
|
|
23
|
+
/** Run a probe to its end: its exit code and stderr, or why it didn't start. */
|
|
24
|
+
export declare function probeReal(program: string, args: readonly string[]): Promise<ProbeResult>;
|
|
25
|
+
export declare function detectDevSandbox(platform: NodeJS.Platform, run: ProbeRunner): Promise<SandboxAvailability>;
|
|
26
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/dev/sandbox/detect.ts"],"names":[],"mappings":"AAyBA,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,QAAsD,CAAC;AAEpF,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC9D;IACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE7F,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAEpD,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAgBxF;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,mBAAmB,CAAC,CAe9B"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* Whether this machine can sandbox the pack service, and with what:
|
|
5
|
+
* macOS's Seatbelt (`sandbox-exec`), or Linux's bubblewrap (`bwrap`,
|
|
6
|
+
* the system's). Each is tried once with an empty policy, so the answer
|
|
7
|
+
* is what happens, not a guess:
|
|
8
|
+
*
|
|
9
|
+
* - `sandbox-exec` refuses inside a process that is already sandboxed by a
|
|
10
|
+
* profile that restricts anything (`sandbox_apply: Operation not
|
|
11
|
+
* permitted`): a coding agent's sandbox around `kindgi dev`.
|
|
12
|
+
* - `bwrap` needs unprivileged user namespaces. Ubuntu 23.10 and later
|
|
13
|
+
* restrict them with AppArmor (`setting up uid map: Permission
|
|
14
|
+
* denied`); a default Docker container doesn't allow them (`Creating
|
|
15
|
+
* new namespace failed: Operation not permitted`).
|
|
16
|
+
* - Windows has none `kindgi dev` can use: under WSL, the Linux one.
|
|
17
|
+
*/
|
|
18
|
+
import { spawn } from 'node:child_process';
|
|
19
|
+
import { docsUrl } from '@kindgi/client/sso-handoff';
|
|
20
|
+
import { CLI_VERSION } from '../../version-info.js';
|
|
21
|
+
/** The page that says how to set the sandbox up, and what it does, on this CLI's release line. */
|
|
22
|
+
export const DEV_SANDBOX_DOCS = docsUrl('guides/secrets/dev-sandbox/', CLI_VERSION);
|
|
23
|
+
export const SANDBOX_EXEC = '/usr/bin/sandbox-exec';
|
|
24
|
+
/** Run a probe to its end: its exit code and stderr, or why it didn't start. */
|
|
25
|
+
export function probeReal(program, args) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const child = spawn(program, [...args], { stdio: ['ignore', 'ignore', 'pipe'] });
|
|
28
|
+
let stderr = '';
|
|
29
|
+
child.stderr?.on('data', (chunk) => {
|
|
30
|
+
stderr += chunk.toString('utf8');
|
|
31
|
+
});
|
|
32
|
+
child.once('error', (err) => resolve({
|
|
33
|
+
code: null,
|
|
34
|
+
stderr: err.message,
|
|
35
|
+
...(err.code !== undefined && { errorCode: err.code }),
|
|
36
|
+
}));
|
|
37
|
+
child.once('close', (code) => resolve({ code, stderr }));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export async function detectDevSandbox(platform, run) {
|
|
41
|
+
if (platform === 'darwin') {
|
|
42
|
+
return seatbeltAvailability(await run(SANDBOX_EXEC, ['-p', '(version 1)(allow default)', '/usr/bin/true']));
|
|
43
|
+
}
|
|
44
|
+
if (platform === 'linux')
|
|
45
|
+
return bwrapAvailability(await run('bwrap', ['--ro-bind', '/', '/', 'true']));
|
|
46
|
+
if (platform === 'win32') {
|
|
47
|
+
return unavailable('Windows has no sandbox kindgi dev can use', 'Run kindgi dev under WSL, where it uses the Linux one.');
|
|
48
|
+
}
|
|
49
|
+
return unavailable(`kindgi dev has no sandbox for ${platform}`, `See ${DEV_SANDBOX_DOCS}.`);
|
|
50
|
+
}
|
|
51
|
+
function unavailable(reason, fix) {
|
|
52
|
+
return { kind: 'unavailable', reason, fix };
|
|
53
|
+
}
|
|
54
|
+
/** What an empty `sandbox-exec` profile run says. */
|
|
55
|
+
function seatbeltAvailability(probe) {
|
|
56
|
+
if (probe.code === 0)
|
|
57
|
+
return { kind: 'available', engine: 'seatbelt' };
|
|
58
|
+
if (probe.errorCode === 'ENOENT') {
|
|
59
|
+
return unavailable(`${SANDBOX_EXEC} isn't on this Mac`, `See ${DEV_SANDBOX_DOCS}.`);
|
|
60
|
+
}
|
|
61
|
+
if (/sandbox_apply/i.test(probe.stderr)) {
|
|
62
|
+
return unavailable('kindgi dev is already inside a sandbox (a coding agent’s?) that won’t let it add its own', 'Run kindgi dev in your own terminal.');
|
|
63
|
+
}
|
|
64
|
+
return unavailable(`sandbox-exec failed: ${firstLine(probe.stderr)}`, `See ${DEV_SANDBOX_DOCS}.`);
|
|
65
|
+
}
|
|
66
|
+
/** What an empty `bwrap` run says. */
|
|
67
|
+
function bwrapAvailability(probe) {
|
|
68
|
+
if (probe.code === 0)
|
|
69
|
+
return { kind: 'available', engine: 'bwrap' };
|
|
70
|
+
if (probe.errorCode === 'ENOENT') {
|
|
71
|
+
return unavailable("bubblewrap (bwrap) isn't installed", 'Install bubblewrap (Debian, Ubuntu: sudo apt-get install bubblewrap; Fedora: sudo dnf install bubblewrap).');
|
|
72
|
+
}
|
|
73
|
+
if (/uid map|setting up uid/i.test(probe.stderr)) {
|
|
74
|
+
return unavailable('this system blocks the user namespaces bwrap needs (Ubuntu 23.10 and later)', `Allow bwrap to use them: ${DEV_SANDBOX_DOCS}#where-it-runs.`);
|
|
75
|
+
}
|
|
76
|
+
if (/new namespace|namespace failed|No permissions to create/i.test(probe.stderr)) {
|
|
77
|
+
return unavailable("this system doesn't allow user namespaces (a container, or a kernel setting)", `In a container, the container is the boundary; elsewhere see ${DEV_SANDBOX_DOCS}#where-it-runs.`);
|
|
78
|
+
}
|
|
79
|
+
return unavailable(`bwrap failed: ${firstLine(probe.stderr)}`, `See ${DEV_SANDBOX_DOCS}#where-it-runs.`);
|
|
80
|
+
}
|
|
81
|
+
function firstLine(text) {
|
|
82
|
+
return text.trim().split('\n')[0]?.trim() || 'no message';
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/dev/sandbox/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PackCode } from '../pack-code.js';
|
|
2
|
+
import { type SandboxEngine } from './detect.js';
|
|
3
|
+
import { type SandboxPolicy } from './policy.js';
|
|
4
|
+
import type { DevSandboxSettings } from './settings.js';
|
|
5
|
+
export { DEV_SANDBOX_DOCS, type SandboxAvailability, type SandboxEngine, detectDevSandbox, } from './detect.js';
|
|
6
|
+
export { DEV_SANDBOX_VAR, type DevSandboxMode, type DevSandboxSettings, devSandboxSettings, } from './settings.js';
|
|
7
|
+
/** The sandbox this `kindgi dev` runs the pack service in. */
|
|
8
|
+
export interface ActiveDevSandbox {
|
|
9
|
+
readonly engine: SandboxEngine;
|
|
10
|
+
readonly settings: DevSandboxSettings;
|
|
11
|
+
/** The home folder it closes. */
|
|
12
|
+
readonly home: string;
|
|
13
|
+
}
|
|
14
|
+
/** What the sandbox calls itself in `kindgi dev`'s output. */
|
|
15
|
+
export declare function sandboxLabel(engine: SandboxEngine): string;
|
|
16
|
+
/** The pack service's own temp folder on macOS: one per app, under the user's temp folder. */
|
|
17
|
+
export declare function sandboxTmpDir(packDir: string): string;
|
|
18
|
+
/** Which process runs inside: each gets its own profile file, so the two never share one mid-write. */
|
|
19
|
+
export type SandboxedProcess = 'pack-service' | 'indexer';
|
|
20
|
+
export interface SandboxedCommandOptions {
|
|
21
|
+
readonly packDir: string;
|
|
22
|
+
readonly code: PackCode;
|
|
23
|
+
/** The command, unsandboxed. */
|
|
24
|
+
readonly command: readonly [string, ...string[]];
|
|
25
|
+
/** Its environment. */
|
|
26
|
+
readonly env: Readonly<Record<string, string>>;
|
|
27
|
+
/** Node: the binary and the entrypoint (the pack service's, or the indexer child's). */
|
|
28
|
+
readonly node: {
|
|
29
|
+
readonly execPath: string;
|
|
30
|
+
readonly entry: string;
|
|
31
|
+
};
|
|
32
|
+
/** Default `pack-service`. */
|
|
33
|
+
readonly process?: SandboxedProcess;
|
|
34
|
+
/** Folders inside the app's `.kindgi` it may write (made here if missing). */
|
|
35
|
+
readonly writable?: readonly string[];
|
|
36
|
+
/** A notice for the user: a root left out because it holds the home folder, a search cut short. */
|
|
37
|
+
readonly onNotice?: (line: string) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface SandboxedCommand {
|
|
40
|
+
readonly command: readonly [string, ...string[]];
|
|
41
|
+
readonly policy: SandboxPolicy;
|
|
42
|
+
}
|
|
43
|
+
export declare function sandboxedCommand(sandbox: ActiveDevSandbox, opts: SandboxedCommandOptions): Promise<SandboxedCommand>;
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dev/sandbox/index.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,aAAa,CAAC;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EACL,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,uGAAuG;AACvG,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACjD,uBAAuB;IACvB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,wFAAwF;IACxF,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAsC3B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* `kindgi dev` runs the pack's code sandboxed, in both processes that run
|
|
5
|
+
* it: the pack service, and the indexer (which imports every primitive's
|
|
6
|
+
* module, so runs its top-level code). The tool and module code a coding
|
|
7
|
+
* agent writes can't read the user's keys, other projects, or the Docker
|
|
8
|
+
* socket, and can't write outside the app. It still reaches the network,
|
|
9
|
+
* and reads and writes the app's own files (but Kindgi's configuration).
|
|
10
|
+
* The guide: https://docs.kindgi.com/v0.1/guides/secrets/dev-sandbox/.
|
|
11
|
+
*
|
|
12
|
+
* At every start, {@link sandboxedCommand} works out what this start runs
|
|
13
|
+
* (the runtime, the dependencies: `policy.ts`), writes the sandbox for it
|
|
14
|
+
* (macOS: a Seatbelt profile; Linux: bwrap's arguments and a wrapper), and
|
|
15
|
+
* returns the command inside it.
|
|
16
|
+
*/
|
|
17
|
+
import { createHash } from 'node:crypto';
|
|
18
|
+
import { realpathSync } from 'node:fs';
|
|
19
|
+
import { chmod, mkdir, writeFile } from 'node:fs/promises';
|
|
20
|
+
import { tmpdir } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { BWRAP_WRAPPER, appSecrets, bwrapArgs } from './bwrap.js';
|
|
23
|
+
import { SANDBOX_EXEC } from './detect.js';
|
|
24
|
+
import { sandboxPolicy } from './policy.js';
|
|
25
|
+
import { seatbeltProfile } from './seatbelt.js';
|
|
26
|
+
export { DEV_SANDBOX_DOCS, detectDevSandbox, } from './detect.js';
|
|
27
|
+
export { DEV_SANDBOX_VAR, devSandboxSettings, } from './settings.js';
|
|
28
|
+
/** What the sandbox calls itself in `kindgi dev`'s output. */
|
|
29
|
+
export function sandboxLabel(engine) {
|
|
30
|
+
return engine === 'seatbelt' ? 'macOS Seatbelt' : 'bubblewrap';
|
|
31
|
+
}
|
|
32
|
+
/** The pack service's own temp folder on macOS: one per app, under the user's temp folder. */
|
|
33
|
+
export function sandboxTmpDir(packDir) {
|
|
34
|
+
const hash = createHash('sha256').update(packDir).digest('hex').slice(0, 12);
|
|
35
|
+
let base = tmpdir();
|
|
36
|
+
try {
|
|
37
|
+
base = realpathSync(base);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// The real path is only for the profile's match; the folder is made below.
|
|
41
|
+
}
|
|
42
|
+
return join(base, `kindgi-dev-${hash}`);
|
|
43
|
+
}
|
|
44
|
+
export async function sandboxedCommand(sandbox, opts) {
|
|
45
|
+
const tmpDir = sandbox.engine === 'seatbelt' ? sandboxTmpDir(opts.packDir) : '/tmp';
|
|
46
|
+
if (sandbox.engine === 'seatbelt')
|
|
47
|
+
await mkdir(tmpDir, { recursive: true, mode: 0o700 });
|
|
48
|
+
for (const dir of opts.writable ?? [])
|
|
49
|
+
await mkdir(dir, { recursive: true });
|
|
50
|
+
const which = opts.process ?? 'pack-service';
|
|
51
|
+
const policy = await sandboxPolicy({
|
|
52
|
+
packDir: opts.packDir,
|
|
53
|
+
home: sandbox.home,
|
|
54
|
+
code: opts.code,
|
|
55
|
+
settings: sandbox.settings,
|
|
56
|
+
tmpDir,
|
|
57
|
+
env: opts.env,
|
|
58
|
+
node: opts.node,
|
|
59
|
+
...(opts.writable !== undefined && { writable: opts.writable }),
|
|
60
|
+
});
|
|
61
|
+
for (const root of policy.skipped) {
|
|
62
|
+
opts.onNotice?.(`dev sandbox: not opening ${root}: it holds your home folder, which stays closed`);
|
|
63
|
+
}
|
|
64
|
+
const devDir = join(opts.packDir, '.kindgi', 'dev');
|
|
65
|
+
await mkdir(devDir, { recursive: true });
|
|
66
|
+
if (sandbox.engine === 'seatbelt') {
|
|
67
|
+
const profile = join(devDir, which === 'indexer' ? 'sandbox-indexer.sb' : 'sandbox.sb');
|
|
68
|
+
await writeFile(profile, seatbeltProfile(policy), { mode: 0o600 });
|
|
69
|
+
return { command: [SANDBOX_EXEC, '-f', profile, ...opts.command], policy };
|
|
70
|
+
}
|
|
71
|
+
const wrapper = join(devDir, 'kindgi-dev-sandbox');
|
|
72
|
+
await writeFile(wrapper, BWRAP_WRAPPER, { mode: 0o755 });
|
|
73
|
+
await chmod(wrapper, 0o755);
|
|
74
|
+
const secrets = await appSecrets(policy.app);
|
|
75
|
+
if (secrets.truncated) {
|
|
76
|
+
opts.onNotice?.('dev sandbox: the app is too large to search for secret files in full; files such as .env further down stay readable');
|
|
77
|
+
}
|
|
78
|
+
const args = bwrapArgs(policy, secrets);
|
|
79
|
+
return { command: ['sh', wrapper, ...args, '--', ...opts.command], policy };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dev/sandbox/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PackConfigRecord } from '../../pack-config.js';
|
|
2
|
+
import { type SandboxAvailability } from './detect.js';
|
|
3
|
+
import { type ActiveDevSandbox } from './index.js';
|
|
4
|
+
export type DevSandboxOutcome = {
|
|
5
|
+
readonly kind: 'ok';
|
|
6
|
+
/** The sandbox the pack service runs in; absent, none. */
|
|
7
|
+
readonly sandbox: ActiveDevSandbox | undefined;
|
|
8
|
+
/** What to print, in order. */
|
|
9
|
+
readonly lines: readonly string[];
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: 'error';
|
|
12
|
+
readonly message: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveDevSandbox(opts: {
|
|
15
|
+
readonly config: PackConfigRecord | undefined;
|
|
16
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
17
|
+
readonly packDir: string;
|
|
18
|
+
readonly home: string;
|
|
19
|
+
readonly detect: () => Promise<SandboxAvailability>;
|
|
20
|
+
}): Promise<DevSandboxOutcome>;
|
|
21
|
+
/** The Kindgi configuration files in the app: `kindgi.config.*`, `kindgi.config.json`, a `pyproject.toml` with `[tool.kindgi]`. */
|
|
22
|
+
export declare function kindgiConfigFiles(packDir: string): string[];
|
|
23
|
+
//# sourceMappingURL=notices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notices.d.ts","sourceRoot":"","sources":["../../../src/dev/sandbox/notices.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,YAAY,CAAC;AAGjE,MAAM,MAAM,iBAAiB,GACzB;IACE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC/C,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACrD,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwD7B;AAED,mIAAmI;AACnI,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW3D"}
|