stitchkit 0.94.0 → 0.94.1
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/CHANGELOG.md +64 -0
- package/dist/agent-runtime/coding-shell-process.d.ts.map +1 -1
- package/dist/agent-runtime/coding-tool-listing.d.ts.map +1 -1
- package/dist/agent-runtime/coding-tool-search-patch.d.ts.map +1 -1
- package/dist/agent-runtime/contained-darwin.d.ts +38 -0
- package/dist/agent-runtime/contained-darwin.d.ts.map +1 -0
- package/dist/agent-runtime/contained-files.d.ts +11 -26
- package/dist/agent-runtime/contained-files.d.ts.map +1 -1
- package/dist/agent-runtime/contained-scan.d.ts +21 -0
- package/dist/agent-runtime/contained-scan.d.ts.map +1 -0
- package/dist/agent-runtime/contained-write.d.ts +9 -0
- package/dist/agent-runtime/contained-write.d.ts.map +1 -0
- package/dist/agent-runtime/deferred-tool-types.d.ts +3 -2
- package/dist/agent-runtime/deferred-tool-types.d.ts.map +1 -1
- package/dist/agent-runtime/harness-control.d.ts +0 -1
- package/dist/agent-runtime/harness-control.d.ts.map +1 -1
- package/dist/agent-runtime/harness.d.ts +0 -5
- package/dist/agent-runtime/harness.d.ts.map +1 -1
- package/dist/agent-runtime/managed-tools.d.ts +3 -2
- package/dist/agent-runtime/managed-tools.d.ts.map +1 -1
- package/dist/agent-runtime/runtime.d.ts +1 -1
- package/dist/agent-runtime/runtime.d.ts.map +1 -1
- package/dist/agent-runtime/schedule-records.d.ts +34 -0
- package/dist/agent-runtime/schedule-records.d.ts.map +1 -0
- package/dist/agent-runtime/schedules.d.ts +34 -0
- package/dist/agent-runtime/schedules.d.ts.map +1 -1
- package/dist/agent-runtime/store-conformance-lifecycle.d.ts +434 -0
- package/dist/agent-runtime/store-conformance-lifecycle.d.ts.map +1 -0
- package/dist/agent-runtime/store-conformance-ordering.d.ts +18 -0
- package/dist/agent-runtime/store-conformance-ordering.d.ts.map +1 -0
- package/dist/agent-runtime/store-conformance-support.d.ts +130 -0
- package/dist/agent-runtime/store-conformance-support.d.ts.map +1 -0
- package/dist/agent-runtime/store-conformance-terminal.d.ts +12 -0
- package/dist/agent-runtime/store-conformance-terminal.d.ts.map +1 -0
- package/dist/agent-runtime/store-conformance.d.ts.map +1 -1
- package/dist/application/admission-rate.d.ts +21 -0
- package/dist/application/admission-rate.d.ts.map +1 -0
- package/dist/application/admission-run.d.ts +8 -0
- package/dist/application/admission-run.d.ts.map +1 -0
- package/dist/application/admission.d.ts.map +1 -1
- package/dist/application/diagnostic-journal-lock.d.ts +9 -34
- package/dist/application/diagnostic-journal-lock.d.ts.map +1 -1
- package/dist/application/diagnostic-journal-manager.d.ts.map +1 -1
- package/dist/application/diagnostic-journal-storage.d.ts.map +1 -1
- package/dist/application/kernel-resource-context.d.ts.map +1 -1
- package/dist/application/notification-outbox.d.ts.map +1 -1
- package/dist/application/schedule.d.ts +0 -1
- package/dist/application/schedule.d.ts.map +1 -1
- package/dist/application/watch-hub-core.d.ts +122 -0
- package/dist/application/watch-hub-core.d.ts.map +1 -0
- package/dist/application/watch-hub.d.ts +2 -2
- package/dist/application/watch-hub.d.ts.map +1 -1
- package/dist/browser/client-executors.d.ts +14 -0
- package/dist/browser/client-executors.d.ts.map +1 -0
- package/dist/browser/client-multipart.d.ts +1 -1
- package/dist/browser/client-multipart.d.ts.map +1 -1
- package/dist/browser/client.d.ts +3 -2
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/http-fetch.d.ts +22 -0
- package/dist/browser/http-fetch.d.ts.map +1 -0
- package/dist/browser/http.d.ts +1 -3
- package/dist/browser/http.d.ts.map +1 -1
- package/dist/browser/live-state-core.d.ts +63 -0
- package/dist/browser/live-state-core.d.ts.map +1 -0
- package/dist/browser/live-state.d.ts.map +1 -1
- package/dist/browser/realtime-client.d.ts +26 -0
- package/dist/browser/realtime-client.d.ts.map +1 -0
- package/dist/browser/socket-io-connection.d.ts +82 -0
- package/dist/browser/socket-io-connection.d.ts.map +1 -0
- package/dist/browser/socket-io-peer.d.ts +20 -0
- package/dist/browser/socket-io-peer.d.ts.map +1 -0
- package/dist/browser/socket-io-trace.d.ts +31 -0
- package/dist/browser/socket-io-trace.d.ts.map +1 -0
- package/dist/browser/socket-io.d.ts +2 -18
- package/dist/browser/socket-io.d.ts.map +1 -1
- package/dist/contract/client-types.d.ts +134 -0
- package/dist/contract/client-types.d.ts.map +1 -0
- package/dist/contract/define-validation.d.ts +30 -0
- package/dist/contract/define-validation.d.ts.map +1 -0
- package/dist/contract/define.d.ts +3 -357
- package/dist/contract/define.d.ts.map +1 -1
- package/dist/contract/runtime-context.d.ts +131 -0
- package/dist/contract/runtime-context.d.ts.map +1 -0
- package/dist/contract/tool-options.d.ts +105 -0
- package/dist/contract/tool-options.d.ts.map +1 -0
- package/dist/contract/tool-view.d.ts +15 -2
- package/dist/contract/tool-view.d.ts.map +1 -1
- package/dist/durability/contract.d.ts +83 -0
- package/dist/durability/contract.d.ts.map +1 -1
- package/dist/durability/effect.d.ts +24 -0
- package/dist/durability/effect.d.ts.map +1 -0
- package/dist/durability/engine.d.ts +2 -2
- package/dist/durability/engine.d.ts.map +1 -1
- package/dist/durability/events.d.ts +2 -0
- package/dist/durability/events.d.ts.map +1 -1
- package/dist/durability/ledger.d.ts +11 -0
- package/dist/durability/ledger.d.ts.map +1 -1
- package/dist/durability/parks.d.ts +22 -0
- package/dist/durability/parks.d.ts.map +1 -0
- package/dist/durability/scheduler.d.ts +1 -0
- package/dist/durability/scheduler.d.ts.map +1 -1
- package/dist/entrypoints/agent-runtime/coding-tools.js +4 -4
- package/dist/entrypoints/agent-runtime/harness.js +127 -116
- package/dist/entrypoints/agent-runtime/sandbox.js +4 -4
- package/dist/entrypoints/agent-runtime/sqlite/bun.js +3 -3
- package/dist/entrypoints/agent-runtime/sqlite/node.js +3 -3
- package/dist/entrypoints/agent-runtime/testing.js +246 -214
- package/dist/entrypoints/agent-runtime.js +224 -203
- package/dist/entrypoints/application/diagnostic-journal.js +63 -203
- package/dist/entrypoints/application/opentelemetry.js +1 -1
- package/dist/entrypoints/application.js +361 -324
- package/dist/entrypoints/cli.d.ts +4 -1
- package/dist/entrypoints/cli.d.ts.map +1 -1
- package/dist/entrypoints/cli.js +57 -35
- package/dist/entrypoints/contract.d.ts +5 -2
- package/dist/entrypoints/contract.d.ts.map +1 -1
- package/dist/entrypoints/contract.js +3 -2
- package/dist/entrypoints/files.d.ts +2 -0
- package/dist/entrypoints/files.d.ts.map +1 -1
- package/dist/entrypoints/files.js +98 -2
- package/dist/entrypoints/index.d.ts +4 -2
- package/dist/entrypoints/index.d.ts.map +1 -1
- package/dist/entrypoints/index.js +348 -282
- package/dist/entrypoints/live.js +89 -71
- package/dist/entrypoints/node.d.ts +2 -1
- package/dist/entrypoints/node.d.ts.map +1 -1
- package/dist/entrypoints/node.js +13 -12
- package/dist/entrypoints/react.js +1 -1
- package/dist/entrypoints/remote.js +4 -4
- package/dist/entrypoints/server.d.ts +4 -2
- package/dist/entrypoints/server.d.ts.map +1 -1
- package/dist/entrypoints/server.js +293 -79
- package/dist/entrypoints/testing.d.ts +2 -1
- package/dist/entrypoints/testing.d.ts.map +1 -1
- package/dist/entrypoints/testing.js +288 -281
- package/dist/entrypoints/tools/connections.js +2 -2
- package/dist/entrypoints/tools/invoker.js +4 -4
- package/dist/entrypoints/tools.d.ts +6 -3
- package/dist/entrypoints/tools.d.ts.map +1 -1
- package/dist/entrypoints/tools.js +245 -202
- package/dist/entrypoints/tracking.js +325 -274
- package/dist/files/boundary.d.ts.map +1 -1
- package/dist/files/file-io.d.ts +14 -0
- package/dist/files/file-io.d.ts.map +1 -0
- package/dist/index-1j8pm5t0.js +412 -0
- package/dist/{index-kvj7f4hq.js → index-2bxbyab0.js} +10 -2
- package/dist/{index-xnj9bgxe.js → index-2gxzjvyr.js} +2 -162
- package/dist/index-4gcnakhx.js +82 -0
- package/dist/{index-j05z5gn4.js → index-55hkhm67.js} +136 -119
- package/dist/{index-cq4qfycf.js → index-79z7m7dt.js} +227 -59
- package/dist/{index-97ac4gph.js → index-7f68ghdn.js} +3 -3
- package/dist/{index-r7nmqpsg.js → index-7p1f0vp2.js} +1 -1
- package/dist/{index-dcpdvjsc.js → index-863ea9jb.js} +4 -4
- package/dist/index-8p52kd5p.js +242 -0
- package/dist/{index-2qzskm8h.js → index-dce5wxcq.js} +1 -1
- package/dist/index-e01r054k.js +105 -0
- package/dist/{index-sees8yf8.js → index-ensd0r74.js} +118 -111
- package/dist/{index-1nd48tm9.js → index-gxrt5h6v.js} +2 -1
- package/dist/{index-e87kakm4.js → index-ham5sz8m.js} +112 -110
- package/dist/{index-kj2wbeta.js → index-het2he5g.js} +280 -196
- package/dist/{index-vcvkq30w.js → index-hmp4800j.js} +3 -3
- package/dist/{index-gyr48nzg.js → index-k30h66yd.js} +71 -151
- package/dist/{index-2cr1cqhn.js → index-khtgb21r.js} +2 -2
- package/dist/{index-x4799c19.js → index-ndddxtyx.js} +11 -11
- package/dist/{index-dydjcp8z.js → index-np4m8hd3.js} +38 -36
- package/dist/{index-p81267c2.js → index-p3vsv1fb.js} +621 -357
- package/dist/{index-mp5sn43f.js → index-p9e0w8hs.js} +2 -2
- package/dist/{index-rewkc2hj.js → index-p9sh0xx4.js} +3 -3
- package/dist/{index-70yj2ebz.js → index-paz6sgdp.js} +107 -103
- package/dist/{index-bn2cjajt.js → index-px2gm2jp.js} +26 -102
- package/dist/index-s812ycat.js +65 -0
- package/dist/{index-xsqjkha9.js → index-sp1tzwnb.js} +2 -2
- package/dist/{index-n6hxg8as.js → index-t9rhjr9f.js} +615 -566
- package/dist/{index-zeemqhqx.js → index-v260df89.js} +88 -80
- package/dist/{index-fdp6hdxn.js → index-w906953s.js} +5 -1
- package/dist/{index-mdzh02yc.js → index-wdkt63w3.js} +1 -1
- package/dist/{index-58k4fp34.js → index-wsm5w4ee.js} +1 -1
- package/dist/{index-v38qyerb.js → index-xw3s75nj.js} +1 -1
- package/dist/internal/atomic-file.d.ts +23 -2
- package/dist/internal/atomic-file.d.ts.map +1 -1
- package/dist/internal/exclusive-lock.d.ts +51 -0
- package/dist/internal/exclusive-lock.d.ts.map +1 -0
- package/dist/internal/process-identity.d.ts +47 -0
- package/dist/internal/process-identity.d.ts.map +1 -0
- package/dist/internal/with-exclusive-lock.d.ts +67 -0
- package/dist/internal/with-exclusive-lock.d.ts.map +1 -0
- package/dist/live/watch-client.d.ts.map +1 -1
- package/dist/observability/audit.d.ts +2 -2
- package/dist/observability/audit.d.ts.map +1 -1
- package/dist/observability/event.d.ts +2 -1
- package/dist/observability/event.d.ts.map +1 -1
- package/dist/primitives/export-operation.d.ts +1 -1
- package/dist/primitives/export-operation.d.ts.map +1 -1
- package/dist/realtime/registry.d.ts +0 -5
- package/dist/realtime/registry.d.ts.map +1 -1
- package/dist/server/bun.d.ts +0 -1
- package/dist/server/bun.d.ts.map +1 -1
- package/dist/server/context-contribution.d.ts +1 -1
- package/dist/server/context-contribution.d.ts.map +1 -1
- package/dist/server/context.d.ts +1 -1
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/endpoint-response.d.ts +2 -1
- package/dist/server/endpoint-response.d.ts.map +1 -1
- package/dist/server/error-dispatch.d.ts +1 -1
- package/dist/server/error-dispatch.d.ts.map +1 -1
- package/dist/server/error-hook.d.ts +1 -1
- package/dist/server/error-hook.d.ts.map +1 -1
- package/dist/server/handler-state.d.ts +1 -1
- package/dist/server/handler-state.d.ts.map +1 -1
- package/dist/server/implement-registry.d.ts +54 -0
- package/dist/server/implement-registry.d.ts.map +1 -0
- package/dist/server/implement.d.ts +9 -55
- package/dist/server/implement.d.ts.map +1 -1
- package/dist/server/middleware/auth.d.ts +1 -31
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/jwt.d.ts +31 -0
- package/dist/server/middleware/jwt.d.ts.map +1 -0
- package/dist/server/multipart-reader.d.ts +22 -0
- package/dist/server/multipart-reader.d.ts.map +1 -0
- package/dist/server/multipart.d.ts +1 -1
- package/dist/server/multipart.d.ts.map +1 -1
- package/dist/server/oauth/cimd.d.ts +88 -0
- package/dist/server/oauth/cimd.d.ts.map +1 -0
- package/dist/server/oauth/endpoints.d.ts +39 -0
- package/dist/server/oauth/endpoints.d.ts.map +1 -0
- package/dist/server/oauth/provider.d.ts +1 -68
- package/dist/server/oauth/provider.d.ts.map +1 -1
- package/dist/server/streaming-pump.d.ts +66 -0
- package/dist/server/streaming-pump.d.ts.map +1 -0
- package/dist/server/streaming-route.d.ts +12 -5
- package/dist/server/streaming-route.d.ts.map +1 -1
- package/dist/server/types.d.ts +4 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/unix-client-bun.d.ts.map +1 -1
- package/dist/server/unix-client-http1.d.ts +76 -0
- package/dist/server/unix-client-http1.d.ts.map +1 -0
- package/dist/server/unix-client.d.ts.map +1 -1
- package/dist/testing/handler-clients.d.ts +2 -1
- package/dist/testing/handler-clients.d.ts.map +1 -1
- package/dist/testing/realtime-probe.d.ts +33 -0
- package/dist/testing/realtime-probe.d.ts.map +1 -0
- package/dist/testing/surface-conformance.d.ts +0 -31
- package/dist/testing/surface-conformance.d.ts.map +1 -1
- package/dist/testing/surface-manifest-digest.d.ts +44 -0
- package/dist/testing/surface-manifest-digest.d.ts.map +1 -0
- package/dist/testing/surface-manifest.d.ts.map +1 -1
- package/dist/tools/agent.d.ts +1 -1
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/cli/args-fields.d.ts +31 -0
- package/dist/tools/cli/args-fields.d.ts.map +1 -0
- package/dist/tools/cli/args-route.d.ts +42 -0
- package/dist/tools/cli/args-route.d.ts.map +1 -0
- package/dist/tools/cli/args-view.d.ts +32 -0
- package/dist/tools/cli/args-view.d.ts.map +1 -0
- package/dist/tools/cli/args.d.ts +2 -65
- package/dist/tools/cli/args.d.ts.map +1 -1
- package/dist/tools/cli/argument-error.d.ts +5 -0
- package/dist/tools/cli/argument-error.d.ts.map +1 -0
- package/dist/tools/cli/checkpoint.d.ts.map +1 -1
- package/dist/tools/cli/command.d.ts +1 -1
- package/dist/tools/cli/command.d.ts.map +1 -1
- package/dist/tools/cli/config.d.ts +1 -1
- package/dist/tools/cli/config.d.ts.map +1 -1
- package/dist/tools/cli/format.d.ts +2 -1
- package/dist/tools/cli/format.d.ts.map +1 -1
- package/dist/tools/cli/invoke.d.ts +2 -1
- package/dist/tools/cli/invoke.d.ts.map +1 -1
- package/dist/tools/cli/managed-surface.d.ts +1 -1
- package/dist/tools/cli/managed-surface.d.ts.map +1 -1
- package/dist/tools/cli/policy.d.ts +1 -1
- package/dist/tools/cli/policy.d.ts.map +1 -1
- package/dist/tools/cli/prepare.d.ts.map +1 -1
- package/dist/tools/cli/run-managed.d.ts.map +1 -1
- package/dist/tools/cli/session.d.ts +1 -1
- package/dist/tools/cli/session.d.ts.map +1 -1
- package/dist/tools/cli/update.d.ts +19 -0
- package/dist/tools/cli/update.d.ts.map +1 -1
- package/dist/tools/cli/view.d.ts +1 -1
- package/dist/tools/cli/view.d.ts.map +1 -1
- package/dist/tools/cli/wait.d.ts +1 -1
- package/dist/tools/cli/wait.d.ts.map +1 -1
- package/dist/tools/connections/runtime.d.ts +1 -1
- package/dist/tools/connections/runtime.d.ts.map +1 -1
- package/dist/tools/execute-args.d.ts +23 -0
- package/dist/tools/execute-args.d.ts.map +1 -0
- package/dist/tools/execute-hooks.d.ts +146 -0
- package/dist/tools/execute-hooks.d.ts.map +1 -0
- package/dist/tools/execute-result.d.ts +40 -0
- package/dist/tools/execute-result.d.ts.map +1 -0
- package/dist/tools/execute.d.ts +4 -193
- package/dist/tools/execute.d.ts.map +1 -1
- package/dist/tools/internal/surface-projector.d.ts +2 -1
- package/dist/tools/internal/surface-projector.d.ts.map +1 -1
- package/dist/tools/invoker.d.ts +2 -1
- package/dist/tools/invoker.d.ts.map +1 -1
- package/dist/tools/lifecycle.d.ts +1 -1
- package/dist/tools/lifecycle.d.ts.map +1 -1
- package/dist/tools/mcp/mount.d.ts +1 -1
- package/dist/tools/mcp/mount.d.ts.map +1 -1
- package/dist/tools/mcp/prepare.d.ts +2 -1
- package/dist/tools/mcp/prepare.d.ts.map +1 -1
- package/dist/tools/mcp/progress.d.ts +1 -1
- package/dist/tools/mcp/progress.d.ts.map +1 -1
- package/dist/tools/mcp/register.d.ts +3 -2
- package/dist/tools/mcp/register.d.ts.map +1 -1
- package/dist/tools/mcp/round-context.d.ts +38 -0
- package/dist/tools/mcp/round-context.d.ts.map +1 -0
- package/dist/tools/mcp/round-policy.d.ts +1 -1
- package/dist/tools/mcp/round-policy.d.ts.map +1 -1
- package/dist/tools/mcp/round.d.ts +3 -11
- package/dist/tools/mcp/round.d.ts.map +1 -1
- package/dist/tools/mcp/runtime-tools.d.ts +2 -1
- package/dist/tools/mcp/runtime-tools.d.ts.map +1 -1
- package/dist/tools/mount.d.ts +3 -1
- package/dist/tools/mount.d.ts.map +1 -1
- package/dist/tools/native-definition.d.ts +2 -1
- package/dist/tools/native-definition.d.ts.map +1 -1
- package/dist/tools/operations/async-operation-runtime-tools.d.ts +2 -1
- package/dist/tools/operations/async-operation-runtime-tools.d.ts.map +1 -1
- package/dist/tools/operations/async-operation-runtime-types.d.ts +2 -1
- package/dist/tools/operations/async-operation-runtime-types.d.ts.map +1 -1
- package/dist/tools/remote.d.ts.map +1 -1
- package/dist/tools/runtime-tool.d.ts +3 -1
- package/dist/tools/runtime-tool.d.ts.map +1 -1
- package/dist/tools/tool-logger.d.ts +1 -1
- package/dist/tools/tool-logger.d.ts.map +1 -1
- package/dist/tracking/client-listeners.d.ts +30 -0
- package/dist/tracking/client-listeners.d.ts.map +1 -0
- package/dist/tracking/client-visit.d.ts +61 -0
- package/dist/tracking/client-visit.d.ts.map +1 -0
- package/dist/tracking/client.d.ts +3 -2
- package/dist/tracking/client.d.ts.map +1 -1
- package/llms/application.2.txt +266 -2
- package/llms/application.txt +8 -266
- package/llms/cli.2.txt +80 -0
- package/llms/cli.txt +45 -74
- package/llms/contract.txt +3 -3
- package/llms/files.txt +3 -0
- package/llms/tools.2.txt +88 -279
- package/llms/tools.3.txt +288 -0
- package/llms/tools.txt +27 -65
- package/llms-full.txt +108 -12
- package/llms.txt +5 -5
- package/package.json +1 -1
- package/dist/index-e2z3ahw9.js +0 -325
- package/dist/index-mkm15s49.js +0 -394
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
attemptExclusiveLock
|
|
3
|
+
} from "../../index-8p52kd5p.js";
|
|
1
4
|
import {
|
|
2
5
|
DiagnosticJournalCloseResultSchema,
|
|
3
6
|
DiagnosticJournalFrameSchema,
|
|
@@ -22,168 +25,25 @@ import { randomUUID } from "node:crypto";
|
|
|
22
25
|
import { z } from "zod";
|
|
23
26
|
|
|
24
27
|
// src/application/diagnostic-journal-storage.ts
|
|
25
|
-
import { constants
|
|
26
|
-
import { lstat, open
|
|
28
|
+
import { constants } from "node:fs";
|
|
29
|
+
import { lstat, open, readdir, realpath, rename, unlink } from "node:fs/promises";
|
|
27
30
|
import { basename, dirname, isAbsolute, resolve } from "node:path";
|
|
28
31
|
|
|
29
32
|
// src/application/diagnostic-journal-lock.ts
|
|
30
|
-
import { execFile } from "node:child_process";
|
|
31
|
-
import { constants } from "node:fs";
|
|
32
|
-
import { open, readFile, unlink } from "node:fs/promises";
|
|
33
|
-
import { hostname, platform } from "node:os";
|
|
34
|
-
import { promisify } from "node:util";
|
|
35
|
-
function isExisting(error) {
|
|
36
|
-
return isRecord(error) && error.code === "EEXIST";
|
|
37
|
-
}
|
|
38
|
-
function readOwner(text) {
|
|
39
|
-
let parsed;
|
|
40
|
-
try {
|
|
41
|
-
parsed = JSON.parse(text);
|
|
42
|
-
} catch {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (!isRecord(parsed))
|
|
46
|
-
return;
|
|
47
|
-
const { pid, host, acquiredAt, machine } = parsed;
|
|
48
|
-
if (typeof pid !== "number" || !Number.isSafeInteger(pid) || pid <= 0)
|
|
49
|
-
return;
|
|
50
|
-
if (typeof host !== "string" || host.length === 0)
|
|
51
|
-
return;
|
|
52
|
-
if (typeof acquiredAt !== "string")
|
|
53
|
-
return;
|
|
54
|
-
const identified = typeof machine === "string" && machine.length > 0 ? { machine } : {};
|
|
55
|
-
return { pid, host, acquiredAt, ...identified };
|
|
56
|
-
}
|
|
57
|
-
var detectedIdentity;
|
|
58
|
-
async function firstReadableLine(paths) {
|
|
59
|
-
for (const path of paths) {
|
|
60
|
-
try {
|
|
61
|
-
const text = (await readFile(path, "utf8")).trim();
|
|
62
|
-
if (text.length > 0)
|
|
63
|
-
return text;
|
|
64
|
-
} catch {}
|
|
65
|
-
}
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
var run = promisify(execFile);
|
|
69
|
-
function parsePlatformUuid(dump) {
|
|
70
|
-
return /"IOPlatformUUID"\s*=\s*"([^"]+)"/.exec(dump)?.[1] ?? null;
|
|
71
|
-
}
|
|
72
|
-
async function readDarwinPlatformUuid(command = "ioreg") {
|
|
73
|
-
try {
|
|
74
|
-
const { stdout } = await run(command, ["-rd1", "-c", "IOPlatformExpertDevice"], {
|
|
75
|
-
timeout: 2000,
|
|
76
|
-
maxBuffer: 1 << 20,
|
|
77
|
-
encoding: "utf8"
|
|
78
|
-
});
|
|
79
|
-
return parsePlatformUuid(stdout);
|
|
80
|
-
} catch {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
async function machineIdentity(declared) {
|
|
85
|
-
if (declared !== undefined)
|
|
86
|
-
return declared;
|
|
87
|
-
if (detectedIdentity !== undefined)
|
|
88
|
-
return detectedIdentity;
|
|
89
|
-
detectedIdentity = platform() === "darwin" ? await readDarwinPlatformUuid() : await firstReadableLine(["/etc/machine-id", "/var/lib/dbus/machine-id"]);
|
|
90
|
-
return detectedIdentity;
|
|
91
|
-
}
|
|
92
|
-
function attribute(owner, identity) {
|
|
93
|
-
if (identity !== null && owner.machine !== undefined) {
|
|
94
|
-
return owner.machine === identity ? "this-machine" : "another-machine";
|
|
95
|
-
}
|
|
96
|
-
return owner.host === hostname() ? "this-machine" : "unattributable";
|
|
97
|
-
}
|
|
98
|
-
async function probeLiveness(owner) {
|
|
99
|
-
try {
|
|
100
|
-
process.kill(owner.pid, 0);
|
|
101
|
-
} catch (error) {
|
|
102
|
-
return isRecord(error) && error.code === "ESRCH" ? "gone" : "alive";
|
|
103
|
-
}
|
|
104
|
-
return await isZombieProcess(owner.pid) ? "gone" : "alive";
|
|
105
|
-
}
|
|
106
|
-
async function isZombieProcess(pid, seam = {}) {
|
|
107
|
-
const { procRoot = "/proc", psCommand = "ps" } = seam;
|
|
108
|
-
try {
|
|
109
|
-
const stat = await readFile(`${procRoot}/${pid}/stat`, "utf8");
|
|
110
|
-
return stat.slice(stat.lastIndexOf(")") + 1).trimStart().startsWith("Z");
|
|
111
|
-
} catch {}
|
|
112
|
-
try {
|
|
113
|
-
const { stdout } = await run(psCommand, ["-o", "state=", "-p", String(pid)], {
|
|
114
|
-
timeout: 2000,
|
|
115
|
-
maxBuffer: 1 << 16,
|
|
116
|
-
encoding: "utf8"
|
|
117
|
-
});
|
|
118
|
-
return stdout.trim().startsWith("Z");
|
|
119
|
-
} catch {
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
async function diagnose(owner, declaredIdentity) {
|
|
124
|
-
if (!owner)
|
|
125
|
-
return { attribution: "unattributable", liveness: "not-probed", owner: null };
|
|
126
|
-
const attribution = attribute(owner, await machineIdentity(declaredIdentity));
|
|
127
|
-
const record = {
|
|
128
|
-
pid: owner.pid,
|
|
129
|
-
host: owner.host,
|
|
130
|
-
acquiredAt: owner.acquiredAt,
|
|
131
|
-
...owner.machine !== undefined && { machine: owner.machine }
|
|
132
|
-
};
|
|
133
|
-
if (attribution !== "this-machine")
|
|
134
|
-
return { attribution, liveness: "not-probed", owner: record };
|
|
135
|
-
return { attribution, liveness: await probeLiveness(owner), owner: record };
|
|
136
|
-
}
|
|
137
|
-
async function readLockOwner(lockPath) {
|
|
138
|
-
let handle;
|
|
139
|
-
try {
|
|
140
|
-
handle = await open(lockPath, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
141
|
-
return readOwner(await handle.readFile("utf8"));
|
|
142
|
-
} catch {
|
|
143
|
-
return;
|
|
144
|
-
} finally {
|
|
145
|
-
await handle?.close().catch(() => {
|
|
146
|
-
return;
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
async function createExclusive(lockPath, mode, declaredIdentity) {
|
|
151
|
-
const handle = await open(lockPath, "wx", mode);
|
|
152
|
-
const identity = await machineIdentity(declaredIdentity);
|
|
153
|
-
const owner = {
|
|
154
|
-
pid: process.pid,
|
|
155
|
-
host: hostname(),
|
|
156
|
-
acquiredAt: new Date().toISOString(),
|
|
157
|
-
...identity !== null && { machine: identity }
|
|
158
|
-
};
|
|
159
|
-
await handle.writeFile(`${JSON.stringify(owner)}
|
|
160
|
-
`, "utf8");
|
|
161
|
-
return handle;
|
|
162
|
-
}
|
|
163
33
|
async function acquireDiagnosticJournalLock(lockPath, mode, policy, declaredIdentity) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
if (isRecord(error))
|
|
176
|
-
Object.assign(error, { journalLock: diagnosis });
|
|
177
|
-
throw error;
|
|
178
|
-
}
|
|
179
|
-
await unlink(lockPath).catch(() => {
|
|
180
|
-
return;
|
|
181
|
-
});
|
|
182
|
-
return {
|
|
183
|
-
handle: await createExclusive(lockPath, mode, declaredIdentity),
|
|
184
|
-
reclaimedStale: true
|
|
185
|
-
};
|
|
34
|
+
const attempt = await attemptExclusiveLock(lockPath, {
|
|
35
|
+
mode,
|
|
36
|
+
reclaim: policy === "reclaim-stale",
|
|
37
|
+
...declaredIdentity !== undefined && { machineIdentity: declaredIdentity }
|
|
38
|
+
});
|
|
39
|
+
if ("held" in attempt) {
|
|
40
|
+
return { lock: attempt.held, reclaimedStale: attempt.held.reclaimed };
|
|
41
|
+
}
|
|
42
|
+
const { error, diagnosis } = attempt;
|
|
43
|
+
if (diagnosis && error !== null && typeof error === "object") {
|
|
44
|
+
Object.assign(error, { journalLock: diagnosis });
|
|
186
45
|
}
|
|
46
|
+
throw error;
|
|
187
47
|
}
|
|
188
48
|
|
|
189
49
|
// src/application/diagnostic-journal-storage.ts
|
|
@@ -204,7 +64,7 @@ async function removeIfPresent(path) {
|
|
|
204
64
|
if (info.isSymbolicLink() || !info.isFile()) {
|
|
205
65
|
throw new Error("Diagnostic journal generations must be regular files");
|
|
206
66
|
}
|
|
207
|
-
await
|
|
67
|
+
await unlink(path);
|
|
208
68
|
} catch (error) {
|
|
209
69
|
if (!isMissing(error))
|
|
210
70
|
throw error;
|
|
@@ -243,7 +103,7 @@ async function createRotatingDiagnosticJournalStorage(config) {
|
|
|
243
103
|
const parent = await realpath(dirname(config.path));
|
|
244
104
|
const journalPath = resolve(parent, basename(config.path));
|
|
245
105
|
const lockPath = `${journalPath}.lock`;
|
|
246
|
-
const {
|
|
106
|
+
const { lock, reclaimedStale } = await acquireDiagnosticJournalLock(lockPath, config.mode, config.lock, config.machineIdentity);
|
|
247
107
|
let handle;
|
|
248
108
|
let currentFileBytes = 0;
|
|
249
109
|
let retainedFiles = 1;
|
|
@@ -251,7 +111,7 @@ async function createRotatingDiagnosticJournalStorage(config) {
|
|
|
251
111
|
let partialTails = 0;
|
|
252
112
|
let closed = false;
|
|
253
113
|
const openCurrent = async () => {
|
|
254
|
-
handle = await
|
|
114
|
+
handle = await open(journalPath, constants.O_APPEND | constants.O_CREAT | constants.O_RDWR | constants.O_NOFOLLOW, config.mode);
|
|
255
115
|
const info = await handle.stat();
|
|
256
116
|
if (!info.isFile()) {
|
|
257
117
|
await handle.close();
|
|
@@ -312,10 +172,7 @@ async function createRotatingDiagnosticJournalStorage(config) {
|
|
|
312
172
|
await handle?.close().catch(() => {
|
|
313
173
|
return;
|
|
314
174
|
});
|
|
315
|
-
await lock.
|
|
316
|
-
return;
|
|
317
|
-
});
|
|
318
|
-
await unlink2(lockPath).catch(() => {
|
|
175
|
+
await lock.release().catch(() => {
|
|
319
176
|
return;
|
|
320
177
|
});
|
|
321
178
|
throw error;
|
|
@@ -359,8 +216,7 @@ async function createRotatingDiagnosticJournalStorage(config) {
|
|
|
359
216
|
failure = error;
|
|
360
217
|
}
|
|
361
218
|
try {
|
|
362
|
-
await lock.
|
|
363
|
-
await unlink2(lockPath);
|
|
219
|
+
await lock.release();
|
|
364
220
|
} catch (error) {
|
|
365
221
|
failure ??= error;
|
|
366
222
|
}
|
|
@@ -382,6 +238,45 @@ function waitBudget(options) {
|
|
|
382
238
|
}
|
|
383
239
|
return options.timeoutMs;
|
|
384
240
|
}
|
|
241
|
+
var NO_REFUSALS = {
|
|
242
|
+
closed: 0,
|
|
243
|
+
failed: 0,
|
|
244
|
+
invalid: 0,
|
|
245
|
+
oversized: 0,
|
|
246
|
+
"item-capacity": 0,
|
|
247
|
+
"byte-capacity": 0
|
|
248
|
+
};
|
|
249
|
+
function waitForProgress(progressWaiters, predicate, options) {
|
|
250
|
+
const timeoutMs = waitBudget(options);
|
|
251
|
+
if (predicate())
|
|
252
|
+
return Promise.resolve("settled");
|
|
253
|
+
if (options.signal?.aborted)
|
|
254
|
+
return Promise.resolve("cancelled");
|
|
255
|
+
return new Promise((resolve2) => {
|
|
256
|
+
let settled = false;
|
|
257
|
+
let timer;
|
|
258
|
+
const finish = (outcome) => {
|
|
259
|
+
if (settled)
|
|
260
|
+
return;
|
|
261
|
+
settled = true;
|
|
262
|
+
progressWaiters.delete(onProgress);
|
|
263
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
264
|
+
if (timer)
|
|
265
|
+
clearTimeout(timer);
|
|
266
|
+
resolve2(outcome);
|
|
267
|
+
};
|
|
268
|
+
const onProgress = () => {
|
|
269
|
+
if (predicate())
|
|
270
|
+
finish("settled");
|
|
271
|
+
};
|
|
272
|
+
const onAbort = () => finish("cancelled");
|
|
273
|
+
progressWaiters.add(onProgress);
|
|
274
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
275
|
+
if (timeoutMs !== undefined)
|
|
276
|
+
timer = setTimeout(() => finish("timed-out"), timeoutMs);
|
|
277
|
+
onProgress();
|
|
278
|
+
});
|
|
279
|
+
}
|
|
385
280
|
function createDiagnosticJournalManager(config, storage) {
|
|
386
281
|
const limits = DiagnosticJournalLimitsSchema.parse(config.limits);
|
|
387
282
|
const encoder = new TextEncoder;
|
|
@@ -392,12 +287,7 @@ function createDiagnosticJournalManager(config, storage) {
|
|
|
392
287
|
sizeOf: (frame) => frame.bytes.byteLength
|
|
393
288
|
});
|
|
394
289
|
const refusals = {
|
|
395
|
-
|
|
396
|
-
failed: 0,
|
|
397
|
-
invalid: 0,
|
|
398
|
-
oversized: 0,
|
|
399
|
-
"item-capacity": 0,
|
|
400
|
-
"byte-capacity": 0
|
|
290
|
+
...NO_REFUSALS
|
|
401
291
|
};
|
|
402
292
|
const progressWaiters = new Set;
|
|
403
293
|
let state = "open";
|
|
@@ -477,37 +367,7 @@ function createDiagnosticJournalManager(config, storage) {
|
|
|
477
367
|
refusals[reason] += 1;
|
|
478
368
|
return DiagnosticJournalSubmitResultSchema.parse({ outcome: "refused", reason });
|
|
479
369
|
};
|
|
480
|
-
const waitUntil = (predicate, options) =>
|
|
481
|
-
const timeoutMs = waitBudget(options);
|
|
482
|
-
if (predicate())
|
|
483
|
-
return Promise.resolve("settled");
|
|
484
|
-
if (options.signal?.aborted)
|
|
485
|
-
return Promise.resolve("cancelled");
|
|
486
|
-
return new Promise((resolve2) => {
|
|
487
|
-
let settled = false;
|
|
488
|
-
let timer;
|
|
489
|
-
const finish = (outcome) => {
|
|
490
|
-
if (settled)
|
|
491
|
-
return;
|
|
492
|
-
settled = true;
|
|
493
|
-
progressWaiters.delete(onProgress);
|
|
494
|
-
options.signal?.removeEventListener("abort", onAbort);
|
|
495
|
-
if (timer)
|
|
496
|
-
clearTimeout(timer);
|
|
497
|
-
resolve2(outcome);
|
|
498
|
-
};
|
|
499
|
-
const onProgress = () => {
|
|
500
|
-
if (predicate())
|
|
501
|
-
finish("settled");
|
|
502
|
-
};
|
|
503
|
-
const onAbort = () => finish("cancelled");
|
|
504
|
-
progressWaiters.add(onProgress);
|
|
505
|
-
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
506
|
-
if (timeoutMs !== undefined)
|
|
507
|
-
timer = setTimeout(() => finish("timed-out"), timeoutMs);
|
|
508
|
-
onProgress();
|
|
509
|
-
});
|
|
510
|
-
};
|
|
370
|
+
const waitUntil = (predicate, options) => waitForProgress(progressWaiters, predicate, options);
|
|
511
371
|
const getStatus = () => {
|
|
512
372
|
const file = storage.snapshot();
|
|
513
373
|
return DiagnosticJournalStatusSchema.parse({
|