dsh-ptc-plus 0.3.1 → 0.4.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.
Files changed (200) hide show
  1. package/README.en.md +66 -73
  2. package/README.md +66 -73
  3. package/assets/ptc-plus-bindings-en.png +0 -0
  4. package/assets/ptc-plus-bindings-zh.png +0 -0
  5. package/assets/ptc-plus-repair-en.png +0 -0
  6. package/assets/ptc-plus-repair-zh.png +0 -0
  7. package/assets/ptc-plus-repl-workspace-en.png +0 -0
  8. package/assets/ptc-plus-repl-workspace-zh.png +0 -0
  9. package/assets/ptc-plus-settings-en.png +0 -0
  10. package/assets/ptc-plus-settings-zh.png +0 -0
  11. package/client.js +30610 -722
  12. package/compiler-amaro.cjs +5 -0
  13. package/compiler-amaro.cjs.map +6 -0
  14. package/compiler-asset-124f80c1bba92ff5fe79cfec6e8ad518f476de4a42514cae3919538887f510e8.txt +1 -0
  15. package/compiler-assets.json +3 -0
  16. package/compiler-core.cjs +554 -0
  17. package/compiler-core.cjs.map +6 -0
  18. package/compiler-platform.cjs +2 -0
  19. package/compiler-platform.cjs.map +6 -0
  20. package/compiler-typescript.cjs +388 -0
  21. package/compiler-typescript.cjs.map +6 -0
  22. package/docs/README.md +6 -0
  23. package/docs/adr/0004-declare-program-bindings-at-the-host.md +1 -1
  24. package/docs/adr/0006-rewrite-module-syntax-with-an-ast.md +6 -4
  25. package/docs/adr/0007-separate-worker-transport-from-session-semantics.md +15 -3
  26. package/docs/adr/0009-bound-expensive-acceptance-default.md +2 -0
  27. package/docs/adr/0010-session-log-derived-recovery-tips.md +59 -5
  28. package/docs/adr/0011-isolate-the-local-recovery-tip-provider.md +1 -1
  29. package/docs/adr/0012-preserve-mixed-destructuring-initialization.md +3 -1
  30. package/docs/adr/0013-isolate-repl-redeclaration-convenience.md +9 -3
  31. package/docs/adr/0014-persist-cell-rewrite-policy.md +11 -5
  32. package/docs/adr/0015-preserve-source-positions-through-rewrites.md +1 -1
  33. package/docs/adr/0016-archive-resolved-review-findings.md +1 -1
  34. package/docs/adr/0017-track-the-latest-dsh-public-surface.md +49 -0
  35. package/docs/adr/0018-use-versioned-fixture-for-ab-benchmark.md +3 -3
  36. package/docs/adr/0019-plugin-settings-and-kill-switch.md +8 -6
  37. package/docs/adr/0020-optional-cordis-tools-in-ptc-mode.md +2 -2
  38. package/docs/adr/0021-separate-host-bootstrap-from-session-runtime.md +17 -3
  39. package/docs/adr/0023-global-user-bindings.md +104 -0
  40. package/docs/adr/0024-repl-console-observation.md +33 -0
  41. package/docs/adr/0025-use-versioned-logical-binding-identities.md +119 -0
  42. package/docs/adr/0026-persist-the-delivery-verdict-against-the-verified-candidate.md +21 -0
  43. package/docs/adr/0027-run-the-session-kernel-in-a-killable-helper-process.md +37 -0
  44. package/docs/adr/0028-attach-to-the-host-ptc-execution-seam.md +103 -0
  45. package/docs/adr/0029-keep-plugin-unavailability-out-of-the-host-agent-lifecycle.md +27 -0
  46. package/docs/adr/0030-serve-both-typert-codec-generations-from-one-codec.md +27 -0
  47. package/docs/architecture.md +82 -22
  48. package/docs/binding-review-placement-design.md +200 -0
  49. package/docs/capability-projection.md +1 -1
  50. package/docs/client-ui.md +96 -20
  51. package/docs/durability-design.md +61 -24
  52. package/docs/evaluation.md +78 -6
  53. package/docs/installation.md +41 -6
  54. package/docs/program-data-plane.md +6 -0
  55. package/docs/publishing.md +5 -3
  56. package/docs/runtime-reference.md +79 -25
  57. package/docs/semantic-validation.md +29 -0
  58. package/docs/stateful-binding-updates-proposal.md +755 -0
  59. package/docs/user-bindings.en.md +64 -0
  60. package/docs/user-bindings.md +64 -0
  61. package/docs/value-wire.md +3 -3
  62. package/docs/verification.md +57 -0
  63. package/index.js +374 -92
  64. package/internal/ast-traversal.js +5 -2
  65. package/internal/binding-descriptors.js +1 -0
  66. package/internal/binding-pattern-traversal.js +25 -0
  67. package/internal/binding-pattern.js +26 -29
  68. package/internal/binding-source-analysis.js +391 -0
  69. package/internal/binding-update-policy.js +66 -0
  70. package/internal/bounded-worker-round.js +56 -0
  71. package/internal/callable-definition-environment.js +42 -0
  72. package/internal/callable-source-catalog.js +129 -0
  73. package/internal/callable-source-encoding.js +47 -0
  74. package/internal/callable-source-facts.js +459 -0
  75. package/internal/callable-source-format.js +2 -0
  76. package/internal/callable-source-lowering.js +123 -0
  77. package/internal/cell-analysis-contract.js +25 -0
  78. package/internal/cell-analysis.js +252 -242
  79. package/internal/cell-completion.js +15 -0
  80. package/internal/cell-error.js +7 -0
  81. package/internal/cell-parser.js +66 -0
  82. package/internal/cell-rewriter.js +3 -553
  83. package/internal/commonjs-export-evidence.js +63 -0
  84. package/internal/commonjs-source-evidence.js +72 -0
  85. package/internal/compiler-amaro.cjs +2 -0
  86. package/internal/compiler-compression.js +12 -0
  87. package/internal/compiler-data.js +58 -0
  88. package/internal/compiler-descriptors.js +54 -0
  89. package/internal/compiler-dynamic-cache.js +48 -0
  90. package/internal/compiler-entry.js +35 -0
  91. package/internal/compiler-generated-names.js +17 -0
  92. package/internal/compiler-intrinsics.js +84 -0
  93. package/internal/compiler-module-links.js +34 -0
  94. package/internal/compiler-operations.js +61 -0
  95. package/internal/compiler-platform-factory.js +84 -0
  96. package/internal/compiler-platform.js +136 -0
  97. package/internal/compiler-record-roles.js +53 -0
  98. package/internal/compiler-region-output.js +259 -0
  99. package/internal/compiler-resource-lowering.js +103 -0
  100. package/internal/compiler-scope-facts.js +115 -0
  101. package/internal/compiler-service.js +109 -0
  102. package/internal/compiler-source-cache.js +32 -0
  103. package/internal/compiler-source-pieces.js +93 -0
  104. package/internal/compiler-source-regions.js +132 -0
  105. package/internal/compiler-storage-source.js +54 -0
  106. package/internal/compiler-text.js +15 -0
  107. package/internal/compiler-typescript.cjs +2 -0
  108. package/internal/config-spec.js +91 -25
  109. package/internal/cordis-tools-owner.js +130 -21
  110. package/internal/diagnostic.js +27 -1
  111. package/internal/direct-surface-owner.js +76 -23
  112. package/internal/dynamic-binding-evidence.js +16 -0
  113. package/internal/dynamic-environment-compiler.js +779 -0
  114. package/internal/dynamic-environment-integration.js +87 -0
  115. package/internal/dynamic-environment-runtime.js +362 -0
  116. package/internal/dynamic-native-calls.js +150 -0
  117. package/internal/dynamic-native-runtime.js +248 -0
  118. package/internal/dynamic-scope-analysis.js +90 -0
  119. package/internal/edit-transport-owner.js +28 -3
  120. package/internal/execution-seam-compat.js +193 -0
  121. package/internal/failure-reporting.js +118 -18
  122. package/internal/host-rpc.js +66 -0
  123. package/internal/isolated-worker.js +548 -0
  124. package/internal/kernel-child.js +139 -0
  125. package/internal/kernel-worker.js +911 -116
  126. package/internal/language-semantics.js +14 -0
  127. package/internal/legacy-binding-catalog.js +48 -0
  128. package/internal/legacy-cell-analysis.js +600 -0
  129. package/internal/legacy-cell-parser.js +50 -0
  130. package/internal/legacy-cell-rewriter.js +631 -0
  131. package/internal/legacy-repl-convenience.js +291 -0
  132. package/internal/managed-module-operations.js +170 -0
  133. package/internal/module-compilation.js +321 -0
  134. package/internal/module-runtime-platform.js +19 -0
  135. package/internal/module-transform-contract.js +12 -0
  136. package/internal/native-await-declarations.js +68 -0
  137. package/internal/native-root-compilation.js +54 -0
  138. package/internal/native-root-dynamic.js +67 -0
  139. package/internal/recovery-tips.js +27 -15
  140. package/internal/rejected-cell-editor.js +13 -8
  141. package/internal/repl-convenience.js +2 -201
  142. package/internal/repl-memory-projection.js +81 -12
  143. package/internal/repl-observation-interest.js +70 -0
  144. package/internal/repl-rewrite-contract.js +21 -0
  145. package/internal/repl-scope-normalizer.js +2091 -0
  146. package/internal/repl-value-observer.js +114 -0
  147. package/internal/rpc-contract.js +52 -0
  148. package/internal/runtime-bridge-owner.js +172 -28
  149. package/internal/runtime-config.js +48 -51
  150. package/internal/runtime-contexts.js +82 -10
  151. package/internal/runtime-messages.js +111 -0
  152. package/internal/session-cell-executor.js +455 -91
  153. package/internal/session-journal-recovery.js +684 -0
  154. package/internal/session-journal-schema.js +106 -0
  155. package/internal/session-journal.js +237 -440
  156. package/internal/session-log-view.js +42 -9
  157. package/internal/session-runtime.js +325 -80
  158. package/internal/session-state.js +249 -40
  159. package/internal/source-position-map.js +211 -71
  160. package/internal/stateful-module-compiler.js +154 -0
  161. package/internal/stateful-module-runtime.js +303 -0
  162. package/internal/stateful-root-compiler.js +598 -0
  163. package/internal/stateful-root-runtime.js +340 -0
  164. package/internal/typert-codec-compat.js +28 -0
  165. package/internal/typescript-transform.js +29 -0
  166. package/internal/user-binding-authoring.js +70 -0
  167. package/internal/user-binding-console-worker.js +184 -0
  168. package/internal/user-binding-console.js +148 -0
  169. package/internal/user-binding-draft-projection.js +335 -0
  170. package/internal/user-binding-model-context.js +31 -0
  171. package/internal/user-binding-runner.js +56 -0
  172. package/internal/user-bindings-owner.js +1065 -0
  173. package/internal/user-bindings-store.js +293 -0
  174. package/internal/user-bindings.js +353 -0
  175. package/internal/value-wire-schema.js +28 -0
  176. package/internal/value-wire.js +29 -20
  177. package/internal/worker-client.js +57 -67
  178. package/internal/worker-environment.js +45 -0
  179. package/internal/worker-output-relay.js +29 -0
  180. package/internal/worker-shutdown.js +14 -0
  181. package/package.json +81 -11
  182. package/src/client-activity.js +109 -45
  183. package/src/client-authoring-view.js +580 -0
  184. package/src/client-binding-review.js +230 -0
  185. package/src/client-bindings-data.js +29 -0
  186. package/src/client-catalog.js +127 -0
  187. package/src/client-code-editor.js +84 -0
  188. package/src/client-console.js +112 -0
  189. package/src/client-copy.js +370 -0
  190. package/src/client-feature-gates.js +62 -0
  191. package/src/client-host-compat.js +150 -0
  192. package/src/client-indicator-view.js +267 -0
  193. package/src/client-repl-view.js +292 -0
  194. package/src/client-rpc.js +20 -0
  195. package/src/client-settings-view.js +221 -0
  196. package/src/client-styles.js +106 -0
  197. package/src/client-tool-view.js +108 -0
  198. package/src/client-transport.js +159 -0
  199. package/src/client-workbench.js +521 -0
  200. package/src/client.js +233 -615
