forkit-ai-footprints 0.2.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.
Files changed (150) hide show
  1. package/LICENSE +21 -0
  2. package/PRIVACY.md +150 -0
  3. package/README.md +313 -0
  4. package/STATUS.md +136 -0
  5. package/dist/agents.d.ts +22 -0
  6. package/dist/agents.js +281 -0
  7. package/dist/aggregate.d.ts +28 -0
  8. package/dist/aggregate.js +151 -0
  9. package/dist/assets/forkit-icon-dark.png +0 -0
  10. package/dist/assets/forkit-icon-light.png +0 -0
  11. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Info.plist +5 -0
  12. package/dist/bootstrap/Forkit AI Footprint.app/Contents/MacOS/Forkit AI Footprint +0 -0
  13. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/ForkitAIFootprint.icns +0 -0
  14. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/ForkitStatusTemplate.png +0 -0
  15. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/agents.d.ts +22 -0
  16. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/agents.js +281 -0
  17. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/aggregate.d.ts +28 -0
  18. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/aggregate.js +151 -0
  19. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/assets/forkit-icon-dark.png +0 -0
  20. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/assets/forkit-icon-light.png +0 -0
  21. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/census.d.ts +3 -0
  22. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/census.js +196 -0
  23. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/cli.d.ts +32 -0
  24. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/cli.js +404 -0
  25. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/doctor.d.ts +14 -0
  26. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/doctor.js +71 -0
  27. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/endpoints.d.ts +8 -0
  28. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/endpoints.js +45 -0
  29. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/evaluate.d.ts +44 -0
  30. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/evaluate.js +102 -0
  31. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/filesystem.d.ts +11 -0
  32. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/filesystem.js +226 -0
  33. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/format.d.ts +7 -0
  34. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/format.js +78 -0
  35. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/hash.d.ts +4 -0
  36. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/hash.js +16 -0
  37. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/index.d.ts +22 -0
  38. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/index.js +58 -0
  39. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/insights.d.ts +13 -0
  40. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/insights.js +76 -0
  41. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/local-device.d.ts +19 -0
  42. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/local-device.js +81 -0
  43. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/locales.json +272 -0
  44. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/localization.d.ts +277 -0
  45. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/localization.js +55 -0
  46. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/mcp.d.ts +9 -0
  47. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/mcp.js +93 -0
  48. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/monitor.d.ts +99 -0
  49. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/monitor.js +285 -0
  50. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/base.d.ts +34 -0
  51. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/base.js +88 -0
  52. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/index.d.ts +6 -0
  53. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/index.js +24 -0
  54. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/lmstudio.d.ts +9 -0
  55. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/lmstudio.js +71 -0
  56. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/ollama.d.ts +12 -0
  57. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/ollama.js +171 -0
  58. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/openai-compatible.d.ts +10 -0
  59. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/openai-compatible.js +68 -0
  60. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/resource-evidence.d.ts +17 -0
  61. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/resource-evidence.js +52 -0
  62. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-activity.d.ts +5 -0
  63. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-activity.js +66 -0
  64. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-identity.d.ts +7 -0
  65. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-identity.js +66 -0
  66. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/server.d.ts +21 -0
  67. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/server.js +308 -0
  68. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/share-page.d.ts +75 -0
  69. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/share-page.js +167 -0
  70. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/sharing.d.ts +35 -0
  71. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/sharing.js +67 -0
  72. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/tools.d.ts +9 -0
  73. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/tools.js +106 -0
  74. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/types.d.ts +166 -0
  75. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/types.js +3 -0
  76. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/version.d.ts +4 -0
  77. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/version.js +13 -0
  78. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/index.d.ts +76 -0
  79. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/index.js +366 -0
  80. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/license +9 -0
  81. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/package.json +44 -0
  82. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/readme.md +56 -0
  83. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/vendor/fastlist-0.3.0-x64.exe +0 -0
  84. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/vendor/fastlist-0.3.0-x86.exe +0 -0
  85. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/package.json +6 -0
  86. package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/runtime/node +0 -0
  87. package/dist/bootstrap/Forkit AI Footprint.app/Contents/_CodeSignature/CodeResources +931 -0
  88. package/dist/census.d.ts +3 -0
  89. package/dist/census.js +196 -0
  90. package/dist/cli.d.ts +32 -0
  91. package/dist/cli.js +404 -0
  92. package/dist/doctor.d.ts +14 -0
  93. package/dist/doctor.js +71 -0
  94. package/dist/endpoints.d.ts +8 -0
  95. package/dist/endpoints.js +45 -0
  96. package/dist/evaluate.d.ts +44 -0
  97. package/dist/evaluate.js +102 -0
  98. package/dist/filesystem.d.ts +11 -0
  99. package/dist/filesystem.js +226 -0
  100. package/dist/format.d.ts +7 -0
  101. package/dist/format.js +78 -0
  102. package/dist/hash.d.ts +4 -0
  103. package/dist/hash.js +16 -0
  104. package/dist/index.d.ts +22 -0
  105. package/dist/index.js +58 -0
  106. package/dist/insights.d.ts +13 -0
  107. package/dist/insights.js +76 -0
  108. package/dist/local-device.d.ts +19 -0
  109. package/dist/local-device.js +81 -0
  110. package/dist/locales.json +272 -0
  111. package/dist/localization.d.ts +277 -0
  112. package/dist/localization.js +55 -0
  113. package/dist/mcp.d.ts +9 -0
  114. package/dist/mcp.js +93 -0
  115. package/dist/monitor.d.ts +99 -0
  116. package/dist/monitor.js +285 -0
  117. package/dist/providers/base.d.ts +34 -0
  118. package/dist/providers/base.js +88 -0
  119. package/dist/providers/index.d.ts +6 -0
  120. package/dist/providers/index.js +24 -0
  121. package/dist/providers/lmstudio.d.ts +9 -0
  122. package/dist/providers/lmstudio.js +71 -0
  123. package/dist/providers/ollama.d.ts +12 -0
  124. package/dist/providers/ollama.js +171 -0
  125. package/dist/providers/openai-compatible.d.ts +10 -0
  126. package/dist/providers/openai-compatible.js +68 -0
  127. package/dist/resource-evidence.d.ts +17 -0
  128. package/dist/resource-evidence.js +52 -0
  129. package/dist/runtime-activity.d.ts +5 -0
  130. package/dist/runtime-activity.js +66 -0
  131. package/dist/runtime-identity.d.ts +7 -0
  132. package/dist/runtime-identity.js +66 -0
  133. package/dist/server.d.ts +21 -0
  134. package/dist/server.js +308 -0
  135. package/dist/share-page.d.ts +75 -0
  136. package/dist/share-page.js +167 -0
  137. package/dist/sharing.d.ts +35 -0
  138. package/dist/sharing.js +67 -0
  139. package/dist/tools.d.ts +9 -0
  140. package/dist/tools.js +106 -0
  141. package/dist/types.d.ts +166 -0
  142. package/dist/types.js +3 -0
  143. package/dist/version.d.ts +4 -0
  144. package/dist/version.js +13 -0
  145. package/docs/GLOBAL_DISTRIBUTION.md +79 -0
  146. package/docs/MACOS_ACCURACY_GATE.md +140 -0
  147. package/docs/MACOS_TESTER_GUIDE.md +88 -0
  148. package/examples/macos-truth.template.json +10 -0
  149. package/package.json +75 -0
  150. package/release/channels.json +41 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Forkit Dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/PRIVACY.md ADDED
