narraeon 0.6.0 → 0.6.2

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 (48) hide show
  1. package/README.md +11 -0
  2. package/README.zh-CN.md +8 -0
  3. package/dist/node/protocol/v1.js +12 -2
  4. package/dist/node/runtime/FileNativeExclusiveLink.js +39 -0
  5. package/dist/node/runtime/V1Runtime.js +5 -5
  6. package/dist/node/runtime/archive/WorldArchives.js +14 -46
  7. package/dist/node/runtime/artifact/ArtifactStoreFiles.js +330 -0
  8. package/dist/node/runtime/artifact/FileNativeArtifactStore.js +495 -1535
  9. package/dist/node/runtime/artifact/LegacyArtifactStoreMigration.js +260 -0
  10. package/dist/node/runtime/authoring/ModelToolConversation.js +25 -2
  11. package/dist/node/runtime/config/AppPreferencesStore.js +0 -1
  12. package/dist/node/runtime/config/ProtagonistTemplateStore.js +0 -1
  13. package/dist/node/runtime/config/dataRootLock.js +108 -0
  14. package/dist/node/runtime/content/ContentWorkspace.js +0 -10
  15. package/dist/node/runtime/content/CurrentTreeContentLibrary.js +7 -44
  16. package/dist/node/runtime/extension/PackageScriptPermissions.js +0 -8
  17. package/dist/node/runtime/extension/WorldExtensionControls.js +0 -8
  18. package/dist/node/runtime/model/ModelConnectionStore.js +0 -1
  19. package/dist/node/runtime/play/FileNativeContinuityCorrection.js +3 -14
  20. package/dist/node/runtime/play/FileNativePlayAdvanceStore.js +32 -207
  21. package/dist/node/runtime/play/FileNativePlayTimelineStore.js +29 -239
  22. package/dist/node/runtime/play/PlayCallChain.js +338 -366
  23. package/dist/node/runtime/play/PlayDocumentTools.js +8 -125
  24. package/dist/node/runtime/play/PlayFollowupRequests.js +2 -2
  25. package/dist/node/runtime/play/PlayTraceRetention.js +8 -36
  26. package/dist/node/runtime/prompt/WorldMaintenanceReport.js +39 -7
  27. package/dist/node/runtime/setting/FileNativeSettingImprovementStore.js +7 -16
  28. package/dist/node/runtime/setting/SettingAuthoringTransaction.js +14 -6
  29. package/dist/node/runtime/setting/SettingImprovementSession.js +39 -25
  30. package/dist/node/runtime/world/FileNativeWorldStorageMigrator.js +213 -1033
  31. package/dist/node/runtime/world/FileNativeWorldStore.js +230 -781
  32. package/dist/node/runtime/world/{FileNativeAuthorityV3.js → LegacyAuthorityV3Reader.js} +13 -404
  33. package/dist/node/runtime/world/WorldActivity.js +14 -22
  34. package/dist/node/runtime/world/WorldDocumentMaintenance.js +2 -2
  35. package/dist/node/runtime/world/WorldLedgerAuthority.js +340 -0
  36. package/dist/node/runtime/world/WorldOperationCoordinator.js +59 -401
  37. package/dist/node/runtime/world/WorldQueue.js +46 -0
  38. package/dist/node/runtime/world/WorldTurnLedger.js +353 -0
  39. package/dist/node/runtime/world-revision/FileNativeWorldRevisionStore.js +1 -13
  40. package/dist/node/runtime/world-revision/WorldRevisionSession.js +29 -2
  41. package/dist/node/server/mobile.js +52 -0
  42. package/dist/node/server/startWebServer.js +15 -8
  43. package/dist/web/assets/index-CXnFaYK9.js +1323 -0
  44. package/dist/web/assets/{index-BJ-1Mb0e.css → index-LPMV0pl3.css} +1 -1
  45. package/dist/web/index.html +2 -2
  46. package/package.json +2 -1
  47. package/dist/node/runtime/FileNativePhysicalClone.js +0 -86
  48. package/dist/web/assets/index-BgBL8G-A.js +0 -1323
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="color-scheme" content="dark" />
7
7
  <title>Narraeon</title>
