@timurproko/a1 0.2.7-dev.767 → 0.2.7-dev.772

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 (115) hide show
  1. package/README.md +30 -0
  2. package/bin/cli.js +4 -0
  3. package/bin/tab-launch-context.d.ts +3 -0
  4. package/bin/tab-launch-context.js +52 -3
  5. package/bin/ui.js +6 -3
  6. package/dist/app/session-shell/session-shell-root.d.ts +0 -1
  7. package/dist/app/session-shell/session-shell-root.js +1 -1
  8. package/dist/app/session-shell/session-shell.js +3 -8
  9. package/dist/app/session-shell/shell-host.d.ts +2 -0
  10. package/dist/app/session-shell/shell-host.js +20 -1
  11. package/dist/cli/dispatch.d.ts +11 -1
  12. package/dist/cli/dispatch.js +79 -5
  13. package/dist/cli/tabs-request.d.ts +7 -0
  14. package/dist/cli/tabs-request.js +1 -0
  15. package/dist/cli/tabs.d.ts +14 -0
  16. package/dist/cli/tabs.js +140 -0
  17. package/dist/composition/owned-ui.d.ts +8 -2
  18. package/dist/composition/owned-ui.js +109 -12
  19. package/dist/features/launch/index.d.ts +1 -1
  20. package/dist/features/launch/intent.d.ts +3 -1
  21. package/dist/features/launch/intent.js +7 -4
  22. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  23. package/dist/features/resident-tab/auto-name.js +42 -0
  24. package/dist/features/resident-tab/index.d.ts +3 -0
  25. package/dist/features/resident-tab/index.js +3 -0
  26. package/dist/features/resident-tab/shortcuts.d.ts +10 -0
  27. package/dist/features/resident-tab/shortcuts.js +35 -0
  28. package/dist/features/resident-tab/status-deriver.d.ts +9 -0
  29. package/dist/features/resident-tab/status-deriver.js +15 -0
  30. package/dist/foundation/launch-context/index.d.ts +4 -0
  31. package/dist/foundation/launch-context/index.js +10 -0
  32. package/dist/foundation/release/bootstrap.d.ts +4 -2
  33. package/dist/foundation/release/bootstrap.js +11 -8
  34. package/dist/foundation/release/cohort-state.d.ts +1 -1
  35. package/dist/foundation/release/cohort-state.js +1 -1
  36. package/dist/foundation/release/release-gc.d.ts +3 -0
  37. package/dist/foundation/release/release-gc.js +44 -8
  38. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +16 -0
  39. package/dist/foundation/resident-tabs/bounded-host-command.js +35 -0
  40. package/dist/foundation/resident-tabs/bridge-client.d.ts +18 -3
  41. package/dist/foundation/resident-tabs/bridge-client.js +87 -7
  42. package/dist/foundation/resident-tabs/doctor.d.ts +29 -0
  43. package/dist/foundation/resident-tabs/doctor.js +166 -0
  44. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +2 -1
  45. package/dist/foundation/resident-tabs/ensure-terminal-host.js +33 -7
  46. package/dist/foundation/resident-tabs/index.d.ts +7 -1
  47. package/dist/foundation/resident-tabs/index.js +4 -1
  48. package/dist/foundation/resident-tabs/maintenance.d.ts +42 -0
  49. package/dist/foundation/resident-tabs/maintenance.js +78 -0
  50. package/dist/foundation/resident-tabs/release-holds.d.ts +27 -0
  51. package/dist/foundation/resident-tabs/release-holds.js +77 -0
  52. package/dist/foundation/resident-tabs/routing.d.ts +4 -3
  53. package/dist/foundation/resident-tabs/routing.js +6 -4
  54. package/dist/foundation/resident-tabs/settings.d.ts +7 -2
  55. package/dist/foundation/resident-tabs/settings.js +17 -16
  56. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +18 -0
  57. package/dist/foundation/resident-tabs/terminal-host-artifact.js +53 -0
  58. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  59. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  60. package/dist/foundation/session-writer-lock/index.d.ts +5 -0
  61. package/dist/foundation/session-writer-lock/index.js +13 -9
  62. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  63. package/dist/integrations/pi/components/shell-presenters-info.d.ts +4 -2
  64. package/dist/integrations/pi/components/shell-presenters-info.js +38 -4
  65. package/dist/integrations/pi/engine/adapter.d.ts +1 -0
  66. package/dist/integrations/pi/engine/adapter.js +3 -0
  67. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  68. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  69. package/dist/native/darwin-arm64/a1_session_lock.node +0 -0
  70. package/dist/native/darwin-arm64/manifest.json +1 -1
  71. package/dist/native/darwin-arm64/terminal-host +0 -0
  72. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  73. package/dist/native/darwin-arm64/terminal-host.manifest.json +44 -0
  74. package/dist/native/darwin-x64/a1_session_lock.node +0 -0
  75. package/dist/native/darwin-x64/manifest.json +20 -0
  76. package/dist/native/darwin-x64/process-guardian +0 -0
  77. package/dist/native/darwin-x64/terminal-host +0 -0
  78. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  79. package/dist/native/darwin-x64/terminal-host.manifest.json +44 -0
  80. package/dist/native/linux-x64/a1_session_lock.node +0 -0
  81. package/dist/native/linux-x64/manifest.json +1 -1
  82. package/dist/native/linux-x64/terminal-host +0 -0
  83. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  84. package/dist/native/linux-x64/terminal-host.manifest.json +44 -0
  85. package/dist/native/win32-x64/a1_session_lock.node +0 -0
  86. package/dist/native/win32-x64/manifest.json +2 -2
  87. package/dist/native/win32-x64/process-guardian.exe +0 -0
  88. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  89. package/dist/native/win32-x64/terminal-host.exe +0 -0
  90. package/dist/native/win32-x64/terminal-host.manifest.json +44 -0
  91. package/dist/ui/settings/declarations.d.ts +19 -43
  92. package/dist/ui/settings/declarations.js +19 -35
  93. package/dist/ui/settings/index.d.ts +1 -1
  94. package/dist/ui/settings/index.js +1 -1
  95. package/dist/ui/settings/manager.d.ts +1 -0
  96. package/dist/ui/settings/manager.js +9 -1
  97. package/dist/ui/settings/migrations.js +12 -0
  98. package/dist/ui/settings/resolution.d.ts +0 -2
  99. package/dist/ui/settings/resolution.js +1 -13
  100. package/dist/ui/settings/sections.js +0 -4
  101. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  102. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  103. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  104. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  105. package/docs/architecture/internal-naming.md +2 -0
  106. package/docs/architecture/process-guardian-provenance.md +2 -0
  107. package/docs/architecture/resident-tabs-requirements.md +1 -563
  108. package/docs/architecture/resident-tabs.md +166 -94
  109. package/docs/architecture/terminal-host-provenance.md +13 -3
  110. package/docs/architecture/toolchain.md +1 -1
  111. package/docs/ci-release-runbook.md +2 -2
  112. package/docs/features/launch-profiles.md +11 -8
  113. package/docs/manual-resident-tabs-acceptance.md +51 -0
  114. package/docs/validation.md +9 -1
  115. package/package.json +5 -1