@@ -0,0 +1,150 @@
1
+ # Privacy Boundary
2
+
3
+ Forkit AI Footprints (`forkit-ai-footprints`) is metadata-only by design.
4
+
5
+ ## Allowed local reads
6
+
7
+ - local operating-system and Node version metadata;
8
+ - the macOS Computer Name for display and storage only in the private local
9
+ device journal;
10
+ - process name and command metadata held only long enough to classify explicit
11
+ executable, module, or package-runner evidence; raw commands are not included
12
+ in the report or in the evidence hash;
13
+ - cumulative CPU time, current CPU percentage, and resident memory for supported
14
+ process trees, held locally for repeated activity classification; raw process
15
+ entries are never exported;
16
+ - directory entries and file metadata for supported model extensions;
17
+ - loopback runtime API responses from explicitly supported local endpoints.
18
+ - known AI-tool installation/configuration path existence;
19
+ - local runtime, model, AI-app, and AI-tool display names in the interactive
20
+ loopback UI; an explicitly created local share image may include only the
21
+ supported active tool product name, while model names and all item names are
22
+ excluded from saved HTML and anonymous/global payloads;
23
+ - optional chat/workspace labels supplied explicitly by a cooperating app for
24
+ local display only; absent cooperation, the fields remain empty;
25
+ - macOS major version, CPU architecture, and Node major in aggregate field-test
26
+ results;
27
+ - aggregate counts, exact recognized model-file bytes, architecture, Node major, product version,
28
+ and scan date in an explicitly saved local HTML share page;
29
+ - up to 1 MiB from a known MCP JSON/TOML configuration file solely to count
30
+ server entries.
31
+
32
+ ## Prohibited collection or export
33
+
34
+ Census must not retain or emit:
35
+
36
+ - raw process commands;
37
+ - process IDs;
38
+ - model weights or file contents;
39
+ - full filesystem paths;
40
+ - prompts, responses, terminal logs, or source-code content;
41
+ - credentials, cookies, tokens, API keys, or passwords;
42
+ - hostname or Mac display name in Census reports, saved share pages, anonymous
43
+ contributions, or global payloads; username, email, and Forkit.dev account
44
+ identity are prohibited everywhere.
45
+ - MCP server names, commands, URLs, environment keys, or environment values;
46
+ - chat, workspace, or repository names in reports, saved/shareable artifacts,
47
+ contribution previews, or global payloads.
48
+
49
+ ## Network boundary
50
+
51
+ Census may call HTTP(S) endpoints only when the hostname is one of:
52
+
53
+ - `localhost`
54
+ - `127.0.0.1`
55
+ - `::1`
56
+
57
+ Remote endpoints and endpoints containing embedded credentials are rejected.
58
+ Census contains no Forkit.dev login, registry-write, passport-publish,
59
+ Runtime_C2-write, billing, telemetry-upload, or deployment client.
60
+
61
+ `forkit-ai-footprints serve` binds only to `127.0.0.1`. Its rescan route
62
+ requires the same page origin and a random in-memory session token. The route
63
+ may return local runtime, model, AI-app, and AI-tool display names to that
64
+ protected local page. It never returns full paths, raw commands, endpoints,
65
+ configuration values, prompts, chat titles, workspace names, or account data.
66
+ The numeric guess is compared inside the browser and is not submitted to the
67
+ local server. Start, Stop, Clear history, Scan again, and contribution preview
68
+ all require the same-origin random session token. Closing a browser or native
69
+ window does not stop monitoring; native Quit stops the monitor and local service.
70
+
71
+ The interactive app keeps `device-journal.json` under the user's macOS
72
+ Application Support directory with directory mode `0700` and file mode `0600`.
73
+ It contains only the sanitized Mac display name, first/last scan timestamps, and
74
+ scan count. It is never placed in the Census report, rescan snapshot, share
75
+ image, saved share page, or anonymous/global contribution. The local monitor
76
+ stream is same-origin and session-token protected. Sampling runs at a one-second
77
+ target interval; durations exclude stopped time and gaps longer than three
78
+ intervals. The stream makes no external request.
79
+
80
+ The packaged app uses a native launcher to query Apple DeviceCheck capability.
81
+ The status check makes no network request and writes no key. On a future
82
+ supported, signed macOS 27+ build, a separate explicit enrollment action may
83
+ generate one App Attest key and store only its opaque key identifier in the
84
+ device-only Keychain. The current UI and CLI do not invoke enrollment,
85
+ attestation, assertion generation, or upload.
86
+
87
+ ## Filesystem identity
88
+
89
+ Filesystem model identity is derived from metadata such as relative location,
90
+ name, size, and modification time. The absolute path participates only inside a
91
+ local one-way root fingerprint helper and is not included in a Census Report.
92
+ Model bytes are never read for hashing.
93
+
94
+ ## Model storage measurement
95
+
96
+ Storage is the exact logical byte total (`stat.size`) of recognized model files
97
+ inside the supported or explicitly selected roots when the scan reports
98
+ `storage_complete=true`. Device/inode identity prevents the same file from being
99
+ counted twice through hard links, symlinks, or overlapping roots. Provider API
100
+ size fields are excluded from the total to avoid double-counting the same model.
101
+ This is not APFS physical allocation: clones, compression, filesystem metadata,
102
+ and unsupported model locations can make actual disk blocks differ.
103
+
104
+ ## Resource evidence
105
+
106
+ **Working now** requires sustained cumulative CPU-time deltas across repeated
107
+ samples of a supported process tree. Two positive samples enter working and
108
+ three negative samples exit it. Process presence alone remains **Open / idle**.
109
+ This is still not exclusive per-prompt proof. Forkit's own process tree is
110
+ excluded from AI activity and measured separately for CPU, RAM, and bounded
111
+ history overhead. Static hardware metadata describes capability, not use. GPU
112
+ and per-process network attribution remain unavailable; no estimate is used.
113
+
114
+ ## Review rule
115
+
116
+ Runtime, model, and agent findings are inventory suggestions. They must not be
117
+ used as automatic evidence of ownership, safety, provenance, or passport status.
118
+
119
+ ## Anonymous contribution boundary
120
+
121
+ The local app can create an allowlisted schema `2.0` preview only after at least
122
+ 600 valid observed seconds. Preview and consent are separate actions. It
123
+ contains valid seconds, AI-active seconds, activity ratio, supported app count
124
+ and categories, model/loaded/runtime counts, recognized model-file bytes,
125
+ macOS major, architecture, and scanner/runtime schema versions. It excludes
126
+ names, process counts, CPU/RAM values, guess, device identity, local Census ID,
127
+ timestamps, and all item-level records. The CLI and app still have no uploader. A
128
+ separate Forkit.dev aggregate endpoint candidate exists with contribution writes
129
+ disabled by default. That candidate now fails closed without Apple App Attest
130
+ verification and excludes quarantined or revoked installations from the public
131
+ pulse. The CLI still contains no proof enrollment or upload transport. Enabling
132
+ either remains a founder/security release gate.
133
+
134
+ ## Local share page
135
+
136
+ `forkit-ai-footprints share-page --output ...` saves a self-contained HTML result only
137
+ after the user supplies an output path. The page contains aggregate counts and
138
+ limitations, not item names, paths, commands, endpoints, configuration values,
139
+ account identity, or the local Census ID. It loads no external assets and makes
140
+ no automatic network requests. Its copy/share controls act only after a user
141
+ click and use aggregate text.
142
+
143
+ The interactive `serve` page can also render a 1080×1080 discovery card locally
144
+ with browser Canvas. It includes model-record count, recognized storage,
145
+ activity ratio, and the supported active tool product name. Its result line is
146
+ derived only from measured local insights. The image has no model names, paths,
147
+ process counts, device/account identifiers, workspace/chat titles, or external
148
+ assets.
149
+ Downloading it or opening the operating system share sheet requires a separate
150
+ user click; AI Footprints does not receive the image.
package/README.md ADDED
@@ -0,0 +1,313 @@
1
+ # Forkit AI Footprints
2
+
3
+ Forkit AI Footprints is a private, metadata-only view of the models, runtimes,
4
+ and AI agents present on a Mac. The prepared package and command are
5
+ `forkit-ai-footprints`; `forkit-census` remains a temporary binary alias.
6
+
7
+ It is derived from the discovery lessons in Forkit Connect, but it has a
8
+ different safety boundary: AI Footprints does not authenticate to Forkit.dev and has
9
+ no passport, Mint, registry-write, Runtime_C2-write, or production deployment
10
+ path.
11
+
12
+ Product status: `current` for the approved Apple Silicon macOS release
13
+
14
+ Current support target: **macOS only**. The real-device validation so far is on
15
+ Apple Silicon. Ubuntu, Windows, Android, and Intel Mac are not part of the
16
+ current release claim.
17
+
18
+ ## Install on macOS
19
+
20
+ The free global installation command is:
21
+
22
+ ```bash
23
+ npx --yes forkit-ai-footprints@latest
24
+ ```
25
+
26
+ Mac users who already have Node can run it directly. Homebrew users can first
27
+ run `brew install node`; users with neither can use the official Node LTS
28
+ installer and verify `node`, `npm`, and `npx`. A Forkit-specific Homebrew formula
29
+ and direct download are deliberately not advertised because those channels do
30
+ not exist. The website presents the command only when the exact tested package
31
+ and release metadata agree. See
32
+ [`docs/GLOBAL_DISTRIBUTION.md`](./docs/GLOBAL_DISTRIBUTION.md).
33
+
34
+ The future click installer remains blocked until it can be Developer ID-signed
35
+ and Apple-notarized. Developers can build the local candidate with:
36
+
37
+ ```bash
38
+ npm ci
39
+ npm run preflight:macos:release
40
+ npm run build:macos:installer
41
+ ```
42
+
43
+ The current output is an unsigned local validation artifact because no valid
44
+ Developer ID Application or Installer identity is available on this Mac. It
45
+ must not be distributed until signing, notarization, stapling, Gatekeeper
46
+ verification, and clean-Mac installation tests pass.
47
+
48
+ ### Developer fallback
49
+
50
+ Requirements:
51
+
52
+ - macOS;
53
+ - Node.js 20, 22, or 24
54
+ - npm
55
+
56
+ ```bash
57
+ git clone https://github.com/arpitasarker01/forkit-census.git
58
+ cd forkit-census
59
+ npm ci
60
+ npm pack
61
+ npm install -g ./forkit-ai-footprints-0.2.0.tgz
62
+ forkit-ai-footprints serve
63
+ ```
64
+
65
+ The equivalent persistent global CLI installation is:
66
+
67
+ ```bash
68
+ npm install -g forkit-ai-footprints
69
+ forkit-ai-footprints serve
70
+ ```
71
+
72
+ npm is the approved public bootstrap channel for this release. Homebrew remains
73
+ a future optional channel.
74
+
75
+ ## Commands
76
+
77
+ Run a local scan, verify the installation, or score one manually labelled Mac:
78
+
79
+ ```bash
80
+ forkit-ai-footprints serve
81
+ forkit-ai-footprints monitor
82
+ forkit-ai-footprints scan
83
+ forkit-ai-footprints doctor
84
+ forkit-ai-footprints evaluate --truth /absolute/path/to/local-truth.json
85
+ forkit-ai-footprints aggregate --results /absolute/path/to/evaluation-results
86
+ forkit-ai-footprints share-page --output /absolute/path/to/local-ai-footprint.html
87
+ ```
88
+
89
+ `evaluate` always runs locally and emits aggregate counts and metrics only. It
90
+ does not upload the truth file or include its item names in the output.
91
+
92
+ Create the truth file only after manually checking that Mac. Empty arrays are
93
+ valid when a surface is not installed or running:
94
+
95
+ ```json
96
+ {
97
+ "schema_version": "1.0",
98
+ "expected": {
99
+ "agent_signatures": ["codex"],
100
+ "tool_names": ["Codex"],
101
+ "online_runtime_names": ["ollama"],
102
+ "model_keys": ["ollama:example-model:latest"],
103
+ "mcp_clients": ["Codex"]
104
+ }
105
+ }
106
+ ```
107
+
108
+ Keep truth files local; model names and installed-tool labels may be private.
109
+ The evaluation result adds only macOS major version, CPU architecture, Node
110
+ major, and aggregate counts. A coordinator can combine explicitly shared result
111
+ files with `aggregate`; this remains local and always keeps automatic accuracy
112
+ claims disabled. See [`docs/MACOS_TESTER_GUIDE.md`](./docs/MACOS_TESTER_GUIDE.md).
113
+
114
+ `share-page` performs the same local scan and writes a self-contained,
115
+ aggregate-only HTML snapshot. It loads no external assets and contains no model
116
+ names, paths, commands, endpoints, configuration values, account identity, or
117
+ Census ID. Its copy/share controls include only the visible aggregate summary
118
+ and run only after a user click.
119
+
120
+ `serve` binds only to `127.0.0.1`, keeps the report and monitor in memory, and
121
+ opens the AI activity → Guess → Reveal → Share experience. `Scan again` calls a random-token-protected local
122
+ endpoint. The protected local page can name detected runtimes, models, AI apps,
123
+ and tools. The explicitly created local share image may include the supported
124
+ active tool product name; saved HTML and anonymous/global payloads remain
125
+ aggregate-only.
126
+ The guess remains in the browser page and is never sent to the local server or
127
+ Forkit.dev. Start/Stop controls monitoring explicitly; browser/window closure
128
+ does not stop it, while native Quit stops the monitor and loopback service.
129
+
130
+ The local app also keeps an owner-only device journal containing the sanitized
131
+ Mac display name, first/last scan timestamps, and scan count. This lets the Mac
132
+ resume its local state without placing the device name in a report, saved share
133
+ page, image, anonymous preview, or website payload. The single result view uses
134
+ a token-protected local stream with a one-second target interval. Repeated
135
+ cumulative CPU-time deltas and hysteresis distinguish Working now from Open /
136
+ idle; process presence alone is never activity. It is near-real-time, not zero delay.
137
+
138
+ The revealed resource view reports deduplicated recognized logical model-file
139
+ bytes and provider-native loaded-model evidence. The activity view uses private
140
+ process-tree CPU-time deltas and separately displays Forkit's measured CPU,
141
+ resident memory, and bounded-history overhead. None is an energy, token, cost,
142
+ or lifetime-usage measurement.
143
+
144
+ AI Footprints does not claim prompt or task ownership. **Working now** means
145
+ sustained recent work inside a supported process tree, which may be foreground
146
+ or background. The result does not measure GPU, energy, tokens, cost, disk I/O,
147
+ or per-process network usage.
148
+
149
+ After revealing the result, `Create share card` renders a 1200×630 PNG entirely
150
+ in the browser. Its result-based line and cards use measured local insights,
151
+ model-record count, recognized model storage, activity ratio, and the supported
152
+ active tool product name. It can be downloaded or passed to the operating
153
+ system share sheet after an explicit click; no model names, chat/workspace
154
+ context, paths, device identity, or scan records are placed in the image or
155
+ uploaded by AI Footprints.
156
+
157
+ ```bash
158
+ forkit-ai-footprints serve
159
+ forkit-ai-footprints scan
160
+ forkit-ai-footprints scan --json
161
+ forkit-ai-footprints scan --verbose --guess 5
162
+ forkit-ai-footprints scan --copy
163
+ forkit-ai-footprints report --json --output footprint.json
164
+ forkit-ai-footprints scan --model-dir /path/you/selected
165
+ forkit-ai-footprints doctor
166
+ forkit-ai-footprints --version
167
+ ```
168
+
169
+ One `scan` includes runtime APIs, filesystem model metadata, and agent process
170
+ metadata by default. Individual surfaces can be disabled:
171
+
172
+ ```bash
173
+ forkit-ai-footprints scan --no-runtimes
174
+ forkit-ai-footprints scan --no-model-files
175
+ forkit-ai-footprints scan --no-agents
176
+ forkit-ai-footprints scan --no-tools
177
+ forkit-ai-footprints scan --no-mcp
178
+ ```
179
+
180
+ CLI flags cannot bypass the required monitoring session. The local UI enables
181
+ an exact schema `2.0` aggregate preview only after 600 valid observed seconds;
182
+ preview and consent remain separate, and no upload transport exists. The
183
+ payload excludes app/model names, process counts, CPU/RAM, chat, workspace,
184
+ repository, device, guess, Census, and account identifiers.
185
+
186
+ ## Shared core API
187
+
188
+ Forkit Connect should delegate to the package's public, read-only core rather
189
+ than copy its detector implementation:
190
+
191
+ ```js
192
+ const { runCensus } = require('forkit-ai-footprints');
193
+
194
+ const report = await runCensus();
195
+ ```
196
+
197
+ The package root also exports the individual metadata detectors, formatters,
198
+ provider adapters, endpoint validation, anonymous-preview builder, and TypeScript
199
+ types. A fresh-install smoke test imports the package root and verifies that an
200
+ all-disabled core scan makes zero external requests and writes no local state.
201
+
202
+ ## What AI Footprints reports
203
+
204
+ - availability of supported loopback runtime APIs;
205
+ - model names and provider identities;
206
+ - models confirmed loaded by Ollama's read-only `/api/ps` response;
207
+ - Ollama content digests when exposed by the runtime;
208
+ - metadata-only fingerprints for supported local model files;
209
+ - known AI agent products with process-instance counts;
210
+ - passively configured or active Claude Code, Codex, Cursor, Windsurf, Gemini
211
+ CLI, GitHub Copilot, OpenCode, and OpenClaw surfaces;
212
+ - aggregate server counts from known MCP client configuration files;
213
+ - exact recognized logical model-file bytes when supported-root coverage is
214
+ complete, plus explicit completeness evidence and optional guess comparison;
215
+ - confidence labels and review warnings;
216
+ - platform, architecture, and Node major version.
217
+
218
+ ## What AI Footprints does not collect
219
+
220
+ - model weights or file contents;
221
+ - prompts or responses;
222
+ - raw process commands;
223
+ - full model paths in reports;
224
+ - credentials, tokens, API keys, or passwords;
225
+ - device name or hostname in reports, saved/shareable artifacts, anonymous
226
+ previews, or website payloads; username, email address, and account identity
227
+ are never collected.
228
+
229
+ AI Footprints only connects to loopback HTTP(S) endpoints. Remote hosts and URLs with
230
+ embedded credentials are rejected.
231
+
232
+ Known MCP configuration files are read only to count configured server entries.
233
+ Server names, commands, URLs, environment variables, and values are neither
234
+ retained nor emitted.
235
+
236
+ See [`PRIVACY.md`](./PRIVACY.md), [`STATUS.md`](./STATUS.md), and
237
+ [`docs/PRODUCT_BOUNDARY.md`](./docs/PRODUCT_BOUNDARY.md).
238
+
239
+ ## Model identity
240
+
241
+ | Source | Identity | Confidence |
242
+ |---|---|---|
243
+ | Ollama weights/manifest SHA-256 | Content-addressed SHA-256 | High |
244
+ | LM Studio/OpenAI-compatible API | Hashed provider/model identity | Medium |
245
+ | Filesystem model metadata | Hashed name, relative location, size, and modification time | Low |
246
+
247
+ A filesystem identity is not a content checksum. AI Footprints says so in every report
248
+ that includes filesystem-discovered models.
249
+
250
+ ## Agent identity
251
+
252
+ Agent matching uses exact executable names, explicit `python -m` module
253
+ invocations, or explicit package-runner invocations such as `npx`. Product words
254
+ appearing in unrelated arguments or paths are rejected. Multiple processes with
255
+ the same product signature are aggregated into one agent product with an
256
+ `instance_count`; this is a process count, not a count of independent autonomous
257
+ agents or user sessions.
258
+
259
+ The checked-in curated conformance corpus covers all supported agent signatures
260
+ and difficult negative names on macOS, Linux, and Windows-style process
261
+ metadata. Run it with `npm run benchmark:agents`. Its result shows whether the
262
+ detector conforms to those labeled fixtures; it is not a representative sample
263
+ of real devices, so it must not be presented as field accuracy.
264
+
265
+ ## Validation
266
+
267
+ ```bash
268
+ npm ci
269
+ npm test
270
+ npm run benchmark:agents
271
+ npm run validate:macos
272
+ npm run smoke:package
273
+ npm run preflight:macos:release
274
+ ```
275
+
276
+ The active GitHub Actions matrix covers Node 20, 22, and 24 on macOS, plus an
277
+ isolated installed-package smoke on macOS. `npm test` includes the conservative
278
+ agent conformance benchmark. See
279
+ [`benchmarks/README.md`](./benchmarks/README.md) for the benchmark method and
280
+ limitations.
281
+
282
+ `npm run validate:macos` performs two real-device scans, verifies stable item
283
+ sets, rejects non-loopback requests, checks the report privacy contract, and
284
+ fails if prohibited process/path keys appear. One machine is a release sanity
285
+ check, not a field-accuracy sample.
286
+
287
+ The multi-device protocol, local truth-file format, and quantitative public
288
+ release thresholds are defined in
289
+ [`docs/MACOS_ACCURACY_GATE.md`](./docs/MACOS_ACCURACY_GATE.md).
290
+
291
+ Storage, runtime-freshness, resource-attribution, and Developer ID truth
292
+ boundaries are defined in
293
+ [`docs/MACOS_MEASUREMENT_FOUNDATION.md`](./docs/MACOS_MEASUREMENT_FOUNDATION.md).
294
+
295
+ ## Accuracy boundary
296
+
297
+ AI Footprints has no defensible global accuracy percentage yet. Runtime API evidence is
298
+ strongest; filesystem findings are explicitly best-effort; tool and MCP coverage
299
+ is limited to documented locations; and the agent benchmark is curated rather
300
+ than independently sampled. Do not market a benchmark pass as field precision
301
+ or recall. Global release requires a separately labelled, consented multi-device
302
+ macOS evaluation.
303
+
304
+ ## Relationship to Forkit Connect
305
+
306
+ - Forkit AI Footprints: canonical read-only inventory core and report generation.
307
+ - Forkit Connect: supporting bridge for governed Model and Agent Passport flows.
308
+ - Forkit.dev website/registry: authoritative review and explicit final Mint.
309
+
310
+ AI Footprints is not a replacement production release for Connect. The intended
311
+ integration is for `forkit-connect census` to delegate to this package's public
312
+ core, avoiding two scanner implementations. Promotion requires an intentional
313
+ update to the Forkit.dev production lock.
package/STATUS.md ADDED
@@ -0,0 +1,136 @@
1
+ # Forkit AI Footprints Status
2
+
3
+ Last updated: 2026-08-23
4
+
5
+ Version: `0.2.0`
6
+
7
+ Production classification: `current` for Apple Silicon macOS
8
+
9
+ Release state: founder-approved public v0.2.0 npm-first release. The npm
10
+ bootstrap installs a persistent unsigned local app; Developer ID signing and
11
+ notarization remain future work.
12
+
13
+ ## What is implemented
14
+
15
+ - One local experience: AI activity first, Guess → Reveal, an aggregate share
16
+ card, optional exact global-payload review, Scan again, and technical details.
17
+ - Explicit Start/Stop Monitoring with repeated one-second macOS process-tree
18
+ sampling, cumulative CPU-time deltas, two-sample entry and three-sample exit
19
+ hysteresis, and sleep-gap exclusion.
20
+ - Clear states: **Working now**, **Open / idle**, **Not running**, and **Stopped**.
21
+ Process presence alone never becomes working activity.
22
+ - One to three deterministic insights from valid measured time: activity share,
23
+ longest continuous active block, supported-tool workflow, mostly-idle state,
24
+ and available-but-unused local models. Stop/restart boundaries cannot inflate
25
+ the longest block.
26
+ - The monitor is owned by the local service, not a browser tab. Closing the
27
+ window does not end a session; stopping preserves the summary; clearing is a
28
+ separate explicit action.
29
+ - A persistent native AppKit/WebKit app installed into the current user's
30
+ Applications folder by a one-time npm bootstrap. Later launches use normal
31
+ macOS surfaces and do not require Terminal.
32
+ - A native AppKit/WebKit window and retained menu-bar controller with Open,
33
+ Start/Stop, and Quit actions. Closing hides the window without quitting; Quit
34
+ stops the service and has a process-exit fallback so the bundled Node service
35
+ cannot remain orphaned.
36
+ - One English/German localization source drives the app, deterministic insights,
37
+ share caption, menu-bar menu, and close/quit notices.
38
+ - Local-only optional chat/workspace display when a cooperating app explicitly
39
+ supplies those values. No inference from window titles, folders, prompts, or
40
+ commands is attempted.
41
+ - Forkit's own process tree is excluded from detected AI activity. Its CPU,
42
+ RAM, and bounded-history overhead are measured and labelled separately.
43
+ - Exact recognized logical model-file bytes for supported roots, with hard-link,
44
+ symlink, overlapping-root, Hugging Face snapshot, and Ollama content-addressed
45
+ deduplication.
46
+ - Verified Ollama availability requires the exact local listener owner, a valid
47
+ version response, and a valid tags response. Loaded state comes only from a
48
+ valid `/api/ps` response.
49
+ - A schema `2.0` candidate global aggregate based on valid observed seconds and
50
+ AI-active seconds. It excludes names, process counts, paths, commands, chat,
51
+ workspace, device identity, guess, and Census ID. Review and consent are
52
+ separate; upload transport remains disabled.
53
+ - A 1080×1080 local share card with Share, Save PNG, Copy Image, and Copy
54
+ Caption controls. It contains only measured totals and supported tool names.
55
+ - A single Forkit.dev `/ai-footprint` page with an honest benchmark-forming
56
+ state and one npm path using `npx --yes forkit-ai-footprints@latest`.
57
+ Unpublished Forkit Homebrew/download channels are not claimed.
58
+ - One release version sourced from `package.json`, release-coherence checks,
59
+ package smoke tooling, a bundled official Node runtime, official Forkit app
60
+ and menu-bar assets, and an unsigned local `.app`/`.pkg` candidate.
61
+
62
+ ## Evidence from this Apple Silicon Mac
63
+
64
+ - Models discovered: **5**.
65
+ - Models loaded: **0**.
66
+ - Recognized model storage: **2,600,071,742 bytes** (**2.60 GB / 2.42 GiB**)
67
+ across **12** deduplicated recognized files with complete supported-root
68
+ coverage.
69
+ - Verified local runtime: **Ollama 0.20.5**, owned by the exact Homebrew
70
+ `ollama` executable on `127.0.0.1:11434`.
71
+ - Ollama inventory: `llama3.2:latest`; `/api/ps` was empty. The correct state is
72
+ **engine available, no model loaded**, not AI work.
73
+ - A real **984.1-second** valid session observed Codex activity for **982.9
74
+ seconds** (ratio **0.999**) while this development task was actively running.
75
+ This is real process-tree activity evidence, not prompt/task/token ownership.
76
+ - During the measured session, Forkit overhead was **1.3% median CPU**, **3.3%
77
+ p95 CPU**, about **53.3 MB current RAM**, **117.1 MB maximum RAM**, and **627
78
+ bytes** of bounded serialized history at the final payload sample.
79
+ - A final source-identical bundled-app observation reached **63.3 seconds** of
80
+ valid time and **62.1 seconds** AI-active (ratio **0.981**), producing: “Codex
81
+ was working during 98% of your observation.”, “Your longest continuous
82
+ AI-active period was 1m 1s.”, and “5 local models are available, but none ran
83
+ during this observation.”
84
+ - A separate real session crossed the 10-minute gate at exactly **600 valid
85
+ seconds** and **598 AI-active seconds**. Only then did the local comparison
86
+ preview become available; no transport was enabled.
87
+
88
+ ## Validation completed locally
89
+
90
+ - TypeScript build and the complete local test suite.
91
+ - Curated agent detector corpus: **58/58** fixtures, 26 positive and 32 negative,
92
+ with zero fixture errors. This is conformance evidence, not field accuracy.
93
+ - Isolated packed-package installation/import/CLI smoke.
94
+ - Native Swift compilation, bundled CLI/version smoke, bundled official Node
95
+ checksum, App Attest capability probe, and unsigned `.app`/`.pkg` build.
96
+ - Real native 1120×787 window creation, visible-on-reveal menu-bar item, menu
97
+ Start, window close with continued monitoring, reopen with the same timeline,
98
+ Stop, restart, and monitoring-state Quit with zero remaining Forkit process or
99
+ loopback listener on this Mac.
100
+ - Accessibility evidence placed the retained 24×24 status item at `y=-59` while
101
+ macOS auto-hid the menu bar and at `y=3` after revealing the bar. Its help text
102
+ was “Forkit AI Footprint” and its complete localized menu was exposed.
103
+ - Real-browser QA in English and German for the local monitor, Guess → Reveal,
104
+ correct GB/GiB labels, deterministic captions, 1080×1080 PNG export, image
105
+ clipboard/share payloads, and the one-page Forkit.dev installation/global page.
106
+ - Forkit.dev production website build and registry AI Footprints route tests.
107
+
108
+ ## Intentionally not enabled or not yet field-validated
109
+
110
+ - No upload, verified global contribution, public ranking, account, registry
111
+ write, passport, Mint, Runtime_C2 write, telemetry, or production deployment.
112
+ - No Homebrew tap, signed direct download, or click installer.
113
+ - No Developer ID signature, notarization, stapling, Gatekeeper distribution
114
+ test, or clean external-Mac installation test.
115
+ - No representative multi-device macOS field-accuracy result and no Intel Mac
116
+ release claim.
117
+ - App Attest reports unsupported on this macOS 26 device, so this Mac cannot
118
+ produce a verified global contribution under the proposed proof policy.
119
+ - No prompt, task, token, energy, cost, GPU, disk-I/O, or per-process network
120
+ attribution.
121
+
122
+ ## Accuracy boundary
123
+
124
+ The detector is deliberately conservative. Exact executable/module/package
125
+ runner matches and verified runtime identities are strong implementation rules,
126
+ but one real Mac and a curated fixture corpus cannot establish a global
127
+ precision/recall percentage. Model storage is exact only for recognized files
128
+ inside supported roots when `storage_complete=true`; it is not whole-disk AI
129
+ storage or APFS physical allocation. **Working now** means sustained recent CPU
130
+ time in a supported process tree and nothing more.
131
+
132
+ ## Smallest release gate
133
+
134
+ Future expansion requires representative multi-device field accuracy, Intel Mac
135
+ validation, and Apple signing/notarization. Global contribution remains closed
136
+ until its separate server-side verification and abuse-control gate passes.
@@ -0,0 +1,22 @@
1
+ import type { CensusAgent, Confidence, ProcessEntry } from './types';
2
+ export interface ClassifiedAgentProcess {
3
+ pid: number;
4
+ ppid: number | null;
5
+ signature: string;
6
+ name: string;
7
+ kind: string;
8
+ confidence: Confidence;
9
+ relationship: 'direct' | 'descendant';
10
+ cpu_percent: number | null;
11
+ memory_percent: number | null;
12
+ cpu_time_ms: number | null;
13
+ }
14
+ /**
15
+ * Builds private process-tree evidence for the activity monitor. PIDs and raw
16
+ * commands remain internal and are deliberately absent from public reports.
17
+ */
18
+ export declare function classifyAgentProcessTrees(processes: ProcessEntry[], excludedRootPid?: number | null): ClassifiedAgentProcess[];
19
+ export declare function parseMacosCpuTime(value: string): number | null;
20
+ export declare function detectAgentProducts(processes: ProcessEntry[]): CensusAgent[];
21
+ export declare function listSystemProcesses(): Promise<ProcessEntry[]>;
22
+ //# sourceMappingURL=agents.d.ts.map