@hasna/instructions 0.6.0 → 0.7.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 (265) hide show
  1. package/README.md +149 -8
  2. package/dist/chunks/apply-7svah2qm.js +25 -0
  3. package/dist/chunks/apply-jp13sa1e.js +25 -0
  4. package/dist/chunks/database-wstmr56z.js +23 -0
  5. package/dist/chunks/index-1cnyjnd7.js +623 -0
  6. package/dist/chunks/index-35z65jsa.js +198 -0
  7. package/dist/chunks/index-3djthcm6.js +117 -0
  8. package/dist/chunks/index-4pfq42t5.js +7300 -0
  9. package/dist/chunks/index-5d7zdftc.js +186 -0
  10. package/dist/chunks/index-7m4j8a33.js +12578 -0
  11. package/dist/chunks/index-8rb7ng2y.js +148 -0
  12. package/dist/chunks/index-arrrx0ed.js +344 -0
  13. package/dist/chunks/index-bsan4c16.js +48 -0
  14. package/dist/chunks/index-bzyxvwcd.js +625 -0
  15. package/dist/chunks/index-fpeyzn3n.js +186 -0
  16. package/dist/chunks/index-fwbs6tma.js +534 -0
  17. package/dist/chunks/index-ma2xmp6c.js +14 -0
  18. package/dist/chunks/index-n3fjspr0.js +119 -0
  19. package/dist/chunks/index-nnwp92tk.js +19 -0
  20. package/dist/chunks/index-z3ma4aqk.js +532 -0
  21. package/dist/chunks/legacy-store-migration-z2m5yzyk.js +322 -0
  22. package/dist/chunks/local-5wvv5xv3.js +694 -0
  23. package/dist/chunks/local-zxa5dpf4.js +518 -0
  24. package/dist/chunks/package-manager-guard-x70xrwk2.js +391 -0
  25. package/dist/chunks/redact-hnq4sc4r.js +16 -0
  26. package/dist/chunks/s3-backup-n2z4fwyh.js +240 -0
  27. package/dist/chunks/s3-config-hhght91k.js +14 -0
  28. package/dist/chunks/s3-object-store-90tgbh6k.js +14 -0
  29. package/dist/chunks/sync-2075deve.js +34 -0
  30. package/dist/chunks/sync-r8t7zsp3.js +34 -0
  31. package/dist/chunks/template-fsfxpe4p.js +16 -0
  32. package/dist/chunks/template-wgnzdn7h.js +16 -0
  33. package/dist/cli/index.js +1681 -15643
  34. package/dist/data/config-store.d.ts +2 -1
  35. package/dist/data/config-store.d.ts.map +1 -1
  36. package/dist/db/database.d.ts +3 -5
  37. package/dist/db/database.d.ts.map +1 -1
  38. package/dist/db/local.d.ts +38 -0
  39. package/dist/db/local.d.ts.map +1 -0
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +13809 -12998
  43. package/dist/lib/apply.d.ts +7 -0
  44. package/dist/lib/apply.d.ts.map +1 -1
  45. package/dist/lib/compact-output.d.ts +1 -0
  46. package/dist/lib/compact-output.d.ts.map +1 -1
  47. package/dist/lib/export.d.ts +22 -3
  48. package/dist/lib/export.d.ts.map +1 -1
  49. package/dist/lib/ids.d.ts +4 -0
  50. package/dist/lib/ids.d.ts.map +1 -0
  51. package/dist/lib/import.d.ts +18 -0
  52. package/dist/lib/import.d.ts.map +1 -1
  53. package/dist/lib/instruction-graph.d.ts.map +1 -1
  54. package/dist/lib/legacy-store-migration.d.ts +39 -0
  55. package/dist/lib/legacy-store-migration.d.ts.map +1 -0
  56. package/dist/lib/managed-skill-runtimes.d.ts +1 -0
  57. package/dist/lib/managed-skill-runtimes.d.ts.map +1 -1
  58. package/dist/lib/session-render.d.ts +3 -0
  59. package/dist/lib/session-render.d.ts.map +1 -1
  60. package/dist/lib/sync-dir.d.ts.map +1 -1
  61. package/dist/mcp/index.js +73 -9462
  62. package/dist/sdk/index.d.ts +2 -0
  63. package/dist/sdk/index.d.ts.map +1 -1
  64. package/dist/sdk/index.js +205 -10
  65. package/dist/sdk/resolve.d.ts +1 -1
  66. package/dist/sdk/resolve.d.ts.map +1 -1
  67. package/dist/sdk/v1-client.d.ts +57 -0
  68. package/dist/sdk/v1-client.d.ts.map +1 -0
  69. package/dist/sdk/v1.generated.d.ts +212 -21
  70. package/dist/sdk/v1.generated.d.ts.map +1 -1
  71. package/dist/server/cloud.d.ts.map +1 -1
  72. package/dist/server/index.d.ts +13 -5
  73. package/dist/server/index.d.ts.map +1 -1
  74. package/dist/server/index.js +8337 -7495
  75. package/dist/server/openapi.d.ts +1264 -92
  76. package/dist/server/openapi.d.ts.map +1 -1
  77. package/dist/server/v1.d.ts +25 -1
  78. package/dist/server/v1.d.ts.map +1 -1
  79. package/dist/status.d.ts +12 -2
  80. package/dist/status.d.ts.map +1 -1
  81. package/dist/storage/cloud-store.d.ts +57 -1
  82. package/dist/storage/cloud-store.d.ts.map +1 -1
  83. package/dist/storage/index.d.ts +7 -0
  84. package/dist/storage/index.d.ts.map +1 -0
  85. package/dist/storage/index.js +725 -0
  86. package/dist/storage/s3-backup.d.ts +76 -0
  87. package/dist/storage/s3-backup.d.ts.map +1 -0
  88. package/dist/storage/s3-config.d.ts +46 -0
  89. package/dist/storage/s3-config.d.ts.map +1 -0
  90. package/dist/storage/s3-object-store.d.ts +70 -0
  91. package/dist/storage/s3-object-store.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +65 -3
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/hasna.contract.json +110 -0
  95. package/migrations/0001_instructions.sql +63 -0
  96. package/migrations/0002_api_keys.sql +20 -0
  97. package/migrations/0003_idempotency_receipts.sql +24 -0
  98. package/package.json +29 -14
  99. package/assets/skills/inbox/SKILL.md +0 -86
  100. package/dist/cli/add-duplicate-target.test.d.ts +0 -2
  101. package/dist/cli/add-duplicate-target.test.d.ts.map +0 -1
  102. package/dist/cli/add-reference-update.test.d.ts +0 -2
  103. package/dist/cli/add-reference-update.test.d.ts.map +0 -1
  104. package/dist/cli/apply-unchanged-snapshot-bloat.test.d.ts +0 -2
  105. package/dist/cli/apply-unchanged-snapshot-bloat.test.d.ts.map +0 -1
  106. package/dist/cli/doctor-reference-duplicates.test.d.ts +0 -2
  107. package/dist/cli/doctor-reference-duplicates.test.d.ts.map +0 -1
  108. package/dist/cli/fail-closed-no-env.test.d.ts +0 -2
  109. package/dist/cli/fail-closed-no-env.test.d.ts.map +0 -1
  110. package/dist/cli/output.test.d.ts +0 -2
  111. package/dist/cli/output.test.d.ts.map +0 -1
  112. package/dist/cli/profile-binding.test.d.ts +0 -2
  113. package/dist/cli/profile-binding.test.d.ts.map +0 -1
  114. package/dist/cli/profile-reads.test.d.ts +0 -2
  115. package/dist/cli/profile-reads.test.d.ts.map +0 -1
  116. package/dist/cli/profile-update.test.d.ts +0 -2
  117. package/dist/cli/profile-update.test.d.ts.map +0 -1
  118. package/dist/cli/project-context.test.d.ts +0 -2
  119. package/dist/cli/project-context.test.d.ts.map +0 -1
  120. package/dist/cli/raw-store-root.test.d.ts +0 -2
  121. package/dist/cli/raw-store-root.test.d.ts.map +0 -1
  122. package/dist/cli/session-apply-managed-input-bound.test.d.ts +0 -2
  123. package/dist/cli/session-apply-managed-input-bound.test.d.ts.map +0 -1
  124. package/dist/cli/session.test.d.ts +0 -2
  125. package/dist/cli/session.test.d.ts.map +0 -1
  126. package/dist/cli/station-profile.test.d.ts +0 -2
  127. package/dist/cli/station-profile.test.d.ts.map +0 -1
  128. package/dist/data/config-store.test.d.ts +0 -2
  129. package/dist/data/config-store.test.d.ts.map +0 -1
  130. package/dist/db/configs.test.d.ts +0 -2
  131. package/dist/db/configs.test.d.ts.map +0 -1
  132. package/dist/db/database.test.d.ts +0 -2
  133. package/dist/db/database.test.d.ts.map +0 -1
  134. package/dist/db/machines.test.d.ts +0 -2
  135. package/dist/db/machines.test.d.ts.map +0 -1
  136. package/dist/db/profile-assets.test.d.ts +0 -2
  137. package/dist/db/profile-assets.test.d.ts.map +0 -1
  138. package/dist/db/profile-config-bindings.test.d.ts +0 -2
  139. package/dist/db/profile-config-bindings.test.d.ts.map +0 -1
  140. package/dist/db/profiles.test.d.ts +0 -2
  141. package/dist/db/profiles.test.d.ts.map +0 -1
  142. package/dist/db/snapshots.test.d.ts +0 -2
  143. package/dist/db/snapshots.test.d.ts.map +0 -1
  144. package/dist/lib/app-home.test.d.ts +0 -2
  145. package/dist/lib/app-home.test.d.ts.map +0 -1
  146. package/dist/lib/apply-batch.test.d.ts +0 -2
  147. package/dist/lib/apply-batch.test.d.ts.map +0 -1
  148. package/dist/lib/apply-dry-run-verdict.test.d.ts +0 -2
  149. package/dist/lib/apply-dry-run-verdict.test.d.ts.map +0 -1
  150. package/dist/lib/apply-secret-placeholder-guard.test.d.ts +0 -2
  151. package/dist/lib/apply-secret-placeholder-guard.test.d.ts.map +0 -1
  152. package/dist/lib/apply-text-format-credential-guard.test.d.ts +0 -2
  153. package/dist/lib/apply-text-format-credential-guard.test.d.ts.map +0 -1
  154. package/dist/lib/apply.test.d.ts +0 -2
  155. package/dist/lib/apply.test.d.ts.map +0 -1
  156. package/dist/lib/asset-plan.test.d.ts +0 -2
  157. package/dist/lib/asset-plan.test.d.ts.map +0 -1
  158. package/dist/lib/client-types.test.d.ts +0 -2
  159. package/dist/lib/client-types.test.d.ts.map +0 -1
  160. package/dist/lib/codewith-shared-todos-storage-standard.test.d.ts +0 -2
  161. package/dist/lib/codewith-shared-todos-storage-standard.test.d.ts.map +0 -1
  162. package/dist/lib/compact-output.test.d.ts +0 -2
  163. package/dist/lib/compact-output.test.d.ts.map +0 -1
  164. package/dist/lib/config-target-identity.test.d.ts +0 -2
  165. package/dist/lib/config-target-identity.test.d.ts.map +0 -1
  166. package/dist/lib/cursor-authority.test.d.ts +0 -2
  167. package/dist/lib/cursor-authority.test.d.ts.map +0 -1
  168. package/dist/lib/dangerous-operation-guard-standard.test.d.ts +0 -2
  169. package/dist/lib/dangerous-operation-guard-standard.test.d.ts.map +0 -1
  170. package/dist/lib/diff-redaction.test.d.ts +0 -2
  171. package/dist/lib/diff-redaction.test.d.ts.map +0 -1
  172. package/dist/lib/export-import.test.d.ts +0 -2
  173. package/dist/lib/export-import.test.d.ts.map +0 -1
  174. package/dist/lib/global-agent-rules-render-integration.test.d.ts +0 -2
  175. package/dist/lib/global-agent-rules-render-integration.test.d.ts.map +0 -1
  176. package/dist/lib/global-agent-rules-standard.test.d.ts +0 -2
  177. package/dist/lib/global-agent-rules-standard.test.d.ts.map +0 -1
  178. package/dist/lib/global-agent-rules-stored-content.test.d.ts +0 -2
  179. package/dist/lib/global-agent-rules-stored-content.test.d.ts.map +0 -1
  180. package/dist/lib/global-source-coverage.test.d.ts +0 -2
  181. package/dist/lib/global-source-coverage.test.d.ts.map +0 -1
  182. package/dist/lib/instruction-graph-apply.test.d.ts +0 -2
  183. package/dist/lib/instruction-graph-apply.test.d.ts.map +0 -1
  184. package/dist/lib/instruction-graph.test.d.ts +0 -2
  185. package/dist/lib/instruction-graph.test.d.ts.map +0 -1
  186. package/dist/lib/machine.test.d.ts +0 -2
  187. package/dist/lib/machine.test.d.ts.map +0 -1
  188. package/dist/lib/managed-skill-runtimes.test.d.ts +0 -2
  189. package/dist/lib/managed-skill-runtimes.test.d.ts.map +0 -1
  190. package/dist/lib/package-manager-guard.test.d.ts +0 -2
  191. package/dist/lib/package-manager-guard.test.d.ts.map +0 -1
  192. package/dist/lib/project-context-prepared-file.test.d.ts +0 -2
  193. package/dist/lib/project-context-prepared-file.test.d.ts.map +0 -1
  194. package/dist/lib/project-context.test.d.ts +0 -2
  195. package/dist/lib/project-context.test.d.ts.map +0 -1
  196. package/dist/lib/project-dashboard-standard.test.d.ts +0 -2
  197. package/dist/lib/project-dashboard-standard.test.d.ts.map +0 -1
  198. package/dist/lib/provider-assets-adapters.test.d.ts +0 -2
  199. package/dist/lib/provider-assets-adapters.test.d.ts.map +0 -1
  200. package/dist/lib/provider-context.test.d.ts +0 -2
  201. package/dist/lib/provider-context.test.d.ts.map +0 -1
  202. package/dist/lib/provider-version-adapters.test.d.ts +0 -2
  203. package/dist/lib/provider-version-adapters.test.d.ts.map +0 -1
  204. package/dist/lib/redact.test.d.ts +0 -2
  205. package/dist/lib/redact.test.d.ts.map +0 -1
  206. package/dist/lib/session-apply.test.d.ts +0 -2
  207. package/dist/lib/session-apply.test.d.ts.map +0 -1
  208. package/dist/lib/session-authority.test.d.ts +0 -2
  209. package/dist/lib/session-authority.test.d.ts.map +0 -1
  210. package/dist/lib/session-render-managed-output-bound.test.d.ts +0 -2
  211. package/dist/lib/session-render-managed-output-bound.test.d.ts.map +0 -1
  212. package/dist/lib/session-render-ownership.test.d.ts +0 -2
  213. package/dist/lib/session-render-ownership.test.d.ts.map +0 -1
  214. package/dist/lib/session-render-rule-currency-floor.test.d.ts +0 -2
  215. package/dist/lib/session-render-rule-currency-floor.test.d.ts.map +0 -1
  216. package/dist/lib/session-render-silent-source-drop.test.d.ts +0 -2
  217. package/dist/lib/session-render-silent-source-drop.test.d.ts.map +0 -1
  218. package/dist/lib/session-render-state-hermeticity.test.d.ts +0 -2
  219. package/dist/lib/session-render-state-hermeticity.test.d.ts.map +0 -1
  220. package/dist/lib/session-render-state.test.d.ts +0 -2
  221. package/dist/lib/session-render-state.test.d.ts.map +0 -1
  222. package/dist/lib/session-render.test.d.ts +0 -2
  223. package/dist/lib/session-render.test.d.ts.map +0 -1
  224. package/dist/lib/station-profile.test.d.ts +0 -2
  225. package/dist/lib/station-profile.test.d.ts.map +0 -1
  226. package/dist/lib/sync-dir.test.d.ts +0 -2
  227. package/dist/lib/sync-dir.test.d.ts.map +0 -1
  228. package/dist/lib/sync-dry-run-unchanged.test.d.ts +0 -2
  229. package/dist/lib/sync-dry-run-unchanged.test.d.ts.map +0 -1
  230. package/dist/lib/sync-known.test.d.ts +0 -2
  231. package/dist/lib/sync-known.test.d.ts.map +0 -1
  232. package/dist/lib/sync.test.d.ts +0 -2
  233. package/dist/lib/sync.test.d.ts.map +0 -1
  234. package/dist/lib/template.test.d.ts +0 -2
  235. package/dist/lib/template.test.d.ts.map +0 -1
  236. package/dist/lib/transforms.test.d.ts +0 -2
  237. package/dist/lib/transforms.test.d.ts.map +0 -1
  238. package/dist/lib/transport-resolver.test.d.ts +0 -2
  239. package/dist/lib/transport-resolver.test.d.ts.map +0 -1
  240. package/dist/mcp/create-config-target-guard.test.d.ts +0 -2
  241. package/dist/mcp/create-config-target-guard.test.d.ts.map +0 -1
  242. package/dist/mcp/early-args.test.d.ts +0 -2
  243. package/dist/mcp/early-args.test.d.ts.map +0 -1
  244. package/dist/mcp/http.test.d.ts +0 -2
  245. package/dist/mcp/http.test.d.ts.map +0 -1
  246. package/dist/mcp/mcp.test.d.ts +0 -2
  247. package/dist/mcp/mcp.test.d.ts.map +0 -1
  248. package/dist/sdk/resolve.test.d.ts +0 -2
  249. package/dist/sdk/resolve.test.d.ts.map +0 -1
  250. package/dist/sdk/sdk-bundle-self-contained.test.d.ts +0 -2
  251. package/dist/sdk/sdk-bundle-self-contained.test.d.ts.map +0 -1
  252. package/dist/server/cloud-auth.test.d.ts +0 -2
  253. package/dist/server/cloud-auth.test.d.ts.map +0 -1
  254. package/dist/server/cloud.test.d.ts +0 -2
  255. package/dist/server/cloud.test.d.ts.map +0 -1
  256. package/dist/server/early-args.test.d.ts +0 -2
  257. package/dist/server/early-args.test.d.ts.map +0 -1
  258. package/dist/server/profile-contract.test.d.ts +0 -2
  259. package/dist/server/profile-contract.test.d.ts.map +0 -1
  260. package/dist/status.test.d.ts +0 -2
  261. package/dist/status.test.d.ts.map +0 -1
  262. package/dist/storage/cloud-store.test.d.ts +0 -2
  263. package/dist/storage/cloud-store.test.d.ts.map +0 -1
  264. package/dist/test-support/preload-state-home.d.ts +0 -2
  265. package/dist/test-support/preload-state-home.d.ts.map +0 -1
