Commit a07b4ee
Enhance WebMCP tool metadata, RPC reliability and add thread status services and add agent layout (#4748)
* fix(ai-native): localize ACP chat input placeholder
Extract hardcoded placeholder string in ACP chat view to use localize()
with i18n key, and update Chinese translation to be more concise.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: update ACP refactor design to use @agentclientprotocol/sdk
Integrate ClientSideConnection from the official ACP SDK instead of
building a custom JSON-RPC transport layer. The SDK provides complete
JSON-RPC 2.0 implementation, NDJSON parsing, request queuing, error
handling, and type validation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add ACP Node layer refactor implementation plan
Plan for replacing custom JSON-RPC transport with
@agentclientprotocol/sdk's ClientSideConnection in the Node layer.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(plan): address code review findings for ACP Node SDK refactor plan
Fix 10 issues found during plan review:
- Runtime bugs: releaseTerminal operator precedence, ndJsonStream called
before SDK loaded, uninitialized exitResolve variable
- Interface mismatches: setSessionMode return type, sendMessage missing
config parameter, authenticate method missing
- Behavioral gaps: handler rewrite now notes workspace sandboxing
preservation, permission options from agent request not hardcoded
- Add test plan with unit and integration test scenarios
- Add 3 new risk items to mitigation table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(plan): correct OpenSumi RPC architecture description — single WS, not per-connection
Replace "per WebSocket connection via childInjector" with accurate model:
single WS connection with RPC multiplexing, DI singleton services managing
one Agent process per workspace, AcpThread scoped per Agent session.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(plan): rework AcpThread to use DI factory instead of manual new
- Complete IAcpThread interface with all lifecycle methods shown in architecture diagram
- Add AcpThreadFactory (useFactory pattern) to auto-inject dependencies
- Update AcpAgentService.createThread to use factory instead of manual new
- Renumber all tasks (1-7) and steps to match new task structure
- Fix subsection numbering consistency throughout
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add AcpThread entity with process lifecycle, SDK connection, and entry management
Implements the core Thread AI entity encapsulating agent process spawning,
@agentclientprotocol/sdk connection via dynamic ESM import (Node 16 compat),
entries state management, Client interface delegation, notification dispatch,
tool call state machine, and permission request forwarding.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): align AcpThread with spec — entry types, events, and API
Fixes 9 spec compliance deviations in AcpThread:
1. Entry data contracts use SDK types (ContentBlock, ToolCall, Plan)
with data wrapper pattern instead of flattened primitives
2. Event model: replaced bulk entries_changed with granular
entry_added/entry_updated events
3. markAssistantComplete(): no params — finds last assistant entry
automatically, transitions status to awaiting_prompt
4. respondToToolCall(toolCallId, allowed: boolean): updates
ToolCallEntry.status (completed/rejected), fires entry_updated
5. reset(): preserves _initialized flag for thread pool reuse
6. initialize(): accepts AgentProcessConfig parameter
7. sessionId: non-nullable string (empty when unbound)
8. Added setError(error): sets status to errored, fires events
9. handleNotification: made public per IAcpThread interface
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add AcpThreadFactory DI provider for creating thread instances
Add AcpThreadFactoryToken, AcpThreadFactory type, AcpThreadRuntimeConfig,
and AcpThreadFactoryProvider using OpenSumi DI useFactory pattern with
Injector-based dependency resolution. The factory accepts sessionId and
runtime config (command, args, cwd, env) at call time while injecting
file system handler, terminal handler, and permission caller via DI.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(ai-native): align handler interfaces with ACP Node SDK refactor plan
- Rewrite file-system handler: replace generic FileSystemRequest/Response
with typed ReadTextFileRequest/Response and WriteTextFileRequest/Response,
remove permissionCallback, getFileMeta, listDirectory, createDirectory
- Rewrite terminal handler: change method signatures to accept individual
parameters (terminalId, sessionId) instead of request objects for
getTerminalOutput, waitForTerminalExit, killTerminal, releaseTerminal
- Remove @Injectable decorator and permissionCallback from both handlers
- Update AcpThread Client and AcpAgentRequestHandler to call handlers
with new signatures
- Fix pre-existing PlanEntry export error in index.ts
- Update tests to match new interfaces, remove obsolete test cases
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): restructure permission system for multi-session ACP support
Refactor the permission caller from a per-clientId static singleton pattern
(AcpPermissionCallerManager) to a proper DI singleton service
(AcpPermissionCallerService) that extends RPCService. Add a new
PermissionRoutingService to route permission requests from multiple ACP
sessions independently, with session registration, active session fallback,
and concurrent request support. Pass sessionId through the entire chain
from Node caller to browser dialog for multi-dialog tracking.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): rewrite AcpAgentService with thread pool pattern
Replace the single-process model (AcpCliClientService + CliAgentProcessManager)
with a multi-thread pool architecture using AcpThread instances. Key changes:
- Thread pool management with sessions Map + threadPool array (max 10)
- findOrCreateThread with idle thread reuse logic
- createSession using Deferred pattern (no setTimeout polling)
- sendMessage with streaming via SumiReadableStream + thread.onEvent
- disposeSession with default (return to pool) and force (full dispose) modes
- stopAgent disposes all threads and clears pool
- AgentUpdate mapping from SDK sessionNotification events
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(acp): pass sessionId to requestPermission in agent-request handler
The AcpPermissionCallerService.requestPermission() signature now requires
sessionId as a second parameter. Update all call sites in
agent-request.handler.ts and corresponding test assertions.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(ai-native): wire PermissionRoutingService into AcpThread and update DI bindings
- Replace AcpPermissionCallerManager with PermissionRoutingService in
AcpThreadFactoryProvider so permission requests go through the routing layer
- Update AcpThreadOptions.permissionCaller to permissionRouting
- Update backServices to bind AcpPermissionServicePath to
AcpPermissionCallerServiceToken instead of deprecated alias
- Update acp-thread.test.ts mock to match new permissionRouting interface
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): use agent-generated sessionId in AcpAgentService.createSession
Previously createSession generated a fake uuid and passed it to
loadSessionOrNew, which failed and fell back to newSession. The real
sessionId from the agent CLI was stored in the thread but not used for
the sessions map or return value.
The new flow:
1. Find or create an idle thread without sessionId binding
2. Call thread.newSession() to get the real sessionId from the agent CLI
3. Register the thread with the real sessionId
4. Return the real sessionId to callers
Also adds error-handling cleanup in loadSession to prevent thread leaks
when initialization or loadSession fails on a newly created thread.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(ai-native): add missing session methods to AcpThread
Add setSessionMode, setSessionConfigOption, and unstable session
operations (fork, resume, close, setSessionModel) to IAcpThread
and AcpThread class. Also add 12 SDK type re-exports to acp-types.ts.
Unify cancel() to use ensureInitialized() for consistent error
behavior across all methods — previously it silently returned.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(ai-native): remove AcpCliClientService and CliAgentProcessManager, update AcpAgentService
Removes the deprecated CLI client and process manager classes that have
been superseded by the thread pool pattern. Cleans up DI bindings,
barrel exports, and associated test files. Updates AcpAgentService,
AcpChatAgent, and agent-types to align with the new architecture.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(ai-native): move notification-to-AgentUpdate mapping from AcpAgentService to AcpThread
AcpThread owns SDK notification format knowledge, so translating
SessionNotification into the legacy AgentUpdate stream format belongs
there. AcpAgentService now delegates to thread.toAgentUpdate() instead
of parsing SDK internals itself.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add implementation plan for AcpThread full delegation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(ai-native): delegate setSessionMode to AcpThread instead of log-only
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(ai-native): add error handling to setSessionMode delegation
Wrap thread.setSessionMode() in try/catch with warn logging, consistent
with cancelRequest pattern. Re-throw error so caller is notified of failure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(ai-native): add loadSessionOrNew with fallback to new session
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(ai-native): proper cleanup on loadSessionOrNew failure
Track whether thread was newly created or reused. On failure:
- New thread: remove from pool and dispose
- Reused thread: reset to clean state
- Add error logging consistent with loadSession pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(ai-native): add setSessionConfigOption delegation to AcpThread
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(ai-native): add error handling to setSessionConfigOption delegation
Wrap thread.setSessionConfigOption() in try/catch with warn logging,
consistent with setSessionMode pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(ai-native): add fork/resume/close/setSessionModel delegation to AcpThread
Expose four unstable_* methods from AcpThread through IAcpAgentService
without the unstable_ prefix, enabling session lifecycle management
(fork, resume, close) and model switching from the service layer.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): add error handling to unstable session methods
Wrap fork/resume/close/setSessionModel delegations in try/catch with
warn logging, consistent with setSessionMode/setSessionConfigOption pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(ai-native): add proxy methods for new AcpAgentService session operations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(ai-native): delegate listSessions to all active threads and deduplicate
Previously listSessions only read from the pool's this.sessions Map, which
could drift from the agent's actual state. Now it delegates to each active
thread's listSessions() method, merges results with Set deduplication, and
catches per-thread errors with warn logging.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(ai-native): remove as any from listSessions, use proper SessionInfo type
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): preserve nextCursor in listSessions for single-thread case
When there is only one active thread, preserve its nextCursor for
pagination. For multiple threads, cursors cannot be meaningfully merged
so nextCursor stays undefined.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add cwd getter to AcpThread and include cwd in log statements
Adds a public cwd getter on AcpThread to expose the working directory.
All key log lines in AcpAgentService now include cwd for better traceability.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): pass cwd to listSessions in AcpCliBackService
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): show loaded session messages instead of welcome page
Render condition only checked hasUserSentMessage, causing the welcome
page to always display when loading a saved session since no message
had been sent yet. Added messageListData.length <= 1 check so recovered
messages are properly rendered.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): only trigger slash dropdown when / is first non-whitespace character
Previously typing / anywhere in the ACP input would open the slash command panel.
Now it only triggers when / is the first non-whitespace character.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): fix type mismatches in resumeSession and setSessionConfigOption
- resumeSession: add missing required `cwd` parameter, use thread.cwd as fallback
- setSessionConfigOption: replace non-existent `options: Record<string, unknown>`
with correct SDK shape `{ configId, value }`, inferring `type: "boolean"` at runtime
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): register sessions in PermissionRoutingService and unify requestId key
- Inject PermissionRoutingService into AcpAgentService and call
registerSession/unregisterSession on session lifecycle events
(createSession, loadSession, loadSessionOrNew, disposeSession, stopAgent)
to enable permission requests to reach the browser UI.
- Unify requestId format in AcpThread from `toolCallId` to
`sessionId:toolCallId` to match AcpPermissionCallerService.
- Use ?? instead of || in buildPermissionResponse to avoid empty
string optionId falling back to wrong option.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add design spec for session-bound permission dialogs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add implementation plan for session-bound permission dialogs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add active session tracking to AcpPermissionBridgeService
Add setActiveSession/getActiveSession/onActiveSessionChange to enable
session-scoped permission dialogs. Remove auto-timeout from
showPermissionDialog so dialogs wait indefinitely for user decision.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add session-scoped dialog retrieval to PermissionDialogManager
Add getDialogsForSession and clearDialogsForSession methods to filter
and clear permission dialogs by session ID.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): filter permission dialogs by active session
Filter dialogs in AcpPermissionDialogContainer to only show dialogs
belonging to the active session, using getDialogsForSession() from
PermissionDialogManager and active session tracking from
AcpPermissionBridgeService.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): notify permission bridge on session switch
Inject AcpPermissionBridgeService into AcpChatInternalService and call
setActiveSession (with acp: prefix stripped) when creating or activating
a session, so the permission bridge shows/hide dialogs for the correct session.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): extract prefix helper and notify bridge in clearSessionModel
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(ai-native): add session-bound permission dialog tests
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): address review feedback for session-bound permission dialogs
- Clear active session on dispose to prevent orphaned pending dialogs
- Reset focusedIndex on session switch to prevent out-of-range keyboard focus
- Remove unused Emitter import in test file
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add ThreadStatus and IChatThreadStatus types
Add ThreadStatus type union and IChatThreadStatus interface to the
IChatProgress union, enabling thread status events to travel across
the RPC boundary as part of the existing agent response stream.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): clear session dialogs when session is deleted
Add clearSessionDialogs to AcpPermissionBridgeService and call it from
clearSessionModel to prevent orphaned dialogs accumulating for deleted
sessions. Pending decisions are resolved as cancelled.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): inject threadStatus into AgentUpdate stream
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): emit IChatThreadStatus in RPC response stream
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): add threadStatus state and onThreadStatusChange event to ChatModel
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): render thread status icons in ACP chat history
Add threadStatus field to IChatHistoryItem interface and render status-specific
icons (working/awaiting_prompt/errored/auth_required/disconnected) in the chat
history sidebar.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): handle IChatThreadStatus in AcpChatAgent
Inject ChatManagerService and handle threadStatus updates from the
stream in invoke(), updating the corresponding ChatModel via
setThreadStatus().
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): subscribe to threadStatus changes in chat history
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add acceptance test cases for session-bound permission dialogs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): lazy-resolve RPC client to fix 'No active RPC client' error
AcpPermissionCallerService was created in the parent injector before
bindModuleBackService (which sets rpcClient) ran on the child injector.
The PermissionRoutingService injected the parent instance that never
received rpcClient.
Fix: add getRpcClient() that falls back to AcpPermissionServicePath via
the Injector, ensuring the RPC proxy is always reachable regardless of
which injector level the instance was created in.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): move PermissionRoutingService to backServices to fix RPC client injection
Root cause: AcpPermissionCallerService was in providers (parent injector)
while rpcClient was set on the backServices instance (child injector per
connection). PermissionRoutingService in providers resolved the parent
instance which never had rpcClient set.
Fix: move PermissionRoutingService from providers to backServices so
both services are created in the child injector scope per connection,
where rpcClient is properly set.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): bridge RPC client across parent/child injector scopes for permission service
AcpPermissionCallerService exists in both parent injector (providers) and
child injector per connection (backServices). bindModuleBackService sets
rpcClient only on the child instance, but PermissionRoutingService resolves
from the parent, where rpcClient is undefined.
Fix: use a static RPC client as cross-injector bridge. Child instance stores
its RPC stub via setStaticRpcClient(), called from connection.ts after rpcClient
assignment. getRpcClient() checks instance client first, then falls back to static.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): fix compilation errors and add WebMCP test mock fix
- Comment out ACP WebMCP registration (type errors deferred, add ts-nocheck)
- Fix duplicate localize import in chat.view.acp.tsx
- Replace zodToJsonSchema (v3-only) with Zod v4 built-in toJSONSchema()
- Add explicit Promise<any> return types to SSE/stdio MCP server methods
- Fix WebMCP test mock to match ChatService class token
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): fix thread status not showing in chat history and permission dialog session leak
Three bugs fixed:
1. sessionId prefix mismatch: handleThreadStatusUpdate received raw UUID
from node layer but sessionModels map uses 'acp:'-prefixed keys,
causing getSession() to always return undefined. Re-add prefix before
lookup.
2. Stale onThreadStatusChange subscription: the subscription was bound
to the initial sessionModel at mount time. After session switch, the
new model's events were never received. Now re-subscribes on
onChangeSession.
3. Permission dialog cross-session leak: PermissionDialogWidget rendered
dialogs from all sessions without filtering. Added activeSessionId
tracking and session-scoped filtering, matching the pattern already
used in AcpPermissionDialogContainer.
Also:
- Add persistent thread status listener in AcpAgentService that fires
onThreadStatusChange across the service lifecycle (not just during
sendMessage streams).
- Emit initial thread status at sendMessage start so browser always
receives current status.
- Add thread_status case to convertAgentUpdateToChatProgress.
- Add threadStatus to shared IChatHistoryItem interface.
- Remove debug console.log statements.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(superpowers): add dev-loop skill design spec
Defines the dev-loop skill that orchestrates: develop → verify → fix → verify → deliver.
Includes skill consolidation plan (delete cdp-webmcp-bridge and contract-dev),
scenario path migration to test/bdd/, dev server detection, WebMCP availability
checks (setup failure, not test failure), subagent-driven fix cycles with bounded context.
Fixes from review:
- Merge duplicate .claude/ blocks in file structure
- Clarify mid-loop WebMCP drop: stop loop, don't auto-restart Phase 0
- Add regression step: full re-run after failing scenarios pass
- Define contract vs scenario relationship explicitly
- Add impact checks for skill deletion (references, user habit)
- Fix dot diagram (cycle>3 as separate branch), add delegation contract marker
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(superpowers): add dev-loop skill implementation plan
5 tasks: migrate BDD scenarios to test/bdd/, merge cdp-webmcp-bridge
into verification-scenarios, create dev-loop orchestrator skill,
delete contract-dev, verify final structure.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(bdd): migrate CDP/WebMCP scenarios from specs to test/bdd
Extract 5 BDD scenario files from the CDP verification scenarios spec
into executable test/bdd/ directory for the dev-loop skill to consume.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(skills): merge cdp-webmcp-bridge into verification-scenarios
Consolidate CDP+WebMCP bridge reference into the verification-scenarios skill.
Adds Phase 0 (environment setup) to the workflow, expands data-testid reference,
and adds troubleshooting section. Deletes standalone cdp-webmcp-bridge skill.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(skills): add dev-loop orchestrator skill
Add the dev-loop skill that orchestrates a closed-loop development
workflow (develop -> verify -> fix -> verify -> deliver) with automatic
browser verification via CDP and WebMCP. Supports up to 3 auto-fix
cycles with subagent-driven diagnostics.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(skills): address code review findings for dev-loop skill
- Clarify auto-generated scenario template with explicit structure guidance
- Fix partial-pass exit conditions: all pass → full regression → Phase 4
- Add reference to cdp-verification-scenarios scenario format for consistency
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(skills): address final review blocking issues
- Create contract-dev stub redirecting to dev-loop
- Update stale scenario path in cdp-verification-scenarios
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(acp): unify thread status icons with spinning animation for working state
Simplified thread status icon mapping: only working (loading with spin) and
errored (error) use distinct icons; all other states use disconnect. Uses
Icon's animate='spin' prop instead of concatenating class names into iconClass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(superpowers): add background permission notification design spec
Design for surfacing permission requests from background ACP sessions:
history button badge counts pending requests from non-active sessions,
and a key icon marks affected rows inside the history popover.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add pending permission index to bridge service
Track pending permission requests per session so the UI can
display a badge count and per-session indicators. Adds
onPendingCountChange event and two query methods:
getPendingCountExcludingActive and hasPendingForSession.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): register nodePath and agents preference schema entries
Add ai-native.acp.nodePath (string) and ai-native.acp.agents (object with
per-agent command/args/env overrides) to the preference system for
discoverable UI-editable ACP agent spawn configuration.
* fix(acp): extract cleanupPendingIndex and add defensive event fire
Deduplicate the pending index cleanup logic from handleUserDecision and
handleDialogClose into a private cleanupPendingIndex method. Also add a
defensive onPendingCountChange fire in clearSessionDialogs when entries
are removed from the reverse requestIdToSessionId map that would not be
covered by the pendingBySessionId.delete branch.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* style(acp): add pending permission badge styles
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add agentId and nodePath to thread interfaces, remove debug console.log
Extend AcpThreadRuntimeConfig and AcpThreadOptions with agentId (stable
identifier for per-agent prefs) and nodePath (Node.js runtime path from
preference, with env var escape hatch).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): render pending permission icon and badge in AcpChatHistory
- Add hasPendingPermission to IChatHistoryItem interface
- Add pendingPermissionBadge to IChatHistoryProps interface
- Render key icon on history items with pending permissions
- Show numeric badge on history button when permissions are pending
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(acp): use correct CSS variable for pending permission key icon
Use --notificationsErrorIcon-foreground (with fallback) instead
of the nonexistent --notification-foreground for the key icon color.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): implement buildAcpAgentProcessConfig browser pure function
Pure function that merges agent registration defaults with user preference
overrides (REPLACE for command/args, MERGE for env). Covers 7 test cases
including no-override, per-field override, env merge, and nodePath handling.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): sync pending permission icon/badge to ChatHistory.acp
Add hasPendingPermission field to IChatHistoryItem, pendingPermissionBadge
prop to IChatHistoryProps, key icon for pending permission sessions,
and count badge on the history button — matching the ChatHistory view changes.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): implement resolveAgentSpawnConfig node pure function
Pure function that resolves final spawn parameters from AgentProcessConfig
+ process.env + process.execPath. Handles env var escape hatches
(SUMI_ACP_NODE_PATH, SUMI_ACP_AGENT_PATH), cross-platform path resolution
(path.dirname, path.delimiter), and forced NODE/PATH override. 10 test cases.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): wire pending permission badge into chat view header
Inject AcpPermissionBridgeService into DefaultChatViewHeaderACP to
subscribe to onPendingCountChange and onActiveSessionChange events,
populate hasPendingPermission for each history item, and pass
pendingPermissionBadge prop to ChatHistory components.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(acp): replace startProcess with resolveAgentSpawnConfig, clean debug code
Replace inline spawn logic with resolveAgentSpawnConfig pure function call.
Remove console.log('newEnv') that leaked env vars to logs.
Remove commented CLAUDE_CODE_EXECUTABLE hardcoded path.
Fix cross-platform path splitting (lastIndexOf('/') → path.dirname).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): pass agentId and nodePath through AcpThreadRuntimeConfig
Update createThreadInstance and findOrCreateIdleThread to forward the new
agentId and nodePath fields from AgentProcessConfig to the thread factory.
* fix(acp): remove unused pendingPermissionBadge from base ChatHistory props
The base ChatHistory component doesn't render the badge (handled by
ACP-specific registered components). Remove the unused prop from
IChatHistoryProps and the fallback call site.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): wire buildAcpAgentProcessConfig into DefaultACPConfigProvider
Replace manual config assembly with buildAcpAgentProcessConfig pure function
call. Read ai-native.acp.nodePath and ai-native.acp.agents preferences and
pass them as userPreferences for merging with registration defaults.
* feat(acp): complete pending permission badge on base ChatHistory
The base ChatHistory.tsx component was missing the pending permission
badge and key icon that ACP variants already had. Also adds the badge
prop to the fallback ChatHistory render in chat.view.acp.tsx and the
i18n keys for the tooltip.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): complete ACP v2 implementation - path config, test fixes, and WebMCP refactor
- Migrate ACP agent subprocess startup from env vars to OpenSumi preferences
- Add agentId, toAgentUpdate, setSessionMode, permissionRouting to test mocks
- Refactor WebMCP tools registry (1100+ line reduction)
- Consolidate BDD scenarios - remove duplicates, update existing ones
- Wire DefaultACPConfigProvider with buildAcpAgentProcessConfig
- Add thread status caller service integration
- Update cross-platform path handling in spawn config
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add ACP WebMCP groups design spec
Design for progressively exposing IDE capabilities to AI agents
via ACP extension methods, organized by WebMCP groups with
on-demand loading to manage context window usage.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: address review feedback on ACP WebMCP groups design
- Add `details` field to WebMcpToolResult for human-readable errors
- Widen execute return type to `Promise<any>` for compatibility
- Clarify ACP extension method mechanism (dynamic registration via
method table, Method not found for unloaded groups)
- Clarify default-loaded auto-registration timing and agent behavior
- Fix `{file}` → `{path}` naming inconsistency across all groups
- Rename `loadedToolCount` → `totalLoadedToolCount` for clarity
- Define P2 group tool methods with parameters and service dependencies
- Group files are new source-of-truth, not extracted from registries
- Add `webmcp-utils.ts` for shared helpers (tryGetService, etc.)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add ACP WebMCP groups implementation plan
12-task plan covering P0 infrastructure (types, utils, registry, RPC
bridge, handler, extMethod hook, DI wiring) and P1 default groups
(file, terminal, editor) with integration tests.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): background session permission notification in history list
Show a badge on the history button and a bell icon on items with
pending permission requests, so users can see at a glance that another
session needs their attention without opening the popover.
Changes:
- AcpChatViewHeader: inject AcpPermissionBridgeService, subscribe to
onPendingCountChange/onActiveSessionChange, populate hasPendingPermission
- AcpChatHistory/ChatHistory.acp/ChatHistory: render amber bell icon
(mutually exclusive with thread-status icon) for pending items
- chat-history.module.less: add .chat_history_item_pending styling
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add WebMCP group types and RPC interface definitions
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add shared WebMCP utility helpers
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add browser-side WebMCP group registry
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add WebMCP RPC bridge services (browser + node)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add Node-side WebMCP extension method handler
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): hook WebMCP handler into AcpThread extMethod and add capability declaration
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): wire up DI registration for WebMCP group services
- Export WebMcpGroupRegistry, AcpWebMcpRpcService, and webmcp-utils
from browser/acp/index.ts
- Export AcpWebMcpCallerService and AcpWebMcpHandler from
node/acp/index.ts
- Register WebMcpGroupRegistry and AcpWebMcpRpcService as providers
in the browser module with backService for RPC bridge
- Register AcpWebMcpCallerService as provider and backService in the
node module, following the AcpPermissionCallerService pattern
- Inject AcpWebMcpCallerService into AcpThreadFactoryProvider and
pass it to AcpThread constructor via webmcpCallerService option
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add file WebMCP group definition
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add terminal WebMCP group definition
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): add editor WebMCP group definition
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(acp): register file, terminal, editor WebMCP groups in contribution
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(acp): add AcpWebMcpHandler unit tests
Also fix a TS2352 cast error in acp-webmcp-handler.ts where
WebMcpToolResult needed a double cast through unknown.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(acp): resolve compilation errors in WebMCP groups implementation
- Rebuild core-common to regenerate .d.ts with new WebMCP types
(AcpWebMcpBridgePath, WebMcpGroupRegistryToken, etc.)
- Fix tryGetService type signature: use Token | symbol instead of unknown
- Add missing ErrorCode variants: INVALID_INPUT, IS_DIRECTORY, NOT_A_DIRECTORY
- Fix FileStat.mtime -> FileStat.lastModification (OpenSumi API)
- Remove unsupported recursive option from fileService.delete() calls
- Remove duplicate IDisposable import in ai-core.contribution.ts
- Add non-null assertion for RPCService.client in acp-webmcp-caller.service
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): preserve ACP error messages
* fix(acp): use lazy initialization for WebMCP handler to fix RPC timing issue
AcpWebMcpHandler.initialize() was called during AcpThread.ensureSdkConnection()
before the RPC client was ready, causing TypeError: Cannot read properties of
undefined (reading '$getGroupDefinitions'). Changed to ensureInitialized() with
lazy init — group definitions are fetched on first _opensumi/* call instead.
Also removed debug console.log and unused import from acp-thread.ts.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat: pass MCP servers into ACP sessions
* feat(acp): enhance WebMCP handler with tool details and improve RPC reliability
- Return full tool metadata (method, description, inputSchema) in list_groups and load_group
- Restructure capability meta under webmcp namespace with methods list
- Add staticRpcClient fallback in AcpWebMcpCallerService for cross-injector scope calls
- Eagerly initialize WebMCP handler before ACP init to ensure groups are ready
- Proper -32601 error response for unhandled extMethod calls
- Add thread status caller/RPC services and webmcp types/polyfill
- Add debug logging throughout WebMCP handler and AcpThread extMethod flow
- Fix chat history item key to use updatedAt for proper re-rendering
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove outdated superpowers plans/specs and refine WebMCP handler
- Delete 17 stale superpowers plan and spec files from docs/
- Add permission pending indicator to AcpChatHistory
- Refine load_group response to include tool metadata
- Fix webmcp-tools.registry.ts terminal tool descriptions
- Update permission-dialog-ui and acp-webmcp-handler tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(acp): correct chat history pending icon, active highlight, and item key
- hasPendingForSession now strips the `acp:` prefix so per-item lookup
matches the raw-id-keyed pending index (badge worked, per-item bell
icon never did)
- chat_history_item_selected uses `&.` for same-element composition and
switches to --list-activeSelection* tokens so the active session is
visibly highlighted
- AcpChatHistory uses item.id as the React key instead of item.updatedAt,
preventing reconciliation collisions on empty-session items (which left
the highlight stuck on the first item)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(ai-native): expose WebMCP tools via MCP server
* fix: stabilize ACP session state handling
* refactor(acp): consolidate WebMCP on HTTP MCP and stabilize sessions
WebMCP transport:
- Drop legacy `_opensumi/*` extMethod path and per-thread
AcpWebMcpHandler. Tools are now exposed via the HTTP MCP server and
the browser-side navigator.modelContext adapter.
- Rename tool identifier from `method` (e.g. `_opensumi/file/read`) to
direct MCP `name` (e.g. `file_read`); remove redundant catalog
prefixing across registry, HTTP server, agent metadata, and types.
- Delete `webmcp-tools.registry.ts` (browser, terminal-next),
`webmcp-file-tools.registry.ts`, and `acp-webmcp-handler.ts` plus
their tests.
Session lifecycle:
- Track `pendingSessionLoads` so concurrent loadSession callers join
the in-flight load instead of observing a half-registered thread.
- Add `sessionRefCounts` so disposeSession releases lazily once all
callers detach, preventing premature teardown.
- Filter `session_notification` events by sessionId in both AcpThread
and AcpAgentService so notifications cannot leak across reused
threads.
- Lower thread pool size from 10 to 3.
Chat relay groundwork:
- Add AcpChatRelayStore and AcpChatRelaySummaryProvider plus
AcpChatInternalService.loadSessionModel to support upcoming
acp_chat_prepareSessionDigest / acp_chat_postPreparedRelay tools.
- Update webmcp-tool-capabilities.md and add phase-2 / Zed-compat
planning docs.
Other:
- Implement AcpCliBackService.request() with an ephemeral ACP session
for non-streaming agent calls, mirroring requestStream cleanup.
Falls back to the OpenAI-compatible model when no agentSessionConfig
is provided.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ai-native): harden ACP MCP capability fallback
* feat: add WebMCP exposure switch
* refactor: preserve acp session notifications
* fix(ai-native): recycle ACP threads by LRU
* fix(ai-native): preserve ACP history titles
* test: add WebMCP contract red tests
* fix(ai-native): stabilize acp chat history sessions
* feat(ai-native): expand ACP chat input
* fix(ai-native): hide ACP chat clear header action
* feat(ai-native): add agentic panel layout
* feat(ai-native): add ACP agentic history rail
* test(ai-native): cover agentic layout split resizing
* feat(ai-native): support ACP session config controls
* feat(ai-native): improve ACP session state handling
* fix: isolate ai layout state profiles
* fix: restore ai chat layout visibility
* fix: open ai chat after layout switch
* fix: refresh tabbar resize handle on layout switch
* fix: restore ai chat after agentic layout toggle
* chore: add acp chat diagnostics
* feat: handle acp session state updates
* feat(ai-native): collapse agentic chat history
* fix: sort acp chat history by creation time
* chore: commit remaining acp workspace changes
* docs: remove obsolete acp notes
* test: provide webcrypto in jest node setup
* test: remove acp layout switch playwright test
* fix: update webmcp tool names and chat agent tests
* fix: dedupe WebMCP model context tools
* fix: prevent duplicate webmcp model context tools
* feat: configure ACP thread pool size
* fix(file-service): handle watcher process startup failures
* revert: file-service watcher startup handling
* feat(ai-native): unify built-in MCP management
* chore(ai-native): simplify WebMCP usage hint
* feat(ai-native): defer ACP session creation until first send
* fix(ai-native): tune classic chat panel sizing
* test(ai-native): remove deprecated WebMCP modelContext adapter test
* refactor(ai-native): simplify AcpChatViewWrapper initialization logic
Remove unnecessary timeout/retry logic from ACP initialization. The fallback
mechanism (ready() polling capped at 10s + catch block falling back to
fallbackToLocal()) already guarantees initialization never hangs forever,
making the 30s timeout and retry button dead weight.
Changes:
- Remove timedOut state, retryKey state, and timeoutTimer
- Remove handleRetry function and retry button from loading UI
- Change useEffect dependency from [retryKey] to [] (mount once)
- Keep cancelledRef for unmount cleanup
* chore(ai-native): remove unused .timeout_hint and .retry_button CSS
These classes were used only by the retry UI removed from
AcpChatViewWrapper.tsx. Grep confirmed no other component
references timeout_hint or retry_button in the ai-native package.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test: add ACP BDD scenarios
* fix(ai-native): ignore blank ACP chat submits
* chore: organize ACP BDD scenarios
* chore(test): move BDD evidence files to gitignored directory
Evidence artifacts (screenshots, JSON dumps, issue reports) were mixed
with scenario definitions in test/bdd/. Move them to test/bdd/evidence/
and add a local .gitignore so future /bdd-run outputs stay untracked.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: agentic history add mcp
* feat(ai-native): expose OpenSumi MCP connection
* fix(ai-native): restore agentic explorer panel width
* fix(file-service): stabilize dev watcher startup
* feat(ai-native): eager session init and deduplicate concurrent session creation
- AcpChatViewWrapper creates default session on init so ACP config
options render into the input area immediately
- ACPSessionProvider.loadSessions() guards against concurrent calls
with a shared promise, prevents duplicate network requests
- AcpChatInternalService.startSessionModel() deduplicates creation
via sessionCreationPromise; ensureSessionModel reuses it
* feat(ai-native): sort ACP sessions newest-first and support WebMCP profile query override
- Add getSessionCreatedAt/sortSessionsByCreatedAtDesc to sort session
list by creation time descending in acp_chat_list_sessions
- Add createdAt field to session summary output
- Support ?webMcpProfile= query param on localhost to override the
active WebMCP profile, useful for local development
* fix(ai-native): restore classic chat panel size and enable resize for both layout modes
- Classic mode now restores previous panel width (prevSize) instead of
always collapsing to default; capped at 1080px max
- Enable resize handle for both agentic and classic layouts via
useFixedResizeSideHandle(true, !isAgenticLayout)
- toggleAIChatView passes explicit open size when showing the panel
* docs: update BDD scenarios for ACP v2 session init, sorting, and layout changes
- Reflect eager session creation and deduplicated concurrent calls
- Update session list ordering expectations (newest-first)
- Add WebMCP profile query override scenarios
- Update classic panel size and resize handle expectations
- Clarify layer descriptions and profile coverage in README
* fix(ai-native): pass isLatter argument to resizeHandle.getSize()
ResizeHandle.getSize() now requires an isLatter boolean parameter.
The agentic left panel always uses targetIsLatter=true.
* refactor(ai-native): bridge ACP browser RPC clients internally
* fix: default ai native panel layout to classic
* ci: install libsecret-1-dev before yarn install on Linux
The keytar native module requires libsecret-1 to compile via
node-gyp when no prebuilt binary is available.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(ai-native): decouple mcp config command constants
* chore: restore non-ai-native test and watcher changes
* ci: skip electron binary download in unit test CI
The CI only runs node/jsdom tests and does not need the Electron
binary. Downloading it causes intermittent 504 timeouts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(ai-native): render ACP plan and recover prompt errors
* test: add BDD evidence reporting
* fix(ai-native): preserve ACP draft footer controls
* fix(ai-native): bootstrap ACP session metadata
Create a hidden ACP bootstrap session for footer metadata.
Add reusable ACP BDD fixtures, mock agent coverage, and docs.
* fix(ai-native): refine ACP agentic chat behavior
* test: stabilize mcp config ci checks
* fix(playwright): use fixture destructuring in ACP e2e tests
* chore(ai-native): remove thread status debug logs
* chore(ai-native): rename agentic layout label
* test: stabilize acp webmcp e2e setup
* test: stabilize acp reasoning and debug e2e
* fix(playwright): stabilize ACP and debug E2E tests
- Fix EXPLORER locator: use getByText instead of getByRole('heading')
since accordion headers are divs, not heading elements
- Fix Deep Thinking collapse test: use expect.poll() to handle timing
issues during stream completion re-renders
- Fix editor.close(): add optional force parameter for handling floating
UI elements (debug toolbar) intercepting clicks
- Apply force click only in debug tests where toolbar overlaps tabs
Fixes CI failures in acp-chat-agentic-startup, acp-chat-agentic-deep-thinking-collapse,
acp-chat-agentic-side-entry-filter, and debug tests.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(ai-native): stabilize agentic side entries
* test: add ACP long-stream BDD coverage
* test: add agentic history coverage
* test: harden ACP permission dialog BDD coverage
* test: cover ACP failure recovery fixtures
* fix(ai-native): load ACP history sessions for WebMCP list
* fix: handle ACP prompt disconnect recovery
* test: stabilize agentic explorer visibility wait
* fix(ai-native): expose full profile webmcp tools
* test(ai-native): add ACP fallback readiness fixture
* fix(ai-native): clear ACP context preview after send
* fix(ai-native): expose full-profile file mutation mcp tools
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>1 parent 44170e0 commit a07b4ee
254 files changed
Lines changed: 38370 additions & 5496 deletions
File tree
- .github/workflows
- packages
- ai-native
- __test__
- browser
- acp
- chat
- node
- acp
- __tests__/node/acp
- src
- browser
- acp
- components
- debug-log
- webmcp-groups
- chat
- components
- acp
- mention-input
- context
- layout
- view/avatar
- mcp
- config
- components
- preferences
- common
- prompts
- node
- acp
- handlers
- openai-compatible
- core-browser
- __tests__/components/layout
- src
- ai-native
- components/layout
- layout
- core-common/src
- settings
- types/ai-native
- file-service
- __tests__/node
- src/node
- i18n/src/common
- main-layout
- __tests__/browser
- src
- browser
- tabbar
- common
- startup/entry
- sample-modules/ai-native
- web/e2e
- scripts
- test/bdd
- fixtures/acp-agent
- tools/playwright/src
- tests
- utils
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
2 | 3 | | |
3 | 4 | | |
4 | 5 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
50 | 54 | | |
| 55 | + | |
| 56 | + | |
51 | 57 | | |
52 | 58 | | |
53 | 59 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
3 | 5 | | |
4 | 6 | | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
5 | 14 | | |
6 | 15 | | |
7 | 16 | | |
| |||
Lines changed: 33 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
0 commit comments