@bitefoundry/retrieviewer 0.0.7 → 0.0.9

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.
@@ -35,6 +35,18 @@ must be checked again for the final release bytes.
35
35
 
36
36
  ## Remaining limits
37
37
 
38
+ 0.0.9 adds offline torso-envelope constraints to the same single-source watch
39
+ coordinate field, using only the existing seated key as a volume reference.
40
+ Face pixels remain exact; the connected neck/body is spatially registered, not
41
+ composited with another illustration. No new visual input or asset family;
42
+ existing CC BY-SA4.0 attribution and licenses remain.
43
+
44
+ 0.0.8 replaces the watch-body joins with offline coordinate registration of
45
+ the same single source drawing per sample. Four paw patches and a shared ground
46
+ plane constrain the lower-body warp; original head/neck pixels remain exact.
47
+ No new image, photograph or video reference is introduced; CC BY-SA4.0 and
48
+ existing attribution remain unchanged.
49
+
38
50
  0.0.6 re-registers only the36 watch samples of the existing behavior archive.
39
51
  The existing seated body/paws stay fixed while the authored head turns; no new
40
52
  image/photo/video reference is introduced. The offline preparation and source
package/PUPPY-MEMORY.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Runtime weight and performance
2
2
 
3
+ ## Fixed-volume watch torso (0.0.9)
4
+
5
+ Paw registration alone in0.0.8 left the upper torso unconstrained. In the36
6
+ watch samples, chest-region (source rows205..230, ink threshold>24) area/mean
7
+ silhouette width grew up to28.9% compared with the seated key. Offline torso
8
+ envelope calibration brings both below1.2%, with centroid movement below0.52
9
+ source pixels. Regression limits are2% chest area/width,1px centroid,3% whole
10
+ torso area (rows205..270), plus the existing four-paw and common-floor tests.
11
+
12
+ The same single-source inverse coordinate field now eases from y180 to205,
13
+ matches the seated torso envelope through y265 and joins the paw field by y275.
14
+ Only the silhouette calibration curves are smoothed, not fur pixels. Face rows
15
+ 0..179 remain byte-exact; the connected neck/bandana can move spatially to join
16
+ the stable chest, instead of freezing the inflated source torso or compositing
17
+ two pictures. The previous y230 pixel digest is superseded deliberately by a
18
+ face-only digest plus explicit body-volume tests. No new frames, runtime work,
19
+ buffer, dependency or process. The archive is3,118 bytes smaller than0.0.8.
20
+ Earlier release sections below are historical, not current registration rules.
21
+
22
+ ## Single-source watch registration and English desktop UI (0.0.8)
23
+
24
+ The0.0.7 neck fix still joined a different torso to the lower legs. This pass
25
+ removes that compositing entirely. Each watch sample uses one original drawing,
26
+ with a smooth inverse-coordinate field below y230 registering four paw patches
27
+ and the ground plane. Resampling always reads the original, never a previously
28
+ warped image. Head/jaw/neck/bandana pixels through y229 remain exact; endpoints
29
+ share the seated key. All36 watch samples have four-paw residual checks (<=2
30
+ source pixels) and a common floor test, in addition to the original neck digest.
31
+ Pillow/NumPy are offline authoring tools only. The shipped runtime has no new
32
+ dependency, warp pass, image buffer, frame count or process. The behavior archive
33
+ is9,369 compressed bytes smaller than0.0.7.
34
+
35
+ Desktop picker, controls, tray/menu and statuses use English. Windows/macOS
36
+ toolbars have64px buttons for English labels; existing Linux labels remain.
37
+ Windows native IPC/lifecycle tests and source-label WinForms layout checks at
38
+ 100%/200% cover this change. macOS has syntax/core/layout checks, not a real Mac
39
+ GUI test. Website EN/KO selection and user-supplied window titles are unchanged.
40
+
3
41
  ## Watch neck seam repair (0.0.7)
4
42
 
5
43
  The0.0.6 watch registration moved the entire head/neck8px and dissolved it into
