mixdog 0.9.14 → 0.9.16
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 +1 -1
- package/scripts/bench/cache-probe-tasks.json +1 -1
- package/scripts/bench/lead-review-tasks-r3.json +1 -1
- package/scripts/bench/r4-mixed-tasks.json +1 -1
- package/scripts/bench/review-tasks.json +1 -1
- package/scripts/build-runtime-windows.ps1 +242 -242
- package/scripts/explore-bench.mjs +5 -4
- package/scripts/ingest-pure-conversation-smoke.mjs +27 -0
- package/scripts/output-style-smoke.mjs +3 -3
- package/scripts/recall-usecase-cases.json +1 -1
- package/scripts/smoke-runtime-negative.ps1 +106 -106
- package/scripts/termio-input-smoke.mjs +199 -0
- package/scripts/tool-efficiency-diag.mjs +88 -0
- package/scripts/tool-smoke.mjs +40 -24
- package/scripts/tui-frame-harness-shim.mjs +32 -0
- package/scripts/tui-frame-harness.mjs +306 -0
- package/src/agents/heavy-worker/AGENT.md +6 -7
- package/src/agents/worker/AGENT.md +6 -7
- package/src/lib/keychain-cjs.cjs +28 -11
- package/src/lib/rules-builder.cjs +6 -10
- package/src/mixdog-session-runtime.mjs +90 -20
- package/src/output-styles/simple.md +22 -24
- package/src/rules/agent/00-core.md +12 -11
- package/src/rules/agent/30-explorer.md +22 -21
- package/src/rules/lead/01-general.md +8 -8
- package/src/rules/lead/02-channels.md +3 -3
- package/src/rules/lead/lead-brief.md +11 -12
- package/src/rules/shared/01-tool.md +25 -14
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +4 -3
- package/src/runtime/agent/orchestrator/config.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +22 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +21 -1
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +29 -8
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +13 -5
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +30 -2
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +19 -0
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/engine.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +37 -15
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +55 -0
- package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +177 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +12 -19
- package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +22 -1
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +13 -18
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager.mjs +59 -2
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +33 -25
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +38 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +24 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +14 -1
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +25 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +73 -3
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +23 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +55 -0
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +21 -13
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +13 -2
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +44 -6
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -0
- package/src/runtime/channels/backends/telegram.mjs +29 -9
- package/src/runtime/channels/lib/event-queue.mjs +6 -2
- package/src/runtime/channels/lib/memory-client.mjs +66 -1
- package/src/runtime/channels/lib/webhook/deliveries.mjs +22 -1
- package/src/runtime/memory/index.mjs +95 -8
- package/src/runtime/memory/lib/cycle-scheduler.mjs +24 -5
- package/src/runtime/memory/lib/memory-cycle1.mjs +45 -3
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +7 -3
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +54 -10
- package/src/runtime/memory/lib/memory-cycle2.mjs +21 -8
- package/src/runtime/memory/lib/memory-embed.mjs +48 -0
- package/src/runtime/memory/lib/memory-recall-store.mjs +57 -13
- package/src/runtime/memory/lib/memory.mjs +88 -1
- package/src/runtime/memory/lib/session-ingest.mjs +34 -3
- package/src/runtime/memory/lib/trace-store.mjs +52 -3
- package/src/runtime/memory/lib/transcript-ingest.mjs +27 -4
- package/src/runtime/shared/child-guardian.mjs +4 -2
- package/src/runtime/shared/open-url.mjs +2 -1
- package/src/runtime/shared/singleton-owner.mjs +26 -0
- package/src/runtime/shared/tool-execution-contract.mjs +25 -0
- package/src/runtime/shared/transcript-writer.mjs +3 -1
- package/src/session-runtime/config-helpers.mjs +7 -2
- package/src/session-runtime/cwd-plugins.mjs +6 -1
- package/src/session-runtime/effort.mjs +6 -1
- package/src/session-runtime/plugin-mcp.mjs +116 -12
- package/src/session-runtime/settings-api.mjs +7 -1
- package/src/standalone/channel-worker.mjs +25 -3
- package/src/standalone/explore-tool.mjs +5 -5
- package/src/standalone/hook-bus/config.mjs +38 -2
- package/src/standalone/hook-bus/handlers.mjs +103 -11
- package/src/standalone/hook-bus.mjs +20 -6
- package/src/standalone/memory-runtime-proxy.mjs +40 -5
- package/src/tui/App.jsx +214 -30
- package/src/tui/app/core-memory-picker.mjs +6 -6
- package/src/tui/app/model-options.mjs +10 -4
- package/src/tui/app/settings-picker.mjs +5 -30
- package/src/tui/app/slash-commands.mjs +0 -1
- package/src/tui/app/slash-dispatch.mjs +0 -16
- package/src/tui/app/text-layout.mjs +57 -0
- package/src/tui/app/transcript-window.mjs +53 -2
- package/src/tui/app/use-mouse-input.mjs +60 -47
- package/src/tui/app/use-transcript-window.mjs +38 -10
- package/src/tui/components/PromptInput.jsx +18 -1
- package/src/tui/components/TextEntryPanel.jsx +97 -33
- package/src/tui/dist/index.mjs +567 -229
- package/src/tui/engine/tool-card-results.mjs +22 -5
- package/src/tui/engine.mjs +126 -7
- package/src/tui/index.jsx +4 -1
- package/src/workflows/default/WORKFLOW.md +27 -31
- package/vendor/ink/build/components/App.js +62 -17
- package/vendor/ink/build/ink.js +78 -3
- package/vendor/ink/build/input-parser.d.ts +9 -4
- package/vendor/ink/build/input-parser.js +45 -176
- package/vendor/ink/build/log-update.js +47 -2
- package/vendor/ink/build/termio-keypress.js +240 -0
- package/vendor/ink/build/termio-tokenize.js +253 -0
package/package.json
CHANGED
|
@@ -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
|
|
@@ -88,8 +88,9 @@ function readTraceSince(ts) {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
const t0 = Date.now();
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
// Parallel round: all queries fire at once. Per-session trace attribution is
|
|
92
|
+
// by session_id so counts stay correct; per-query ms includes queueing.
|
|
93
|
+
const results = await Promise.all(QUERIES.map(async ({ q, expect, expectFail }) => {
|
|
93
94
|
const qt0 = Date.now();
|
|
94
95
|
const res = await runExplore({ query: q, cwd: CWD }, { callerCwd: CWD });
|
|
95
96
|
const text = res?.content?.[0]?.text || '';
|
|
@@ -99,8 +100,8 @@ for (const { q, expect, expectFail } of QUERIES) {
|
|
|
99
100
|
const hit = expectFail
|
|
100
101
|
? (failed && anchors === 0)
|
|
101
102
|
: (!failed && (expect || []).some((e) => lower.includes(e.toLowerCase())));
|
|
102
|
-
|
|
103
|
-
}
|
|
103
|
+
return { q: q.slice(0, 48), ms: Date.now() - qt0, anchors, failed, hit, bytes: text.length };
|
|
104
|
+
}));
|
|
104
105
|
|
|
105
106
|
// Attribute tool calls per explorer session spawned during this run.
|
|
106
107
|
const rows = readTraceSince(t0);
|
|
@@ -56,6 +56,25 @@ const summaryRow = { role: 'user', content: `${SUMMARY_PREFIX}\nmessages=10 sha2
|
|
|
56
56
|
const ackRow = { role: 'assistant', content: '.' }
|
|
57
57
|
// (vi) internal runtime nudge user row.
|
|
58
58
|
const nudgeRow = { role: 'user', content: '[mixdog-runtime] Your previous response was empty. Continue.' }
|
|
59
|
+
// (vi-b) model-visible tool-completion wrapper row (mgr.enqueuePendingMessage
|
|
60
|
+
// mirror of modelVisibleToolCompletionMessage — the transcript-watcher bug
|
|
61
|
+
// this change fixes: these were previously persisted verbatim).
|
|
62
|
+
const completionWrapperRow = {
|
|
63
|
+
role: 'user',
|
|
64
|
+
content:
|
|
65
|
+
'The async shell task task_123 has finished (completed) - review this result in your next step.\n\n' +
|
|
66
|
+
'Result:\n> background task\n> task_id: task_123\n> status: completed',
|
|
67
|
+
}
|
|
68
|
+
// (vi-c) UNQUOTED persisted form — taken from a real DB row. No `> ` prefix
|
|
69
|
+
// on the Result body; isModelVisibleToolCompletionWrapper alone misses this
|
|
70
|
+
// shape, so shouldExcludeIngestMessage falls back to the instruction-head
|
|
71
|
+
// regex (isUnquotedToolCompletionHead).
|
|
72
|
+
const unquotedCompletionRow = {
|
|
73
|
+
role: 'user',
|
|
74
|
+
content:
|
|
75
|
+
'The async shell task task_456 has finished (completed, exit 0) - review this result in your next step.\n' +
|
|
76
|
+
'Result:\nbackground task\ntask_id: task_456\nstatus: completed',
|
|
77
|
+
}
|
|
59
78
|
// (vii) normal human + normal assistant.
|
|
60
79
|
const normalUser = { role: 'user', content: '안녕' }
|
|
61
80
|
const normalAsst = { role: 'assistant', content: '네 안녕하세요' }
|
|
@@ -67,6 +86,8 @@ const before = {
|
|
|
67
86
|
summaryRow: summaryRow.content,
|
|
68
87
|
ackRow: ackRow.content,
|
|
69
88
|
nudgeRow: nudgeRow.content,
|
|
89
|
+
completionWrapperRow: completionWrapperRow.content,
|
|
90
|
+
unquotedCompletionRow: unquotedCompletionRow.content,
|
|
70
91
|
normalUser: normalUser.content,
|
|
71
92
|
normalAsst: normalAsst.content,
|
|
72
93
|
}
|
|
@@ -78,6 +99,8 @@ const after = {
|
|
|
78
99
|
summaryRow: ingestRow(summaryRow),
|
|
79
100
|
ackRow: ingestRow(ackRow),
|
|
80
101
|
nudgeRow: ingestRow(nudgeRow),
|
|
102
|
+
completionWrapperRow: ingestRow(completionWrapperRow),
|
|
103
|
+
unquotedCompletionRow: ingestRow(unquotedCompletionRow),
|
|
81
104
|
normalUser: ingestRow(normalUser),
|
|
82
105
|
normalAsst: ingestRow(normalAsst),
|
|
83
106
|
}
|
|
@@ -96,6 +119,8 @@ assert(after.referenceRow === null, 'Reference files row must be excluded')
|
|
|
96
119
|
assert(after.summaryRow === null, 'SUMMARY_PREFIX row must be excluded')
|
|
97
120
|
assert(after.ackRow === null, '`.` ack row must be excluded')
|
|
98
121
|
assert(after.nudgeRow === null, '[mixdog-runtime] nudge row must be excluded')
|
|
122
|
+
assert(after.completionWrapperRow === null, 'model-visible tool-completion wrapper row must be excluded')
|
|
123
|
+
assert(after.unquotedCompletionRow === null, 'unquoted tool-completion wrapper row (real DB shape) must be excluded')
|
|
99
124
|
|
|
100
125
|
// (vii) normal conversation survives intact.
|
|
101
126
|
assert(after.normalUser === '안녕', 'normal human text must survive intact')
|
|
@@ -136,6 +161,8 @@ const rows = [
|
|
|
136
161
|
['(iv) SUMMARY_PREFIX', before.summaryRow, after.summaryRow],
|
|
137
162
|
['(v) `.` ack', before.ackRow, after.ackRow],
|
|
138
163
|
['(vi) [mixdog-runtime] nudge', before.nudgeRow, after.nudgeRow],
|
|
164
|
+
['(vi-b) tool-completion wrapper', before.completionWrapperRow, after.completionWrapperRow],
|
|
165
|
+
['(vi-c) unquoted tool-completion (real DB shape)', before.unquotedCompletionRow, after.unquotedCompletionRow],
|
|
139
166
|
['(vii) normal human', before.normalUser, after.normalUser],
|
|
140
167
|
['(vii) normal assistant', before.normalAsst, after.normalAsst],
|
|
141
168
|
]
|
|
@@ -69,7 +69,7 @@ for (const required of [
|
|
|
69
69
|
'Outcome-first concise handoffs for coding work',
|
|
70
70
|
'Practical concise — outcome-first handoffs',
|
|
71
71
|
'file_path:line_number',
|
|
72
|
-
'
|
|
72
|
+
'Controlled detail',
|
|
73
73
|
'Synthesize agent or retrieval results',
|
|
74
74
|
'Do not hide blockers',
|
|
75
75
|
'verification was not run, say so once',
|
|
@@ -106,9 +106,9 @@ try {
|
|
|
106
106
|
assert(!customRules.includes('Mixdog default — the most detailed of the three styles'), 'custom outputStyle should not append default style');
|
|
107
107
|
const profileMeta = rulesBuilder.buildLeadMetaContent({ PLUGIN_ROOT: join(root, 'src'), DATA_DIR: dataDir });
|
|
108
108
|
assert(profileMeta.includes('Use "재영님" when directly addressing the user'), 'profile title must inject into Lead BP3 meta');
|
|
109
|
-
assert(profileMeta.includes('
|
|
109
|
+
assert(profileMeta.includes('do not repeat it in routine progress updates or pre-tool preambles'), 'profile title must not encourage title in preambles');
|
|
110
110
|
assert(/Default user-facing response language from system locale/.test(profileMeta), 'system profile language must resolve from system locale');
|
|
111
|
-
assert(profileMeta.includes('
|
|
111
|
+
assert(profileMeta.includes('pre-tool preambles (even single-line)'), 'profile language must cover pre-tool preambles');
|
|
112
112
|
} finally {
|
|
113
113
|
rmSync(dataDir, { recursive: true, force: true });
|
|
114
114
|
}
|