@@ -0,0 +1,391 @@
1
+ // @bun
2
+ import"./index-bsan4c16.js";
3
+
4
+ // src/lib/package-manager-guard.ts
5
+ import { execFileSync } from "child_process";
6
+ import { existsSync, lstatSync, readdirSync, readFileSync } from "fs";
7
+ import { homedir } from "os";
8
+ import { basename, dirname, isAbsolute, join, relative, resolve } from "path";
9
+ var SKIP_DIRS = new Set([
10
+ ".git",
11
+ "node_modules",
12
+ "dist",
13
+ "build",
14
+ "coverage",
15
+ ".next",
16
+ ".turbo",
17
+ ".cache"
18
+ ]);
19
+ var LOCKFILE_NAMES = new Set([
20
+ "bun.lock",
21
+ "package-lock.json",
22
+ "npm-shrinkwrap.json",
23
+ "pnpm-lock.yaml",
24
+ "yarn.lock"
25
+ ]);
26
+ var HOME_FILES = [
27
+ ".npmrc",
28
+ ".bunfig.toml",
29
+ "bunfig.toml",
30
+ ".bashrc",
31
+ ".bash_profile",
32
+ ".zshrc",
33
+ ".zprofile",
34
+ ".profile"
35
+ ];
36
+ var TOKEN_VALUE_PATTERNS = [
37
+ { re: /npm_[A-Za-z0-9]{36,}/, rule: "literal-npm-token", detail: "literal npm token-like value" },
38
+ { re: /gh[pousr]_[A-Za-z0-9_]{36,}/, rule: "literal-github-token", detail: "literal GitHub token-like value" },
39
+ { re: /sk[-]ant-[A-Za-z0-9\-_]{40,}/, rule: "literal-anthropic-key", detail: "literal Anthropic key-like value" },
40
+ { re: /sk-[A-Za-z0-9]{48,}/, rule: "literal-openai-key", detail: "literal OpenAI key-like value" },
41
+ { re: /AKIA[0-9A-Z]{16}/, rule: "literal-aws-access-key", detail: "literal AWS access-key-like value" },
42
+ { re: /xoxb-[0-9]+-[A-Za-z0-9-]+/, rule: "literal-slack-token", detail: "literal Slack token-like value" }
43
+ ];
44
+ function scanPackageManagerSecrets(options = {}) {
45
+ const cwd = options.cwd ? resolve(options.cwd) : process.cwd();
46
+ const roots = (options.roots && options.roots.length > 0 ? options.roots : [cwd]).map((root) => resolve(cwd, root));
47
+ const findings = [];
48
+ let scannedFiles = 0;
49
+ for (const root of roots) {
50
+ if (!existsSync(root))
51
+ continue;
52
+ const stat = lstatSync(root);
53
+ if (stat.isFile()) {
54
+ if (!shouldScanRepoFile(root))
55
+ continue;
56
+ const text = readTextFile(root);
57
+ if (text === null)
58
+ continue;
59
+ scannedFiles++;
60
+ findings.push(...scanFile(root, text, classifyRepoFile(root), isTrackedFile(root), dirname(root)));
61
+ continue;
62
+ }
63
+ if (!stat.isDirectory())
64
+ continue;
65
+ const tracked = trackedFiles(root);
66
+ for (const file of collectRepoFiles(root)) {
67
+ const rel = toPosix(relative(root, file));
68
+ const isTracked = tracked.has(rel);
69
+ const text = readTextFile(file);
70
+ if (text === null)
71
+ continue;
72
+ scannedFiles++;
73
+ findings.push(...scanFile(file, text, classifyRepoFile(file), isTracked, root));
74
+ }
75
+ }
76
+ if (options.includeHome) {
77
+ const home = homedir();
78
+ for (const name of HOME_FILES) {
79
+ const file = join(home, name);
80
+ if (!existsSync(file))
81
+ continue;
82
+ const text = readTextFile(file);
83
+ if (text === null)
84
+ continue;
85
+ scannedFiles++;
86
+ findings.push(...scanFile(file, text, classifyHomeFile(name), false, home));
87
+ }
88
+ }
89
+ findings.sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line || a.rule.localeCompare(b.rule));
90
+ return {
91
+ clean: findings.length === 0,
92
+ scannedFiles,
93
+ scannedRoots: roots,
94
+ findings
95
+ };
96
+ }
97
+ function collectRepoFiles(root) {
98
+ const out = [];
99
+ const visit = (dir) => {
100
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
101
+ if (entry.isDirectory()) {
102
+ if (SKIP_DIRS.has(entry.name))
103
+ continue;
104
+ visit(join(dir, entry.name));
105
+ continue;
106
+ }
107
+ if (!entry.isFile())
108
+ continue;
109
+ const file = join(dir, entry.name);
110
+ if (shouldScanRepoFile(file))
111
+ out.push(file);
112
+ }
113
+ };
114
+ visit(root);
115
+ return out;
116
+ }
117
+ function shouldScanRepoFile(file) {
118
+ const name = basename(file);
119
+ return isNpmrcName(name) || isBunConfigName(name) || LOCKFILE_NAMES.has(name);
120
+ }
121
+ function classifyRepoFile(file) {
122
+ const name = basename(file);
123
+ if (isNpmrcName(name))
124
+ return "repo-npmrc";
125
+ if (isBunConfigName(name))
126
+ return "bun-config";
127
+ return "lockfile";
128
+ }
129
+ function classifyHomeFile(name) {
130
+ if (name === ".npmrc")
131
+ return "home-npmrc";
132
+ if (isBunConfigName(name))
133
+ return "bun-config";
134
+ return "shell-profile";
135
+ }
136
+ function isBunConfigName(name) {
137
+ return name === "bunfig.toml" || name === ".bunfig.toml";
138
+ }
139
+ function isNpmrcName(name) {
140
+ return name === ".npmrc" || name.startsWith(".npmrc.") || name.endsWith(".npmrc");
141
+ }
142
+ function readTextFile(file) {
143
+ try {
144
+ const stat = lstatSync(file);
145
+ if (!stat.isFile() || stat.size > 5000000)
146
+ return null;
147
+ const buf = readFileSync(file);
148
+ if (buf.includes(0))
149
+ return null;
150
+ return buf.toString("utf-8");
151
+ } catch {
152
+ return null;
153
+ }
154
+ }
155
+ function scanFile(file, text, surface, tracked, root) {
156
+ const findings = [];
157
+ const path = displayPath(file, root);
158
+ if (surface === "bun-config")
159
+ return scanBunConfigFile(text, path, tracked);
160
+ const lines = text.split(/\r?\n/);
161
+ for (let i = 0;i < lines.length; i++) {
162
+ const line = lines[i];
163
+ const lineNo = i + 1;
164
+ if (surface === "repo-npmrc" || surface === "home-npmrc") {
165
+ findings.push(...scanNpmrcLine(line, path, lineNo, surface, tracked));
166
+ } else if (surface === "shell-profile") {
167
+ findings.push(...scanShellProfileLine(line, path, lineNo, tracked));
168
+ } else {
169
+ findings.push(...scanLockfileLine(line, path, lineNo, tracked));
170
+ }
171
+ }
172
+ return findings;
173
+ }
174
+ function scanNpmrcLine(lineText, path, line, surface, tracked) {
175
+ const findings = [];
176
+ const stripped = lineText.trim();
177
+ if (stripped === "" || stripped.startsWith("#") || stripped.startsWith(";"))
178
+ return findings;
179
+ const auth = stripped.match(/(?:^|:)(_[A-Za-z]*(?:auth|password)[A-Za-z]*|password)\s*=\s*(.+)$/i);
180
+ if (auth) {
181
+ const value = stripQuotes(stripInlineComment(auth[2].trim()));
182
+ if (value && !isSafeReference(value)) {
183
+ findings.push({
184
+ path,
185
+ line,
186
+ rule: "npmrc-literal-auth",
187
+ surface,
188
+ severity: "error",
189
+ tracked,
190
+ detail: tracked ? "tracked npm auth entry uses a literal value" : "npm auth entry uses a literal value"
191
+ });
192
+ }
193
+ }
194
+ findings.push(...scanCredentialedUrl(stripped, path, line, surface, tracked));
195
+ findings.push(...scanKnownTokenPatterns(stripped, path, line, surface, tracked));
196
+ return findings;
197
+ }
198
+ function scanBunConfigFile(text, path, tracked) {
199
+ const findings = [];
200
+ const lines = text.split(/\r?\n/);
201
+ let inReleaseAgeExcludes = false;
202
+ let hasMinimumReleaseAge = false;
203
+ for (let i = 0;i < lines.length; i++) {
204
+ const lineText = lines[i];
205
+ const line = i + 1;
206
+ const stripped = lineText.trim();
207
+ if (stripped === "" || stripped.startsWith("#"))
208
+ continue;
209
+ const releaseAge = stripped.match(/^minimumReleaseAge\s*=\s*(?:"([^"]+)"|'([^']+)'|([0-9]+))\s*(?:#.*)?$/i);
210
+ if (releaseAge) {
211
+ hasMinimumReleaseAge = true;
212
+ const rawValue = releaseAge[1] ?? releaseAge[2] ?? releaseAge[3] ?? "";
213
+ const value = Number(rawValue);
214
+ if (!Number.isFinite(value) || value <= 0) {
215
+ findings.push({
216
+ path,
217
+ line,
218
+ rule: "bun-release-age-disabled",
219
+ surface: "bun-config",
220
+ severity: "error",
221
+ tracked,
222
+ detail: "Bun release-age quarantine is disabled"
223
+ });
224
+ }
225
+ }
226
+ const startsReleaseAgeExcludes = /minimumReleaseAgeExcludes/i.test(stripped);
227
+ const scanExcludes = startsReleaseAgeExcludes || inReleaseAgeExcludes;
228
+ if (scanExcludes) {
229
+ const quoted = [...stripped.matchAll(/["']([^"']+)["']/g)].map((m) => m[1]);
230
+ for (const item of quoted) {
231
+ if (!isExactHasnaPackageName(item)) {
232
+ findings.push({
233
+ path,
234
+ line,
235
+ rule: "bun-release-age-broad-exclude",
236
+ surface: "bun-config",
237
+ severity: "error",
238
+ tracked,
239
+ detail: "Bun release-age exclude must be an exact @hasna package name"
240
+ });
241
+ }
242
+ }
243
+ }
244
+ inReleaseAgeExcludes = startsReleaseAgeExcludes ? stripped.includes("[") && !stripped.includes("]") : inReleaseAgeExcludes && !stripped.includes("]");
245
+ findings.push(...scanKnownTokenPatterns(stripped, path, line, "bun-config", tracked));
246
+ }
247
+ if (!hasMinimumReleaseAge) {
248
+ findings.push({
249
+ path,
250
+ line: 1,
251
+ rule: "bun-release-age-missing",
252
+ surface: "bun-config",
253
+ severity: "error",
254
+ tracked,
255
+ detail: "Bun release-age quarantine must be configured with a positive minimumReleaseAge"
256
+ });
257
+ }
258
+ return findings;
259
+ }
260
+ function scanShellProfileLine(lineText, path, line, tracked) {
261
+ const findings = [];
262
+ const stripped = lineText.trim();
263
+ if (stripped === "" || stripped.startsWith("#"))
264
+ return findings;
265
+ const assignment = stripped.match(/^(?:export\s+)?(NPM(?:_CONFIG)?_[A-Z0-9_]*TOKEN|NODE_AUTH_TOKEN|NPM_TOKEN)\s*=\s*(.+)$/);
266
+ if (assignment) {
267
+ const value = stripQuotes(stripInlineComment(assignment[2].trim()));
268
+ if (value && !isSafeReference(value)) {
269
+ findings.push({
270
+ path,
271
+ line,
272
+ rule: "shell-literal-package-token",
273
+ surface: "shell-profile",
274
+ severity: "error",
275
+ tracked,
276
+ detail: "shell profile package-manager token uses a literal value"
277
+ });
278
+ }
279
+ }
280
+ findings.push(...scanKnownTokenPatterns(stripped, path, line, "shell-profile", tracked));
281
+ return findings;
282
+ }
283
+ function scanLockfileLine(lineText, path, line, tracked) {
284
+ const findings = scanKnownTokenPatterns(lineText, path, line, "lockfile", tracked);
285
+ if (/(?:^|:)_authToken\s*=\s*/i.test(lineText) && !/\$\{[A-Z0-9_]+\}|\{\{[A-Z0-9_]+\}\}/.test(lineText)) {
286
+ findings.push({
287
+ path,
288
+ line,
289
+ rule: "lockfile-auth-token",
290
+ surface: "lockfile",
291
+ severity: "error",
292
+ tracked,
293
+ detail: "lockfile contains package-manager auth token material"
294
+ });
295
+ }
296
+ return findings;
297
+ }
298
+ function scanKnownTokenPatterns(lineText, path, line, surface, tracked) {
299
+ const findings = [];
300
+ for (const pattern of TOKEN_VALUE_PATTERNS) {
301
+ if (pattern.re.test(lineText)) {
302
+ findings.push({
303
+ path,
304
+ line,
305
+ rule: pattern.rule,
306
+ surface,
307
+ severity: "error",
308
+ tracked,
309
+ detail: pattern.detail
310
+ });
311
+ }
312
+ }
313
+ return findings;
314
+ }
315
+ function scanCredentialedUrl(lineText, path, line, surface, tracked) {
316
+ const findings = [];
317
+ for (const match of lineText.matchAll(/\bhttps?:\/\/([^/\s#;]+)@/gi)) {
318
+ const userInfo = match[1];
319
+ const credentialPart = userInfo.includes(":") ? userInfo.split(":").slice(1).join(":") : userInfo;
320
+ if (credentialPart && !isSafeReference(credentialPart)) {
321
+ findings.push({
322
+ path,
323
+ line,
324
+ rule: "package-manager-url-credentials",
325
+ surface,
326
+ severity: "error",
327
+ tracked,
328
+ detail: "package-manager URL embeds literal credentials"
329
+ });
330
+ }
331
+ }
332
+ return findings;
333
+ }
334
+ function trackedFiles(root) {
335
+ try {
336
+ const output = execFileSync("git", ["-C", root, "ls-files", "-z"], {
337
+ encoding: "utf-8",
338
+ stdio: ["ignore", "pipe", "ignore"]
339
+ });
340
+ return new Set(output.split("\x00").filter(Boolean).map(toPosix));
341
+ } catch {
342
+ return new Set;
343
+ }
344
+ }
345
+ function isTrackedFile(file) {
346
+ try {
347
+ const repoRoot = execFileSync("git", ["-C", dirname(file), "rev-parse", "--show-toplevel"], {
348
+ encoding: "utf-8",
349
+ stdio: ["ignore", "pipe", "ignore"]
350
+ }).trim();
351
+ const rel = toPosix(relative(repoRoot, file));
352
+ execFileSync("git", ["-C", repoRoot, "ls-files", "--error-unmatch", "--", rel], {
353
+ stdio: ["ignore", "ignore", "ignore"]
354
+ });
355
+ return true;
356
+ } catch {
357
+ return false;
358
+ }
359
+ }
360
+ function isExactHasnaPackageName(item) {
361
+ return /^@hasna\/[a-z0-9][a-z0-9._-]*$/.test(item);
362
+ }
363
+ function isSafeReference(value) {
364
+ const trimmed = stripQuotes(value.trim());
365
+ return /^\$\{[A-Z][A-Z0-9_]*\}$/.test(trimmed) || /^\$[A-Z][A-Z0-9_]*$/.test(trimmed) || /^\{\{[A-Z][A-Z0-9_]*\}\}$/.test(trimmed) || /^%[A-Z][A-Z0-9_]*%$/.test(trimmed);
366
+ }
367
+ function stripQuotes(value) {
368
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
369
+ return value.slice(1, -1);
370
+ }
371
+ return value;
372
+ }
373
+ function stripInlineComment(value) {
374
+ return value.replace(/\s[#;].*$/, "").trim();
375
+ }
376
+ function displayPath(file, root) {
377
+ const home = homedir();
378
+ if (root === home && (file === home || file.startsWith(home + "/")))
379
+ return "~/" + toPosix(relative(home, file));
380
+ if (isAbsolute(root) && file.startsWith(root + "/"))
381
+ return toPosix(relative(root, file));
382
+ if (file === home || file.startsWith(home + "/"))
383
+ return "~/" + toPosix(relative(home, file));
384
+ return file;
385
+ }
386
+ function toPosix(path) {
387
+ return path.split("\\").join("/");
388
+ }
389
+ export {
390
+ scanPackageManagerSecrets
391
+ };
@@ -0,0 +1,16 @@
1
+ // @bun
2
+ import {
3
+ hasSecrets,
4
+ isSecretVarName,
5
+ redactContent,
6
+ redactFormatForTarget,
7
+ scanSecrets
8
+ } from "./index-35z65jsa.js";
9
+ import"./index-nnwp92tk.js";
10
+ export {
11
+ scanSecrets,
12
+ redactFormatForTarget,
13
+ redactContent,
14
+ isSecretVarName,
15
+ hasSecrets
16
+ };
@@ -0,0 +1,240 @@
1
+ // @bun
2
+ import {
3
+ assertSafeInstructionsObjectKey,
4
+ assertSafeInstructionsObjectVersionId
5
+ } from "./index-arrrx0ed.js";
6
+ import {
7
+ normalizeInstructionsS3Prefix
8
+ } from "./index-8rb7ng2y.js";
9
+ import"./index-bsan4c16.js";
10
+
11
+ // src/storage/s3-backup.ts
12
+ var INSTRUCTIONS_BACKUP_MANIFEST_SCHEMA = "hasna.instructions.backup-object/v1";
13
+ var encoder = new TextEncoder;
14
+ var decoder = new TextDecoder;
15
+ var SHA256_PATTERN = /^[0-9a-f]{64}$/;
16
+ var CONTROL_CHARACTERS = /[\u0000-\u001f\u007f]/;
17
+ function buildInstructionsBackupKeys(prefix, backupId) {
18
+ const normalizedPrefix = normalizeInstructionsS3Prefix(prefix);
19
+ const encodedBackupId = encodeBackupId(backupId);
20
+ const rootKey = `${normalizedPrefix}backups/${encodedBackupId}`;
21
+ const keys = {
22
+ rootKey,
23
+ payloadKey: `${rootKey}/payload`,
24
+ manifestKey: `${rootKey}/manifest.json`
25
+ };
26
+ assertSafeInstructionsObjectKey(keys.payloadKey);
27
+ assertSafeInstructionsObjectKey(keys.manifestKey);
28
+ return keys;
29
+ }
30
+ async function planInstructionsBackupPush(input) {
31
+ const keys = buildInstructionsBackupKeys(input.prefix, input.backupId);
32
+ return {
33
+ operation: "push",
34
+ dryRun: true,
35
+ noNetwork: true,
36
+ backupId: input.backupId,
37
+ ...keys,
38
+ sha256: sha256(input.bytes),
39
+ sizeBytes: input.bytes.byteLength,
40
+ contentType: normalizeContentType(input.contentType)
41
+ };
42
+ }
43
+ async function pushInstructionsBackup(input) {
44
+ const plan = await planInstructionsBackupPush(input);
45
+ const existingManifestBytes = await input.store.get(plan.manifestKey);
46
+ if (existingManifestBytes) {
47
+ const existingManifest2 = parseManifest(existingManifestBytes, plan, input.backupId);
48
+ assertManifestMatchesPayload(existingManifest2, input.bytes);
49
+ const existingPayload2 = await input.store.get(existingManifest2.payloadKey);
50
+ if (!existingPayload2)
51
+ throw new Error("Instructions backup payload object is missing");
52
+ assertBytesMatch(existingPayload2, existingManifest2.sha256, existingManifest2.sizeBytes, "backup payload integrity");
53
+ return {
54
+ status: "existing",
55
+ manifest: existingManifest2,
56
+ ...await resolveCurrentVersions(input.store, existingManifest2)
57
+ };
58
+ }
59
+ const payloadCreate = await createImmutableObject(input.store, plan.payloadKey, input.bytes, plan.contentType);
60
+ if (payloadCreate.status === "existing") {
61
+ const existingPayload2 = await input.store.get(plan.payloadKey);
62
+ if (!existingPayload2)
63
+ throw new Error("Instructions backup payload object is missing");
64
+ assertBytesMatch(existingPayload2, plan.sha256, plan.sizeBytes, "existing immutable payload");
65
+ }
66
+ const manifest = {
67
+ schema: INSTRUCTIONS_BACKUP_MANIFEST_SCHEMA,
68
+ app: "instructions",
69
+ backupId: input.backupId,
70
+ payloadKey: plan.payloadKey,
71
+ manifestKey: plan.manifestKey,
72
+ sha256: plan.sha256,
73
+ sizeBytes: plan.sizeBytes,
74
+ contentType: plan.contentType,
75
+ createdAt: normalizeCreatedAt(input.createdAt)
76
+ };
77
+ const manifestCreate = await createImmutableObject(input.store, plan.manifestKey, serializeManifest(manifest), "application/json");
78
+ if (manifestCreate.status === "created") {
79
+ const versions = completeCreatedVersions(payloadCreate, manifestCreate);
80
+ return { status: "created", manifest, ...versions ? { versions } : {} };
81
+ }
82
+ const racedManifestBytes = await input.store.get(plan.manifestKey);
83
+ if (!racedManifestBytes)
84
+ throw new Error("Instructions backup manifest object is missing");
85
+ const existingManifest = parseManifest(racedManifestBytes, plan, input.backupId);
86
+ assertManifestMatchesPayload(existingManifest, input.bytes);
87
+ const existingPayload = await input.store.get(existingManifest.payloadKey);
88
+ if (!existingPayload)
89
+ throw new Error("Instructions backup payload object is missing");
90
+ assertBytesMatch(existingPayload, existingManifest.sha256, existingManifest.sizeBytes, "backup payload integrity");
91
+ return {
92
+ status: "existing",
93
+ manifest: existingManifest,
94
+ ...await resolveCurrentVersions(input.store, existingManifest)
95
+ };
96
+ }
97
+ async function pullInstructionsBackup(input) {
98
+ const versions = normalizeReadVersions(input);
99
+ const keys = buildInstructionsBackupKeys(input.prefix, input.backupId);
100
+ const manifestBytes = await input.store.get(keys.manifestKey, versions ? { versionId: versions.manifestVersionId } : undefined);
101
+ if (!manifestBytes)
102
+ throw new Error("Instructions backup manifest object is missing");
103
+ const manifest = parseManifest(manifestBytes, keys, input.backupId);
104
+ const bytes = await input.store.get(manifest.payloadKey, versions ? { versionId: versions.payloadVersionId } : undefined);
105
+ if (!bytes)
106
+ throw new Error("Instructions backup payload object is missing");
107
+ assertBytesMatch(bytes, manifest.sha256, manifest.sizeBytes, "backup payload integrity");
108
+ if (versions) {
109
+ const [manifestMetadata, payloadMetadata] = await Promise.all([
110
+ input.store.head(keys.manifestKey, { versionId: versions.manifestVersionId }),
111
+ input.store.head(manifest.payloadKey, { versionId: versions.payloadVersionId })
112
+ ]);
113
+ if (manifestMetadata?.versionId !== versions.manifestVersionId || payloadMetadata?.versionId !== versions.payloadVersionId) {
114
+ throw new Error("Instructions backup immutable version authority check failed");
115
+ }
116
+ if (payloadMetadata.size !== manifest.sizeBytes) {
117
+ throw new Error("Instructions backup payload version size check failed");
118
+ }
119
+ }
120
+ return {
121
+ manifest,
122
+ bytes,
123
+ versionPinned: Boolean(versions),
124
+ ...versions ? { versions } : {}
125
+ };
126
+ }
127
+ async function verifyInstructionsBackup(input) {
128
+ const result = await pullInstructionsBackup(input);
129
+ return {
130
+ ok: true,
131
+ backupId: result.manifest.backupId,
132
+ payloadKey: result.manifest.payloadKey,
133
+ manifestKey: result.manifest.manifestKey,
134
+ sha256: result.manifest.sha256,
135
+ sizeBytes: result.manifest.sizeBytes,
136
+ versionPinned: result.versionPinned,
137
+ ...result.versions ? { versions: result.versions } : {}
138
+ };
139
+ }
140
+ async function createImmutableObject(store, key, bytes, contentType) {
141
+ if (!store.putIfAbsent) {
142
+ throw new Error("Instructions object store does not support atomic immutable creation");
143
+ }
144
+ return store.putIfAbsent(key, bytes, { contentType });
145
+ }
146
+ function completeCreatedVersions(payload, manifest) {
147
+ if (!payload.versionId || !manifest.versionId)
148
+ return;
149
+ return { payloadVersionId: payload.versionId, manifestVersionId: manifest.versionId };
150
+ }
151
+ async function resolveCurrentVersions(store, manifest) {
152
+ const [payload, manifestObject] = await Promise.all([
153
+ store.head(manifest.payloadKey),
154
+ store.head(manifest.manifestKey)
155
+ ]);
156
+ if (!payload?.versionId || !manifestObject?.versionId)
157
+ return {};
158
+ return {
159
+ versions: {
160
+ payloadVersionId: payload.versionId,
161
+ manifestVersionId: manifestObject.versionId
162
+ }
163
+ };
164
+ }
165
+ function normalizeReadVersions(input) {
166
+ const payloadVersionId = input.payloadVersionId?.trim();
167
+ const manifestVersionId = input.manifestVersionId?.trim();
168
+ if (Boolean(payloadVersionId) !== Boolean(manifestVersionId)) {
169
+ throw new Error("Instructions backup payload and manifest version ids must be provided together");
170
+ }
171
+ if (!payloadVersionId || !manifestVersionId)
172
+ return;
173
+ assertSafeInstructionsObjectVersionId(payloadVersionId);
174
+ assertSafeInstructionsObjectVersionId(manifestVersionId);
175
+ return { payloadVersionId, manifestVersionId };
176
+ }
177
+ function encodeBackupId(backupId) {
178
+ const trimmed = backupId.trim();
179
+ if (!trimmed || trimmed.length > 128 || trimmed === "." || trimmed === ".." || trimmed.includes("\\") || CONTROL_CHARACTERS.test(trimmed)) {
180
+ throw new Error("Instructions backup id is invalid");
181
+ }
182
+ return encodeURIComponent(trimmed);
183
+ }
184
+ function normalizeContentType(value) {
185
+ const contentType = value?.trim() || "application/octet-stream";
186
+ if (contentType.length > 255 || CONTROL_CHARACTERS.test(contentType)) {
187
+ throw new Error("Instructions backup content type is invalid");
188
+ }
189
+ return contentType;
190
+ }
191
+ function normalizeCreatedAt(value) {
192
+ const date = value ?? new Date;
193
+ if (!Number.isFinite(date.getTime()))
194
+ throw new Error("Instructions backup creation timestamp is invalid");
195
+ return date.toISOString();
196
+ }
197
+ function serializeManifest(manifest) {
198
+ return encoder.encode(`${JSON.stringify(manifest, null, 2)}
199
+ `);
200
+ }
201
+ function parseManifest(bytes, keys, backupId) {
202
+ let value;
203
+ try {
204
+ value = JSON.parse(decoder.decode(bytes));
205
+ } catch {
206
+ throw new Error("Instructions backup manifest is not valid JSON");
207
+ }
208
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
209
+ throw new Error("Instructions backup manifest is invalid");
210
+ }
211
+ const manifest = value;
212
+ if (manifest.schema !== INSTRUCTIONS_BACKUP_MANIFEST_SCHEMA || manifest.app !== "instructions" || manifest.backupId !== backupId || manifest.payloadKey !== keys.payloadKey || manifest.manifestKey !== keys.manifestKey || typeof manifest.sha256 !== "string" || !SHA256_PATTERN.test(manifest.sha256) || typeof manifest.sizeBytes !== "number" || !Number.isSafeInteger(manifest.sizeBytes) || manifest.sizeBytes < 0 || typeof manifest.contentType !== "string" || !manifest.contentType || typeof manifest.createdAt !== "string" || !Number.isFinite(Date.parse(manifest.createdAt))) {
213
+ throw new Error("Instructions backup manifest failed validation");
214
+ }
215
+ assertSafeInstructionsObjectKey(manifest.payloadKey);
216
+ assertSafeInstructionsObjectKey(manifest.manifestKey);
217
+ return manifest;
218
+ }
219
+ function assertManifestMatchesPayload(manifest, bytes) {
220
+ const digest = sha256(bytes);
221
+ if (manifest.sha256 !== digest || manifest.sizeBytes !== bytes.byteLength) {
222
+ throw new Error("Instructions backup is immutable; the existing backup id refers to different bytes");
223
+ }
224
+ }
225
+ function assertBytesMatch(bytes, expectedSha256, expectedSize, label) {
226
+ if (bytes.byteLength !== expectedSize || sha256(bytes) !== expectedSha256) {
227
+ throw new Error(`Instructions ${label} check failed`);
228
+ }
229
+ }
230
+ function sha256(bytes) {
231
+ return new Bun.CryptoHasher("sha256").update(bytes).digest("hex");
232
+ }
233
+ export {
234
+ verifyInstructionsBackup,
235
+ pushInstructionsBackup,
236
+ pullInstructionsBackup,
237
+ planInstructionsBackupPush,
238
+ buildInstructionsBackupKeys,
239
+ INSTRUCTIONS_BACKUP_MANIFEST_SCHEMA
240
+ };
@@ -0,0 +1,14 @@
1
+ // @bun
2
+ import {
3
+ INSTRUCTIONS_S3_ALIAS_ENV,
4
+ INSTRUCTIONS_S3_ENV,
5
+ loadInstructionsS3Config,
6
+ normalizeInstructionsS3Prefix
7
+ } from "./index-8rb7ng2y.js";
8
+ import"./index-bsan4c16.js";
9
+ export {
10
+ normalizeInstructionsS3Prefix,
11
+ loadInstructionsS3Config,
12
+ INSTRUCTIONS_S3_ENV,
13
+ INSTRUCTIONS_S3_ALIAS_ENV
14
+ };
@@ -0,0 +1,14 @@
1
+ // @bun
2
+ import {
3
+ assertSafeInstructionsObjectKey,
4
+ assertSafeInstructionsObjectVersionId,
5
+ createInstructionsS3ObjectStore,
6
+ memoryInstructionsObjectStore
7
+ } from "./index-arrrx0ed.js";
8
+ import"./index-bsan4c16.js";
9
+ export {
10
+ memoryInstructionsObjectStore,
11
+ createInstructionsS3ObjectStore,
12
+ assertSafeInstructionsObjectVersionId,
13
+ assertSafeInstructionsObjectKey
14
+ };