@@ -0,0 +1,44 @@
1
+ {
2
+ "schema": "a1-terminal-host-artifact-v1",
3
+ "protocolVersion": 1,
4
+ "generation": 1,
5
+ "crateVersion": "0.1.0-dev",
6
+ "platform": "win32",
7
+ "architecture": "x64",
8
+ "target": "x86_64-pc-windows-msvc",
9
+ "capability": "supported",
10
+ "builtAt": "2026-10-15T16:41:35.484Z",
11
+ "artifact": {
12
+ "filename": "terminal-host.exe",
13
+ "sha256": "cbcda1f0a7234ac3a2938fbedecaa71e93c0a9b18bfcc52afb434fc5c8c3e038",
14
+ "size": 5114368
15
+ },
16
+ "sessionLock": {
17
+ "filename": "a1_session_lock.node",
18
+ "sha256": "9eb9f269336acd2955640c1044df2bcfceabbe43bdbc441f2b41e08072ffbd29",
19
+ "size": 1996288
20
+ },
21
+ "notices": {
22
+ "filename": "terminal-host-THIRD-PARTY-NOTICES.txt",
23
+ "sha256": "9e80136b62106ac672162dacbd0d6eb2a94b3318e597e40dfcf70c4920c34b00",
24
+ "size": 555140
25
+ },
26
+ "provenance": {
27
+ "language": "Rust",
28
+ "sourceRoot": "native/terminal-host",
29
+ "cargoLock": "native/terminal-host/Cargo.lock",
30
+ "cargoLockSha256": "f8a60ecf67ce276d8f668ed09805f3b869e3e9058eac152dc197c1fbbf855220",
31
+ "libghosttyVtCommit": "c5a21edfcbc2d5b46540ad91b7980aca31f5f1f3",
32
+ "zigTarget": "x86_64-windows-msvc",
33
+ "zigCpu": "baseline",
34
+ "zigVersion": "0.15.2",
35
+ "rustVersion": "rustc 1.99.0 (b940084d7 2026-09-28)",
36
+ "features": {
37
+ "executable": [],
38
+ "sessionLock": [
39
+ "node-addon"
40
+ ]
41
+ },
42
+ "signatureStatus": "ci-attestation-required"
43
+ }
44
+ }
@@ -1,4 +1,4 @@
1
- export declare const OWNED_UI_SETTINGS_VERSION = 15;
1
+ export declare const OWNED_UI_SETTINGS_VERSION = 16;
2
2
  export type OwnedUiSettingValue = string | number | boolean;