package/RELEASING.md CHANGED
@@ -1,13 +1,14 @@
1
- # Retrieviewer 0.0.7 release process
2
-
3
- Current target: `@bitefoundry/retrieviewer@0.0.7`, public `latest`. The owner
4
- explicitly requested npm publication of the watch neck seam repair on2026-10-23.
5
- The authored head/jaw/neck/bandana remain together; chest contours are registered
6
- offline before joining the seated lower body. No new frames, runtime buffers,
7
- dependencies or per-frame work. Node crop compression and butterfly behavior
8
- from0.0.6 remain. MIT/CC BY-SA4.0 unchanged. Preserve0.0.6 and all earlier registry
9
- bytes; publish only the exact tested0.0.7 tarball. The historical scope below is
10
- not current verification evidence.
1
+ # Retrieviewer 0.0.9 release process
2
+
3
+ Current target: `@bitefoundry/retrieviewer@0.0.9`, public `latest`, continuing the
4
+ approved npm release workflow. The owner requested correction of the watch
5
+ torso's swelling on2026-10-23. Offline single-source registration now constrains
6
+ chest width/area/center and whole torso area, keeping the four paw anchors and
7
+ floor. Face pixels through y179 stay exact; neck coordinates can join the fixed
8
+ torso without image compositing. No new frames, dependencies, runtime work or
9
+ buffers. English desktop UI remains. MIT/CC BY-SA4.0 unchanged. Preserve0.0.8
10
+ and earlier registry bytes; publish only the exact tested0.0.9 tarball.
11
+ Historical scope below is not current verification.
11
12
 
12
13
  Target: `@bitefoundry/retrieviewer@0.0.4`, public npm registry, `latest` tag.
13
14
  The npm organization `bitefoundry` uses the free public-packages plan; account
@@ -14,12 +14,12 @@ var MIN_WIDTH = 160, MIN_HEIGHT = 120;
14
14
  var INK = [248, 242, 232, 245];
15
15
  var TERMINAL_OWNERS = ['Terminal', 'iTerm2', 'iTerm', 'WezTerm', 'wezterm-gui', 'Alacritty', 'kitty', 'Ghostty', 'Warp', 'Hyper', 'Tabby'];
16
16
  var TEXT = {
17
- preparing: '\uC900\uBE44 \uC911',
18
- playing: '\uD568\uAED8 \uB178\uB294 \uC911',
19
- accepted: '\uC88B\uC544!',
20
- busy: '\uC7A0\uAE50 \uAE30\uB2E4\uB824',
21
- engineError: '\uC5D4\uC9C4 \uC624\uB958',
22
- chooseFromMenu: '\uBA54\uB274 \uB9C9\uB300\uC5D0\uC11C \uCC3D \uC120\uD0DD'
17
+ preparing: 'Loading...',
18
+ playing: 'Playing',
19
+ accepted: 'Ready!',
20
+ busy: 'Please wait',
21
+ engineError: 'Engine error',
22
+ chooseFromMenu: 'Choose a window'
23
23
  };
24
24
 
25
25
  // Low profile: 12pt cells, or 16pt when a large window would exceed 20000 cells.
@@ -194,7 +194,7 @@ function pickerTargets(infos, ownPid) {
194
194
  var w = windowRecord(infos[i]);
195
195
  if (!w || w.pid === ownPid || w.layer !== 0 || w.alpha <= 0 || w.bounds.width < MIN_WIDTH || w.bounds.height < MIN_HEIGHT) continue;
196
196
  var terminal = TERMINAL_OWNERS.indexOf(w.owner) >= 0;
197
- var label = (terminal ? '[\uD130\uBBF8\uB110] ' : '') + (w.name ? w.name + ' \u00B7 ' + w.owner : w.owner + ' \u00B7 \uCC3D') + ' #' + w.id;
197
+ var label = (terminal ? '[Terminal] ' : '') + (w.name ? w.name + ' \u00B7 ' + w.owner : w.owner + ' - Window') + ' #' + w.id;
198
198
  result.push({ id: w.id, pid: w.pid, owner: w.owner, title: label, terminal: terminal });
199
199
  }