@@ -0,0 +1,159 @@
1
+ import { RPC_CONTRACTS } from '../internal/rpc-contract.js'
2
+ import { normalizeReplMemorySnapshot } from '../internal/repl-memory-projection.js'
3
+
4
+ /**
5
+ * Client-side transport state machines that own their own invalidation:
6
+ *
7
+ * - observeRepl watches one visible REPL region, retries the watch with bounded
8
+ * backoff and only reports an observation that still matches the requested
9
+ * inventory. Everything it starts is aborted by its disposer.
10
+ * - createBindingCommandAvailability publishes one boolean per session for the
11
+ * `binding` command, keyed by epoch so a late `commands.list` answer can never
12
+ * revive a subscription that already ended.
13
+ */
14
+ export function createReplObserver({ rpc, ctx }) {
15
+ function observeRepl(sessionId, element, memory, onObservation) {
16
+ let controller
17
+ let retryTimer
18
+ let retries = 0
19
+ let disposed = false
20
+ const retryDelays = [1000, 2000, 4000]
21
+ let visible = typeof IntersectionObserver !== 'function'
22
+ const stop = () => {
23
+ const previous = controller
24
+ controller = undefined
25
+ clearTimeout(retryTimer)
26
+ retryTimer = undefined
27
+ retries = 0
28
+ previous?.abort()
29
+ }
30
+ const watch = async current => {
31
+ try {
32
+ await rpc.call(RPC_CONTRACTS.repl, 'watch', { sessionId }, current.signal)
33
+ } catch {}
34
+ if (disposed || controller !== current) return
35
+ controller = undefined
36
+ current.abort()
37
+ if (!visible || document.visibilityState === 'hidden') { stop(); return }
38
+ const delay = retryDelays[retries++]
39
+ if (delay === undefined) return
40
+ retryTimer = setTimeout(() => { retryTimer = undefined; sync() }, delay)
41
+ }
42
+ const read = async current => {
43
+ if (!memory.available || memory.entries.length === 0 || memory.observation !== undefined) return
44
+ try {
45
+ const result = await rpc.call(RPC_CONTRACTS.repl, 'observe', { sessionId, memory }, current.signal)
46
+ if (disposed || controller !== current || current.signal.aborted || result?.ok !== true || result.value === null) return
47
+ const observed = normalizeReplMemorySnapshot(result.value)
48
+ const { observation, ...inventory } = observed
49
+ if (observation !== undefined && JSON.stringify(inventory) === JSON.stringify(memory)) onObservation(observed)
50
+ } catch {}
51
+ }
52
+ const sync = () => {
53
+ if (disposed) return
54
+ const active = visible && document.visibilityState !== 'hidden'
55
+ if (!active) { stop(); return }
56
+ if (controller !== undefined || retryTimer !== undefined || retries > retryDelays.length) return
57
+ controller = new AbortController()
58
+ void watch(controller)
59
+ void read(controller)
60
+ }
61
+ const observer = typeof IntersectionObserver === 'function' ? new IntersectionObserver(entries => {
62
+ visible = entries.some(entry => entry.isIntersecting)
63
+ sync()
64
+ }) : undefined
65
+ observer?.observe(element)
66
+ const reset = ctx.on('connection/reset', () => { stop(); sync() })
67
+ document.addEventListener('visibilitychange', sync)
68
+ sync()
69
+ return () => {
70
+ disposed = true
71
+ stop()
72
+ observer?.disconnect()
73
+ document.removeEventListener('visibilitychange', sync)
74
+ reset()
75
+ }
76
+ }
77
+
78
+ return { observeRepl }
79
+ }
80
+
81
+ export function createBindingCommandAvailability(scope) {
82
+ const entries = new Map()
83
+ let commandRemote
84
+ const entryFor = (sessionId) => {
85
+ const id = String(sessionId)
86
+ let entry = entries.get(id)
87
+ if (entry === undefined) {
88
+ entry = { available: false, epoch: 0, listeners: new Set() }
89
+ entry.source = {
90
+ getSnapshot: () => entry.available,
91
+ subscribe(listener) {
92
+ entry.listeners.add(listener)
93
+ if (entry.listeners.size === 1) void refresh(id)
94
+ return () => {
95
+ entry.listeners.delete(listener)
96
+ if (entry.listeners.size === 0) {
97
+ entry.epoch++
98
+ entry.available = false
99
+ }
100
+ }
101
+ },
102
+ }
103
+ entries.set(id, entry)
104
+ }
105
+ return entry
106
+ }
107
+ const publish = (entry, available) => {
108
+ if (entry.available === available) return
109
+ entry.available = available
110
+ for (const listener of entry.listeners) listener()
111
+ }
112
+ const refresh = async (sessionId) => {
113
+ if (sessionId === undefined || sessionId === null) return
114
+ const entry = entries.get(String(sessionId))
115
+ if (entry === undefined || entry.listeners.size === 0) return
116
+ const epoch = ++entry.epoch
117
+ let available = false
118
+ try {
119
+ const result = await commandRemote?.commands.list(String(sessionId))
120
+ available = result?.ok === true
121
+ && Array.isArray(result.value)
122
+ && result.value.some(command => command?.name === 'binding')
123
+ } catch {}
124
+ if (entry.epoch === epoch) publish(entry, available)
125
+ }
126
+ const reset = (sessionId) => {
127
+ if (sessionId === undefined || sessionId === null) return
128
+ const entry = entries.get(String(sessionId))
129
+ if (entry === undefined || entry.listeners.size === 0) return
130
+ entry.epoch += 1
131
+ publish(entry, false)
132
+ void refresh(sessionId)
133
+ }
134
+ scope.inject(['remote', 'remote.commands'], commandScope => {
135
+ commandRemote = commandScope.remote
136
+ commandScope.effect(() => commandScope.remote.$on('commands/change', () => {
137
+ for (const sessionId of entries.keys()) void refresh(sessionId)
138
+ }))
139
+ commandScope.effect(() => commandScope.remote.$on('agent-preset/selected', reset))
140
+ for (const sessionId of entries.keys()) void refresh(sessionId)
141
+ commandScope.effect(() => () => {
142
+ commandRemote = undefined
143
+ for (const entry of entries.values()) {
144
+ entry.epoch++
145
+ publish(entry, false)
146
+ }
147
+ })
148
+ })
149
+ scope.on('connection/reset', () => {
150
+ for (const sessionId of entries.keys()) reset(sessionId)
151
+ })
152
+ scope.effect(() => () => {
153
+ for (const entry of entries.values()) entry.epoch++
154
+ entries.clear()
155
+ })
156
+ return Object.freeze({
157
+ source: sessionId => entryFor(sessionId).source,
158
+ })
159
+ }