8
- <script type="module" crossorigin src="/assets/index-BgBL8G-A.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-BJ-1Mb0e.css">
8
+ <script type="module" crossorigin src="/assets/index-CXnFaYK9.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-LPMV0pl3.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "narraeon",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "A local-first workspace for living worlds.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -35,6 +35,7 @@
35
35
  "scripts": {
36
36
  "build": "npm run clean && npm run build:web && npm run build:node",
37
37
  "build:node": "tsc -p tsconfig.build.json",
38
+ "build:android": "node scripts/build-android-bundle.mjs",
38
39
  "build:web": "vite build",
39
40
  "check": "npm run typecheck && npm run lint && npm run format:check",
40
41
  "clean": "node scripts/clean-dist.mjs",
@@ -1,86 +0,0 @@
1
- import { constants } from "node:fs";
2
- import { copyFile, link, mkdir } from "node:fs/promises";
3
- import { dirname } from "node:path";
4
- const hardlinkFallbackCodes = new Set([
5
- "EXDEV",
6
- "EPERM",
7
- "EACCES",
8
- "EMLINK",
9
- "ENOTSUP",
10
- "EOPNOTSUPP",
11
- "ENOSYS",
12
- ]);
13
- const reflinkFallbackCodes = new Set([
14
- "EXDEV",
15
- "EPERM",
16
- "EACCES",
17
- "ENOTSUP",
18
- "EOPNOTSUPP",
19
- "EINVAL",
20
- "ENOSYS",
21
- ]);
22
- /**
23
- * Retains one file without aliasing mutable bytes. Immutable files prefer a
24
- * hard link; every other case walks reflink -> exclusive byte copy.
25
- */
26
- export async function cloneFilePhysically(input) {
27
- await mkdir(dirname(input.target), { recursive: true, mode: 0o700 });
28
- const strategy = process.env.NARRAEON_INTERNAL_TEST_CLONE_STRATEGY;
29
- if (input.immutable && strategy !== "reflink" && strategy !== "copy") {
30
- try {
31
- await link(input.source, input.target);
32
- return;
33
- }
34
- catch (error) {
35
- if (await acceptExistingTarget(error, input))
36
- return;
37
- if (!isFallbackError(error, hardlinkFallbackCodes))
38
- throw error;
39
- }
40
- }
41
- if (strategy !== "copy") {
42
- try {
43
- await copyFileAsReflink(input.source, input.target);
44
- return;
45
- }
46
- catch (error) {
47
- if (await acceptExistingTarget(error, input))
48
- return;
49
- if (!isFallbackError(error, reflinkFallbackCodes))
50
- throw error;
51
- }
52
- }
53
- try {
54
- await copyFile(input.source, input.target, constants.COPYFILE_EXCL);
55
- }
56
- catch (error) {
57
- if (await acceptExistingTarget(error, input))
58
- return;
59
- throw error;
60
- }
61
- }
62
- async function copyFileAsReflink(source, target) {
63
- const injectedErrorCode = process.env.NARRAEON_INTERNAL_TEST_REFLINK_ERROR_CODE;
64
- if (injectedErrorCode !== undefined) {
65
- const error = new Error(`${injectedErrorCode}: injected copy-on-write clone failure`);
66
- error.code = injectedErrorCode;
67
- error.path = source;
68
- error.syscall = "copyfile";
69
- throw error;
70
- }
71
- await copyFile(source, target, constants.COPYFILE_FICLONE_FORCE);
72
- }
73
- async function acceptExistingTarget(error, input) {
74
- if (!isNodeError(error) ||
75
- error.code !== "EEXIST" ||
76
- input.onTargetExists === undefined)
77
- return false;
78
- await input.onTargetExists(input.source, input.target);
79
- return true;
80
- }
81
- function isFallbackError(error, acceptedCodes) {
82
- return isNodeError(error) && acceptedCodes.has(error.code ?? "");
83
- }
84
- function isNodeError(error) {
85
- return error instanceof Error && "code" in error;
86
- }