Commit Graph
282 Commits
Author SHA1 Message Date
weichen 727f3702d0 Expose builtin document parsing through the host handle
ci / vet-and-test (pull_request) Successful in 46s
Why: downstream parsers are unreachable via extension.Host and the base lacked xlsx/pptx parsers; MS1 needs Excel and PPT ingest (EXT-5 request, documents proposal 2026-10-06-ext-5-host-parse-document).

Evidence: local GOWORK=off go test ./... all 29 packages pass incl. new ooxml_test (hand-built parts), ooxml_python_test (openpyxl/python-pptx round-trip), inproc owner-scope and limit tests, xlsx upload e2e; go vet clean; recorded as SELF on the Dev task card, PR CI to confirm.

Impact: Host gains ParseDocument (pure compute; errors only on ctx cancel or >100MiB input); builtin:xlsx (sheet order via workbook.xml rels, rich-text shared strings, formula cache, 1900/1904 dates, sparse cells) and builtin:pptx (sldIdLst order, titles, group shapes, AlternateContent Choice, tables, notes) added with 200k-cell/64MiB-part caps; legacy doc/xls/ppt get an actionable hint; ParsersDescription gains xlsx/pptx and the missing text ext; surface snapshot now records exported interface methods; docx part reads share the 64MiB cap.

