@code-yeongyu/senpi-codemode 2026.10.16 → 2026.10.18

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
@@ -12,6 +12,56 @@
12
12
 
13
13
  ### Removed
14
14
 
15
+ ## [2026.10.18] - 2026-10-18
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ ### Removed
26
+
27
+ ## [2026.10.16-4] - 2026-10-16
28
+
29
+ ### Breaking Changes
30
+
31
+ ### Added
32
+
33
+ ### Changed
34
+
35
+ ### Fixed
36
+
37
+ ### Removed
38
+
39
+ ## [2026.10.16-3] - 2026-10-16
40
+
41
+ ### Breaking Changes
42
+
43
+ ### Added
44
+
45
+ ### Changed
46
+
47
+ ### Fixed
48
+
49
+ ### Removed
50
+
51
+ ## [2026.10.16-2] - 2026-10-16
52
+
53
+ ### Breaking Changes
54
+
55
+ ### Added
56
+
57
+ ### Changed
58
+
59
+ ### Fixed
60
+
61
+ - Julia writes its startup status and ready frames pre-encoded, so neither a fresh nor an interrupt-replacement interpreter runs the frame encoder before its first cell; all startup stages are still reported ([#3048](https://github.com/code-yeongyu/senpi/issues/3048)).
62
+
63
+ ### Removed
64
+
15
65
  ## [2026.10.16] - 2026-10-16
16
66
 
17
67
  ### Breaking Changes
package/README.md CHANGED
@@ -654,7 +654,7 @@ bun run --cwd packages/senpi-codemode gate --target <base-checkout> \
654
654
  ```
655
655
 
656
656
  Record with the canonical runtimes, so the baseline's runtime observations do not
657
- flip between recordings: Bun 1.4.2, Python 3.14, Julia 1.12 and Ruby 4.x from
657
+ flip between recordings: Bun 1.4.3, Python 3.14, Julia 1.12 and Ruby 4.x from
658
658
  Homebrew (put `/opt/homebrew/opt/ruby/bin` first on `PATH`; macOS's system Ruby
659
659
  2.6 records a different runtime). Check `ruby --version` and `python3 --version`
660
660
  before `--write-baseline`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.10.16",
3
+ "version": "2026.10.18",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -33,15 +33,15 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@babel/parser": "8.0.4",
36
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.10.16",
36
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.10.18",
37
37
  "quickjs-wasi": "3.6.2",
38
38
  "typebox": "1.3.34"
39
39
  },
40
40
  "peerDependencies": {
41
- "@code-yeongyu/senpi": "2026.10.16"
41
+ "@code-yeongyu/senpi": "2026.10.18"
42
42
  },
43
43
  "devDependencies": {
44
- "@code-yeongyu/senpi": "2026.10.16"
44
+ "@code-yeongyu/senpi": "2026.10.18"
45
45
  },
46
46
  "keywords": [
47
47
  "senpi",
@@ -161,14 +161,21 @@ function senpi_json_parse(input::AbstractString)
161
161
  parsed_result
162
162
  end
163
163
 
164
- function senpi_emit(frame)
164
+ function senpi_emit_line(line::String)
165
165
  lock(senpi_write_lock) do
166
- println(SENPI_ORIGINAL_STDOUT, senpi_json(frame))
166
+ println(SENPI_ORIGINAL_STDOUT, line)
167
167
  flush(SENPI_ORIGINAL_STDOUT)
168
168
  end
169
169
  nothing
170
170
  end
171
171
 
172
+ senpi_emit(frame) = senpi_emit_line(senpi_json(frame))
173
+
174
+ # Startup frames are constant: writing them pre-encoded keeps the generic encoder
175
+ # from running (and specializing) in every fresh or replacement interpreter.
176
+ const SENPI_HOST_INIT_FRAME = "{\"type\":\"status\",\"event\":{\"op\":\"kernel-startup\",\"stage\":\"host-init\"}}"
177
+ const SENPI_READY_FRAME = "{\"type\":\"ready\",\"memoryGlobals\":true}"
178
+
172
179
  function senpi_emit_stream(stream::String, bytes::Vector{UInt8})
173
180
  senpi_current_cell === nothing && return nothing
174
181
  isempty(bytes) && return nothing
@@ -356,9 +363,9 @@ while !eof(SENPI_ORIGINAL_STDIN)
356
363
  message isa AbstractDict || error("Bridge frame must be an object")
357
364
  kind = get(message, "type", nothing)
358
365
  if kind == "init"
359
- senpi_emit(Dict("type" => "status", "event" => Dict("op" => "kernel-startup", "stage" => "host-init")))
366
+ senpi_emit_line(SENPI_HOST_INIT_FRAME)
360
367
  senpi_set_connection(get(message, "connection", nothing))
361
- senpi_emit(Dict("type" => "ready", "memoryGlobals" => true))
368
+ senpi_emit_line(SENPI_READY_FRAME)
362
369
  elseif kind == "run"
363
370
  global senpi_memory_cell = nothing
364
371
  senpi_run_cell(message)