mixdog 0.9.17 → 0.9.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mixdog",
3
- "version": "0.9.17",
3
+ "version": "0.9.18",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Standalone mixdog coding-agent CLI/TUI workspace.",
@@ -5,4 +5,4 @@
5
5
  "cwd": "C:/Project/mixdog",
6
6
  "prompt": "Investigation only, no edits. Step by step, one file per turn: 1) read README.md 2) read package.json 3) read scripts/smoke.mjs first 40 lines 4) read src/cli.mjs first 40 lines 5) read scripts/build-tui.mjs first 40 lines 6) read scripts/boot-smoke.mjs first 40 lines. After each read, state one sentence about the file. Finally give a 3-line synthesis. Use exactly one read tool call per step, sequentially."
7
7
  }
8
- ]
8
+ ]
@@ -17,4 +17,4 @@
17
17
  "cwd": "C:/Project/mixdog-bench",
18
18
  "prompt": "READ-ONLY review task: you and any delegated agents must NOT modify, create, or delete any files - report findings only. Review the folder src/runtime/agent/orchestrator/session/compact/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: schema validation gaps, data corruption on summarize, lossy round-trips, error swallowing. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
19
19
  }
20
- ]
20
+ ]
@@ -17,4 +17,4 @@
17
17
  "cwd": "C:/Project/mixdog-bench",
18
18
  "prompt": "Map the compaction subsystem: starting from src/runtime/agent/orchestrator/session/compact/engine.mjs, produce a concise architecture brief - entry points and callers, the decision flow for when compaction fires, how the preserved tail is chosen, where redaction hooks in, and the failure/fallback paths. Anchor every claim with file:line. Keep it under 40 lines."
19
19
  }
20
- ]
20
+ ]
@@ -17,4 +17,4 @@
17
17
  "cwd": "C:/Project/mixdog",
18
18
  "prompt": "Review the folder src/runtime/agent/orchestrator/session/compact/ for correctness, regression, and security risks. Focus on real actionable bugs: schema validation gaps, data corruption on summarize, lossy round-trips, error swallowing. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
19
19
  }