3
3
  export type OwnedUiSettingApplication = "live" | "restart";
4
4
  export interface OwnedUiSettingDeclaration {
@@ -164,53 +164,29 @@ export declare const OWNED_SETTING_DECLARATIONS: Readonly<{
164
164
  defaultValue: 8;
165
165
  allowedValues: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
166
166
  }>;
167
- readonly residentTabs: Readonly<{
168
- id: "residentTabs";
169
- label: "Resident tabs";
167
+ readonly tabsMax: Readonly<{
168
+ id: "tabsMax";
169
+ label: "Maximum tabs";
170
170
  section: Readonly<{
171
- id: "generic";
172
- title: "Generic";
173
- }>;
174
- description: "Keep bare A1 running when its terminal closes and reattach on the next launch. Turning this off prevents new resident launches but does not stop existing tabs.";
175
- application: "restart";
176
- defaultValue: false;
177
- allowedValues: readonly [true, false];
178
- }>;
179
- readonly tabsMaxConcurrentStarts: Readonly<{
180
- id: "tabsMaxConcurrentStarts";
181
- label: "Concurrent tab starts";
182
- section: Readonly<{
183
- id: "generic";
184
- title: "Generic";
171
+ id: "tabs";
172
+ title: "Tabs";
185
173
  }>;
186
- description: "Maximum A1 tabs started together. Starts remain spaced to protect shared profile files.";
187
- application: "restart";
188
- defaultValue: 2;
189
- allowedValues: readonly [1, 2, 3, 4, 5, 6, 7, 8];
190
- }>;
191
- readonly tabsUnresponsiveRestartSeconds: Readonly<{
192
- id: "tabsUnresponsiveRestartSeconds";
193
- label: "Unresponsive tab restart";
194
- section: Readonly<{
195
- id: "generic";
196
- title: "Generic";
197
- }>;
198
- description: "Seconds of continuously healthy supervision without a tab heartbeat before A1 restarts that tab.";
199
- application: "restart";
200
- defaultValue: 120;
201
- allowedValues: readonly [60, 120, 300, 600];
174
+ description: "Maximum resident A1 tabs kept in the shared strip.";
175
+ application: "live";
176
+ defaultValue: 10;
177
+ allowedValues: readonly number[];
202
178
  }>;
203
- readonly tabsStallNoticeSeconds: Readonly<{
204
- id: "tabsStallNoticeSeconds";
205
- label: "Tab stall notice";
179
+ readonly tabsAutoName: Readonly<{
180
+ id: "tabsAutoName";
181
+ label: "Auto name";
206
182
  section: Readonly<{
207
- id: "generic";
208
- title: "Generic";
183
+ id: "tabs";
184
+ title: "Tabs";
209
185
  }>;
210
- description: "Seconds without model or tool progress before a working tab shows a stall notice; A1 never kills a stalled tab automatically.";
211
- application: "restart";
212
- defaultValue: 300;
213
- allowedValues: readonly [120, 300, 600, 1800];
186
+ description: "Automatically name a new tab from its first completed turn with the tab's current model.";
187
+ application: "live";
188
+ defaultValue: true;
189
+ allowedValues: readonly [true, false];
214
190
  }>;
215
191
  }>;
216
192
  export type OwnedSettingId = keyof typeof OWNED_SETTING_DECLARATIONS;
@@ -1,4 +1,4 @@
1
- export const OWNED_UI_SETTINGS_VERSION = 15;
1
+ export const OWNED_UI_SETTINGS_VERSION = 16;
2
2
  const UI_ACCENT_COLOR_CHOICES = Object.freeze([
3
3
  "purple", "blue", "cyan", "green", "orange", "pink",
4
4
  ]);
@@ -9,6 +9,8 @@ const GENERIC_SECTION = Object.freeze({ id: "generic", title: "Generic" });
9
9
  const APPEARANCE_SECTION = Object.freeze({ id: "appearance", title: "Appearance" });
10
10
  const SCROLL_SECTION = Object.freeze({ id: "scroll", title: "Scroll" });
11
11
  const AGENT_SECTION = Object.freeze({ id: "agent", title: "Agent" });
12
+ const TABS_SECTION = Object.freeze({ id: "tabs", title: "Tabs" });
13
+ const TABS_MAX_CHOICES = Object.freeze(Array.from({ length: 50 }, (_, index) => index + 1));
12
14
  /**
13
15
  * Every A1 setting, keyed by its id. The table is the one declaration: ids, defaults, and allowed
14
16
  * values are read from it, and `OwnedSettingValueOf` derives each getter's type from it.
@@ -124,42 +126,24 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
124
126
  defaultValue: 8,
125
127
  allowedValues: Object.freeze([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
126
128
  }),
127
- residentTabs: Object.freeze({
128
- id: "residentTabs",
129
- label: "Resident tabs",
130
- section: GENERIC_SECTION,
131
- description: "Keep bare A1 running when its terminal closes and reattach on the next launch. Turning this off prevents new resident launches but does not stop existing tabs.",
132
- application: "restart",
133
- defaultValue: false,
129
+ tabsMax: Object.freeze({
130
+ id: "tabsMax",
131
+ label: "Maximum tabs",
132
+ section: TABS_SECTION,
133
+ description: "Maximum resident A1 tabs kept in the shared strip.",
134
+ application: "live",
135
+ defaultValue: 10,
136
+ allowedValues: TABS_MAX_CHOICES,
137
+ }),
138
+ tabsAutoName: Object.freeze({
139
+ id: "tabsAutoName",
140
+ label: "Auto name",
141
+ section: TABS_SECTION,
142
+ description: "Automatically name a new tab from its first completed turn with the tab's current model.",
143
+ application: "live",
144
+ defaultValue: true,
134
145
  allowedValues: Object.freeze([true, false]),
135
146
  }),
136
- tabsMaxConcurrentStarts: Object.freeze({
137
- id: "tabsMaxConcurrentStarts",
138
- label: "Concurrent tab starts",
139
- section: GENERIC_SECTION,
140
- description: "Maximum A1 tabs started together. Starts remain spaced to protect shared profile files.",
141
- application: "restart",
142
- defaultValue: 2,
143
- allowedValues: Object.freeze([1, 2, 3, 4, 5, 6, 7, 8]),
144
- }),
145
- tabsUnresponsiveRestartSeconds: Object.freeze({
146
- id: "tabsUnresponsiveRestartSeconds",
147
- label: "Unresponsive tab restart",
148
- section: GENERIC_SECTION,
149
- description: "Seconds of continuously healthy supervision without a tab heartbeat before A1 restarts that tab.",
150
- application: "restart",
151
- defaultValue: 120,
152
- allowedValues: Object.freeze([60, 120, 300, 600]),
153
- }),
154
- tabsStallNoticeSeconds: Object.freeze({
155
- id: "tabsStallNoticeSeconds",
156
- label: "Tab stall notice",
157
- section: GENERIC_SECTION,
158
- description: "Seconds without model or tool progress before a working tab shows a stall notice; A1 never kills a stalled tab automatically.",
159
- application: "restart",
160
- defaultValue: 300,
161
- allowedValues: Object.freeze([120, 300, 600, 1800]),
162
- }),
163
147
  });
164
148
  /** The declarations in declaration order, for resolution, persistence, and the settings screen. */
165
149
  export const OWNED_UI_SETTING_DECLARATIONS = Object.freeze(Object.values(OWNED_SETTING_DECLARATIONS));
@@ -2,7 +2,7 @@ export { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING
2
2
  export type { OwnedSettingId, OwnedSettingValueOf, OwnedUiSettingApplication, OwnedUiSettingDeclaration, OwnedUiSettingValue } from "./declarations.js";
3
3
  export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom, normalizeOwnedUiSettingsValues, } from "./migrations.js";
4
4
  export type { OwnedUiSettingsCompatibilityResult, OwnedUiSettingsMigration } from "./migrations.js";
5
- export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, resolveResidentTabsSetting, settingValue } from "./resolution.js";
5
+ export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, settingValue } from "./resolution.js";
6
6
  export type { OwnedUiResolvedSetting, OwnedUiSettingSource, OwnedUiSettingsDocument, OwnedUiSettingsNotice, OwnedUiSettingsNoticeCode, OwnedUiSettingsResolution, ResolveOwnedUiSettingsInput, } from "./resolution.js";
