arcane-os 0.54.1 → 0.56.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 (45) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +35 -28
  3. package/browser-runtime/core/client.mjs +552 -0
  4. package/browser-runtime/core/contracts.mjs +85 -0
  5. package/docs/architecture.md +31 -23
  6. package/docs/compatibility.md +10 -1
  7. package/docs/consumer-updates.md +82 -0
  8. package/docs/platform-targets.md +20 -11
  9. package/docs/publishing.md +41 -18
  10. package/docs/reference/README.md +19 -7
  11. package/docs/reference/availability-and-normalization.md +15 -5
  12. package/docs/reference/behavioral-testing.md +7 -6
  13. package/docs/reference/cli.md +12 -4
  14. package/docs/reference/core-client.md +163 -0
  15. package/docs/reference/core-native-packaging.md +149 -0
  16. package/docs/reference/core-runtime.md +185 -0
  17. package/docs/reference/inventory/package-api.json +271 -5
  18. package/docs/reference/protocols.md +38 -14
  19. package/docs/reference/pwa.md +17 -0
  20. package/docs/reference/sdk-api.md +772 -15
  21. package/package.json +10 -3
  22. package/schemas/arcane-app.schema.json +10 -0
  23. package/schemas/arcane-package.schema.json +10 -0
  24. package/schemas/native-build-plan.schema.json +8 -0
  25. package/src/app-descriptor.mjs +18 -1
  26. package/src/app-layout.mjs +6 -2
  27. package/src/cli/main.mjs +8 -6
  28. package/src/core/host.mjs +23 -0
  29. package/src/core/hosts/arcane-core-loader.cjs +2 -0
  30. package/src/core/hosts/linux/arcane_core_process.c +568 -0
  31. package/src/core/hosts/linux/arcane_core_process.h +127 -0
  32. package/src/core/hosts/sea-launcher.cjs +17 -0
  33. package/src/core/hosts/windows/ArcaneCoreProcess.cs +416 -0
  34. package/src/core/runtime.mjs +345 -0
  35. package/src/core/stdio.mjs +209 -0
  36. package/src/core-classic-source.mjs +43 -0
  37. package/src/import-map.mjs +62 -0
  38. package/src/native/portable-layout.mjs +184 -0
  39. package/src/native/portable-provider.mjs +211 -0
  40. package/src/native-plan.mjs +10 -4
  41. package/src/native-provider-loader.mjs +15 -4
  42. package/src/packager/core.mjs +131 -32
  43. package/src/process.mjs +8 -4
  44. package/src/targets/index.mjs +3 -1
  45. package/src/toolchain.mjs +23 -6
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "sdkVersion": "0.51.1",
3
+ "sdkVersion": "0.55.0",
4
4
  "environment": {
5
5
  "runtime": "Node.js for Node entrypoints; browser for browser-only entrypoints",
6
6
  "minimumVersion": "22.23.2 for Node entrypoints",
7
7
  "moduleSystem": "ESM"
8
8
  },
