arcane-os 0.42.0 → 0.42.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.42.1
4
+
5
+ - Keep Enter as native newline input on phones and tablets using the shared
6
+ browser-device classification. The visible Send button still submits.
7
+ - Submit desktop Enter before native newline insertion while preserving
8
+ Shift+Enter, input-method composition, complete draft text, and existing
9
+ Send, speech and programmatic submission routes. Held Enter does not submit
10
+ repeatedly; input changes resize the composer through its existing lifecycle.
11
+
3
12
  ## 0.42.0
4
13
 
5
14
  - Accept the optional boolean `responseToUsersPromptComplete` in conversation
package/README.md CHANGED
@@ -19,7 +19,7 @@ version-locked SDK runtime, while an integrated Arcane checkout uses its live
19
19
  `arcane/` runtime. Both profiles share the theme, packaging, event, cancellation,
20
20
  and browser run contracts while retaining their selected application layout.
21
21
 
22
- This checkout defines the `0.42.0` SDK contract. Applications pin one exact npm
22
+ This checkout defines the `0.42.1` SDK contract. Applications pin one exact npm
23
23
  version and lockfile; registry state is deliberately not baked into application
24
24
  artifacts.
25
25
 
@@ -314,6 +314,13 @@ extension callbacks. The component installs warning-only defaults when the host
314
314
  does not supply them; applications may instead consume the corresponding
315
315
  `chat-send-message` and `chat-language-changed` events.
316
316
 
317
+ The composer uses the shared browser-device classification: Enter inserts a
318
+ newline on mobile devices and tablets; desktop Enter submits before the native
319
+ newline is inserted. Shift+Enter and input-method composition retain native
320
+ editing. The visible Send button remains available on every device. Input
321
+ changes resize the composer without submitting; held desktop Enter does not
322
+ submit repeatedly. All input listeners follow the component's existing cleanup.
323
+
317
324
  Before any session binding begins, callback-mode `sessionStatus` follows the
318
325
  selected sticky LLM role and the existing application-owned `modelName` label
319
326
  (or the selected model ID). Assigning `modelName` refreshes that status even
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arcane-os",
3
- "version": "0.42.0",
3
+ "version": "0.42.1",
4
4
  "description": "Arcane OS JavaScript SDK, project-local CLI, browser runtime, and repository-portable application packager.",
5
5
  "type": "module",
6
6
  "main": "./src/index.mjs",
@@ -86,7 +86,7 @@
86
86
  "test": "npm run test:unit && npm run test:functional && npm run test:integration && npm run test:regression",
87
87
  "test:release": "node ./bin/arcane-test.mjs test/npm-release.test.mjs",
88
88
  "test:unit": "node ./bin/arcane-test.mjs test/app-descriptor.test.mjs test/app-schema.test.mjs test/app-selection.test.mjs test/contracts.test.mjs test/conversation-closing-report.test.mjs test/doctor.test.mjs test/mail-credentials.test.mjs test/mail-outbox.test.mjs test/mail-public-api.test.mjs test/mail-send.test.mjs test/mail-transport.test.mjs test/targets.test.mjs test/workspace-operation-lock.test.mjs",
89
- "test:functional": "node ./bin/arcane-test.mjs test/ai-request-model.test.mjs test/ai-request-retry.test.mjs test/ai-stream-cancellation.test.mjs test/browser-speech-providers.test.mjs test/browser-wasm-gpu-notice.test.mjs test/browser-wasm-download-resume.test.mjs test/chat-stream-speech.test.mjs test/chat-transcript-scroll.test.mjs test/chat-transient-retention.test.mjs test/cli.test.mjs test/continuous-voice-capture.test.mjs test/dbopfs-document-library.test.mjs test/dbopfs-png.test.mjs test/dbopfs.test.mjs test/dev-server.test.mjs test/dev-pwa.test.mjs test/dom-event-instrumentation.test.mjs test/event-manager.test.mjs test/events.test.mjs test/file-preview.test.mjs test/import-map.test.mjs test/mail-cli.test.mjs test/mail-runtime.test.mjs test/mail-server.test.mjs test/markdown-editor.test.mjs test/markdown-source-map.test.mjs test/modal.test.mjs test/packaging.test.mjs test/pwa-packaging.test.mjs test/pwa-client.test.mjs test/pwa-install.test.mjs test/pwa-worker.test.mjs test/persistent-ai-chat-session.test.mjs test/reference-completeness.test.mjs test/runtime-api-behavior.test.mjs test/runtime.test.mjs test/scaffold.test.mjs test/speech-playback.test.mjs test/site.test.mjs test/twin-cloud.test.mjs test/update-check.test.mjs test/user-explicit-updates.test.mjs",
89
+ "test:functional": "node ./bin/arcane-test.mjs test/ai-request-model.test.mjs test/ai-request-retry.test.mjs test/ai-stream-cancellation.test.mjs test/browser-speech-providers.test.mjs test/browser-wasm-gpu-notice.test.mjs test/browser-wasm-download-resume.test.mjs test/chat-input.test.mjs test/chat-stream-speech.test.mjs test/chat-transcript-scroll.test.mjs test/chat-transient-retention.test.mjs test/cli.test.mjs test/continuous-voice-capture.test.mjs test/dbopfs-document-library.test.mjs test/dbopfs-png.test.mjs test/dbopfs.test.mjs test/dev-server.test.mjs test/dev-pwa.test.mjs test/dom-event-instrumentation.test.mjs test/event-manager.test.mjs test/events.test.mjs test/file-preview.test.mjs test/import-map.test.mjs test/mail-cli.test.mjs test/mail-runtime.test.mjs test/mail-server.test.mjs test/markdown-editor.test.mjs test/markdown-source-map.test.mjs test/modal.test.mjs test/packaging.test.mjs test/pwa-packaging.test.mjs test/pwa-client.test.mjs test/pwa-install.test.mjs test/pwa-worker.test.mjs test/persistent-ai-chat-session.test.mjs test/reference-completeness.test.mjs test/runtime-api-behavior.test.mjs test/runtime.test.mjs test/scaffold.test.mjs test/speech-playback.test.mjs test/site.test.mjs test/twin-cloud.test.mjs test/update-check.test.mjs test/user-explicit-updates.test.mjs",
90
90
  "test:integration": "node ./bin/arcane-test.mjs test/installed-package-runtime.test.mjs test/root-app-layout.test.mjs test/integrated-shared.test.mjs test/integrated-workspace.test.mjs test/mail-browser.test.mjs test/native-plan.test.mjs test/native-provider-loader.test.mjs test/npm-release.test.mjs test/release-bundle.test.mjs test/release-capability-smoke.test.mjs test/shared-payload-batch.test.mjs test/tarball.test.mjs test/browser-wasm-cpu.test.mjs test/wllama-webgpu-runtime.test.mjs",