Refs: documents 2026-10-06-ext-5-host-parse-document.md; EXT-1 host.go precedent.
2026-10-06 14:59:38 +00:00
weichen f9212d01b7 Merge pull request 'Merge EXT-1 inproc plugin command handler into main' (#66) from feature/ext-1-inproc-handler into main
ci / vet-and-test (push) Successful in 41s
2026-10-06 01:25:37 +00:00
weichen cb26e4c947 Add EXT-1 inproc plugin command handler with owner-scoped host handle
ci / vet-and-test (pull_request) Successful in 41s
Why: 进程内插件命令此前只登记规格不绑处理器,分发即 "no host handler bound",
且插件无 owner 凭证(H4);EXT-1 最小集补上处理器绑定与 owner 作用域宿主句柄。
Evidence: pkg/extension 新增 Request/Handler/Host + Registry.AddCommandHandler(surface.txt 12→15);
cmdbus.RegisterPluginCommand 三例测试(committed/未绑 rejected/高危确认卡先拦);
rag.IndexChunks 抽出并两例直测;internal/app hostcaps+inprocHost 复用 hostapi owner 作用域实现,
applyCompiled 携 caps,inproc_host_test 双 owner 隔离 + provider=hash 向量写入均通过;go test ./... 29 包全绿。
Impact: 公开面依赖从零外部模块变为 +agent-system-core(声明式 go.mod 需按 compat-policy §4 加 core require+replace);
既有路径语义不变,SurfaceVersion 保持 2.0.0-experimental。
Refs: documents 提案 2026-10-05-ext-1-inproc-command-handler.md;V1.2 方案批注 1。
v0.1.0
2026-10-05 11:39:25 +00:00
weichen 3f438b9e80 Merge pull request 'Make boolean column reads and writes work on both storage tiers' (#62) from fix/pg-boolean-columns into main
ci / vet-and-test (push) Successful in 40s
2026-10-05 05:03:04 +00:00
weichen 4b93abbb2d Merge remote-tracking branch 'origin/main' into fix/pg-boolean-columns
ci / vet-and-test (pull_request) Successful in 40s
# Conflicts:
#	internal/store/auth.go
#	internal/store/projects.go
2026-10-05 05:01:01 +00:00
weichen 4136bdcbbb Merge pull request 'Bind archived filter as bool in ListTasks' (#65) from feature/store-pg-archived-literal into main
ci / vet-and-test (push) Successful in 40s
Merge pull request 'Bind archived filter as bool in ListTasks' (#65) from feature/store-pg-archived-literal into main
2026-10-05 03:21:13 +00:00
weichenandCursor 8d82408bb7 Bind archived filter as bool in ListTasks
ci / vet-and-test (pull_request) Successful in 41s
Why: GET /api/conversations on the default unarchived view appended
AND archived=0. PostgreSQL stores conversations.archived as BOOLEAN
and rejects boolean = integer (42883), so listTasks returned 500.
The previous dialect fix bound parameters and scans but left this literal.

Evidence: before the change, TestConversationFlagsAndTaskList against
pg1 failed with SQLSTATE 42883. After: AGENT_PG_TEST_DSN set to pg1,
go test ./internal/store -count=1 passed; go vet ./... && go test ./...
passed on SQLite.

Impact: the default task list works on the postgres tier. SQLite still
binds the bool as 0/1. openTestStore accepts URL and keyword DSNs and
keeps public on search_path so an existing pg_trgm extension stays visible.

Refs: Agent-System-Dev feature/store-pg-archived-literal
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-05 03:18:10 +00:00
weichen dc3462b62b Merge pull request 'Bind booleans as bool for the postgres dialect in auth and conversations' (#64) from feature/store-pg-bool-dialect into main
ci / vet-and-test (push) Successful in 39s
2026-10-05 02:53:24 +00:00
weichen 14aa60b698 Bind booleans as bool for the postgres dialect in auth and conversations
ci / vet-and-test (pull_request) Successful in 42s
Why: user create/reset-password and conversation flag updates wrote 1/0
literals and boolInt ints into BOOLEAN columns; SQLite tolerates it,
PostgreSQL rejects with 42804. The 10-04 user create on pg1 failed midway
(empty password_hash, is_admin=f), and password reset, user list (bool
scanned into int) and login (GetUserAuthState scan) were all broken on
the postgres tier.

Evidence: store tests green; against the live pg1 the fixed CLI completes
user reset-password and user list (isAdmin=true, mustChangePassword=true,
hasPassword=true).

Impact: auth/account management and conversation list/flag paths work on
postgres; SQLite unchanged (0/1 converts via driver.Bool). No schema
changes.

Refs: dev-repo PR for gitlink bump (feature/store-pg-bool-dialect)
2026-10-05 02:53:14 +00:00
weichen 272d4d6d1c Store secrets apart from settings and guard open listeners
ci / vet-and-test (push) Successful in 42s
Merge pull request 'Store secrets apart from settings and guard open listeners' (#63) from feature/sillytavern-review into main
2026-10-04 19:42:36 +00:00
weichenandCursor c05832dd6a Pin agent-system-core after the contract type cleanup
ci / vet-and-test (pull_request) Successful in 43s
Why: Dev and the backend checkout must name the same core commit, and the section type is no longer a separate export.
Evidence: modules/core is 0b5c774. The nested checkout is detached at that commit.
Impact: Backend still compiles the same Go observation type. Only the TypeScript export changed.
Refs: .task/feature-sillytavern-review.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 18:36:58 +00:00
weichen 8c7f3d9a7e Pin agent-squad to the shared agent-native commit
Why: The pin check requires Backend's squad gitlink to match Dev, and that squad commit must itself pin the message-shaping agent-native.
Evidence: Squad commit 5a57636 points agent-native at 3a110a7.
Impact: Backend and Dev resolve the same squad and native trees.
Refs: docs/records/2026-10-04-sillytavern-review.md
2026-10-04 18:28:30 +00:00
weichen 42cca8fade Store secrets apart from settings and assemble context at the end
Why: Masks must not be the only copy of a key, and personal instructions, lore hits, and candidate replies have to reach the model without rewriting the system prefix or deleting history.
Evidence: go test ./internal/store ./internal/ctxasm ./internal/settings ./internal/runtime ./internal/server. Migration v16 upgrades and rolls back. Startup snapshots settings before moving raw keys.
Impact: One labeled key is active per service. Excluding a message hides its whole run from the model. Regenerating appends another candidate and rewinds files to the user turn. User slash commands expand to prompt text and do not fire on their own.
Refs: docs/records/2026-10-04-sillytavern-review.md
2026-10-04 18:20:10 +00:00
weichenandCursor 8eda35f365 Refuse open listeners and cross-site writes without auth
Why: The embedded tier starts without auth, and nothing checked Origin or Host, so a public bind or a foreign page could call write APIs.
Evidence: go test ./internal/config ./internal/server covering listen policy, origin rejection, and response headers.
Impact: Non-loopback without auth exits before opening the database. HTML artifacts get a sandbox CSP. Reverse proxies must list their public host in allowedHosts.
Refs: feature/sillytavern-review
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 17:28:46 +00:00
weichen 685bd0d171 Make boolean column reads and writes work on both storage tiers
ci / vet-and-test (pull_request) Successful in 46s
Why:
The dev runtime switched to the PostgreSQL tier and every conversation
endpoint started returning 500. Migrations define
conversations.pinned/archived/allow_cross_read/cross_private and
users.must_change_password/is_admin as BOOLEAN on PostgreSQL but
INTEGER on SQLite, while the store layer compared them with 0/1
literals, scanned them into int, and wrote them via boolInt().
Under pgx these fail with 42883 (operator does not exist: boolean =
integer), bool encode errors, or 42804 (column is of type boolean but
expression is of type integer).

Evidence:
- parent-repo main 4fd03ee with AGENT_PG_TEST_DSN:
  TestConversationFlagsAndTaskList and TestAdminAccountsAndSessions
  fail with the errors above; live GET /api/conversations returned
  "operator does not exist: boolean = integer (SQLSTATE 42883)".
- this branch: full ./internal/store suite green on the PostgreSQL
  tier (AGENT_PG_TEST_DSN against a scratch database), pgbus green,
  make test-backend green on the SQLite tier.
- scan into *bool and Go bool parameters are cross-dialect: pgx encodes
  bool natively; database/sql converts bool<->0/1 for SQLite.
- pre-existing and out of scope: ./internal/runmgr PG integration tests
  fail on main too (gin_trgm_ops invisible inside the search_path
  isolation schema, 42704).

Impact:
Conversations list/detail/flags and user auth-state reads/writes now
work identically on both storage tiers; SQLite behavior is unchanged.

Refs: Dev task .task/fix-pg-boolean-columns.md
2026-10-04 14:51:48 +00:00
weichen fd17011047 Merge pull request 'Expand dotted setting keys and mask secret pools' (#61) from fix/settings-dotted-keys into main
ci / vet-and-test (push) Successful in 43s
2026-10-04 13:43:05 +00:00
weichen fd7ecaa661 Merge remote-tracking branch 'origin/main' into fix/settings-dotted-keys
ci / vet-and-test (pull_request) Successful in 49s
2026-10-04 13:42:24 +00:00
weichenandCursor d90b9c045b Expand dotted setting keys and mask secret pools
ci / vet-and-test (pull_request) Successful in 52s
Why: A dotted-key PUT was stored beside the nested object and never read, so replacing a key kept the old pool. GET also returned tools.tavily.apiKeys in clear text, and saving settings would write the mask placeholder back over a real key.
Evidence: go test ./...
Impact: Dotted writes take effect on the next read. Startup expands stored dotted keys, and the existing nested value wins when both forms exist. GET masks schema secrets, including apiKeys. Writing the mask placeholder no longer overwrites a stored secret.
Refs: fix/settings-dotted-keys
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 13:01:38 +00:00
weichen 6b05e888fb Merge pull request 'Run tool scripts through the shared host and keep orchestration off' (#60) from feature/code-orchestration into main
ci / vet-and-test (push) Successful in 41s
2026-10-03 18:07:12 +00:00
weichenandCursor cd57276f1c Run tool scripts through the shared host and keep orchestration off
ci / vet-and-test (pull_request) Successful in 39s
Why: workflow scripts and run_tool_script should share one Python host, while a slow MCP server must not block the first prompt.
Evidence: GOWORK=off go test ./internal/runtime/ ./internal/app/ ./internal/settings/ ./internal/tools/ ./internal/runmgr/
Impact: runtime.codeOrchestration defaults to false, so the tool stays hidden. Workflow script confirmation and its longer timeout cap stay as they were.
Refs: feature/code-orchestration
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 18:04:25 +00:00
weichen 96dec4048f Merge pull request 'Rewind tracked files and fall back before the first token' (#59) from feature/durable-rewind into main
ci / vet-and-test (push) Successful in 39s
2026-10-03 17:40:15 +00:00
weichenandCursor bead03374e Rewind tracked files and fall back before the first token
ci / vet-and-test (pull_request) Successful in 39s
Why: workspace writes had no checkpoint, and a 5xx before any output stopped the turn instead of trying the next configured model.
Evidence: GOWORK=off go test ./internal/runtime/ ./internal/runmgr/ ./internal/tools/ ./internal/settings/ ./internal/server/ ./internal/app/
Impact: models.chat.fallbacks defaults to empty, so existing runs keep their model. Rewind restores only tracked writes and appends a system note. Usage records the model that served.
Refs: feature/durable-rewind
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 17:31:56 +00:00
weichen ebfa7677e4 Merge pull request 'Gate tools by session mode and show confirmation details' (#58) from feature/permission-hooks into main
ci / vet-and-test (push) Successful in 39s
2026-10-03 17:06:48 +00:00
weichenandCursor ce95cd1355 Pin rebased native, squad, and core permission commits
ci / vet-and-test (pull_request) Successful in 40s
Why: Those three branches were replayed onto origin/main after the first pin.
Evidence: native 0a52d9f, squad beea97e, and core cf7df54 each contain origin/main.
Impact: The backend build uses the same commits that will be merged.
Refs: feature/permission-hooks
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 17:02:47 +00:00
weichenandCursor 6b0ff49f34 Gate tools by session mode and show confirmation details
Why: Plan mode has to block writes, confirmations dropped the argument preview, and direct chat did not share its stop gate with squad members.
Evidence: GOWORK=off go test ./internal/store/ ./internal/tools/ ./internal/runmgr/ ./internal/runtime/ ./internal/server/ passed. Default mode still runs write_artifact; plan mode rejects it.
Impact: Empty permission mode keeps the profile allow, deny, and confirm lists. High-risk shell commands now ask. There is no bypass-all mode.
Refs: feature/permission-hooks
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 17:01:46 +00:00
weichen 8f946e3094 Merge pull request 'Send an SSE retry interval and replay after overflow' (#57) from feature/runstate-shell into main
ci / vet-and-test (push) Successful in 40s
2026-10-03 16:41:40 +00:00
weichenandCursor 7bef7a4f94 Send an SSE retry interval and replay after overflow
ci / vet-and-test (pull_request) Successful in 40s
Why: A dropped subscription had no retry hint, and a reconnect had no test that the gap is filled from the cursor.
Evidence: The stream starts with retry: 1000. A live publish is delivered, and Last-Event-ID after an overflow replay skips events the client already has.
Impact: EventSource waits one second before reconnecting. Persisted events are unchanged.
Refs: feature/runstate-shell
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 16:35:34 +00:00
weichen 40728ab671 Merge pull request 'Cap tool results by character and gate stale file writes' (#56) from feature/context-engineering into main
ci / vet-and-test (push) Successful in 42s
2026-10-03 16:25:50 +00:00
weichenandCursor b2dc9a7e0b Pin agent-squad to the context-engineering native
ci / vet-and-test (pull_request) Successful in 38s
Why: The pin check requires backend's squad gitlink to match the Dev pin, and that squad commit carries the native context-engineering loop.
Evidence: deps/agent-squad is 4d53450, whose agent-native gitlink is 6fd1d44.
Impact: No backend behavior change beyond the shared native loop.
Refs: feature/context-engineering
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 16:22:32 +00:00
weichenandCursor 78ce78a7d3 Cap tool results by character and gate stale file writes
Why: Byte truncation split UTF-8, subagent results could return unbounded text, and a write could overwrite a file that changed after it was read.
Evidence: cutRunes keeps a two-character Chinese prefix; tool selection honors -name; checklist reminders go through the reminder bus.
Impact: Tool output limits count characters. A subagent result over 32000 characters is stored as an artifact and the parent sees the path. fs_write_file rejects an existing file that was not read in this run.
Refs: feature/context-engineering
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 16:21:02 +00:00
weichen 4e00c98cb5 Merge pull request 'Retry direct model calls before the first delta' (#55) from feature/llm-robustness into main
ci / vet-and-test (push) Successful in 42s
2026-10-03 15:56:15 +00:00
weichenandCursor 93adb93b9d Retry direct model calls before the first delta
ci / vet-and-test (pull_request) Successful in 40s
Why: The direct path never retried provider timeouts, so a single 429 failed the run.
Evidence: go test ./internal/settings/ ./internal/runtime/ passed. Default runtime.llmRetries is 2.
Impact: Retries happen only when the stream has not forwarded a delta. Injected test streams are not wrapped.
Refs: feature/llm-robustness
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 15:53:42 +00:00
weichen 28ccb741e4 Merge pull request 'Replay an open run from its first event' (#54) from fix/live-run-visibility into main
ci / vet-and-test (push) Successful in 42s
2026-10-03 15:25:37 +00:00
weichen cf44bd56b0 Merge origin/main into fix/live-run-visibility
ci / vet-and-test (pull_request) Successful in 41s
Why: The pull request cannot merge while the head is behind main.
Evidence: origin/main is 5d59ee9, one commit ahead of this branch.
Impact: Keeps the resume cursor and the interrupted-run recovery together.
Refs: Backend #54
2026-10-03 15:25:12 +00:00
weichenandCursor 51b1ff6923 Replay an open run from its first event
ci / vet-and-test (pull_request) Successful in 42s
Why: Refreshing or switching back only knew the latest event cursor, so process that had already happened was missing until the run finished.
Evidence: GOWORK=off go test -count=1 -run TestConversationResumeSeq ./internal/server passed. While a hitl run waits, resumeSeq is the run's first seq minus one and is less than lastSeq; after the run completes the two cursors match.
Impact: Conversation detail gains resumeSeq beside lastSeq. No core contract change. Clients that ignore the field keep the old cursor.
Refs: Dev fix/live-run-visibility
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 15:21:29 +00:00
weichen 5d59ee9d4f Merge pull request 'Recover interrupted runs and commit terminal state once' (#53) from feature/pi-durable-borrow into main
ci / vet-and-test (push) Successful in 43s
Recover interrupted runs and commit terminal state once
2026-10-03 14:44:38 +00:00
weichenandCursor 44aa764b56 Recover interrupted runs and commit terminal state once
ci / vet-and-test (pull_request) Successful in 43s
Why: A hard kill left runs in pending, running, or waiting_hitl, a busy send stored a message before the 409, finishRun could mark a run completed without an assistant message, and a full SSE buffer dropped events without closing the stream.
Evidence: GOWORK=off go vet ./... and GOWORK=off go test -count=1 ./... passed, including store, runmgr, bus, and server recovery tests.
Impact: Migration v14 adds runs.instance_id and messages.request_id. Startup reconciliation and shutdown share one seal. Turn and workflow sends claim a slot before writing. Duplicate request ids return the existing message. SettleRun updates the run and appends the assistant message in one transaction. A full subscriber buffer closes the channel so SSE can replay from the cursor.
Refs: Dev feature/pi-durable-borrow
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 14:37:49 +00:00
weichen 8fb3cae987 Merge pull request 'Wire the squad native adapter' (#52) from feature/agent-stack-d1 into main
ci / vet-and-test (push) Successful in 53s
2026-10-03 14:02:33 +00:00
weichen 0a9a9776d6 Pin native and squad to the SSE abort fix
ci / vet-and-test (pull_request) Successful in 42s
Why: Backend's nested checkouts have to match the native head that treats a cancelled stream as aborted.
Evidence: gitlinks only. The race test passed on d84a67c.
Impact: no Backend source change.
Refs: D1
2026-10-03 13:52:01 +00:00
weichen 5d0097d145 Pin native and squad to the aligned D1 heads
ci / vet-and-test (pull_request) Successful in 5m44s
Why: Backend's nested checkouts have to match the intent, native, and squad commits Dev will pin.
Evidence: gitlinks only. Internal package tests passed before this pointer move.
Impact: no Backend source change.
Refs: D1
2026-10-03 13:45:23 +00:00
weichenandCursor aa969aa747 Pin agent-squad to the adapter-only intent import
Why: Backend must build against the squad head that keeps agent-intent inside adapters/intent.
Evidence: the previous internal package tests passed on a182d76; this commit only moves the gitlink to f68e5bd.
Impact: no Backend source change.
Refs: D1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 13:43:09 +00:00
weichenandCursor b8e8cfb754 Wire the squad native adapter instead of the core registration
Why: Backend has to keep the same squad runs after the core stopped importing agent-native. The adapter module owns the concrete client.
Evidence: GOWORK=off go test -count=1 ./internal/... passed.
Impact: AgentNativeOptions now returns the adapter config. Default roles still use the agent-system backend.
Refs: D1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 13:42:04 +00:00
weichen 6d38f17302 Pin the three agent libraries to their R2 heads
ci / vet-and-test (push) Successful in 40s
Merge via API
2026-10-03 13:22:55 +00:00
weichenandCursor 6e30569cab Pin agent-native and agent-squad to the summed R2 heads
ci / vet-and-test (pull_request) Successful in 41s
Why: native 855fe41 records the golang.org/x/text sum that intent's NFKC import needs, and squad 31ee395 pins that native commit.
Evidence: GOWORK=off go vet ./internal/squadadapter/ ./internal/app/ passed against these heads.
Impact: two gitlinks move. Backend product code is unchanged.
Refs: I4
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 13:13:58 +00:00
weichenandCursor a494375d58 Pin the three agent libraries to their R2 heads
ci / vet-and-test (pull_request) Successful in 42s
Why: backend must run against the intent, native, and squad commits that close this batch.
Evidence: agent-intent 05e74d8, agent-native 11d1a76, and agent-squad 1bb0c3a are the feature/agent-stack-r2 heads.
Impact: gitlinks move; backend product code is unchanged.
Refs: R2 pin
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 13:10:50 +00:00
weichen 9688fb9733 Merge pull request #50 from feature/agent-stack-r0-r1 into main
ci / vet-and-test (push) Successful in 43s
CI on the head commit is success.
2026-10-03 12:47:36 +00:00
weichenandCursor b365fd0f22 Install house-style Python packages before backend CI
ci / vet-and-test (pull_request) Successful in 43s
Why: TestLintErrorContinues imports the house-style linter, which needs python-docx, python-pptx, and openpyxl.
Evidence: Actions run 678 failed that test with ModuleNotFoundError: No module named docx after submodules checked out.
Impact: The packages come from the Tsinghua PyPI mirror. The test command is unchanged.
Refs: feature/agent-stack-r0-r1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 12:46:10 +00:00
weichenandCursor 26474b4752 Clone the repo in CI without GitHub-hosted actions
ci / vet-and-test (pull_request) Failing after 39s
Why: The runner cannot reach github.com, so a checkout action would time out before vet or test.
Evidence: The Go 1.27.1 tarball is available from mirrors.aliyun.com. Checkout uses the job token and GITHUB_SHA.
Impact: Submodule checkout still requires SUBMODULE_TOKEN. A missing secret fails the job with that message.
Refs: feature/agent-stack-r0-r1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 10:31:43 +00:00
weichenandCursor ef0a1bef0f Pin the three agent libraries to their pull request heads
ci / vet-and-test (pull_request) Failing after 4s
Why: Backend must call the library commits that include the hold fixes and the CI checkout change.
Evidence: intent 7f7879b06b053f0a62746309b79e0e1b9a00f42d, native 91c155618487e21edeb4f1d3cc27e985aae2b0d2, squad e928ea3c0fa649cbbbad22a93a1bc0a12dee5f7d.
Impact: The three gitlinks match the open pull request heads. Other pins are unchanged.
Refs: feature/agent-stack-r0-r1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 10:20:54 +00:00
weichenandCursor e14feb0321 Add a CI workflow that vets and tests the backend module
ci / vet-and-test (pull_request) Failing after 31s
Why: This repo had no workflow, so pull requests could not show a vet or test result.
Evidence: The job checks out submodules over HTTPS and runs GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... on Go 1.27 with GOPROXY=https://goproxy.cn,direct.
Impact: SUBMODULE_TOKEN must be set by the owner before checkout can succeed.
Refs: feature/agent-stack-r0-r1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 10:19:56 +00:00