200
200
  result.sort(function (a, b) { return a.terminal === b.terminal ? (a.title < b.title ? -1 : a.title > b.title ? 1 : 0) : a.terminal ? -1 : 1; });
@@ -265,7 +265,7 @@ var STYLE_BORDERLESS = 0, STYLE_TITLED = 1, STYLE_CLOSABLE = 2, STYLE_NONACTIVAT
265
265
  var BACKING_BUFFERED = 2, FLOATING_LEVEL = 3, ACTIVATION_ACCESSORY = 1, ANIMATION_NONE = 2;
266
266
  // canJoinAllSpaces | stationary | ignoresCycle | fullScreenAuxiliary
267
267
  var OVERLAY_SPACES = 1 | 16 | 64 | 256;
268
- var BAR_WIDTH = 404, BAR_HEIGHT = 40;
268
+ var BAR_WIDTH = 538, BAR_HEIGHT = 40;
269
269
 
270
270
  var shell = null;
271
271
 
@@ -409,14 +409,14 @@ function startCompanion(testMode) {
409
409
  bar.setBackgroundColor($.NSColor.colorWithCalibratedRedGreenBlueAlpha(28 / 255, 30 / 255, 34 / 255, 0.94));
410
410
  bar.setFloatingPanel(true); bar.setBecomesKeyOnlyIfNeeded(true); bar.setLevel(FLOATING_LEVEL); bar.setCollectionBehavior(OVERLAY_SPACES);
411
411
  var content = bar.contentView;
412
- ballButton = makeButton('\uACF5', { x: 8, y: 6, width: 40, height: 28 }, 'onBall:');
412
+ ballButton = makeButton('Ball', { x: 8, y: 6, width: 64, height: 28 }, 'onBall:');
413
413
  content.addSubview(ballButton);
414
- content.addSubview(makeButton('\uAC04\uC2DD', { x: 52, y: 6, width: 46, height: 28 }, 'onTreat:'));
415
- content.addSubview(makeButton('\uD130\uADF8', { x: 102, y: 6, width: 46, height: 28 }, 'onTug:'));
416
- content.addSubview(makeButton('\uCC3D', { x: 152, y: 6, width: 40, height: 28 }, 'onPick:'));
417
- content.addSubview(makeButton('\uC27C', { x: 196, y: 6, width: 40, height: 28 }, 'onPause:'));
418
- content.addSubview(makeButton('\uC885\uB8CC', { x: 240, y: 6, width: 46, height: 28 }, 'onQuit:'));
419
- statusLabel = makeLabel(TEXT.preparing, { x: 292, y: 10, width: 108, height: 20 }, $.NSColor.whiteColor);
414
+ content.addSubview(makeButton('Treat', { x: 76, y: 6, width: 64, height: 28 }, 'onTreat:'));
415
+ content.addSubview(makeButton('Tug', { x: 144, y: 6, width: 64, height: 28 }, 'onTug:'));
416
+ content.addSubview(makeButton('Window', { x: 212, y: 6, width: 64, height: 28 }, 'onPick:'));
417
+ content.addSubview(makeButton('Pause', { x: 280, y: 6, width: 64, height: 28 }, 'onPause:'));
418
+ content.addSubview(makeButton('Quit', { x: 348, y: 6, width: 64, height: 28 }, 'onQuit:'));
419
+ statusLabel = makeLabel(TEXT.preparing, { x: 422, y: 10, width: 112, height: 20 }, $.NSColor.whiteColor);
420
420
  content.addSubview(statusLabel);
421
421
 
422
422
  // Menu bar item: the macOS counterpart of the Windows tray icon.
@@ -424,7 +424,7 @@ function startCompanion(testMode) {
424
424
  statusItem.button.setTitle($('\u28BF'));
425
425
  statusItem.button.setToolTip($('Retrieviewer'));
426
426
  var menu = $.NSMenu.alloc.initWithTitle($('Retrieviewer'));
427
- [['\uB2E4\uB978 \uCC3D \uC120\uD0DD', 'onPick:'], ['\uC228\uAE30\uAE30 / \uB2E4\uC2DC \uD45C\uC2DC', 'onPause:'], ['\uC885\uB8CC', 'onQuit:']].forEach(function (entry) {
427
+ [['Choose window', 'onPick:'], ['Hide / resume', 'onPause:'], ['Quit', 'onQuit:']].forEach(function (entry) {
428
428
  var item = $.NSMenuItem.alloc.initWithTitleActionKeyEquivalent($(entry[0]), entry[1], $(''));
429
429
  item.target = shell.controller;
430
430
  menu.addItem(item);
@@ -474,19 +474,19 @@ function startCompanion(testMode) {
474
474
  if (picker || core.state.quitting) return;
475
475
  core.setPicking(true); core.track(true);
476
476
  picker = makePanel({ x: 0, y: 0, width: 650, height: 230 }, STYLE_TITLED | STYLE_CLOSABLE);
477
- picker.setTitle($('Retrieviewer \u00B7 \uD568\uAED8 \uC788\uC744 \uCC3D'));
477
+ picker.setTitle($('Retrieviewer - Choose a window'));
478
478
  picker.setLevel(FLOATING_LEVEL);
479
479
  picker.setDelegate(shell.controller);
480
480
  var view = picker.contentView;
481
- view.addSubview(makeLabel('Codex\uB97C \uC0AC\uC6A9\uD558\uB294 \uD130\uBBF8\uB110 \uCC3D\uC744 \uC120\uD0DD\uD558\uC138\uC694.\n' +
482
- '\uB0B4\uC6A9\uC744 \uC77D\uC9C0 \uC54A\uACE0 \uCC3D\uC758 \uC704\uCE58\u00B7\uD06C\uAE30\uB9CC \uB530\uB77C\uAC11\uB2C8\uB2E4. \uD0ED\uC740 \uAD6C\uBCC4\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n' +
483
- '\uD654\uBA74 \uAE30\uB85D \uAD8C\uD55C\uC774 \uC5C6\uC73C\uBA74 \uC81C\uBAA9 \uB300\uC2E0 \uC571 \uC774\uB984\uACFC \uCC3D \uBC88\uD638\uAC00 \uBCF4\uC785\uB2C8\uB2E4.',
481
+ view.addSubview(makeLabel('Choose an app window for Retrieviewer.\n' +
482
+ 'Only its position and size are followed. Contents are never read.\n' +
483
+ 'Without Screen Recording permission, app names and window IDs replace titles.',
484
484
  { x: 18, y: 150, width: 614, height: 64 }, null));
485
485
  pickerList = $.NSPopUpButton.alloc.initWithFramePullsDown($.NSMakeRect(18, 106, 600, 28), false);
486
486
  view.addSubview(pickerList);
487
- view.addSubview(makeButton('\uC0C8\uB85C \uACE0\uCE68', { x: 18, y: 24, width: 100, height: 34 }, 'onRefresh:'));
488
- view.addSubview(makeButton('\uC774 \uCC3D\uC5D0 \uBD99\uC774\uAE30', { x: 378, y: 24, width: 140, height: 34 }, 'onAttach:'));
489
- view.addSubview(makeButton('\uCDE8\uC18C', { x: 528, y: 24, width: 90, height: 34 }, 'onCancel:'));
487
+ view.addSubview(makeButton('Refresh', { x: 18, y: 24, width: 100, height: 34 }, 'onRefresh:'));
488
+ view.addSubview(makeButton('Attach', { x: 378, y: 24, width: 140, height: 34 }, 'onAttach:'));
489
+ view.addSubview(makeButton('Cancel', { x: 528, y: 24, width: 90, height: 34 }, 'onCancel:'));
490
490
  refreshPicker();
491
491
  picker.center;
492
492
  app.activateIgnoringOtherApps(true);
@@ -499,7 +499,7 @@ function startCompanion(testMode) {
499
499
  emit({ type: 'picker', visible: false });
500
500
  if (core.state.quitting) return;
501
501
  if (!core.state.target) statusLabel.setStringValue($(TEXT.chooseFromMenu));
502
- statusItem.button.setToolTip($(core.state.target ? 'Retrieviewer \u00B7 \uCC3D\uC5D0 \uBD99\uC5B4 \uC788\uC74C' : 'Retrieviewer \u00B7 \uCC3D \uC120\uD0DD'));
502
+ statusItem.button.setToolTip($(core.state.target ? 'Retrieviewer - Attached' : 'Retrieviewer - Choose window'));
503
503
  // Hand focus back: to the window the user just chose, otherwise to whoever had it.
504
504
  var chosen = attachedPid ? $.NSRunningApplication.runningApplicationWithProcessIdentifier(attachedPid) : null;
505
505
  attachedPid = 0;
@@ -112,12 +112,12 @@ sealed class Companion : ApplicationContext {
112
112
  TargetItem target;Form pickerWindow;QuietWindow testTarget;readonly bool testMode;Rectangle canvas;int revision=0,cell=8;bool visible=false,paused=false,loaded=false,quitting=false,picking=false,announced=false;
113
113
  Label status=new Label();Mutex mutex;
114
114
  internal Companion(Mutex single,bool diagnostic){
115
- mutex=single;testMode=diagnostic;bar.Text="Retrieviewer controls";bar.Size=new Size(404,40);bar.BackColor=Color.FromArgb(28,30,34);bar.ForeColor=Color.White;
116
- bar.Font=new Font("Segoe UI",9);bar.Controls.Add(MakeButton("공",8,()=>Interact("ball")));bar.Controls.Add(MakeButton("간식",52,()=>Interact("treat")));
117
- bar.Controls.Add(MakeButton("터그",102,()=>Interact("tug")));bar.Controls.Add(MakeButton("창",152,ChooseTarget));bar.Controls.Add(MakeButton("쉼",196,TogglePause));bar.Controls.Add(MakeButton("종료",240,Quit));
118
- status.AutoSize=false;status.Location=new Point(290,12);status.Size=new Size(110,22);status.Text="준비 중";bar.Controls.Add(status);
119
- ContextMenuStrip menu=new ContextMenuStrip();menu.Items.Add("다른 창 선택",null,(s,e)=>ChooseTarget());menu.Items.Add("숨기기 / 다시 표시",null,(s,e)=>TogglePause());menu.Items.Add("종료",null,(s,e)=>Quit());
120
- tray.Icon=SystemIcons.Application;tray.Text="Retrieviewer · 창 선택";tray.ContextMenuStrip=menu;tray.Visible=true;tray.DoubleClick+=(s,e)=>ChooseTarget();
115
+ mutex=single;testMode=diagnostic;bar.Text="Retrieviewer controls";bar.Size=new Size(538,40);bar.BackColor=Color.FromArgb(28,30,34);bar.ForeColor=Color.White;
116
+ bar.Font=new Font("Segoe UI",9);bar.Controls.Add(MakeButton("Ball",8,()=>Interact("ball")));bar.Controls.Add(MakeButton("Treat",76,()=>Interact("treat")));
117
+ bar.Controls.Add(MakeButton("Tug",144,()=>Interact("tug")));bar.Controls.Add(MakeButton("Window",212,ChooseTarget));bar.Controls.Add(MakeButton("Pause",280,TogglePause));bar.Controls.Add(MakeButton("Quit",348,Quit));
118
+ status.AutoSize=false;status.Location=new Point(422,12);status.Size=new Size(112,22);status.Text="Loading...";bar.Controls.Add(status);
119
+ ContextMenuStrip menu=new ContextMenuStrip();menu.Items.Add("Choose window",null,(s,e)=>ChooseTarget());menu.Items.Add("Hide / resume",null,(s,e)=>TogglePause());menu.Items.Add("Quit",null,(s,e)=>Quit());
120
+ tray.Icon=SystemIcons.Application;tray.Text="Retrieviewer · Choose window";tray.ContextMenuStrip=menu;tray.Visible=true;tray.DoubleClick+=(s,e)=>ChooseTarget();
121
121
  // Handles are created on the UI thread before the reader can signal EOF.
122
122
  IntPtr unused=bar.Handle;unused=pet.Handle;
123
123
  Thread reader=new Thread(ReadInput);reader.IsBackground=true;reader.Start();
@@ -128,7 +128,7 @@ sealed class Companion : ApplicationContext {
128
128
  }
129
129
  }
130
130
  Button MakeButton(string title,int x,Action action){
131
- Button b=new Button();b.Text=title;b.TabStop=false;b.Size=new Size(title=="간식"||title=="터그"?46:40,28);b.Location=new Point(x,6);b.FlatStyle=FlatStyle.Flat;b.FlatAppearance.BorderSize=0;b.BackColor=Color.FromArgb(48,51,58);b.ForeColor=Color.White;b.Click+=(s,e)=>action();return b;
131
+ Button b=new Button();b.Text=title;b.TabStop=false;b.Size=new Size(64,28);b.Location=new Point(x,6);b.FlatStyle=FlatStyle.Flat;b.FlatAppearance.BorderSize=0;b.BackColor=Color.FromArgb(48,51,58);b.ForeColor=Color.White;b.Click+=(s,e)=>action();return b;
132
132
  }
133
133
  void ReadInput(){
134
134
  try{
@@ -150,9 +150,9 @@ sealed class Companion : ApplicationContext {
150
150
  for(;;){Dictionary<string,object> m;lock(inputLock){if(messages.Count==0)break;m=messages.Dequeue();}
151
151
  string type=Program.Str(m,"type");
152
152
  if(type=="quit"){Quit();return;}
153
- if(type=="loaded"){string ink=m.ContainsKey("ink")?Program.Str(m,"ink"):"cream";if(ink!="cream"&&ink!="gold"&&ink!="dark")throw new Exception("Invalid ink");pet.Ink=ink=="gold"?Color.FromArgb(245,231,184,103):ink=="dark"?Color.FromArgb(245,67,48,24):Color.FromArgb(245,248,242,232);loaded=true;status.Text="함께 노는 중";if(testMode)((Button)bar.Controls[0]).PerformClick();continue;}
154
- if(type=="interaction"){status.Text=Program.Bool(m,"accepted")?"좋아!":"잠깐 기다려";continue;}
155
- if(type=="error"){status.Text="엔진 오류";Quit();return;}
153
+ if(type=="loaded"){string ink=m.ContainsKey("ink")?Program.Str(m,"ink"):"cream";if(ink!="cream"&&ink!="gold"&&ink!="dark")throw new Exception("Invalid ink");pet.Ink=ink=="gold"?Color.FromArgb(245,231,184,103):ink=="dark"?Color.FromArgb(245,67,48,24):Color.FromArgb(245,248,242,232);loaded=true;status.Text="Playing";if(testMode)((Button)bar.Controls[0]).PerformClick();continue;}
154
+ if(type=="interaction"){status.Text=Program.Bool(m,"accepted")?"Ready!":"Please wait";continue;}
155
+ if(type=="error"){status.Text="Engine error";Quit();return;}
156
156
  if(type=="frame"){
157
157
  // Always acknowledge discarded frames too, otherwise resizing can deadlock the sender.
158
158
  bool painted=visible&&!paused&&Program.Int(m,"revision")==revision;
@@ -187,7 +187,7 @@ sealed class Companion : ApplicationContext {
187
187
  StringBuilder name=new StringBuilder(512);Native.GetWindowText(hwnd,name,name.Capacity);if(name.Length==0)return true;
188
188
  string process="";try{using(Process p=Process.GetProcessById((int)pid)){process=p.ProcessName;}}catch{}
189
189
  bool terminal=process.Equals("WindowsTerminal",StringComparison.OrdinalIgnoreCase)||process.IndexOf("wezterm",StringComparison.OrdinalIgnoreCase)>=0||process=="OpenConsole"||process=="conhost"||process=="mintty";
190
- result.Add(new TargetItem{Window=hwnd,Process=pid,Title=(terminal?"[터미널] ":"")+name.ToString()+" · "+process,Terminal=terminal});return true;
190
+ result.Add(new TargetItem{Window=hwnd,Process=pid,Title=(terminal?"[Terminal] ":"")+name.ToString()+" · "+process,Terminal=terminal});return true;
191
191
  },IntPtr.Zero);
192
192
  result.Sort((a,b)=>a.Terminal==b.Terminal?String.Compare(a.Title,b.Title,StringComparison.CurrentCulture):a.Terminal?-1:1);return result;
193
193
  }
@@ -195,15 +195,15 @@ sealed class Companion : ApplicationContext {
195
195
  if(picking||quitting)return;picking=true;Track(true);
196
196
  Form picker=new Form();pickerWindow=picker;
197
197
  {
198
- picker.Text="Retrieviewer · 함께 있을 창";picker.Size=new Size(650,230);picker.StartPosition=FormStartPosition.CenterScreen;picker.FormBorderStyle=FormBorderStyle.FixedDialog;picker.MaximizeBox=false;picker.MinimizeBox=false;picker.Font=new Font("Segoe UI",10);
198
+ picker.Text="Retrieviewer · Choose a window";picker.Size=new Size(650,230);picker.StartPosition=FormStartPosition.CenterScreen;picker.FormBorderStyle=FormBorderStyle.FixedDialog;picker.MaximizeBox=false;picker.MinimizeBox=false;picker.Font=new Font("Segoe UI",10);
199
199
  picker.ShowInTaskbar=true;picker.TopMost=true;
200
- Label hint=new Label();hint.Text="Codex를 사용하는 터미널 창을 선택하세요.\n내용을 읽지 않고 창의 위치·크기만 따라갑니다. 탭은 구별하지 않습니다.";hint.SetBounds(18,16,610,50);
200
+ Label hint=new Label();hint.Text="Choose an app window for Retrieviewer.\nOnly its position and size are followed. Contents are never read.";hint.SetBounds(18,16,610,50);
201
201
  ComboBox list=new ComboBox();list.DropDownStyle=ComboBoxStyle.DropDownList;list.SetBounds(18,76,600,28);foreach(TargetItem item in Targets())list.Items.Add(item);if(list.Items.Count>0)list.SelectedIndex=0;
202
- Button refresh=new Button();refresh.Text="새로 고침";refresh.SetBounds(18,124,100,34);refresh.Click+=(s,e)=>{list.Items.Clear();foreach(TargetItem item in Targets())list.Items.Add(item);if(list.Items.Count>0)list.SelectedIndex=0;};
203
- Button attach=new Button();attach.Text="이 창에 붙이기";attach.SetBounds(378,124,140,34);attach.Click+=(s,e)=>{if(list.SelectedItem!=null){target=(TargetItem)list.SelectedItem;paused=false;Program.Emit(new {type="pause",paused=false});picker.Close();}};
204
- Button cancel=new Button();cancel.Text="취소";cancel.SetBounds(528,124,90,34);cancel.Click+=(s,e)=>picker.Close();
202
+ Button refresh=new Button();refresh.Text="Refresh";refresh.SetBounds(18,124,100,34);refresh.Click+=(s,e)=>{list.Items.Clear();foreach(TargetItem item in Targets())list.Items.Add(item);if(list.Items.Count>0)list.SelectedIndex=0;};
203
+ Button attach=new Button();attach.Text="Attach";attach.SetBounds(378,124,140,34);attach.Click+=(s,e)=>{if(list.SelectedItem!=null){target=(TargetItem)list.SelectedItem;paused=false;Program.Emit(new {type="pause",paused=false});picker.Close();}};
204
+ Button cancel=new Button();cancel.Text="Cancel";cancel.SetBounds(528,124,90,34);cancel.Click+=(s,e)=>picker.Close();
205
205
  picker.Controls.AddRange(new Control[]{hint,list,refresh,attach,cancel});
206
- picker.FormClosed+=(s,e)=>{pickerWindow=null;picking=false;Program.Emit(new {type="picker",visible=false});if(!quitting){if(target==null)status.Text="트레이에서 창 선택";tray.Text=target==null?"Retrieviewer · 창 선택":"Retrieviewer · 창에 붙어 있음";Track(true);}picker.Dispose();};
206
+ picker.FormClosed+=(s,e)=>{pickerWindow=null;picking=false;Program.Emit(new {type="picker",visible=false});if(!quitting){if(target==null)status.Text="Choose a window";tray.Text=target==null?"Retrieviewer · Choose window":"Retrieviewer · Attached";Track(true);}picker.Dispose();};
207
207
  picker.Show();Native.ShowWindow(picker.Handle,5);Program.Emit(new {type="picker",visible=Native.IsWindowVisible(picker.Handle)});
208
208
  }
209
209
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitefoundry/retrieviewer",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "A fluffy Braille desktop pet for Windows and Linux X11, with experimental macOS support and an embeddable TUI engine.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://bitefoundry.github.io/retrieviewer/",
@@ -80,20 +80,33 @@
80
80
  "uniqueFrames": 142,
81
81
  "sourceSha256": "7918261fb64c57a91739729841fd84c6dd53891196c7fb76ee9c27712ab6ef5d",
82
82
  "sourcePackedSha256": "7785ef65b8a2a5bf6f7ce600fe9957a60d9af82066ff49275bba061eac5392d1",
83
- "encodedBytes": 6209085,
84
- "gzipBytes": 1438571,
85
- "residentPixelBytes": 3860054,
86
- "encodedSha256": "93c98cb49ad26a84390adb76f443ab3cf231cf3d1203c3da4059e463283d5f51",
87
- "quantizedSha256": "5c3c9d0dbe29db4b482fcc6b04562e46cf0d9352c95ad6c273b849a3f30b8d75",
83
+ "encodedBytes": 6227235,
84
+ "gzipBytes": 1426084,
85
+ "residentPixelBytes": 3871386,
86
+ "encodedSha256": "783eafb78fac8e004efd4d44c88776ba6cb486ed18092738a4aaf74a6906b8ed",
87
+ "quantizedSha256": "f2d89ac5f6fb230b4d5ac6bcf09865185a00900947dbbfc7cbacc40f8f9719b6",
88
88
  "watchRegistration": {
89
89
  "sourceVersion": "0.0.5",
90
90
  "sourceEncodedSha256": "38cfdfcee9c857c56a14f0a9734cb3301b4a04cb8e1ae3fb2e2b2ffe3666240f",
91
91
  "canonicalSeat": 50,
92
- "bodyFromY": 250,
93
- "chestBlendFromY": 230,
94
- "chestContourRegistered": true,
92
+ "method": "single-source-torso-envelope-and-paw-registration",
93
+ "protectedFaceRows": 180,
94
+ "torsoWarpStartY": 180,
95
+ "torsoEnvelopeFullY": [
96
+ 205,
97
+ 265
98
+ ],
99
+ "pawWarpFullFromY": 275,
100
+ "groundRow": 300,
95
101
  "headTranslateY": 0,
96
- "neckUnmodified": true,
102
+ "neckConnected": true,
103
+ "bodyCompositing": false,
104
+ "paws": [
105
+ 105,
106
+ 138,
107
+ 185,
108
+ 218
109
+ ],
97
110
  "unchangedOtherFrames": true
98
111
  }
99
112
  },
Binary file