7
7
  export { AGENT_SECTION_ID, buildOwnedUiSettingsSections, findOwnedUiSettingsEntry } from "./sections.js";
8
8
  export type { AgentSettingsSnapshot, BuildOwnedUiSettingsSectionsInput, OwnedUiSettingsBackend, OwnedUiSettingsEntry, OwnedUiSettingsSection, } from "./sections.js";
@@ -1,6 +1,6 @@
1
1
  export { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, assertOwnedUiSettingDeclarations, findOwnedUiSettingDeclaration, isOwnedSettingId, } from "./declarations.js";
2
2
  export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom, normalizeOwnedUiSettingsValues, } from "./migrations.js";
3
- export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, resolveResidentTabsSetting, settingValue } from "./resolution.js";
3
+ export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, settingValue } from "./resolution.js";
4
4
  export { AGENT_SECTION_ID, buildOwnedUiSettingsSections, findOwnedUiSettingsEntry } from "./sections.js";
5
5
  export { OwnedSettingsManager } from "./manager.js";
6
6
  export { assertProfileSettingsNamespaceAvailable, readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
@@ -17,6 +17,7 @@ export interface OwnedSettingsManagerOptions {
17
17
  readonly migrations?: readonly OwnedUiSettingsMigration[];
18
18
  readonly agent?: AgentSettingsPort | null;
19
19
  readonly agentProvider?: () => AgentSettingsPort | null;
20
+ readonly hiddenOwnedSettingIds?: readonly string[];
20
21
  readonly hiddenAgentSettingIds?: readonly string[];
21
22
  readonly agentSettingLabelOverrides?: Readonly<Record<string, string>>;
22
23
  }
@@ -23,6 +23,7 @@ export class OwnedSettingsManager {
23
23
  #agent;
24
24
  #agentProvider;
25
25
  #listeners = new Set();
26
+ #hiddenOwnedSettingIds;
26
27
  #hiddenAgentSettingIds;
27
28
  #agentSettingLabelOverrides;
28
29
  #resolution;
@@ -45,6 +46,7 @@ export class OwnedSettingsManager {
45
46
  this.#migrations = options.migrations ?? OWNED_UI_SETTINGS_MIGRATIONS;
46
47
  this.#agent = options.agent ?? null;
47
48
  this.#agentProvider = options.agentProvider ?? null;
49
+ this.#hiddenOwnedSettingIds = new Set(options.hiddenOwnedSettingIds ?? []);
48
50
  this.#hiddenAgentSettingIds = new Set(options.hiddenAgentSettingIds ?? []);
49
51
  this.#agentSettingLabelOverrides = { ...(options.agentSettingLabelOverrides ?? {}) };
50
52
  this.#resolution = this.read();
@@ -128,7 +130,13 @@ export class OwnedSettingsManager {
128
130
  this.#notify();
129
131
  }
130
132
  sections() {
131
- return buildOwnedUiSettingsSections({ resolution: this.#resolution, agent: this.#agentSnapshot }).map(section => ({
133
+ const resolution = this.#hiddenOwnedSettingIds.size === 0
134
+ ? this.#resolution
135
+ : {
136
+ ...this.#resolution,
137
+ settings: this.#resolution.settings.filter(setting => !this.#hiddenOwnedSettingIds.has(setting.declaration.id)),
138
+ };
139
+ return buildOwnedUiSettingsSections({ resolution, agent: this.#agentSnapshot }).map(section => ({
132
140
  ...section,
133
141
  entries: section.entries.map(entry => {
134
142
  if (entry.backend === "a1" && this.#restartEffective.has(entry.id)) {
@@ -118,6 +118,18 @@ export const OWNED_UI_SETTINGS_MIGRATIONS = Object.freeze([
118
118
  return { ...values };
119
119
  },
120
120
  }),
121
+ Object.freeze({
122
+ to: 16,
123
+ description: "Make bare A1 tabs unconditional and keep only tab UX controls.",
124
+ migrate(values) {
125
+ const migrated = { ...values };
126
+ delete migrated.residentTabs;
127
+ delete migrated.tabsMaxConcurrentStarts;
128
+ delete migrated.tabsUnresponsiveRestartSeconds;
129
+ delete migrated.tabsStallNoticeSeconds;
130
+ return migrated;
131
+ },
132
+ }),
121
133
  ]);
122
134
  /** Shape-selected compatibility for the metadata-free product object. */
123
135
  export function normalizeOwnedUiSettingsValues(source) {
@@ -42,6 +42,4 @@ export interface ResolveOwnedUiSettingsInput {
42
42
  */
43
43
  export declare function resolveOwnedUiSettings(input: ResolveOwnedUiSettingsInput): OwnedUiSettingsResolution;
44
44
  export declare function settingValue(resolution: OwnedUiSettingsResolution, id: string): OwnedUiSettingValue | null;
45
- /** Resolve the launch-routing flag without constructing the UI settings manager. */
46
- export declare function resolveResidentTabsSetting(document: OwnedUiSettingsDocument | null): boolean;
47
45
  export declare function documentFrom(resolution: OwnedUiSettingsResolution): OwnedUiSettingsDocument;
@@ -1,4 +1,4 @@
1
- import { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, findOwnedUiSettingDeclaration, } from "./declarations.js";
1
+ import { OWNED_UI_SETTINGS_VERSION, findOwnedUiSettingDeclaration, } from "./declarations.js";
2
2
  import { migrationsFrom } from "./migrations.js";
3
3
  export function parseOwnedUiSettingsDocument(raw) {
4
4
  let parsed;
@@ -122,18 +122,6 @@ export function resolveOwnedUiSettings(input) {
122
122
  export function settingValue(resolution, id) {
123
123
  return resolution.settings.find(setting => setting.declaration.id === id)?.value ?? null;
124
124
  }
125
- /** Resolve the launch-routing flag without constructing the UI settings manager. */
126
- export function resolveResidentTabsSetting(document) {
127
- if (document === null || document.version !== OWNED_UI_SETTINGS_VERSION)
128
- return false;
129
- const resolution = resolveOwnedUiSettings({
130
- declarations: [OWNED_SETTING_DECLARATIONS.residentTabs],
131
- migrations: [],
132
- document,
133
- currentVersion: OWNED_UI_SETTINGS_VERSION,
134
- });
135
- return settingValue(resolution, "residentTabs") === true;
136
- }
137
125
  export function documentFrom(resolution) {
138
126
  const values = { ...resolution.preserved };
139
127
  for (const setting of resolution.settings) {
@@ -2,11 +2,7 @@ export const AGENT_SECTION_ID = "agent";
2
2
  const BOOLEAN_CHOICES = Object.freeze([true, false]);
3
3
  export function buildOwnedUiSettingsSections(input) {
4
4
  const grouped = new Map();
5
- const residentTabsEnabled = input.resolution.settings
6
- .find(setting => setting.declaration.id === "residentTabs")?.value === true;
7
5
  for (const setting of input.resolution.settings) {
8
- if (!residentTabsEnabled && ["tabsUnresponsiveRestartSeconds", "tabsStallNoticeSeconds"].includes(setting.declaration.id))
9
- continue;
10
6
  const section = setting.declaration.section ?? { id: "a1", title: "A1" };
11
7
  const group = grouped.get(section.id) ?? { title: section.title, entries: [] };
12
8
  group.entries.push({
@@ -0,0 +1,37 @@
1
+ # Resident tabs acceptance: Linux x64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Pull-request `terminal-host` lane on `ubuntu-24.04`: native unit and role-integration suites, every named crash point recovering to a clean start, the 10,000-schedule simulation corpus, `a1 tabs` maintenance end to end, and the release build of the terminal host with its manifest, session lock, and notices.
19
+ - Pull-request `resident-chaos` lane on `ubuntu-24.04`: bounded randomized kills of servers, holders, and agents against the release-built host, with no duplicate tabs or holders and no orphaned processes.
20
+ - Publication `terminal_hosts` job on `ubuntu-24.04`: the release artifact is rebuilt, its `--version` identity checked, and packing refuses a missing or altered artifact.
21
+ - Bounded fuzzing of every decoder and parser runs on this lane; it proves parser robustness, not platform behavior.
22
+
23
+ ## Physical verdicts
24
+
25
+ | # | Item | Verdict | Notes |
26
+ |---|---|---|---|
27
+ | 1 | Terminal close mid-turn | pending | |
28
+ | 2 | SSH or remote-session loss | pending | |
29
+ | 3 | Forced attach-client kill | pending | |
30
+ | 4 | Reattach fidelity | pending | |
31
+ | 5 | Input and render smoothness | pending | |
32
+ | 6 | Extension text UI | pending | |
33
+ | 7 | Two clients and controller transfer | pending | |
34
+ | 8 | Server, holder, and child failure | pending | |
35
+ | 9 | Sensitive-data separation | pending | |
36
+ | 10 | Conflict-safe direct rollback | pending | |
37
+ | 11 | Logout (Linux) | pending | |
@@ -0,0 +1,36 @@
1
+ # Resident tabs acceptance: macOS arm64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Pull-request `terminal-host` lane on `macos-15`: native unit and role-integration suites, every named crash point recovering to a clean start, the 10,000-schedule simulation corpus, `a1 tabs` maintenance end to end, and the release build of the terminal host with its manifest, session lock, and notices.
19
+ - Pull-request `resident-chaos` lane on `macos-15`: bounded randomized kills of servers, holders, and agents against the release-built host, with no duplicate tabs or holders and no orphaned processes.
20
+ - Publication `terminal_hosts` job on `macos-15`: the release artifact is rebuilt, its `--version` identity checked, and packing refuses a missing or altered artifact.
21
+
22
+ ## Physical verdicts
23
+
24
+ | # | Item | Verdict | Notes |
25
+ |---|---|---|---|
26
+ | 1 | Terminal close mid-turn | pending | |
27
+ | 2 | SSH or remote-session loss | pending | |
28
+ | 3 | Forced attach-client kill | pending | |
29
+ | 4 | Reattach fidelity | pending | |
30
+ | 5 | Input and render smoothness | pending | |
31
+ | 6 | Extension text UI | pending | |
32
+ | 7 | Two clients and controller transfer | pending | |
33
+ | 8 | Server, holder, and child failure | pending | |
34
+ | 9 | Sensitive-data separation | pending | |
35
+ | 10 | Conflict-safe direct rollback | pending | |
36
+ | 11 | Logout (Linux) | not applicable | Linux-only item. |
@@ -0,0 +1,35 @@
1
+ # Resident tabs acceptance: macOS x64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Publication `terminal_hosts` and `guardians` jobs on `macos-15-intel`: the release terminal host and process guardian are built for Intel macOS, the host's `--version` identity is checked, and packing refuses a missing or altered artifact.
19
+ - Known gap: the pull-request `terminal-host` and `resident-chaos` suites run on macOS arm64 only, because modular validation outcomes are keyed by platform without architecture. Intel macOS has build and identity evidence but no automated behavior suite of its own.
20
+
21
+ ## Physical verdicts
22
+
23
+ | # | Item | Verdict | Notes |
24
+ |---|---|---|---|
25
+ | 1 | Terminal close mid-turn | pending | |
26
+ | 2 | SSH or remote-session loss | pending | |
27
+ | 3 | Forced attach-client kill | pending | |
28
+ | 4 | Reattach fidelity | pending | |
29
+ | 5 | Input and render smoothness | pending | |
30
+ | 6 | Extension text UI | pending | |
31
+ | 7 | Two clients and controller transfer | pending | |
32
+ | 8 | Server, holder, and child failure | pending | |
33
+ | 9 | Sensitive-data separation | pending | |
34
+ | 10 | Conflict-safe direct rollback | pending | |
35
+ | 11 | Logout (Linux) | not applicable | Linux-only item. |
@@ -0,0 +1,36 @@
1
+ # Resident tabs acceptance: Windows x64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Pull-request `terminal-host` lane on `windows-2025`: native unit and role-integration suites, every named crash point recovering to a clean start, the 10,000-schedule simulation corpus, `a1 tabs` maintenance end to end, and the release build of the terminal host with its manifest, session lock, and notices.
19
+ - Pull-request `resident-chaos` lane on `windows-2025`: bounded randomized kills of servers, holders, and agents against the release-built host, with no duplicate tabs or holders and no orphaned processes.
20
+ - Publication `terminal_hosts` job on `windows-2025`: the release artifact is rebuilt, its `--version` identity checked, and packing refuses a missing or altered artifact.
21
+
22
+ ## Physical verdicts
23
+
24
+ | # | Item | Verdict | Notes |
25
+ |---|---|---|---|
26
+ | 1 | Terminal close mid-turn | pending | Milestone 2 passed this item against development build `09028be5` (run 38159593912); that evidence is for that build, not this package. |
27
+ | 2 | SSH or remote-session loss | pending | Milestone 2 passed Windows OpenSSH loss against development build `09028be5`; it is not evidence for this package. |
28
+ | 3 | Forced attach-client kill | pending | |
29
+ | 4 | Reattach fidelity | pending | |
30
+ | 5 | Input and render smoothness | pending | |
31
+ | 6 | Extension text UI | pending | |
32
+ | 7 | Two clients and controller transfer | pending | |
33
+ | 8 | Server, holder, and child failure | pending | |
34
+ | 9 | Sensitive-data separation | pending | |
35
+ | 10 | Conflict-safe direct rollback | pending | |
36
+ | 11 | Logout (Linux) | not applicable | Linux-only item. |
@@ -47,6 +47,8 @@ Pending review preserves a possible external interface, not an obsolete private
47
47
  | `RELEASE_RUNNER_LABEL` | Release/full-regression workflows supply certification-runner provenance to `run-release-gates.mjs`. |
48
48
  | `TERMINAL_FIXTURE_INPUT`, `TERMINAL_FIXTURE_TOKEN` | Native terminal probe producer/consumer in `native/terminal-host/src/main.rs`; expected input and fixture token. |
49
49
  | `TERMINAL_HOST_LOCAL_BUILD` | Developer shell sets exactly `1`; `native/terminal-host/build.rs` then permits a Windows build outside CI. |
50
+ | `TERMINAL_HOST_EXPORT_VT` | Native validation lanes in `.github/workflows/ci.yml` name a directory; `build.rs` copies the linked terminal library, headers, and manifest there for upload. |
51
+ | `TERMINAL_HOST_PREBUILT_VT` | Developer shell names a fetched library directory; with `TERMINAL_HOST_LOCAL_BUILD=1` and no `CI`, `build.rs` verifies its manifest and links it instead of running Zig. |
50
52
  | `DOCS_AUTO_MERGE_POLL_ATTEMPTS`, `DOCS_AUTO_MERGE_POLL_MS` | Documentation automation polling controls, produced by governance tests and consumed by `manage-documentation-auto-merge.mjs`. |
51
53
  | `VALIDATION_JOB_STARTED_MS`, `RENDERING_JOB_STARTED_MS` | CI timing handoffs within `.github/workflows/ci.yml`; epoch milliseconds. |
52
54
  | `RUN_PROCESS_CONTAINMENT_INTEGRATION` | CI enables the real containment fixture with exactly `1`; platform containment tests consume it. |
@@ -21,6 +21,8 @@ dist/native/darwin-x64/process-guardian
21
21
  dist/native/darwin-arm64/process-guardian
22
22
  ```
23
23
 
24
+ The publication `guardians` job builds them on `windows-2025`, `ubuntu-24.04`, `macos-15` (arm64), and `macos-15-intel` (x64).
25
+
24
26
  Each supported artifact must be named in the release integrity manifest with target triple, crate version, guardian protocol version, SHA-256, byte size, build provenance, and signature/attestation status. The build marks a platform supported only after its native containment integration runs on that platform. A missing, altered, incompatible, unsupported, or wrong-platform artifact is a concise containment launch error; A1 never silently falls back to PID-only cleanup.
25
27
 
26
28
  ## Licensing