91
91
  "test:regression": "node ./bin/arcane-test.mjs test/channel-workflows.test.mjs test/html-import-registration.test.mjs test/logging-regression.test.mjs test/markdown-speech.test.mjs test/prepared-speech.test.mjs test/native-provider-generation.test.mjs test/speech-queue-regression.test.mjs test/testing.test.mjs test/test-sets.test.mjs",
92
92
  "check": "node tools/check-source.mjs && npm test",
@@ -889,14 +889,17 @@
889
889
  {default:FileEntity},
890
890
  {ConversationSubmissionBarrier,requireConversationTimeboxDelivery},
891
891
  {requestAIRuntimeIntent,subscribeAIRuntimeState},
892
- {createPersistentAIChatSession}
892
+ {createPersistentAIChatSession},
893
+ {getBrowserDeviceClass}
893
894
  ]=await Promise.all([
894
895
  import('../modules/MD.js'),
895
896
  import('../entities/File.js'),
896
897
  import('../modules/ConversationTimebox.js'),
897
898
  import('../modules/AIRuntimeState.js'),
898
- import('../modules/PersistentAIChatSession.js')
899
+ import('../modules/PersistentAIChatSession.js'),
900
+ import('arcane-os/browser-device')
899
901
  ]);
902
+ const browserDeviceClass = getBrowserDeviceClass();
900
903
 
901
904
  host.language=host.language||'English';
902
905
  host.name = host.name||'User';
@@ -2997,7 +3000,13 @@
2997
3000
  }
2998
3001
 
2999
3002
  textArea.addEventListener(
3000
- 'keyup',
3003
+ 'keydown',
3004
+ handleChatKeyDown,
3005
+ {signal:aiRuntimeStateAbortController.signal}
3006
+ );
3007
+
3008
+ textArea.addEventListener(
3009
+ 'input',
3001
3010
  resizeTextArea,
3002
3011
  {signal:aiRuntimeStateAbortController.signal}
3003
3012
  );
@@ -3140,12 +3149,28 @@
3140
3149
  {signal:aiRuntimeStateAbortController.signal}
3141
3150
  );
3142
3151
 
3143
- async function resizeTextArea(e={}) {
3144
- if(e.key && e.key == 'Enter' && !e.shiftKey && !send.disabled){
3145
- e.preventDefault();
3146
- void submitMessage('',{source:'keyboard'});
3152
+ function handleChatKeyDown(event) {
3153
+ if(browserDeviceClass === 'mobile'
3154
+ || event.key !== 'Enter'
3155
+ || event.shiftKey
3156
+ || event.isComposing
3157
+ || event.keyCode === 229
3158
+ || send.disabled) {
3159
+ return;
3160
+ }
3161
+
3162
+ event.preventDefault();
3163
+ if(event.repeat) {
3164
+ return;
3147
3165
  }
3166
+ void submitMessage(
3167
+ '',
3168
+ {source: 'keyboard'}
3169
+ );
3170
+ resizeTextArea();
3171
+ }
3148
3172
 
3173
+ async function resizeTextArea() {
3149
3174
  // Reset height to shrink to content size
3150
3175
  trackTranscriptScrollPosition();
3151
3176
  textArea.style.height = 'auto';