9
- "memberCount": 226,
9
+ "memberCount": 244,
10
10
  "runtimeSubpathPatterns": {
11
11
  "arcane-os/modules/*": "./runtime/arcane/modules/*",
12
12
  "arcane-os/entities/*": "./runtime/arcane/entities/*"
@@ -340,7 +340,7 @@
340
340
  "name": "assertIntegratedNativeToolchain",
341
341
  "displayName": "assertIntegratedNativeToolchain()",
342
342
  "kind": "function",
343
- "signature": "assertIntegratedNativeToolchain({workspaceMode, workspaceRoot, toolchainRoot, target}={})",
343
+ "signature": "assertIntegratedNativeToolchain({workspaceMode, workspaceRoot, toolchainRoot, target, providerSource='arcane-checkout'}={})",
344
344
  "entrypoints": [
345
345
  "arcane-os",
346
346
  "arcane-os/toolchain"
@@ -540,7 +540,7 @@
540
540
  "name": "createNativeBuildPlan",
541
541
  "displayName": "createNativeBuildPlan()",
542
542
  "kind": "function",
543
- "signature": "async createNativeBuildPlan({ nativeBuilder, toolchainRoot, toolchainReceipt, appReleaseRoot, appReleaseReceipt, appDescriptor, dependencyReleases=[], providerGeneration, minimumCoreVersion, protectedRoots=[], outputRoot, targetRequest, signal, onEvent }={})",
543
+ "signature": "async createNativeBuildPlan({ nativeBuilder, toolchainRoot, toolchain, appReleaseRoot, release, appDescriptor, selectedSdk, dependencyReleases, minimumCoreVersion, protectedRoots=[], outputRoot, targetRequest, signal, onEvent }={})",
544
544
  "entrypoints": [
545
545
  "arcane-os",
546
546
  "arcane-os/native"
@@ -1037,7 +1037,7 @@
1037
1037
  "name": "loadArcaneNativeProvider",
1038
1038
  "displayName": "loadArcaneNativeProvider()",
1039
1039
  "kind": "function",
1040
- "signature": "loadArcaneNativeProvider({ arcaneRoot, target, inspect=lstat, canonicalize=realpath, readModule=readFile, importModule=specifier=>import(specifier), generationCache=providerGenerationCache, signal, onEvent }={})",
1040
+ "signature": "async loadArcaneNativeProvider({ arcaneRoot, target, inspect=lstat, canonicalize=realpath, importModule=specifier=>import(specifier), signal, onEvent }={})",
1041
1041
  "entrypoints": [
1042
1042
  "arcane-os",
1043
1043
  "arcane-os/native-provider"
@@ -3619,6 +3619,272 @@
3619
3619
  "availability": "Node and Browser",
3620
3620
  "protocol": "Shared AI cancellation",
3621
3621
  "normalization": "Preserves an existing ARCANE_AI_REQUEST_ABORTED value or returns an AbortError with that code and the supplied cause"
3622
+ },
3623
+ {
3624
+ "id": "core-contracts:CORE_PROTOCOL",
3625
+ "name": "CORE_PROTOCOL",
3626
+ "displayName": "CORE_PROTOCOL",
3627
+ "kind": "constant",
3628
+ "signature": "const CORE_PROTOCOL = 'arcane/1'",
3629
+ "entrypoints": ["arcane-os/core/contracts"],
3630
+ "primaryImport": "arcane-os/core/contracts",
3631
+ "group": "Core protocol contracts",
3632
+ "summary": "Identifies Arcane Core request, response, event and control frames.",
3633
+ "availability": "Node and browser/bundler",
3634
+ "protocol": "arcane/1",
3635
+ "normalization": "Exact protocol string; it identifies a frame contract without granting a method, service, transport or model capability"
3636
+ },
3637
+ {
3638
+ "id": "core-contracts:CORE_READY_EVENTS",
3639
+ "name": "CORE_READY_EVENTS",
3640
+ "displayName": "CORE_READY_EVENTS",
3641
+ "kind": "constant",
3642
+ "signature": "const CORE_READY_EVENTS",
3643
+ "entrypoints": ["arcane-os/core/contracts"],
3644
+ "primaryImport": "arcane-os/core/contracts",
3645
+ "group": "Core protocol contracts",
3646
+ "summary": "Lists the transport and dispatcher events that the Core client treats as durable completions.",
3647
+ "availability": "Node and browser/bundler",
3648
+ "protocol": "arcane/1 client readiness",
3649
+ "normalization": "Contains transport.ready and core.ready; neither event asserts application-service, repository or model readiness"
3650
+ },
3651
+ {
3652
+ "id": "core-contracts:CORE_FRAME_CONTRACTS",
3653
+ "name": "CORE_FRAME_CONTRACTS",
3654
+ "displayName": "CORE_FRAME_CONTRACTS",
3655
+ "kind": "constant",
3656
+ "signature": "const CORE_FRAME_CONTRACTS",
3657
+ "entrypoints": ["arcane-os/core/contracts"],
3658
+ "primaryImport": "arcane-os/core/contracts",
3659
+ "group": "Core protocol contracts",
3660
+ "summary": "Describes the public fields on Core request, response, event, cancellation and runtime.replay control frames.",
3661
+ "availability": "Node and browser/bundler",
3662
+ "protocol": "arcane/1 wire descriptions",
3663
+ "normalization": "Descriptive data only; it does not admit methods, validate application policy or create a transport"
3664
+ },
3665
+ {
3666
+ "id": "core-contracts:CORE_METHOD_CONTRACTS",
3667
+ "name": "CORE_METHOD_CONTRACTS",
3668
+ "displayName": "CORE_METHOD_CONTRACTS",
3669
+ "kind": "constant",
3670
+ "signature": "const CORE_METHOD_CONTRACTS",
3671
+ "entrypoints": ["arcane-os/core/contracts"],
3672
+ "primaryImport": "arcane-os/core/contracts",
3673
+ "group": "Core protocol contracts",
3674
+ "summary": "Describes existing Core method input, output and semantic shapes.",
3675
+ "availability": "Node and browser/bundler",
3676
+ "protocol": "arcane/1 method descriptions",
3677
+ "normalization": "Descriptive data only; the active host and its registered services remain the authority for method availability"
3678
+ },
3679
+ {
3680
+ "id": "core-contracts:CoreError",
3681
+ "name": "CoreError",
3682
+ "displayName": "CoreError",
3683
+ "kind": "class",
3684
+ "signature": "new CoreError(value)",
3685
+ "entrypoints": ["arcane-os/core/contracts"],
3686
+ "primaryImport": "arcane-os/core/contracts",
3687
+ "group": "Core protocol contracts",
3688
+ "summary": "Creates the common Core error while retaining supplied native diagnostic fields.",
3689
+ "availability": "Node and browser/bundler",
3690
+ "protocol": "arcane/1 error response",
3691
+ "normalization": "Preserves own fields, stack and cause; supplies Arcane defaults for absent name, code, message, resolution and diagnostic metadata"
3692
+ },
3693
+ {
3694
+ "id": "core-contracts:serializeCoreError",
3695
+ "name": "serializeCoreError",
3696
+ "displayName": "serializeCoreError()",
3697
+ "kind": "function",
3698
+ "signature": "serializeCoreError(error)",
3699
+ "entrypoints": ["arcane-os/core/contracts"],
3700
+ "primaryImport": "arcane-os/core/contracts",
3701
+ "group": "Core protocol contracts",
3702
+ "summary": "Projects an error into a complete plain diagnostic record for Core responses and events.",
3703
+ "availability": "Node and browser/bundler",
3704
+ "protocol": "arcane/1 error response",
3705
+ "normalization": "Retains own properties and ordinary name, message, stack and cause fields; recursively projects Error causes and AggregateError members"
3706
+ },
3707
+ {
3708
+ "id": "core-client:createCoreClient",
3709
+ "name": "createCoreClient",
3710
+ "displayName": "createCoreClient()",
3711
+ "kind": "function",
3712
+ "signature": "createCoreClient({global=globalThis,transport=null,eventOwner=arcaneEvents,eventOwnerReady,autoConnect=true,replayRuntimeState=false,onError}={})",
3713
+ "entrypoints": ["arcane-os/core/client"],
3714
+ "primaryImport": "arcane-os/core/client",
3715
+ "group": "Core browser client",
3716
+ "summary": "Creates one correlated Arcane Core RPC client with explicit transport, readiness, events, cancellation and lifetime ownership.",
3717
+ "availability": "Browser and native WebView JavaScript hosts; custom transports require a callable send(frame)",
3718
+ "protocol": "arcane/1 over the selected host transport",
3719
+ "normalization": "Preserves complete request, result and event data; retains FIFO event-owner handoff; failTransport(error) settles pending RPCs and acknowledgements with the complete failure and releases the client lifetime; opt-in replayRuntimeState sends one observed nonblocking runtime.replay control after transport readiness"
3720
+ },
3721
+ {
3722
+ "id": "core-client:createCoreFacade",
3723
+ "name": "createCoreFacade",
3724
+ "displayName": "createCoreFacade()",
3725
+ "kind": "function",
3726
+ "signature": "createCoreFacade(client)",
3727
+ "entrypoints": ["arcane-os/core/client"],
3728
+ "primaryImport": "arcane-os/core/client",
3729
+ "group": "Core browser client",
3730
+ "summary": "Projects a Core client into the established application-facing Arcane namespace.",
3731
+ "availability": "Browser and native WebView JavaScript hosts with a Core client",
3732
+ "protocol": "arcane/1 compatibility facade",
3733
+ "normalization": "Routes existing namespace methods through client.invoke while retaining operation-specific parameters, correlation, streaming callbacks, timeouts and cancellation"
3734
+ },
3735
+ {
3736
+ "id": "core-client:installCoreClient",
3737
+ "name": "installCoreClient",
3738
+ "displayName": "installCoreClient()",
3739
+ "kind": "function",
3740
+ "signature": "installCoreClient(global=globalThis,options={})",
3741
+ "entrypoints": ["arcane-os/core/client"],
3742
+ "primaryImport": "arcane-os/core/client",
3743
+ "group": "Core browser client",
3744
+ "summary": "Installs one synchronous global Arcane facade, native receive callback and terminal transport-failure callback for the selected renderer lifetime.",
3745
+ "availability": "Browser and native WebView JavaScript hosts",
3746
+ "protocol": "arcane/1 renderer facade",
3747
+ "normalization": "Repeated installation returns the same client; close/failTransport release owned resources and restore prior globals only while still owned; __arcaneTransportFailed preserves the complete host failure without killing Core"
3748
+ },
3749
+ {
3750
+ "id": "core-client:getInstalledCoreClient",
3751
+ "name": "getInstalledCoreClient",
3752
+ "displayName": "getInstalledCoreClient()",
3753
+ "kind": "function",
3754
+ "signature": "getInstalledCoreClient(global=globalThis)",
3755
+ "entrypoints": ["arcane-os/core/client"],
3756
+ "primaryImport": "arcane-os/core/client",
3757
+ "group": "Core browser client",
3758
+ "summary": "Returns the exact live SDK-installed client or null without installing, connecting or changing globals.",
3759
+ "availability": "Browser and native WebView JavaScript hosts",
3760
+ "protocol": "arcane/1 renderer client ownership",
3761
+ "normalization": "Recognizes ESM and classic SDK installation identity; returns null after close or terminal failure and does not treat a foreign Arcane facade as an SDK client"
3762
+ },
3763
+ {
3764
+ "id": "core-classic-source:createCoreClassicSource",
3765
+ "name": "createCoreClassicSource",
3766
+ "displayName": "createCoreClassicSource()",
3767
+ "kind": "function",
3768
+ "signature": "async createCoreClassicSource({eventOwnerModuleURL,replayRuntimeState=false}={})",
3769
+ "entrypoints": ["arcane-os/core/classic-source"],
3770
+ "primaryImport": "arcane-os/core/classic-source",
3771
+ "group": "Core classic client projection",
3772
+ "summary": "Generates the native host's classic injection script from the installed canonical Core client and contracts.",
3773
+ "availability": "Node; generated source runs in browser and native WebView renderers",
3774
+ "protocol": "arcane/1 classic-script injection",
3775
+ "normalization": "Returns the complete canonical client projection; installs synchronous facade shapes while deferring only the event-owner module connection when document parsing is incomplete; forwards explicit runtime replay selection with a false default"
3776
+ },
3777
+ {
3778
+ "id": "core-runtime:createCoreRuntime",
3779
+ "name": "createCoreRuntime",
3780
+ "displayName": "createCoreRuntime()",
3781
+ "kind": "function",
3782
+ "signature": "createCoreRuntime({application,version,services=[]}={})",
3783
+ "entrypoints": ["arcane-os/core/runtime"],
3784
+ "primaryImport": "arcane-os/core/runtime",
3785
+ "group": "Native Core runtime",
3786
+ "summary": "Creates an app-neutral Core dispatcher with explicit services, request lifetimes, events and graceful drain.",
3787
+ "availability": "Node on Windows, Linux and macOS native hosts; Android requires its host adaptation",
3788
+ "protocol": "arcane/1 dispatcher and service lifecycle",
3789
+ "normalization": "Starts services independently, preserves complete results/errors, cancels only request-lifetime work and drains accepted service work; runtime.replay publishes current dispatcher/service state without restart and preserves reentrant lifecycle publication order"
3790
+ },
3791
+ {
3792
+ "id": "core-stdio:encodeCoreFrame",
3793
+ "name": "encodeCoreFrame",
3794
+ "displayName": "encodeCoreFrame()",
3795
+ "kind": "function",
3796
+ "signature": "encodeCoreFrame(frame)",
3797
+ "entrypoints": ["arcane-os/core/stdio"],
3798
+ "primaryImport": "arcane-os/core/stdio",
3799
+ "group": "Native Core stdio transport",
3800
+ "summary": "Encodes one Core frame as UTF-8 JSON with the native Content-Length transport header.",
3801
+ "availability": "Node",
3802
+ "protocol": "Content-Length framed arcane/1 stdio",
3803
+ "normalization": "Returns a Buffer containing one transport frame; framing length remains transport-local and the JSON payload retains the supplied frame fields"
3804
+ },
3805
+ {
3806
+ "id": "core-stdio:createCoreFrameDecoder",
3807
+ "name": "createCoreFrameDecoder",
3808
+ "displayName": "createCoreFrameDecoder()",
3809
+ "kind": "function",
3810
+ "signature": "createCoreFrameDecoder(onFrame)",
3811
+ "entrypoints": ["arcane-os/core/stdio"],
3812
+ "primaryImport": "arcane-os/core/stdio",
3813
+ "group": "Native Core stdio transport",
3814
+ "summary": "Creates the incremental decoder for fragmented or consecutive native Core frames.",
3815
+ "availability": "Node",
3816
+ "protocol": "Content-Length framed arcane/1 stdio",
3817
+ "normalization": "push(chunk) delivers each complete parsed JSON value in order; finish() reports an incomplete final header or body instead of dropping it"
3818
+ },
3819
+ {
3820
+ "id": "core-stdio:startCoreStdio",
3821
+ "name": "startCoreStdio",
3822
+ "displayName": "startCoreStdio()",
3823
+ "kind": "function",
3824
+ "signature": "startCoreStdio({runtime,input=process.stdin,output=process.stdout,onError}={})",
3825
+ "entrypoints": ["arcane-os/core/stdio"],
3826
+ "primaryImport": "arcane-os/core/stdio",
3827
+ "group": "Native Core stdio transport",
3828
+ "summary": "Attaches an existing Core runtime to framed input and output with concurrent dispatch and graceful shutdown.",
3829
+ "availability": "Node with readable input and writable output streams",
3830
+ "protocol": "Content-Length framed arcane/1 stdio",
3831
+ "normalization": "Returns {runtime,closed,close}; preserves queued output order, reports parser and stream failures, drains accepted runtime work on EOF and never exits the host or ends caller-owned output"
3832
+ },
3833
+ {
3834
+ "id": "native-portable-provider:createPortableNativeProvider",
3835
+ "name": "createPortableNativeProvider",
3836
+ "displayName": "createPortableNativeProvider()",
3837
+ "kind": "function",
3838
+ "signature": "createPortableNativeProvider({services=[]}={})",
3839
+ "entrypoints": ["arcane-os/native/portable-provider"],
3840
+ "primaryImport": "arcane-os/native/portable-provider",
3841
+ "group": "Portable native provider",
3842
+ "summary": "Creates the SDK-owned provider that assembles one selected app and explicit services into a portable Core payload.",
3843
+ "availability": "Node; produces a portable payload rather than an executable host",
3844
+ "protocol": "arcane-native-builder/1 portable provider",
3845
+ "normalization": "Preserves complete selected app and dependency releases, uses explicit service module factories, reports executable:false and never substitutes for an unavailable platform host"
3846
+ },
3847
+ {
3848
+ "id": "native-portable-provider:arcaneNativeBuilderProvider",
3849
+ "name": "arcaneNativeBuilderProvider",
3850
+ "displayName": "arcaneNativeBuilderProvider",
3851
+ "kind": "singleton",
3852
+ "signature": "const arcaneNativeBuilderProvider",
3853
+ "entrypoints": ["arcane-os/native/portable-provider"],
3854
+ "primaryImport": "arcane-os/native/portable-provider",
3855
+ "group": "Portable native provider",
3856
+ "summary": "Package-owned portable provider with no preconfigured application services.",
3857
+ "availability": "Node; produces a portable payload rather than an executable host",
3858
+ "protocol": "arcane-native-builder/1 portable provider",
3859
+ "normalization": "Binding identity is exactly equal to the subpath default export; describe, doctor, prepare, build and verify retain portable semantics while run reports unsupported"
3860
+ },
3861
+ {
3862
+ "id": "native-portable-provider:default",
3863
+ "name": "default",
3864
+ "displayName": "arcaneNativeBuilderProvider default export",
3865
+ "kind": "singleton",
3866
+ "signature": "default as arcaneNativeBuilderProvider",
3867
+ "entrypoints": ["arcane-os/native/portable-provider"],
3868
+ "primaryImport": "arcane-os/native/portable-provider",
3869
+ "group": "Portable native provider",
3870
+ "summary": "Default package binding for the same portable provider exposed by arcaneNativeBuilderProvider.",
3871
+ "availability": "Node; produces a portable payload rather than an executable host",
3872
+ "protocol": "arcane-native-builder/1 portable provider",
3873
+ "normalization": "Binding identity is exactly equal to the named arcaneNativeBuilderProvider export"
3874
+ },
3875
+ {
3876
+ "id": "core-host:startCoreHost",
3877
+ "name": "startCoreHost",
3878
+ "displayName": "startCoreHost()",
3879
+ "kind": "function",
3880
+ "signature": "startCoreHost({application,version,services=[],input,output,onError,signal}={})",
3881
+ "entrypoints": ["arcane-os/core/host"],
3882
+ "primaryImport": "arcane-os/core/host",
3883
+ "group": "Native Core host composition",
3884
+ "summary": "Composes explicitly supplied application services with the shared Core runtime and stdio lifecycle.",
3885
+ "availability": "Node with readable input and writable output streams",
3886
+ "protocol": "arcane/1 over Content-Length framed stdio",
3887
+ "normalization": "Returns the existing {runtime,closed,close} transport owner; an optional abort signal invokes the same idempotent drain without killing the process, replacing service readiness or cancelling accepted service-lifetime work"
3622
3888
  }
3623
3889
  ]
3624
3890
  }
@@ -39,7 +39,7 @@ a nonzero CLI status.
39
39
  Machine output uses `arcane-cli-events/1`. Native planning and providers use:
40
40
 
41
41
  - `arcane-target-adapter/1` for target adapters;
42
- - `arcane-native-build-plan/1` for single-attempt native plans;
42
+ - `arcane-native-build-plan/1` for native plans with complete selected release inputs;
43
43
  - `arcane-native-builder/1` for injected native builders;
44
44
  - `arcane-integrated-toolchain/1` for the fixed integrated shared/Core provider.
45
45
 
@@ -47,6 +47,15 @@ These protocols normalize orchestration and results. They do not normalize a
47
47
  Windows EXE, Linux DEB, Android APK, and portable directory into the same
48
48
  artifact kind.
49
49
 
50
+ Portable CLI operations load the installed SDK's
51
+ `arcane-os/native/portable-provider` by default. Explicit `--arcane-root`
52
+ selection retains the checkout provider route; executable targets still need
53
+ their platform provider/toolchain. `arcane-os/core/host` composes the reusable
54
+ native runtime with explicitly supplied app services. Neither export is a
55
+ browser import, executable host or installer. The synchronous classic facade
56
+ and browser-safe client retain their separate public entries. Integrated
57
+ shared checks keep their existing Arcane OS development provider.
58
+
50
59
  App-scoped managed browser imports have three supported control-plane entrypoints. The CLI
51
60
  uses `arcane import-map`; Node callers use
52
61
  `executeOperation('import-map', options)` or
@@ -79,9 +88,11 @@ Explicit host document lists use the separate root-exported
79
88
  described below; they do not enter app discovery.
80
89
 
81
90
  The application dependency boundary is conditional. Only an application that
82
- actually consumes Arcane declares one exact published `arcane-os` version in
83
- its own `package.json` and resolves it through that project's normal install
84
- into its own `node_modules`. An application that does not currently consume
91
+ actually consumes Arcane declares `arcane-os` in its own `package.json` and
92
+ resolves it through that project's normal install into its own `node_modules`.
93
+ During development the declaration tracks `latest`; the lockfile and installed
94
+ package record the exact selected version. An explicitly selected production
95
+ build may declare an exact version. An application that does not currently consume
85
96
  Arcane adds no `arcane-os` dependency solely because of this rule; the user or
86
97
  governing task may direct that application to adopt Arcane later, at which point
87
98
  the same app-owned package, install, projection, and artifact boundary applies.
@@ -236,6 +247,12 @@ For an extension, select `browserPwa:false` for that artifact and place the
236
247
  complete SDK-produced app beneath the app-owned extension root. The application
237
248
  owns its manifest, toolbar/background launcher and permissions. Ordinary browser
238
249
  PWA configuration and generated browser output remain independently available.
250
+ Before native-module processing, the stage removes active `data-arcane-pwa`
251
+ scripts and manifest relationships targeting the package's `arcane.webmanifest`
252
+ from the existing selected PWA document set. Authored bases resolve those links;
253
+ unrelated manifest URLs, other link relationships, comments, templates and other
254
+ inactive HTML retain their content. Source documents and saved PWA settings
255
+ remain unchanged; the operation does not sweep every packaged HTML file.
239
256
 
240
257
  ## Installed-package browser routes
241
258
 
@@ -366,10 +383,11 @@ layouts; the default nested scaffold continues to use its development dependency
366
383
  ## Installed SDK runtime materialization
367
384
 
368
385
  `materializeInstalledSdkRuntime()` is the Node entrypoint for refreshing one
369
- external workspace's checked-in `arcane/` projection from its one exact
370
- installed SDK declaration. Import the function through the dependency key that
386
+ external workspace's checked-in `arcane/` projection from its one declared and
387
+ installed SDK dependency. Import the function through the dependency key that
371
388
  the workspace actually declares: `arcane-os` for the canonical package name or,
372
- for example, `arcane-sdk` for the exact `npm:arcane-os@<version>` alias. No
389
+ for example, `arcane-sdk` for the development alias `npm:arcane-os@latest`. The
390
+ lockfile and installed package retain the exact resolved version. No
373
391
  application- or Arcane OS-local copier owns this operation.
374
392
 
375
393
  The operation resolves that declaration while holding the shared
@@ -548,8 +566,8 @@ exactly `dependencyName`, `packageSource`,
548
566
  `canonicalPackageRoot`, `packageName`, `packageVersion`, `runtimeRoot`,
549
567
  and `browserRuntimeRoot`. A
550
568
  workspace may use the canonical dependency name or one npm alias such as
551
- `npm:arcane-os@0.51.1`; the installed package manifest identifies `arcane-os`
552
- and supplies its actual version. The resolver requires one declaration and a
569
+ `npm:arcane-os@latest`; the installed package manifest identifies `arcane-os`
570
+ and supplies its actual exact version. The resolver requires one declaration and a
553
571
  direct physical installation with runtime and browser-runtime directories.
554
572
  The application's normal npm declaration and lockfile own version selection.
555
573
 
@@ -984,9 +1002,12 @@ reachable.
984
1002
 
985
1003
  ### macOS
986
1004
 
987
- No macOS target, native bridge, Core host, artifact, or run contract is exposed
988
- by this SDK version. A browser may still run browser-only application code, but
989
- that does not create a native Arcane host or satisfy a native capability.
1005
+ No macOS executable target, native bridge, platform host, artifact, or run
1006
+ contract is exposed by this SDK version. A browser may still run browser-only
1007
+ application code. A separately composed macOS host may use the reusable Node
1008
+ Core runtime, framed stdio transport, host composition, and portable payload,
1009
+ but those SDK primitives do not create a native bridge or executable host and
1010
+ do not by themselves satisfy a native capability.
990
1011
 
991
1012
  ## Development and remote HTTP transport
992
1013
 
@@ -1068,8 +1089,11 @@ The common contract ends where platform truth must remain different:
1068
1089
  artifact kind, and some diagnostic/result fields remain platform-specific;
1069
1090
  - unsupported platforms fail or return a documented unsupported state; they do
1070
1091
  not run an unrelated browser implementation as a substitute;
1071
- - this SDK version requires a selected checkout and Core to provide the current
1072
- native plan's protocol, version, feature, capability, method, and provider;
1092
+ - the portable target defaults to the installed SDK provider and assembles a
1093
+ non-executable payload without an Arcane OS checkout;
1094
+ - executable native targets require their explicit checkout/provider, and the
1095
+ composed host must supply the protocol, version, features, capabilities,
1096
+ methods, and services that its application contract requires;
1073
1097
  - that current-build compatibility does not promise that a future SDK will accept
1074
1098
  this Core or that this SDK will accept a future Core.
1075
1099
 
@@ -206,6 +206,23 @@ manifest carries release information. Non-PWA and native packaging use the same
206
206
  [clean local resource URLs](asset-versioning.md). Native packaging does not
207
207
  generate the browser PWA worker, installation manifest or registration bootstrap.
208
208
 
209
+ ## Package without browser PWA output
210
+
211
+ Select `browserPwa:false` for an artifact, such as an application directory
212
+ inside an extension-owned root. The package omits `arcane.webmanifest`,
213
+ `arcane-offline.json`, `arcane-sw.js`, and `arcane-pwa.mjs`. Before native-module
214
+ processing, it removes active SDK-marked `data-arcane-pwa` scripts and manifest
215
+ relationships that resolve to that package's `arcane.webmanifest` from the
216
+ selected application document set.
217
+
218
+ This is a package-output choice, not a source or saved-setting change. It
219
+ preserves unrelated manifest links and link relationships, comments, templates,
220
+ other inactive HTML, unselected documents, and authored PWA configuration. The
221
+ application remains responsible for any extension manifest, permissions,
222
+ background process, toolbar launcher, or other outer host. See the
223
+ [native-module output contract](protocols.md#native-module-package-output) and
224
+ [`packageApp()` options](sdk-api.md#packageapp) for the complete boundary.
225
+
209
226
  ## Development and hosting
210
227
 
211
228
  Use the ordinary `arcane dev --app <id>` command after editing the selected