20
- ]
20
+ ]
@@ -1,242 +1,242 @@
1
- # build-runtime-windows.ps1 — Build PostgreSQL 16 + pgvector runtime on Windows.
2
- # Uses windows-2022 GHA runner's preinstalled PostgreSQL 16 (consistent
3
- # pg_config + postgres.exe from same package) — avoids EDB zip's split-version
4
- # packaging bug that linked pgvector against PG 14 ABI.
5
- # Builds pgvector from source via MSVC/nmake, then assembles a self-contained
6
- # runtime tree (bin + lib + share at root). Final smoke: initdb + CREATE
7
- # EXTENSION vector + distance query.
8
- # Produces: dist\mixdog-runtime-win32-x64-pg{pgver}-pgvector{vecver}.tar.gz
9
-
10
- $ErrorActionPreference = 'Stop'
11
-
12
- $PG_VERSION = '16.4'
13
- $PGVECTOR_VERSION = '0.8.2'
14
- $TARGET_OS = $env:TARGET_OS ?? 'win32'
15
- $TARGET_ARCH = $env:TARGET_ARCH ?? 'x64'
16
-
17
- # Auto-detect highest preinstalled PG ≥ 16 OR install via chocolatey.
18
- $PgInstallRoot = 'C:\Program Files\PostgreSQL'
19
-
20
- function Find-PgRoot {
21
- if (-not (Test-Path $PgInstallRoot)) { return $null }
22
- $cands = Get-ChildItem $PgInstallRoot -Directory -ErrorAction SilentlyContinue |
23
- Where-Object { $_.Name -match '^(\d+)' } |
24
- Sort-Object { [int]([regex]::Match($_.Name, '^(\d+)').Groups[1].Value) } -Descending
25
- foreach ($c in $cands) {
26
- $major = [int]([regex]::Match($c.Name, '^(\d+)').Groups[1].Value)
27
- if ($major -ge 16 -and (Test-Path "$($c.FullName)\bin\pg_config.exe")) {
28
- return $c.FullName
29
- }
30
- }
31
- return $null
32
- }
33
-
34
- $PgRoot = Find-PgRoot
35
- if (-not $PgRoot) {
36
- Write-Host "==> No preinstalled PG ≥ 16 found. Installing via chocolatey..."
37
- if (Test-Path $PgInstallRoot) {
38
- Write-Host "Existing PG dirs (none usable):"
39
- Get-ChildItem $PgInstallRoot -Directory -ErrorAction SilentlyContinue | Select-Object Name
40
- }
41
- choco install postgresql16 --version=16.4.0 --params '/Password:postgres' -y --no-progress 2>&1 | Out-Host
42
- if ($LASTEXITCODE -ne 0) { Write-Error "choco install postgresql16 failed (exit $LASTEXITCODE)"; exit 1 }
43
- $PgRoot = Find-PgRoot
44
- if (-not $PgRoot) {
45
- Write-Error "ASSERT FAILED: chocolatey install completed but PG ≥ 16 still not found under $PgInstallRoot"
46
- Get-ChildItem $PgInstallRoot -Directory -ErrorAction SilentlyContinue | Select-Object Name
47
- exit 1
48
- }
49
- }
50
-
51
- $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
52
- $RootDir = (Resolve-Path "$ScriptDir\..").Path
53
- $BuildDir = "$RootDir\build\runtime-win32-$TARGET_ARCH"
54
- $DistDir = "$RootDir\dist"
55
- $RuntimeDir = "$BuildDir\runtime"
56
-
57
- $PgBin = "$PgRoot\bin"
58
- $PgConfig = "$PgBin\pg_config.exe"
59
-
60
- $OutputName = "mixdog-runtime-${TARGET_OS}-${TARGET_ARCH}-pg${PG_VERSION}-pgvector${PGVECTOR_VERSION}.tar.gz"
61
-
62
- Write-Host "==> Using preinstalled PG: $PgRoot"
63
- & $PgConfig --version
64
- $RealVersion = (& $PgConfig --version) -replace 'PostgreSQL ', ''
65
- Write-Host " pg_config reports version: $RealVersion"
66
-
67
- if (Test-Path $RuntimeDir) { Remove-Item -Recurse -Force $RuntimeDir }
68
- New-Item -ItemType Directory -Force -Path $BuildDir, $DistDir,
69
- "$RuntimeDir\bin", "$RuntimeDir\lib", "$RuntimeDir\share" | Out-Null
70
-
71
- Write-Host "==> Cloning pgvector $PGVECTOR_VERSION"
72
- $PgVectorDir = "$BuildDir\pgvector"
73
- $VectorDllBuilt = "$PgVectorDir\vector.dll"
74
-
75
- if (Test-Path $VectorDllBuilt) {
76
- Write-Host " Cache hit: vector.dll already built at $VectorDllBuilt"
77
- } else {
78
- if (Test-Path $PgVectorDir) { Remove-Item -Recurse -Force $PgVectorDir }
79
- git clone --branch "v$PGVECTOR_VERSION" --depth 1 `
80
- https://github.com/pgvector/pgvector.git $PgVectorDir
81
-
82
- Write-Host "==> Building pgvector (MSVC/nmake against system PG 16)"
83
- Push-Location $PgVectorDir
84
- try {
85
- $VsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
86
- $VcVarsAll = & $VsWhere -latest -find 'VC\Auxiliary\Build\vcvarsall.bat' 2>$null | Select-Object -First 1
87
- if (-not $VcVarsAll) {
88
- Write-Error "vswhere could not locate vcvarsall.bat — Visual Studio Build Tools required."
89
- exit 1
90
- }
91
- # CRITICAL: prepend $PgRoot\bin to PATH so any bare `pg_config` call
92
- # inside Makefile.win resolves to PG 16 — runner has PG 14/15
93
- # preinstalled and would otherwise win the PATH lookup, producing
94
- # PG14-ABI vector.dll that fails to load in our PG 16 postgres.exe.
95
- # Set in PowerShell so cmd /c inherits; setting inside the cmd batch
96
- # via %PATH% loses vcvarsall's additions due to parse-time expansion.
97
- $env:PATH = "$PgRoot\bin;$env:PATH"
98
- $env:PGROOT = $PgRoot
99
- $BuildCmd = "`"$VcVarsAll`" amd64 && nmake /F Makefile.win PG_CONFIG=`"$PgConfig`""
100
- cmd /c $BuildCmd
101
- if ($LASTEXITCODE -ne 0) {
102
- Write-Error "pgvector nmake build failed (exit $LASTEXITCODE)"
103
- exit 1
104
- }
105
- } finally {
106
- Pop-Location
107
- }
108
- }
109
-
110
- Write-Host "==> Assembling runtime layout — copy bin (.exe + .dll), lib, share from $PgRoot"
111
- # Copy ALL .exe + .dll from PG bin so postgres.exe + libpq.dll + libcrypto/libssl/
112
- # libintl/libiconv/icu*/libxml2/libxslt/libwinpthread/libecpg/libpgtypes etc. all
113
- # ship together. PG 16 install layout puts these all in bin\.
114
- Copy-Item "$PgBin\*.exe","$PgBin\*.dll" "$RuntimeDir\bin\" -Force
115
-
116
- # lib\: PG extension modules (incl. contrib like pgcrypto.dll). vector.dll
117
- # placed here below — PG looks for $libdir/<ext>.dll which resolves to lib\.
118
- Copy-Item -Recurse -Force "$PgRoot\lib\*" "$RuntimeDir\lib\" -ErrorAction SilentlyContinue
119
- # share\: extension SQL/control, locale, timezone data, conf samples.
120
- Copy-Item -Recurse -Force "$PgRoot\share\*" "$RuntimeDir\share\" -ErrorAction SilentlyContinue
121
-
122
- Write-Host "==> Manually staging pgvector artifacts (avoid pg_config-derived install paths)"
123
- $RuntimeExtDir = "$RuntimeDir\share\extension"
124
- New-Item -ItemType Directory -Force -Path $RuntimeExtDir | Out-Null
125
- Copy-Item "$PgVectorDir\vector.dll" "$RuntimeDir\lib\" -Force
126
- Copy-Item "$PgVectorDir\vector.control" $RuntimeExtDir -Force
127
- Copy-Item "$PgVectorDir\sql\vector--*.sql" $RuntimeExtDir -Force
128
-
129
- Write-Host "==> Asserting runtime layout"
130
- $VectorControl = "$RuntimeDir\share\extension\vector.control"
131
- if (-not (Test-Path $VectorControl)) { Write-Error "ASSERT FAILED: $VectorControl not found"; exit 1 }
132
- $VectorSql = "$RuntimeDir\share\extension\vector--$PGVECTOR_VERSION.sql"
133
- if (-not (Test-Path $VectorSql)) { Write-Error "ASSERT FAILED: $VectorSql not found"; exit 1 }
134
- if (-not (Test-Path "$RuntimeDir\lib\vector.dll")) {
135
- Write-Error "ASSERT FAILED: vector.dll not found in lib\"
136
- exit 1
137
- }
138
- Write-Host " PASS runtime layout"
139
-
140
- # Licenses
141
- if (Test-Path "$PgRoot\doc\postgresql\COPYRIGHT") {
142
- Copy-Item "$PgRoot\doc\postgresql\COPYRIGHT" "$RuntimeDir\LICENSE.postgresql" -Force
143
- } elseif (Test-Path "$PgRoot\doc\COPYRIGHT") {
144
- Copy-Item "$PgRoot\doc\COPYRIGHT" "$RuntimeDir\LICENSE.postgresql" -Force
145
- }
146
- if (Test-Path "$PgVectorDir\LICENSE") {
147
- Copy-Item "$PgVectorDir\LICENSE" "$RuntimeDir\LICENSE.pgvector" -Force
148
- }
149
-
150
- Write-Host "==> Self-contained smoke test (initdb + CREATE EXTENSION vector + distance query)"
151
- & "$RuntimeDir\bin\postgres.exe" --version
152
- if ($LASTEXITCODE -ne 0) { Write-Error "FAIL: postgres.exe --version exit $LASTEXITCODE"; exit 1 }
153
-
154
- $SmokeData = "$BuildDir\smoke-pgdata"
155
- $SmokeLog = "$BuildDir\smoke-pg.log"
156
- $SmokePort = 55899
157
- if (Test-Path $SmokeData) { Remove-Item -Recurse -Force $SmokeData }
158
-
159
- & "$RuntimeDir\bin\initdb.exe" -D $SmokeData --username=postgres --auth-local=trust --no-locale -E UTF8 | Out-Null
160
- if ($LASTEXITCODE -ne 0) { Write-Error "FAIL: initdb"; exit 1 }
161
-
162
- & "$RuntimeDir\bin\pg_ctl.exe" -D $SmokeData -o "-p $SmokePort -h 127.0.0.1" -l $SmokeLog -w start
163
- if ($LASTEXITCODE -ne 0) { Write-Error "FAIL: pg_ctl start (see $SmokeLog)"; Get-Content $SmokeLog | Select-Object -Last 30; exit 1 }
164
-
165
- try {
166
- & "$RuntimeDir\bin\psql.exe" -h 127.0.0.1 -p $SmokePort -U postgres -d postgres -c "CREATE EXTENSION vector;" | Out-Null
167
- if ($LASTEXITCODE -ne 0) { throw "CREATE EXTENSION vector failed" }
168
- $ExtV = & "$RuntimeDir\bin\psql.exe" -h 127.0.0.1 -p $SmokePort -U postgres -d postgres -tAc "SELECT extversion FROM pg_extension WHERE extname='vector';"
169
- $Dist = & "$RuntimeDir\bin\psql.exe" -h 127.0.0.1 -p $SmokePort -U postgres -d postgres -tAc "SELECT '[1,2,3]'::vector <-> '[1,2,4]'::vector;"
170
- Write-Host " vector extension version: $ExtV"
171
- Write-Host " distance query result: $Dist"
172
- if ($ExtV.Trim() -ne $PGVECTOR_VERSION) {
173
- Write-Error "FAIL: extversion='$ExtV' expected='$PGVECTOR_VERSION'"
174
- exit 1
175
- }
176
- Write-Host " PASS smoke (extension load + vector distance)"
177
- }
178
- finally {
179
- & "$RuntimeDir\bin\pg_ctl.exe" -D $SmokeData -m fast stop 2>$null | Out-Null
180
- Remove-Item -Recurse -Force $SmokeData -ErrorAction SilentlyContinue
181
- }
182
-
183
- Write-Host "==> Creating tarball: $OutputName"
184
- $DistDirFwd = $DistDir.Replace('\', '/')
185
- $RuntimeDirFwd = $RuntimeDir.Replace('\', '/')
186
- & tar -czf "$DistDirFwd/$OutputName" -C "$RuntimeDirFwd" .
187
- if ($LASTEXITCODE -ne 0) { Write-Error "tar failed (exit $LASTEXITCODE)"; exit 1 }
188
-
189
- Write-Host "==> Generating sha256 sidecar"
190
- Push-Location $DistDir
191
- $Hash = (Get-FileHash -Algorithm SHA256 $OutputName).Hash.ToLower()
192
- "$Hash $OutputName" | Out-File -Encoding ascii "${OutputName}.sha256"
193
- Pop-Location
194
-
195
- # ---------------------------------------------------------------------------
196
- # Phase A: Re-smoke from EXTRACTED tarball with hostile env (cleared PATH,
197
- # only system32). Catches false-pass where the build host has VC redist /
198
- # preinstalled DLLs that the tarball might be missing.
199
- # ---------------------------------------------------------------------------
200
- Write-Host "==> Re-smoke from extracted tarball (hostile env)"
201
- $ExtractDir = "$BuildDir\extract-smoke"
202
- if (Test-Path $ExtractDir) { Remove-Item -Recurse -Force $ExtractDir }
203
- New-Item -ItemType Directory -Force -Path $ExtractDir | Out-Null
204
- & tar -xzf "$DistDirFwd/$OutputName" -C ($ExtractDir.Replace('\','/'))
205
- if ($LASTEXITCODE -ne 0) { Write-Error "extract failed"; exit 1 }
206
-
207
- $ExtractData = "$ExtractDir\extract-pgdata"
208
- $ExtractLog = "$ExtractDir\extract-pg.log"
209
- $ExtractPort = 55898
210
-
211
- # Snapshot current env, then strip to minimal Windows PATH (no PG14/15/16
212
- # preinstalled bin, no chocolatey, no MSVC tools).
213
- $SavedPath = $env:PATH
214
- $SavedPgRoot = $env:PGROOT
215
- $env:PATH = "$env:SystemRoot\System32;$env:SystemRoot"
216
- $env:PGROOT = $null
217
- $env:PGDATA = $null
218
-
219
- try {
220
- & "$ExtractDir\bin\postgres.exe" --version
221
- if ($LASTEXITCODE -ne 0) { throw "FAIL: postgres --version under hostile env" }
222
- & "$ExtractDir\bin\initdb.exe" -D $ExtractData --username=postgres --auth-local=trust --no-locale -E UTF8 | Out-Null
223
- if ($LASTEXITCODE -ne 0) { throw "FAIL: initdb under hostile env" }
224
- & "$ExtractDir\bin\pg_ctl.exe" -D $ExtractData -o "-p $ExtractPort -h 127.0.0.1" -l $ExtractLog -w start
225
- if ($LASTEXITCODE -ne 0) { Get-Content $ExtractLog | Select-Object -Last 30; throw "FAIL: pg_ctl start under hostile env" }
226
- try {
227
- & "$ExtractDir\bin\psql.exe" -h 127.0.0.1 -p $ExtractPort -U postgres -d postgres -c "CREATE EXTENSION vector;" | Out-Null
228
- if ($LASTEXITCODE -ne 0) { throw "FAIL: CREATE EXTENSION vector under hostile env" }
229
- $ExtV2 = & "$ExtractDir\bin\psql.exe" -h 127.0.0.1 -p $ExtractPort -U postgres -d postgres -tAc "SELECT extversion FROM pg_extension WHERE extname='vector';"
230
- if ($ExtV2.Trim() -ne $PGVECTOR_VERSION) { throw "FAIL: extracted-smoke extversion='$ExtV2'" }
231
- Write-Host " PASS extracted-tarball smoke (hostile env)"
232
- } finally {
233
- & "$ExtractDir\bin\pg_ctl.exe" -D $ExtractData -m fast stop 2>$null | Out-Null
234
- }
235
- } finally {
236
- $env:PATH = $SavedPath
237
- $env:PGROOT = $SavedPgRoot
238
- Remove-Item -Recurse -Force $ExtractDir -ErrorAction SilentlyContinue
239
- }
240
-
241
- Write-Host "==> Done: $DistDir\$OutputName"
242
- Get-Item "$DistDir\$OutputName" | Select-Object Name, Length
1
+ # build-runtime-windows.ps1 — Build PostgreSQL 16 + pgvector runtime on Windows.
2
+ # Uses windows-2022 GHA runner's preinstalled PostgreSQL 16 (consistent
3
+ # pg_config + postgres.exe from same package) — avoids EDB zip's split-version
4
+ # packaging bug that linked pgvector against PG 14 ABI.
5
+ # Builds pgvector from source via MSVC/nmake, then assembles a self-contained
6
+ # runtime tree (bin + lib + share at root). Final smoke: initdb + CREATE
7
+ # EXTENSION vector + distance query.
8
+ # Produces: dist\mixdog-runtime-win32-x64-pg{pgver}-pgvector{vecver}.tar.gz
9
+
10
+ $ErrorActionPreference = 'Stop'
11
+
12
+ $PG_VERSION = '16.4'
13
+ $PGVECTOR_VERSION = '0.8.2'
14
+ $TARGET_OS = $env:TARGET_OS ?? 'win32'
15
+ $TARGET_ARCH = $env:TARGET_ARCH ?? 'x64'
16
+
17
+ # Auto-detect highest preinstalled PG ≥ 16 OR install via chocolatey.
18
+ $PgInstallRoot = 'C:\Program Files\PostgreSQL'
19
+
20
+ function Find-PgRoot {
21
+ if (-not (Test-Path $PgInstallRoot)) { return $null }
22
+ $cands = Get-ChildItem $PgInstallRoot -Directory -ErrorAction SilentlyContinue |
23
+ Where-Object { $_.Name -match '^(\d+)' } |
24
+ Sort-Object { [int]([regex]::Match($_.Name, '^(\d+)').Groups[1].Value) } -Descending
25
+ foreach ($c in $cands) {
26
+ $major = [int]([regex]::Match($c.Name, '^(\d+)').Groups[1].Value)
27
+ if ($major -ge 16 -and (Test-Path "$($c.FullName)\bin\pg_config.exe")) {
28
+ return $c.FullName
29
+ }
30
+ }
31
+ return $null
32
+ }
33
+
34
+ $PgRoot = Find-PgRoot
35
+ if (-not $PgRoot) {
36
+ Write-Host "==> No preinstalled PG ≥ 16 found. Installing via chocolatey..."
37
+ if (Test-Path $PgInstallRoot) {
38
+ Write-Host "Existing PG dirs (none usable):"
39
+ Get-ChildItem $PgInstallRoot -Directory -ErrorAction SilentlyContinue | Select-Object Name
40
+ }
41
+ choco install postgresql16 --version=16.4.0 --params '/Password:postgres' -y --no-progress 2>&1 | Out-Host
42
+ if ($LASTEXITCODE -ne 0) { Write-Error "choco install postgresql16 failed (exit $LASTEXITCODE)"; exit 1 }
43
+ $PgRoot = Find-PgRoot
44
+ if (-not $PgRoot) {
45
+ Write-Error "ASSERT FAILED: chocolatey install completed but PG ≥ 16 still not found under $PgInstallRoot"
46
+ Get-ChildItem $PgInstallRoot -Directory -ErrorAction SilentlyContinue | Select-Object Name
47
+ exit 1
48
+ }
49
+ }
50
+
51
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
52
+ $RootDir = (Resolve-Path "$ScriptDir\..").Path
53
+ $BuildDir = "$RootDir\build\runtime-win32-$TARGET_ARCH"
54
+ $DistDir = "$RootDir\dist"
55
+ $RuntimeDir = "$BuildDir\runtime"
56
+
57
+ $PgBin = "$PgRoot\bin"
58
+ $PgConfig = "$PgBin\pg_config.exe"
59
+
60
+ $OutputName = "mixdog-runtime-${TARGET_OS}-${TARGET_ARCH}-pg${PG_VERSION}-pgvector${PGVECTOR_VERSION}.tar.gz"
61
+
62
+ Write-Host "==> Using preinstalled PG: $PgRoot"
63
+ & $PgConfig --version
64
+ $RealVersion = (& $PgConfig --version) -replace 'PostgreSQL ', ''
65
+ Write-Host " pg_config reports version: $RealVersion"
66
+
67
+ if (Test-Path $RuntimeDir) { Remove-Item -Recurse -Force $RuntimeDir }
68
+ New-Item -ItemType Directory -Force -Path $BuildDir, $DistDir,
69
+ "$RuntimeDir\bin", "$RuntimeDir\lib", "$RuntimeDir\share" | Out-Null
70
+
71
+ Write-Host "==> Cloning pgvector $PGVECTOR_VERSION"
72
+ $PgVectorDir = "$BuildDir\pgvector"
73
+ $VectorDllBuilt = "$PgVectorDir\vector.dll"
74
+
75
+ if (Test-Path $VectorDllBuilt) {
76
+ Write-Host " Cache hit: vector.dll already built at $VectorDllBuilt"
77
+ } else {
78
+ if (Test-Path $PgVectorDir) { Remove-Item -Recurse -Force $PgVectorDir }
79
+ git clone --branch "v$PGVECTOR_VERSION" --depth 1 `
80
+ https://github.com/pgvector/pgvector.git $PgVectorDir
81
+
82
+ Write-Host "==> Building pgvector (MSVC/nmake against system PG 16)"
83
+ Push-Location $PgVectorDir
84
+ try {
85
+ $VsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
86
+ $VcVarsAll = & $VsWhere -latest -find 'VC\Auxiliary\Build\vcvarsall.bat' 2>$null | Select-Object -First 1
87
+ if (-not $VcVarsAll) {
88
+ Write-Error "vswhere could not locate vcvarsall.bat — Visual Studio Build Tools required."
89
+ exit 1
90
+ }
91
+ # CRITICAL: prepend $PgRoot\bin to PATH so any bare `pg_config` call
92
+ # inside Makefile.win resolves to PG 16 — runner has PG 14/15
93
+ # preinstalled and would otherwise win the PATH lookup, producing
94
+ # PG14-ABI vector.dll that fails to load in our PG 16 postgres.exe.
95
+ # Set in PowerShell so cmd /c inherits; setting inside the cmd batch
96
+ # via %PATH% loses vcvarsall's additions due to parse-time expansion.
97
+ $env:PATH = "$PgRoot\bin;$env:PATH"
98
+ $env:PGROOT = $PgRoot
99
+ $BuildCmd = "`"$VcVarsAll`" amd64 && nmake /F Makefile.win PG_CONFIG=`"$PgConfig`""
100
+ cmd /c $BuildCmd
101
+ if ($LASTEXITCODE -ne 0) {
102
+ Write-Error "pgvector nmake build failed (exit $LASTEXITCODE)"
103
+ exit 1
104
+ }
105
+ } finally {
106
+ Pop-Location
107
+ }
108
+ }
109
+
110
+ Write-Host "==> Assembling runtime layout — copy bin (.exe + .dll), lib, share from $PgRoot"
111
+ # Copy ALL .exe + .dll from PG bin so postgres.exe + libpq.dll + libcrypto/libssl/
112
+ # libintl/libiconv/icu*/libxml2/libxslt/libwinpthread/libecpg/libpgtypes etc. all
113
+ # ship together. PG 16 install layout puts these all in bin\.
114
+ Copy-Item "$PgBin\*.exe","$PgBin\*.dll" "$RuntimeDir\bin\" -Force
115
+
116
+ # lib\: PG extension modules (incl. contrib like pgcrypto.dll). vector.dll
117
+ # placed here below — PG looks for $libdir/<ext>.dll which resolves to lib\.
118
+ Copy-Item -Recurse -Force "$PgRoot\lib\*" "$RuntimeDir\lib\" -ErrorAction SilentlyContinue
119
+ # share\: extension SQL/control, locale, timezone data, conf samples.
120
+ Copy-Item -Recurse -Force "$PgRoot\share\*" "$RuntimeDir\share\" -ErrorAction SilentlyContinue
121
+
122
+ Write-Host "==> Manually staging pgvector artifacts (avoid pg_config-derived install paths)"
123
+ $RuntimeExtDir = "$RuntimeDir\share\extension"
124
+ New-Item -ItemType Directory -Force -Path $RuntimeExtDir | Out-Null
125
+ Copy-Item "$PgVectorDir\vector.dll" "$RuntimeDir\lib\" -Force
126
+ Copy-Item "$PgVectorDir\vector.control" $RuntimeExtDir -Force
127
+ Copy-Item "$PgVectorDir\sql\vector--*.sql" $RuntimeExtDir -Force
128
+
129
+ Write-Host "==> Asserting runtime layout"
130
+ $VectorControl = "$RuntimeDir\share\extension\vector.control"
131
+ if (-not (Test-Path $VectorControl)) { Write-Error "ASSERT FAILED: $VectorControl not found"; exit 1 }
132
+ $VectorSql = "$RuntimeDir\share\extension\vector--$PGVECTOR_VERSION.sql"
133
+ if (-not (Test-Path $VectorSql)) { Write-Error "ASSERT FAILED: $VectorSql not found"; exit 1 }
134
+ if (-not (Test-Path "$RuntimeDir\lib\vector.dll")) {
135
+ Write-Error "ASSERT FAILED: vector.dll not found in lib\"
136
+ exit 1
137
+ }
138
+ Write-Host " PASS runtime layout"
139
+
140
+ # Licenses
141
+ if (Test-Path "$PgRoot\doc\postgresql\COPYRIGHT") {
142
+ Copy-Item "$PgRoot\doc\postgresql\COPYRIGHT" "$RuntimeDir\LICENSE.postgresql" -Force
143
+ } elseif (Test-Path "$PgRoot\doc\COPYRIGHT") {
144
+ Copy-Item "$PgRoot\doc\COPYRIGHT" "$RuntimeDir\LICENSE.postgresql" -Force
145
+ }
146
+ if (Test-Path "$PgVectorDir\LICENSE") {
147
+ Copy-Item "$PgVectorDir\LICENSE" "$RuntimeDir\LICENSE.pgvector" -Force
148
+ }
149
+
150
+ Write-Host "==> Self-contained smoke test (initdb + CREATE EXTENSION vector + distance query)"
151
+ & "$RuntimeDir\bin\postgres.exe" --version
152
+ if ($LASTEXITCODE -ne 0) { Write-Error "FAIL: postgres.exe --version exit $LASTEXITCODE"; exit 1 }
153
+
154
+ $SmokeData = "$BuildDir\smoke-pgdata"
155
+ $SmokeLog = "$BuildDir\smoke-pg.log"
156
+ $SmokePort = 55899
157
+ if (Test-Path $SmokeData) { Remove-Item -Recurse -Force $SmokeData }
158
+
159
+ & "$RuntimeDir\bin\initdb.exe" -D $SmokeData --username=postgres --auth-local=trust --no-locale -E UTF8 | Out-Null
160
+ if ($LASTEXITCODE -ne 0) { Write-Error "FAIL: initdb"; exit 1 }
161
+
162
+ & "$RuntimeDir\bin\pg_ctl.exe" -D $SmokeData -o "-p $SmokePort -h 127.0.0.1" -l $SmokeLog -w start
163
+ if ($LASTEXITCODE -ne 0) { Write-Error "FAIL: pg_ctl start (see $SmokeLog)"; Get-Content $SmokeLog | Select-Object -Last 30; exit 1 }
164
+
165
+ try {
166
+ & "$RuntimeDir\bin\psql.exe" -h 127.0.0.1 -p $SmokePort -U postgres -d postgres -c "CREATE EXTENSION vector;" | Out-Null
167
+ if ($LASTEXITCODE -ne 0) { throw "CREATE EXTENSION vector failed" }
168
+ $ExtV = & "$RuntimeDir\bin\psql.exe" -h 127.0.0.1 -p $SmokePort -U postgres -d postgres -tAc "SELECT extversion FROM pg_extension WHERE extname='vector';"
169
+ $Dist = & "$RuntimeDir\bin\psql.exe" -h 127.0.0.1 -p $SmokePort -U postgres -d postgres -tAc "SELECT '[1,2,3]'::vector <-> '[1,2,4]'::vector;"
170
+ Write-Host " vector extension version: $ExtV"
171
+ Write-Host " distance query result: $Dist"
172
+ if ($ExtV.Trim() -ne $PGVECTOR_VERSION) {
173
+ Write-Error "FAIL: extversion='$ExtV' expected='$PGVECTOR_VERSION'"
174
+ exit 1
175
+ }
176
+ Write-Host " PASS smoke (extension load + vector distance)"
177
+ }
178
+ finally {
179
+ & "$RuntimeDir\bin\pg_ctl.exe" -D $SmokeData -m fast stop 2>$null | Out-Null
180
+ Remove-Item -Recurse -Force $SmokeData -ErrorAction SilentlyContinue
181
+ }
182
+
183
+ Write-Host "==> Creating tarball: $OutputName"
184
+ $DistDirFwd = $DistDir.Replace('\', '/')
185
+ $RuntimeDirFwd = $RuntimeDir.Replace('\', '/')
186
+ & tar -czf "$DistDirFwd/$OutputName" -C "$RuntimeDirFwd" .
187
+ if ($LASTEXITCODE -ne 0) { Write-Error "tar failed (exit $LASTEXITCODE)"; exit 1 }
188
+
189
+ Write-Host "==> Generating sha256 sidecar"
190
+ Push-Location $DistDir
191
+ $Hash = (Get-FileHash -Algorithm SHA256 $OutputName).Hash.ToLower()
192
+ "$Hash $OutputName" | Out-File -Encoding ascii "${OutputName}.sha256"
193
+ Pop-Location
194
+
195
+ # ---------------------------------------------------------------------------
196
+ # Phase A: Re-smoke from EXTRACTED tarball with hostile env (cleared PATH,
197
+ # only system32). Catches false-pass where the build host has VC redist /
198
+ # preinstalled DLLs that the tarball might be missing.
199
+ # ---------------------------------------------------------------------------
200
+ Write-Host "==> Re-smoke from extracted tarball (hostile env)"
201
+ $ExtractDir = "$BuildDir\extract-smoke"
202
+ if (Test-Path $ExtractDir) { Remove-Item -Recurse -Force $ExtractDir }
203
+ New-Item -ItemType Directory -Force -Path $ExtractDir | Out-Null
204
+ & tar -xzf "$DistDirFwd/$OutputName" -C ($ExtractDir.Replace('\','/'))
205
+ if ($LASTEXITCODE -ne 0) { Write-Error "extract failed"; exit 1 }
206
+
207
+ $ExtractData = "$ExtractDir\extract-pgdata"
208
+ $ExtractLog = "$ExtractDir\extract-pg.log"
209
+ $ExtractPort = 55898
210
+
211
+ # Snapshot current env, then strip to minimal Windows PATH (no PG14/15/16
212
+ # preinstalled bin, no chocolatey, no MSVC tools).
213
+ $SavedPath = $env:PATH
214
+ $SavedPgRoot = $env:PGROOT
215
+ $env:PATH = "$env:SystemRoot\System32;$env:SystemRoot"
216
+ $env:PGROOT = $null
217
+ $env:PGDATA = $null
218
+
219
+ try {
220
+ & "$ExtractDir\bin\postgres.exe" --version
221
+ if ($LASTEXITCODE -ne 0) { throw "FAIL: postgres --version under hostile env" }
222
+ & "$ExtractDir\bin\initdb.exe" -D $ExtractData --username=postgres --auth-local=trust --no-locale -E UTF8 | Out-Null
223
+ if ($LASTEXITCODE -ne 0) { throw "FAIL: initdb under hostile env" }
224
+ & "$ExtractDir\bin\pg_ctl.exe" -D $ExtractData -o "-p $ExtractPort -h 127.0.0.1" -l $ExtractLog -w start
225
+ if ($LASTEXITCODE -ne 0) { Get-Content $ExtractLog | Select-Object -Last 30; throw "FAIL: pg_ctl start under hostile env" }
226
+ try {
227
+ & "$ExtractDir\bin\psql.exe" -h 127.0.0.1 -p $ExtractPort -U postgres -d postgres -c "CREATE EXTENSION vector;" | Out-Null
228
+ if ($LASTEXITCODE -ne 0) { throw "FAIL: CREATE EXTENSION vector under hostile env" }
229
+ $ExtV2 = & "$ExtractDir\bin\psql.exe" -h 127.0.0.1 -p $ExtractPort -U postgres -d postgres -tAc "SELECT extversion FROM pg_extension WHERE extname='vector';"
230
+ if ($ExtV2.Trim() -ne $PGVECTOR_VERSION) { throw "FAIL: extracted-smoke extversion='$ExtV2'" }
231
+ Write-Host " PASS extracted-tarball smoke (hostile env)"
232
+ } finally {
233
+ & "$ExtractDir\bin\pg_ctl.exe" -D $ExtractData -m fast stop 2>$null | Out-Null
234
+ }
235
+ } finally {
236
+ $env:PATH = $SavedPath
237
+ $env:PGROOT = $SavedPgRoot
238
+ Remove-Item -Recurse -Force $ExtractDir -ErrorAction SilentlyContinue
239
+ }
240
+
241
+ Write-Host "==> Done: $DistDir\$OutputName"
242
+ Get-Item "$DistDir\$OutputName" | Select-Object Name, Length
@@ -15,4 +15,4 @@
15
15
  { "id": "uc5-yesterday", "label": "UC5 calendar yesterday", "args": { "period": "yesterday", "limit": 10 }, "expect": "browse" },
16
16
  { "id": "uc5-thisweek", "label": "UC5 calendar this_week", "args": { "period": "this_week", "limit": 10 }, "expect": "browse" },
17
17
  { "id": "uc6-category", "label": "UC6 category decision 7d", "args": { "period": "7d", "category": "decision", "limit": 10 }, "expect": "browse" }
18
- ]
18
+ ]