@animalabs/agent-framework 0.21.0 → 0.22.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 +43 -0
- package/dist/src/agent.d.ts +17 -4
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +102 -42
- package/dist/src/agent.js.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts +22 -1
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +64 -9
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts +4 -0
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +215 -38
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/framework.d.ts +250 -39
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1602 -371
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +21 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +40 -7
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +26 -3
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +28 -1
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +17 -0
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/feature-set-manager.d.ts +11 -0
- package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -1
- package/dist/src/mcpl/feature-set-manager.js +31 -7
- package/dist/src/mcpl/feature-set-manager.js.map +1 -1
- package/dist/src/mcpl/index.d.ts +2 -0
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +1 -0
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/prose-stream-router.d.ts +27 -6
- package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
- package/dist/src/mcpl/prose-stream-router.js +85 -22
- package/dist/src/mcpl/prose-stream-router.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +32 -4
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +46 -13
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +5 -3
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +41 -11
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +4 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +45 -8
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts +5 -2
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +25 -7
- package/dist/src/mcpl/server-registry.js.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.d.ts +52 -2
- package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.js +47 -1
- package/dist/src/mcpl/tool-lifecycle.js.map +1 -1
- package/dist/src/mcpl/tool-pattern-check.d.ts +51 -0
- package/dist/src/mcpl/tool-pattern-check.d.ts.map +1 -0
- package/dist/src/mcpl/tool-pattern-check.js +79 -0
- package/dist/src/mcpl/tool-pattern-check.js.map +1 -0
- package/dist/src/mcpl/types.d.ts +15 -5
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/mcpl/visible-content.d.ts +39 -0
- package/dist/src/mcpl/visible-content.d.ts.map +1 -0
- package/dist/src/mcpl/visible-content.js +54 -0
- package/dist/src/mcpl/visible-content.js.map +1 -0
- package/dist/src/module-registry.d.ts +81 -3
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +257 -16
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/workspace/branch-intent.d.ts +72 -0
- package/dist/src/modules/workspace/branch-intent.d.ts.map +1 -0
- package/dist/src/modules/workspace/branch-intent.js +83 -0
- package/dist/src/modules/workspace/branch-intent.js.map +1 -0
- package/dist/src/modules/workspace/disk-agreement.d.ts +167 -0
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -0
- package/dist/src/modules/workspace/disk-agreement.js +259 -0
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -0
- package/dist/src/modules/workspace/effects.d.ts +84 -0
- package/dist/src/modules/workspace/effects.d.ts.map +1 -0
- package/dist/src/modules/workspace/effects.js +368 -0
- package/dist/src/modules/workspace/effects.js.map +1 -0
- package/dist/src/modules/workspace/index.d.ts +155 -17
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +1059 -424
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +278 -0
- package/dist/src/modules/workspace/observe.d.ts.map +1 -0
- package/dist/src/modules/workspace/observe.js +805 -0
- package/dist/src/modules/workspace/observe.js.map +1 -0
- package/dist/src/modules/workspace/reconcile.d.ts +224 -0
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -0
- package/dist/src/modules/workspace/reconcile.js +901 -0
- package/dist/src/modules/workspace/reconcile.js.map +1 -0
- package/dist/src/modules/workspace/sync.d.ts +6 -59
- package/dist/src/modules/workspace/sync.d.ts.map +1 -1
- package/dist/src/modules/workspace/sync.js +6 -257
- package/dist/src/modules/workspace/sync.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +77 -10
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/record-journal.d.ts +127 -0
- package/dist/src/record-journal.d.ts.map +1 -0
- package/dist/src/record-journal.js +202 -0
- package/dist/src/record-journal.js.map +1 -0
- package/dist/src/shutdown.d.ts +13 -0
- package/dist/src/shutdown.d.ts.map +1 -0
- package/dist/src/shutdown.js +46 -0
- package/dist/src/shutdown.js.map +1 -0
- package/dist/src/silent-heartbeat.d.ts +74 -0
- package/dist/src/silent-heartbeat.d.ts.map +1 -0
- package/dist/src/silent-heartbeat.js +77 -0
- package/dist/src/silent-heartbeat.js.map +1 -0
- package/dist/src/tool-presentation.d.ts +50 -0
- package/dist/src/tool-presentation.d.ts.map +1 -0
- package/dist/src/tool-presentation.js +235 -0
- package/dist/src/tool-presentation.js.map +1 -0
- package/dist/src/tool-result-guard.d.ts +125 -6
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +310 -35
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +13 -0
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +21 -1
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/types/agent.d.ts +18 -2
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +4 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +12 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +14 -0
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +73 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/batched-wake-locus.test.d.ts +2 -0
- package/dist/test/batched-wake-locus.test.d.ts.map +1 -0
- package/dist/test/batched-wake-locus.test.js +166 -0
- package/dist/test/batched-wake-locus.test.js.map +1 -0
- package/dist/test/code-execution.test.js +386 -2
- package/dist/test/code-execution.test.js.map +1 -1
- package/dist/test/component-defaults.test.d.ts +2 -0
- package/dist/test/component-defaults.test.d.ts.map +1 -0
- package/dist/test/component-defaults.test.js +54 -0
- package/dist/test/component-defaults.test.js.map +1 -0
- package/dist/test/conversation-routing.test.js +57 -1
- package/dist/test/conversation-routing.test.js.map +1 -1
- package/dist/test/ephemeral-settle.test.js +3 -0
- package/dist/test/ephemeral-settle.test.js.map +1 -1
- package/dist/test/event-gate.test.js +118 -0
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/explicit-prose-routing.test.js +977 -0
- package/dist/test/explicit-prose-routing.test.js.map +1 -1
- package/dist/test/helpers/pytc-stop-rows.d.ts +11 -0
- package/dist/test/helpers/pytc-stop-rows.d.ts.map +1 -0
- package/dist/test/helpers/pytc-stop-rows.js +143 -0
- package/dist/test/helpers/pytc-stop-rows.js.map +1 -0
- package/dist/test/mcpl-coalescing.test.js +19 -6
- package/dist/test/mcpl-coalescing.test.js.map +1 -1
- package/dist/test/mcpl-config-diagnostics.test.d.ts +2 -0
- package/dist/test/mcpl-config-diagnostics.test.d.ts.map +1 -0
- package/dist/test/mcpl-config-diagnostics.test.js +449 -0
- package/dist/test/mcpl-config-diagnostics.test.js.map +1 -0
- package/dist/test/mcpl-empty-content.test.d.ts +2 -0
- package/dist/test/mcpl-empty-content.test.d.ts.map +1 -0
- package/dist/test/mcpl-empty-content.test.js +368 -0
- package/dist/test/mcpl-empty-content.test.js.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js +106 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +1 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +2 -0
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-script.test.js +288 -0
- package/dist/test/mcpl-tool-lifecycle-script.test.js.map +1 -0
- package/dist/test/prose-stream-router.test.js +41 -0
- package/dist/test/prose-stream-router.test.js.map +1 -1
- package/dist/test/record-journal.test.d.ts +6 -0
- package/dist/test/record-journal.test.d.ts.map +1 -0
- package/dist/test/record-journal.test.js +269 -0
- package/dist/test/record-journal.test.js.map +1 -0
- package/dist/test/save-recent-image.test.js +102 -0
- package/dist/test/save-recent-image.test.js.map +1 -1
- package/dist/test/shutdown-errors.test.d.ts +2 -0
- package/dist/test/shutdown-errors.test.d.ts.map +1 -0
- package/dist/test/shutdown-errors.test.js +662 -0
- package/dist/test/shutdown-errors.test.js.map +1 -0
- package/dist/test/silent-heartbeat-rows.test.d.ts +2 -0
- package/dist/test/silent-heartbeat-rows.test.d.ts.map +1 -0
- package/dist/test/silent-heartbeat-rows.test.js +451 -0
- package/dist/test/silent-heartbeat-rows.test.js.map +1 -0
- package/dist/test/silent-heartbeat.test.js +49 -38
- package/dist/test/silent-heartbeat.test.js.map +1 -1
- package/dist/test/stop-with-work-in-flight.test.d.ts +23 -0
- package/dist/test/stop-with-work-in-flight.test.d.ts.map +1 -0
- package/dist/test/stop-with-work-in-flight.test.js +672 -0
- package/dist/test/stop-with-work-in-flight.test.js.map +1 -0
- package/dist/test/tool-batch-hook.test.d.ts +8 -0
- package/dist/test/tool-batch-hook.test.d.ts.map +1 -0
- package/dist/test/tool-batch-hook.test.js +275 -0
- package/dist/test/tool-batch-hook.test.js.map +1 -0
- package/dist/test/tool-presentation.test.d.ts +2 -0
- package/dist/test/tool-presentation.test.d.ts.map +1 -0
- package/dist/test/tool-presentation.test.js +268 -0
- package/dist/test/tool-presentation.test.js.map +1 -0
- package/dist/test/tool-result-guard.test.js +2330 -18
- package/dist/test/tool-result-guard.test.js.map +1 -1
- package/dist/test/tool-result-history.test.js +2 -1
- package/dist/test/tool-result-history.test.js.map +1 -1
- package/dist/test/turn-trigger-provenance.test.js +35 -0
- package/dist/test/turn-trigger-provenance.test.js.map +1 -1
- package/dist/test/unconvertible-tool-result.test.d.ts +2 -0
- package/dist/test/unconvertible-tool-result.test.d.ts.map +1 -0
- package/dist/test/unconvertible-tool-result.test.js +358 -0
- package/dist/test/unconvertible-tool-result.test.js.map +1 -0
- package/dist/test/workspace-materialize-freshness.test.d.ts +16 -0
- package/dist/test/workspace-materialize-freshness.test.d.ts.map +1 -0
- package/dist/test/workspace-materialize-freshness.test.js +252 -0
- package/dist/test/workspace-materialize-freshness.test.js.map +1 -0
- package/dist/test/workspace-three-way.test.d.ts +12 -0
- package/dist/test/workspace-three-way.test.d.ts.map +1 -0
- package/dist/test/workspace-three-way.test.js +3079 -0
- package/dist/test/workspace-three-way.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/agent.ts +120 -44
- package/src/code-execution/py-runner.ts +66 -9
- package/src/code-execution/runtime-py.ts +215 -38
- package/src/framework.ts +1661 -363
- package/src/gate/event-gate.ts +59 -7
- package/src/index.ts +11 -0
- package/src/mcpl/channel-registry.ts +24 -3
- package/src/mcpl/conversation-router.ts +34 -1
- package/src/mcpl/feature-set-manager.ts +36 -11
- package/src/mcpl/index.ts +2 -0
- package/src/mcpl/prose-stream-router.ts +79 -23
- package/src/mcpl/push-coalescer.ts +62 -13
- package/src/mcpl/push-handler.ts +41 -12
- package/src/mcpl/server-connection.ts +41 -10
- package/src/mcpl/server-registry.ts +24 -7
- package/src/mcpl/tool-lifecycle.ts +77 -2
- package/src/mcpl/tool-pattern-check.ts +106 -0
- package/src/mcpl/types.ts +15 -5
- package/src/mcpl/visible-content.ts +57 -0
- package/src/module-registry.ts +252 -16
- package/src/modules/workspace/branch-intent.ts +123 -0
- package/src/modules/workspace/disk-agreement.ts +325 -0
- package/src/modules/workspace/effects.ts +362 -0
- package/src/modules/workspace/index.ts +1058 -446
- package/src/modules/workspace/observe.ts +839 -0
- package/src/modules/workspace/reconcile.ts +1136 -0
- package/src/modules/workspace/sync.ts +6 -336
- package/src/modules/workspace/types.ts +75 -10
- package/src/record-journal.ts +246 -0
- package/src/shutdown.ts +49 -0
- package/src/silent-heartbeat.ts +141 -0
- package/src/tool-presentation.ts +188 -0
- package/src/tool-result-guard.ts +335 -33
- package/src/tool-result-history.ts +25 -1
- package/src/types/agent.ts +18 -2
- package/src/types/events.ts +4 -0
- package/src/types/framework.ts +12 -0
- package/src/types/module.ts +15 -0
- package/src/types/trace.ts +80 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the workspace observes disk for reconciliation, under the mount's
|
|
3
|
+
* boundary.
|
|
4
|
+
*
|
|
5
|
+
* Observation honors the boundary the way openContainedFile does: the lexical
|
|
6
|
+
* path is lstat'd first, a symlink is refused unless the mount follows
|
|
7
|
+
* symlinks, and a followed one must resolve inside the canonical mount root.
|
|
8
|
+
* Anything that isn't a regular file inside the mount is `unobserved` — it
|
|
9
|
+
* proves nothing either way, and reconciliation leaves the path alone.
|
|
10
|
+
*
|
|
11
|
+
* Reads go through one descriptor that is fstat'd, located inside the mount
|
|
12
|
+
* and then read, so what is read and the fingerprint recorded with its hash
|
|
13
|
+
* describe the same file, inside the mount. A hard link is a name inside the
|
|
14
|
+
* mount like any other, and reading through it shows what that path holds;
|
|
15
|
+
* only a write in place reaches a file's other names, so effects.ts refuses
|
|
16
|
+
* that instead.
|
|
17
|
+
*
|
|
18
|
+
* Directories are checked (CheckedDir): located inside the mount, with their
|
|
19
|
+
* identity, and what they showed — a listing, an absence — is accepted only
|
|
20
|
+
* if each is still the directory its logical path names afterwards. A walk records which
|
|
21
|
+
* directories it listed completely, and only those prove a file absent: an
|
|
22
|
+
* unreadable directory, an ignored subtree, the file cap, a symlink the walk
|
|
23
|
+
* doesn't descend, or a directory that changed while it was listed leave
|
|
24
|
+
* everything beneath them unproven. Outside a walk, absence is proven the
|
|
25
|
+
* same way: by a directory inside the mount, still at its path, that lacks
|
|
26
|
+
* the entry (confirmAbsent). A missing parent alone proves nothing, since a
|
|
27
|
+
* dangling symlink or a swapped directory looks just like one.
|
|
28
|
+
*
|
|
29
|
+
* Each check is made where the operation happens, against what is there at
|
|
30
|
+
* that moment, so the boundary holds against what is in the mount, including
|
|
31
|
+
* what appears while an operation runs. Node has no openat or fdopendir, so
|
|
32
|
+
* a directory is checked by its canonical path and identity, not held open:
|
|
33
|
+
* a parent replaced concurrently in the window between a check and its use
|
|
34
|
+
* (or replaced and restored around it) can still redirect a listing or
|
|
35
|
+
* lookup there. File contents are bound regardless: a file is read only
|
|
36
|
+
* through a descriptor bound to its path first.
|
|
37
|
+
*/
|
|
38
|
+
import { type Fingerprint, type RootIdentity } from './disk-agreement.js';
|
|
39
|
+
export interface MountView {
|
|
40
|
+
/** Mount root as configured. */
|
|
41
|
+
root: string;
|
|
42
|
+
/**
|
|
43
|
+
* The root directory disk last agreed under, once the mount has evidence.
|
|
44
|
+
* A root that resolves to any other directory is unavailable.
|
|
45
|
+
*/
|
|
46
|
+
rootIdentity?: RootIdentity;
|
|
47
|
+
followSymlinks: boolean;
|
|
48
|
+
/** Text above this size is not ingested. */
|
|
49
|
+
maxFileSize: number;
|
|
50
|
+
ignore: string[];
|
|
51
|
+
}
|
|
52
|
+
export type StatFingerprint = Omit<Fingerprint, 'hashedAt'>;
|
|
53
|
+
/**
|
|
54
|
+
* Opened with every read or write of a workspace path, where the platform has
|
|
55
|
+
* it: for a regular file it changes nothing, and a FIFO or other special file
|
|
56
|
+
* swapped in at the path neither blocks the open nor passes the regular-file
|
|
57
|
+
* check that follows.
|
|
58
|
+
*/
|
|
59
|
+
export declare const NONBLOCK: number;
|
|
60
|
+
export type Observation = {
|
|
61
|
+
kind: 'absent';
|
|
62
|
+
} | {
|
|
63
|
+
kind: 'file';
|
|
64
|
+
size: number;
|
|
65
|
+
mtimeMs: number;
|
|
66
|
+
fp: StatFingerprint;
|
|
67
|
+
} | {
|
|
68
|
+
kind: 'unobserved';
|
|
69
|
+
reason: string;
|
|
70
|
+
};
|
|
71
|
+
export interface ReadResult {
|
|
72
|
+
kind: 'read';
|
|
73
|
+
size: number;
|
|
74
|
+
mtimeMs: number;
|
|
75
|
+
fp: Fingerprint;
|
|
76
|
+
hash: string;
|
|
77
|
+
/** The whole file, when it is at most the requested limit. */
|
|
78
|
+
bytes: Buffer | null;
|
|
79
|
+
/** First bytes, for binary detection and MIME sniffing. */
|
|
80
|
+
head: Buffer;
|
|
81
|
+
}
|
|
82
|
+
/** The first bytes of a file and its size: nothing else was read or hashed. */
|
|
83
|
+
export interface HeadResult {
|
|
84
|
+
kind: 'head';
|
|
85
|
+
size: number;
|
|
86
|
+
mtimeMs: number;
|
|
87
|
+
head: Buffer;
|
|
88
|
+
}
|
|
89
|
+
/** Bytes kept for binary detection and MIME sniffing. */
|
|
90
|
+
export declare const HEAD_BYTES = 8192;
|
|
91
|
+
/** Timestamps this close to the hashing time can't vouch for the bytes. */
|
|
92
|
+
export declare const RACY_WINDOW_MS = 2000;
|
|
93
|
+
export declare const OUTSIDE_PARENT = "a parent directory resolves outside the mount";
|
|
94
|
+
export declare const NOT_FOLLOWED = "a symlink, which this mount does not follow";
|
|
95
|
+
export declare const ROOT_UNAVAILABLE = "the mount root is unavailable";
|
|
96
|
+
export declare const ROOT_REPLACED: string;
|
|
97
|
+
export declare function errno(err: unknown): string | undefined;
|
|
98
|
+
export declare function contained(rootReal: string, candidate: string): boolean;
|
|
99
|
+
/** The mount-relative parent of a path ('' for the root). */
|
|
100
|
+
export declare function parentOf(relativePath: string): string;
|
|
101
|
+
/** The last component of a mount-relative path. */
|
|
102
|
+
export declare function nameOf(relativePath: string): string;
|
|
103
|
+
export type DirCheck = {
|
|
104
|
+
kind: 'checked';
|
|
105
|
+
dir: CheckedDir;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* No directory there, proven: nothing can exist beneath the path. `by` is
|
|
109
|
+
* the directory whose entries prove it — the one that lacks it, or that
|
|
110
|
+
* holds the non-directory in its place.
|
|
111
|
+
*/
|
|
112
|
+
| {
|
|
113
|
+
kind: 'absent';
|
|
114
|
+
by: string;
|
|
115
|
+
}
|
|
116
|
+
/** Unproven either way; `outside` when it resolves outside the mount. */
|
|
117
|
+
| {
|
|
118
|
+
kind: 'unobserved';
|
|
119
|
+
reason: string;
|
|
120
|
+
outside?: true;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* A directory inside the mount, as it was checked: its canonical path and
|
|
124
|
+
* its identity. Its entries are named through that path, and what it showed
|
|
125
|
+
* is accepted only while it is still the directory its logical path names
|
|
126
|
+
* (see the module doc for what that does and doesn't bind).
|
|
127
|
+
*/
|
|
128
|
+
export declare class CheckedDir {
|
|
129
|
+
/** Mount-relative path ('' for the root). */
|
|
130
|
+
readonly rel: string;
|
|
131
|
+
/** Its canonical location when checked. */
|
|
132
|
+
readonly real: string;
|
|
133
|
+
private readonly lexical;
|
|
134
|
+
private readonly dev;
|
|
135
|
+
private readonly ino;
|
|
136
|
+
constructor(
|
|
137
|
+
/** Mount-relative path ('' for the root). */
|
|
138
|
+
rel: string,
|
|
139
|
+
/** Its canonical location when checked. */
|
|
140
|
+
real: string, lexical: string, dev: bigint, ino: bigint);
|
|
141
|
+
/** Which directory it is. */
|
|
142
|
+
identity(): RootIdentity;
|
|
143
|
+
/** A path that reaches `name` in this directory. */
|
|
144
|
+
at(name: string): string;
|
|
145
|
+
/** Whether it is still the directory its logical path names: same location, same directory. */
|
|
146
|
+
stillHere(): Promise<boolean>;
|
|
147
|
+
/**
|
|
148
|
+
* Make its entries durable: this very directory, never one that replaced
|
|
149
|
+
* it at its path. Throws if it can't; a filesystem that can't sync
|
|
150
|
+
* directories (or Windows, where a directory can't be opened for it) is
|
|
151
|
+
* not a failure.
|
|
152
|
+
*/
|
|
153
|
+
sync(): Promise<void>;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The mount root as it is now: its identity if it is available (a directory,
|
|
157
|
+
* the one the pass was given, and the one disk last agreed under), else why not.
|
|
158
|
+
*/
|
|
159
|
+
export declare function locateRoot(view: MountView, rootReal: string): Promise<{
|
|
160
|
+
identity: RootIdentity;
|
|
161
|
+
} | {
|
|
162
|
+
reason: string;
|
|
163
|
+
}>;
|
|
164
|
+
/** The mount root as locateRoot finds it, checked, so a caller can ask later whether it's still there. */
|
|
165
|
+
export declare function checkRoot(view: MountView, rootReal: string): Promise<{
|
|
166
|
+
dir: CheckedDir;
|
|
167
|
+
} | {
|
|
168
|
+
reason: string;
|
|
169
|
+
}>;
|
|
170
|
+
/**
|
|
171
|
+
* Check the directory at a mount-relative path. With `create`, missing
|
|
172
|
+
* directories are made one at a time beneath the deepest one that exists;
|
|
173
|
+
* the mount root itself is never created (a missing root is an unavailable
|
|
174
|
+
* mount). Without it, a missing directory is `absent` only where that can be
|
|
175
|
+
* proven (confirmAbsent).
|
|
176
|
+
*/
|
|
177
|
+
export declare function checkDir(view: MountView, rootReal: string, rel: string, opts?: {
|
|
178
|
+
create?: boolean;
|
|
179
|
+
}): Promise<DirCheck>;
|
|
180
|
+
/**
|
|
181
|
+
* Prove that nothing exists at a mount-relative path (`entry`), or that no
|
|
182
|
+
* directory does, so nothing can exist beneath it (`beneath`). Walking down
|
|
183
|
+
* from the root through checked directories: some directory lacks the next
|
|
184
|
+
* component; or a component is a non-directory, still the same one, beneath
|
|
185
|
+
* which nothing can exist. Either proves it only while every directory the
|
|
186
|
+
* walk went through, the root included, is still the one its path names
|
|
187
|
+
* afterwards: a root or parent replaced during the walk would otherwise lend
|
|
188
|
+
* its replacement's absence to the original's path. Symlinked directories
|
|
189
|
+
* inside the mount are followed as parents; any other symlink proves
|
|
190
|
+
* nothing. Returns the directory whose entries prove it, or why absence
|
|
191
|
+
* couldn't be shown.
|
|
192
|
+
*/
|
|
193
|
+
export declare function confirmAbsent(view: MountView, rootReal: string, rel: string, target?: 'entry' | 'beneath'): Promise<{
|
|
194
|
+
by: string;
|
|
195
|
+
} | string>;
|
|
196
|
+
/** Same file, same bytes, as far as stat can tell. */
|
|
197
|
+
export declare function sameFingerprint(a: StatFingerprint, b: StatFingerprint): boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Whether a recorded fingerprint vouches that the current file still holds
|
|
200
|
+
* the bytes hashed with it: the filesystem maintains ctime (so no user-space
|
|
201
|
+
* tool can restore the old stamps after a write), every field matches, and
|
|
202
|
+
* the file's timestamps were already more than the racy window old when it
|
|
203
|
+
* was hashed (a write in the same timestamp tick can't hide behind them).
|
|
204
|
+
* Device and inode are part of it, so a stat that reached another file — a
|
|
205
|
+
* path whose parent was swapped, say — can never vouch for P's bytes.
|
|
206
|
+
*/
|
|
207
|
+
export declare function fingerprintVouches(recorded: Fingerprint | undefined, current: StatFingerprint, trusted: boolean): boolean;
|
|
208
|
+
/** Whether a statfs f_type is one of those filesystems. */
|
|
209
|
+
export declare function fsTypeTrustsCtime(type: number | bigint): boolean;
|
|
210
|
+
export declare function filesystemTrustsCtime(root: string): Promise<boolean>;
|
|
211
|
+
/**
|
|
212
|
+
* Observe a mount-relative path without reading it. A `file` here is only a
|
|
213
|
+
* stat — anything decided on its bytes is read through a located descriptor,
|
|
214
|
+
* or vouched for by a fingerprint of the very inode P was recorded from — so
|
|
215
|
+
* only `absent` needs proof beyond the path lookup, and gets it.
|
|
216
|
+
*/
|
|
217
|
+
export declare function observePath(view: MountView, rootReal: string, relativePath: string): Promise<Observation>;
|
|
218
|
+
/**
|
|
219
|
+
* Read and hash a mount-relative file through one located descriptor. The
|
|
220
|
+
* whole file is returned when it is at most `limit` bytes; larger files are
|
|
221
|
+
* hashed in chunks and only their head is kept.
|
|
222
|
+
*/
|
|
223
|
+
export declare function readPath(view: MountView, rootReal: string, relativePath: string, limit: number): Promise<ReadResult | Exclude<Observation, {
|
|
224
|
+
kind: 'file';
|
|
225
|
+
}>>;
|
|
226
|
+
/**
|
|
227
|
+
* The first bytes of a mount-relative file and its size, through the same
|
|
228
|
+
* located descriptor as readPath — for listing a file nothing tracks, which
|
|
229
|
+
* needs a MIME type, not a hash.
|
|
230
|
+
*/
|
|
231
|
+
export declare function readHead(view: MountView, rootReal: string, relativePath: string): Promise<HeadResult | Exclude<Observation, {
|
|
232
|
+
kind: 'file';
|
|
233
|
+
}>>;
|
|
234
|
+
/** Null bytes in the first 8 KB: the store holds text only from disk. */
|
|
235
|
+
export declare function looksBinary(head: Buffer): boolean;
|
|
236
|
+
/** Image MIME type from magic bytes, for listing disk-only files. */
|
|
237
|
+
export declare function sniffImageMime(head: Buffer): string | undefined;
|
|
238
|
+
export interface Walk {
|
|
239
|
+
/** Regular files seen. */
|
|
240
|
+
files: Set<string>;
|
|
241
|
+
/** Directories seen. */
|
|
242
|
+
dirs: Set<string>;
|
|
243
|
+
/** Names seen that are neither (symlinks, sockets…), or ignored: present, unproven. */
|
|
244
|
+
others: Map<string, string>;
|
|
245
|
+
/** Directories listed completely. */
|
|
246
|
+
complete: Set<string>;
|
|
247
|
+
/** Directories that don't exist (everything beneath them is absent). */
|
|
248
|
+
missing: Set<string>;
|
|
249
|
+
/**
|
|
250
|
+
* Where the walk didn't reach, and why. `error` and `cap` regions may hide
|
|
251
|
+
* files the listing would show; `ignored` and `symlink` ones matter only
|
|
252
|
+
* where tracked entries lie beneath them.
|
|
253
|
+
*/
|
|
254
|
+
incomplete: Array<{
|
|
255
|
+
path: string;
|
|
256
|
+
reason: string;
|
|
257
|
+
kind: 'error' | 'cap' | 'ignored' | 'symlink';
|
|
258
|
+
}>;
|
|
259
|
+
}
|
|
260
|
+
/** Simple ignore patterns, as the watcher and the old walk read them. */
|
|
261
|
+
export declare function isIgnored(relativePath: string, name: string, patterns: string[]): boolean;
|
|
262
|
+
/**
|
|
263
|
+
* List a directory scope ('' for the mount root), descending when recursive,
|
|
264
|
+
* up to `cap` files in total. A scope that resolves outside the mount is not
|
|
265
|
+
* listed at all; beneath it, the walk only descends real directories, never
|
|
266
|
+
* symlinks. Each directory's listing counts only if, once listed, it is still
|
|
267
|
+
* the directory at its path: a directory moved or replaced meanwhile is an
|
|
268
|
+
* incomplete region, contributing no names and proving nothing absent.
|
|
269
|
+
*/
|
|
270
|
+
export declare function walkScope(view: MountView, rootReal: string, scope: string, recursive: boolean, cap: number): Promise<Walk>;
|
|
271
|
+
/**
|
|
272
|
+
* Whether the walk proves nothing exists at `path`: some ancestor directory
|
|
273
|
+
* is missing, or a completely listed ancestor holds no entry that could lead
|
|
274
|
+
* to it. Ancestors outside the walked scope are passed through, so a walk of
|
|
275
|
+
* `a/b` decides paths beneath `a/b` and nothing else.
|
|
276
|
+
*/
|
|
277
|
+
export declare function provenAbsent(walk: Walk, path: string): boolean;
|
|
278
|
+
//# sourceMappingURL=observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../../../src/modules/workspace/observe.ts"],"names":[],"mappings":"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"}
|