Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 11:58
· 154 commits to main since this release

Changes since v0.1.14:

  • 0.2.0
  • docs: CHANGELOG 0.2.0 dated; README and CHANGELOG say Pier, never head
  • docs: 10's role table row is one line, architecture says what settings.ts imports from core/types, 05 carries no ceiling of its own, AGENTS' core row names /skills and the skill-prefix rewrite
  • docs: 03 system-input rows name the glyphs the icons actually draw
  • docs: 08 lists the schedule verbs on /task; 09 drops the removed continuous switch
  • docs: 06 — any user message is editable, and the raised shadow is the composer's and palette's
  • docs: 05 names what boards.ts really imports
  • docs: 03 drops standDownShadowed — the not-loaded verdict is computed at list time
  • docs: 10 names the head's real ⋯ menu and its home-chat key
  • docs: 04 says ChannelControl is built in main.ts, not runtime.ts
  • docs: architecture map lists every file at HEAD, all four socket routes, the real command parse and receipt sweep
  • docs: 04 names the home DM exception, the full ChannelControl and the real receipt sweep
  • docs: 11 home chat matches the built code — isHome covers threads, no build order or 'as today'
  • web: comments name no deleted file or old behaviour — the why each line still owes
  • channels: delete Chains.oldest and ConversationStore.boundSessions — their callers went with Telegram and the web ↔ IM handoff
  • docs: CHANGELOG 0.2.0 draft — what the continuous conversation, the home chat and the one-bar web change for an operator
  • deploy: ~/.pier/home in backups, passkeys log area, the Settings-header version badge
  • pier-help: the head's home and callbacks, /new and /stop on the head and home chat, no 'IM is unchanged'
  • readme: the conversation, its head and home chat explained; status line without a stale version; Settings tabs and the version badge as they are
  • src: drop export from 93 declarations only their own module uses — the module surface names only what another file imports
  • lark: a panel card in the home chat is stale, a topic tap there is the head's
  • Squash commits from slack-conversation
  • Squash commits from files-md-render
  • config-sync: version gate, source-owned fields, no boot sync
  • Squash commits from path-link-cwd
  • web: /api/fs/file frameable by the same origin — the Files viewer shows a PDF inline; attachment PDFs open in Files again
  • web: attachment PDFs keep their own tab — X-Frame-Options: DENY bars every frame, the Files viewer's included; FilesSession unexported
  • web: one Files dialog for Browse files, Agent → Browse files and chat file refs
  • Squash commits from tools-in-packages
  • Squash commits from status-one-panel
  • Squash commits from docs-naming-cleanup
  • pier-help: the command table's one-line copy, since the package ships no docs/design
  • channels: one command spelling, /word or %word
  • Squash commits from run-card-session-link
  • Squash commits from no-key-error
  • web: a panel closes on the user's scroll, not the page's
  • web: the Status panel shows /status's own text
  • web: steps, callback and run rows share one chevron column
  • Main conversation: named Pier; each new head starts on the Settings defaults
  • im-conversation: review — the head's key moves cleanly, chat commands wear no 👀
  • web: run cards fold to one line like callback rows — the background-run card built its head without expands and clamped the prompt with its own "Show full message" toggle, so it never joined the system-row fold
  • AGENTS: adapter ceiling 450 — the home chat's second target on every path
  • im-conversation lark: the home chat's adapter, the runtime split, the head's key
  • docs: pier-help keeps the panel facts beside the prefix rule and the home chat
  • docs: clarify IM commands and home chat
  • im-conversation: wave 1 integrated — composer lists /skills; a one-letter word is never a skill spelling
  • im-conversation core: % prefix, a chat's key on MainChain.send, /skills, skill prefixes, note labels
  • channels, web: the home flag — store, route, Console switch, control
  • im-conversation: seams — ChatConfig.home, CHAT_COMMANDS.skills; the design doc
  • web: the phone bar's title shrinks instead of wrapping — a long child title pushed ⋯ to its own line and the meta row out of the bar onto the transcript
  • docs: restore scheduled task and board interaction rules
  • web, agent: drop the routes nothing calls — POST /api/sessions with its nascent rows, /rename and /compact with their...
  • web: the conversation's bar shows only the used context; Session info reads it against rotateAt
  • web: needs you = a design awaiting Finalize or a turn the operator started
  • core: queue promotion recovery goes — the in-memory failed-batch ledger, the uncertain hold that paused automatic promotion, and the ACK flow (route, recovery panel, queue-recovery event, snapshot fields); a failed promotion now reports the error with the original text to the session via reportTo (the hub gets it whole, IM through cut 600) and keeps nothing
  • tasks: the chain ↔ tasks callback ring goes — ChainDeps' sessionOf/roleOf/designs/hub callbacks and chain's own hub subscription on the head (watch/unwatch); open items move to src/tasks/open-items.ts because the ledger join, the worker count by state and the markers table are task-run vocabulary TaskService already holds (ledger, openDesigns, store.roleOf/getRun), and the head's markers are written from TaskService's existing onTurnEnd listener; tasks +109 is core's −103 arriving with its reads direct
  • Settings: Tasks and Boards tabs, restored lean from f470e3d^
  • docs: Budgets — core's row names what it holds once open items are tasks' and the Console seam agent's; agent 2.8k, the Console's config seams declared on the side that answers them
  • agent: the chat-surface prompt and surfacePrompt leave core/reply.ts for agent/roles.ts beside DISPATCHER and LEAD — a contract injected into every session is not presentation; reply.ts keeps one line pointing at it
  • agent: the Console's Pi-config seams (config, packages, providers, config sync, web auth) and the ProviderSetup validators leave core/types.ts for agent/types.ts, declared by the side that answers them — no SDK, no node:*, so any area may import it; core/types.ts is the conversation seam only
  • core: a match beginning outside code is prose — an open-item marker whose text holds a code span was dropped by the overlap rule
  • channels: the IM note digest leaves core for lines.ts noteBody, where slack and lark now quote and label a note once — how much a chat shows is a platform fact, so Channel.notify gets the whole text. Net +11 source lines: the digest moved whole, the error exemption core had by position is now a branch, and the pair it replaces was one line per adapter
  • core: one code-skipping scanner — reply.ts's unfenced/FENCE and cjkFriendly's stash were copies of inbound-file's replaceOutsideCode, which also knows code spans; chain's localDate is identity's day, router's truncate is cut
  • core: Attached.stateSince and Router.stateSinceOf go — nothing reads them; the UI's "idle since" they claimed to feed does not exist
  • docs: core-slim design — the net-deletion plan for core/ and its wiring
  • web: the conversation's context chip reads against the rotation threshold
  • drop the web ↔ IM handoff, the working set and the close route
  • web: the conversation's bar reads only its context, and ⋯ → Status shows /status as one card
  • docs: remove stale rail terminology
  • docs: 12 links the drawer section that exists and says the order the code keeps
  • core: two comments stop naming the deleted rail
  • web: a settings write re-lists nothing — the switch it re-listed for is gone; the close refusal and the open route stop naming the rail
  • web: the session list is ordered once where it lands, not again per surface; comments and exports the deleted rail, chip and create left behind go
  • web: the status chip's name is its count — an aria-label read "In progress" over "2 running · 1 needs you"
  • web: an error takes back only this tab's own optimistic streaming — between two turns of one run the server's streaming stands
  • test: the chain rig follows main's sessionOf dep and the switch's absence
  • docs: describe the one-bar web workbench
  • web: the Settings head keeps title and ✕ on the phone's first line, and a folded system row stays one line
  • web: the bar's running chip goes — the status chip is the one count of what is in flight, and the drawer the way to it
  • web: one bar and the In progress drawer in place of the rail
  • web: the composer's continuous dep is required, and a prompt refused before its turn clears the streaming state
  • web: drop the -webkit-backdrop-filter copies that trail the standard property
  • core: a lost head leaves main_chain — with no transcript on disk it rendered 'unknown session' above the head on every Conversation load; the three added lines are the delete, in one transaction with the new head's row
  • settings: delete the continuous switch — the instance is always the continuous conversation; its routes always answer, a role'd session always gets the child cap, and the chain is a required dep of the web server and TaskService
  • web: seeds, callbacks and delegations fold to one line that opens to their card; a failed run's reason stays on the line
  • docs: 12-ui-shape — one column, one bar, In progress drawer; folds in Phase B
  • core: /status follows an item's session, not its run; lists only untracked live runs
  • core: speaker header carries lang= on a language change
  • agent: tell every session not to cd into its own cwd
  • web: a completion row is picked on pointerup, so a finger scrolling the list past eight rows fills nothing
  • docs: 11 §Open records no migration for definitions saved with none
  • docs: 09 §list no longer credits the deleted Console row
  • web: the Console's one row needs no Map of rows, and the composer's exact-word test needs no cast
  • tasks: store.listRuns drops the offset only the deleted /api/tasks/:id/runs paging passed
  • docs: three sentences still named tasks/routes.ts, /api/tasks/:id/* and the Console's row after their deletion
  • web: Settings' two links to #/tasks/ pointed at the deleted Automation route and landed on the chat
  • docs: 11 §Open records the two defaults Phase A took
  • tasks: service keeps setEnabled and listRuns — pier task pause/resume and list's lastRun call them
  • Console: delete Automation and Boards; the transcript and the folder are the surface
  • tasks: pause/resume/archive verbs, list's nextRun/lastRun, saved callbacks default to the conversation
  • web: the composer completes /skill: from the session's own skills
  • web: the conversation's ⋯ menu drops New session here too; 11 names the unread dot amber, 03's colour
  • web: In progress is the palette's Running set less the conversation — needs you = unread, so a finished lead stays until viewed, and the conversation's ⋯ menu drops Rename, Close and Continue in…
  • docs: product shape under the continuous conversation
  • web: the rail's lead-phase test says design as a flag, not a prompt
  • tasks: a lead is design only when main launches it with --design
  • tasks: a design lead's Design final: in its own session reports like a run's
  • web: a design lead waiting on the user stays in In progress, and /status lists it
  • web: pinning an already-pinned model uses the dialog's reasoning level
  • Squash commits from continuous-simplify
  • web: a lead leaves In progress once its runs are finished
  • AGENTS.md: core/ ceiling 1.75k → 1.8k
  • Squash commits from rail-dedupe
  • web: slash-command menu rows center, align and highlight once
  • Squash commits from chat-commands-new-stop
  • Squash commits from lead-finish-status
  • DISPATCHER: open items are only work in flight or awaiting the user's decision
  • Squash commits from continuous-open-items
  • Squash commits from conversation-route
  • lead: only the user finalizes a design; the rail names runs by intent and tags a lead's phase
  • Squash commits from model-menu-dup-pins
  • Squash commits from tier-by-difficulty
  • web: light only the route's rail row, and title the conversation "Conversation"
  • Squash commits from model-menu-tiers
  • tasks: a lead run that did not succeed calls main back — a failure is not a turn the user read in the lead's session; channels: the IM panel shows tokens/compactAt like the web header
  • docs: GET /api/continuous names the full reason ChainReason already carries
  • tasks, web: drop an unused binding the linter flagged; reflow session-state's header
  • web: close refuses a continuous-conversation member with 409 — the rail's row is drawn from them, and the UI's disabled item was the only guard; server.test.ts builds its run rows from one storedRun
  • tasks: the menu's tier is a ModelTier on the service seam, not a string
  • chain: the full seed's reason reads CHAIN_FULL_TOKENS, not a second 60K
  • tasks: settleCallback asks createdRole, the one definition of a lead run
  • web: close a session out of the rail — a lead has no way out of the rail for its life without a remembered, reversible closed flag the list filters and a message clears; the header reads context against compactAt
  • tasks, web: a --after follow-up is visible where it waits — without the parked rows in the target's queue snapshot and the queued count on the sender's run card, a follow-up parked in the outbox looks like nothing happening on both ends until it lands
  • docs: fold the token-workflow design into 10 — 10 now carries the contracts the build shipped (full rotation, the one-line seed ledger, the dispatcher's three rules and model tiers, the terse-result preamble, compactAt, the caps' reason, the lead's rail presence and milestone-only callbacks, the cache invariants), so the design doc goes
  • tasks, web: a lead stays in the rail for its life and reports milestones only — without the role on the session row a seen lead vanishes from In progress, and without the finish-time decision every lead turn spends a main turn on what the user already reads in the lead's session
  • tasks: model tiers on the menu — a pin's tier field, the Models row select, --model and the tier in --model ?
  • chain: rotate the head past 60K tokens, one-line seed ledger, context shown against compactAt
  • Prompts name model tiers and terse results: the dispatcher decides answer-or-dispatch before its first tool call and writes no note per callback, the lead's workers get balanced/cheap, every run is told to return the conclusion and its paths, and the skill's tier table is the only place the three tiers are mapped to work — without these lines main would keep burning calls re-telling callbacks and naming model ids from memory.
  • docs: token design — the tier is a menu field the operator assigns; no model named in prompts or docs
  • docs: token design final — balanced is opus-5-5, the other pins named
  • docs: token design — a lead stays in the rail, reports milestones only; a cross-session follow-up shows where it waits
  • docs: token design — context shown against the compaction point; caps stay 100K/150K, the 200K price tier is the reason
  • docs: token and workflow design for the continuous conversation — rotate on size, fewer main calls, terse results, model by tier
  • dispatcher: multi-step research is a worker run, not answered in main
  • core: a rotation builds its seed before creating the session, so a failed seed leaves no orphan
  • tasks: a milestone wait backs off 10 s instead of being re-asked every tick
  • tasks: pier task runs answers in any session with the runs the caller launched
  • agent: the compaction cap is decided at open by what the session is, and the seam loses setCompactionCap
  • agent, web: every session's history is its branch, compacted turns included
  • docs: the continuous-session contract at half its length, its web half left to 03
  • tasks, agent: TaskService.roleOf and a duplicate role test go
  • tasks: the milestone is asked once, by the delivery engine, not copied into callbacks and groups
  • web, agent: the continuous routes and the web pane lose their copies
  • chain, tasks: one chain lookup and one creating-run query where there were three and two
  • tasks: the ledger reads runs that finished in its window, and runs by target session are indexed
  • skills: pier-tasks refuses --role beside --bash and names it for a fresh --prompt run; pier-help says what the continuous conversation is for a user — the switch, one conversation, rotation after an idle hour, In progress, leads and workers
  • docs: the continuous-session contract states what is built — Phases 1–2 as fact, Phase 3 and the unbuilt as Gap; 09 gains runs and --role lead as commands with receipt and refusals, and states once who may delegate by role; 08 lists runs; architecture names main_chain, the role contracts and the new seam members
  • dispatcher: MEMORY.md is a fact list, edited in place
  • tasks: a role is the session's for its life — a session a delegated run created is a worker, refused pier task even reopened after its run, and opened without pier-tasks
  • agent: the dispatcher keeps MEMORY.md a list of one-line facts — rationale in the daily note, nothing the contract or skills say, a superseded decision replaced, a proposed one marked
  • docs: the feature lead's contract — the role off the switch, the web's two views of a lead, the build by a new lead, the milestone rules
  • tasks: a lead's milestones — the result that leaves nothing owed it resumes its last run, committed with the delivered marks
  • tasks: pier task run --role lead — a feature lead that may delegate, never to a lead, with its contract injected at every open
  • continuous: readHistory is a required seam member, a child is capped on every open, and paging no longer flashes the pane
  • web/ui: the continuous conversation in the workbench — its rail row and In progress group, chain paging with dividers, read-only earlier sessions, the Instance switch
  • web: the continuous conversation's routes — its chain, the alias send, a head resolved ahead of a send, earlier sessions read-only off disk
  • tasks: callbacks and ownership follow the continuous conversation's chain, pier task runs is its ledger, and children compact at 150K
  • core,agent: the continuous conversation's chain — main sessions in $PIER_HOME/home, lazily rotated past an idle hour and seeded — behind a default-off instance switch
  • docs: the feature lead moves ahead of IM, since the trial runs on the web first and the lead is used there before any DM
  • docs: the continuous-session contract splits into three phases and names its cost rules — per-role compaction caps under 200K input, the lead's fresh build session — so Phase 1 has a boundary and main is woken once per lead milestone, not per worker
  • docs: the continuous-session contract adds the optional feature lead, so a feature's design and integration run beside the dispatcher instead of through it
  • docs: the continuous-session contract records the operator's answers on rotation, reply surface, bound threads and the seed
  • docs: the continuous-session trial needs one contract naming what it reuses and the gaps it must build before any code lands
  • tests: a testkit stays out of the package, and the docs name both
  • tests: one fake AgentSession for every area, in core/session.testkit.ts
  • just size: a .testkit.ts file is test support, excluded like *.test.ts
  • tests: main and views run their leaf modules for real
  • tests: one fake DOM for web/ui
  • tests: drop the inventory of removed task operations

pier update stops the service and writes a copy of the database to
~/.pier/db/backups/ before installing. Schema migrations are one-way.
See docs/deploy.md.