feat: add iSphere live probe recorder

This commit is contained in:
zhaoyilun
2026-07-10 10:59:48 +08:00
parent 349fbe4a44
commit f7914a63dc
13 changed files with 2209 additions and 16 deletions

View File

@@ -158,9 +158,9 @@ WRITE_NOT_READY
VERIFY_FAILED
```
## 6. 第一阶段 op
## 6. 当前只读 helper op
第一阶段只支持四个 op
当前 helper 只支持只读探测类 op。`version``self_check``scan_windows``dump_uia` 是第一阶段窗口/UIA 基线;`probe_client_runtime` 是 C30 为 B 路线发送连接器新增的只读运行时探测
### 6.1 `version`
@@ -182,7 +182,7 @@ VERIFY_FAILED
```json
{
"helper_name": "ISphereWinHelper",
"helper_version": "0.1.0",
"helper_version": "0.3.0",
"protocol": "isphere.helper.v1",
"runtime": ".NET Framework"
}
@@ -274,6 +274,66 @@ runs/real-loggedin-lab/uia-dumps/
C# helper 文件输出通过未来 `out_path` 参数控制。
### 6.5 `probe_client_runtime`
用途:为 B 路线发送连接器做只读运行时探测,确认本机是否存在已运行的 `IMPlatformClient.exe` / iSphere 相关进程,以及进程位数、安装路径、关键模块是否加载。
这个 op 只做进程和模块枚举:
- 不发送消息;
- 不上传文件;
- 不点击、不输入;
- 不注入、不 hook
- 不读取聊天内容。
请求示例:
```json
{
"protocol": "isphere.helper.v1",
"request_id": "...",
"op": "probe_client_runtime",
"timeout_ms": 5000,
"args": {
"process_names": ["IMPlatformClient", "IMPP.ISphere", "iSphere", "importal"],
"include_modules": true,
"max_modules": 120
}
}
```
响应 data 示例:
```json
{
"probe_mode": "read_only_process_module_inventory",
"host": {
"is_64_bit_os": true,
"is_64_bit_process": true
},
"target_count": 1,
"targets": [
{
"pid": 1234,
"process_name": "IMPlatformClient",
"main_window_title": "iSphere",
"executable_path": "C:\\...\\IMPlatformClient.exe",
"bitness": "x86",
"assembly_presence": {
"IMPlatformClient.exe": true,
"smack.dll": true,
"IMPP.Interface.dll": true,
"IMPP.ServiceBase.dll": true,
"IMPP.Service.dll": true
},
"module_probe_ok": true
}
]
}
```
该 op 是 C30 的 B 路线入口检查。它暂不等于发送能力,只用于判断后续是否值得做 sidecar / in-process 调用验证。
## 7. 后续 op 扩展顺序
必须等真实登录窗口的 UIA dump 被确认后,再扩展真实动作。
@@ -344,7 +404,7 @@ native/
## 11. 验收标准
第一阶段完成后,只验收:
当前只读 helper 基线验收:
1. C# helper 能编译。
2. `version` 返回合法 JSON。
@@ -353,17 +413,20 @@ native/
5. 打开记事本后,`dump_uia` 能导出记事本控件树。
6. 用户手动登录 iSphere 后,`scan_windows` 能找到候选窗口。
7. 对 iSphere 候选窗口执行 `dump_uia` 能返回控件树。
8. 第一阶段验收聚焦窗口扫描和 UIA dump 结果。
8. `probe_client_runtime` 在无目标客户端运行时也能返回合法空结果。
9. 用户手动登录 iSphere 后,`probe_client_runtime` 能返回目标进程、位数、路径和关键模块探测结果。
10. 当前验收仍聚焦只读探测;发送、文件上传、点击、输入都不在本节验收范围内。
## 12. 下一步
建议下一步只做 C# helper 第一阶段
当前下一步是 C30 B 路线运行时探测
```text
version
self_check
scan_windows
dump_uia
probe_client_runtime
```
Go MCP 代码在后续节点实现C# helper 稳定拿到真实 iSphere 窗口结构后,再实现 Go 的 `helperclient` 和 MCP tools
Go MCP 代码已经具备基础 helper 调用能力;`probe_client_runtime` 暂不暴露为 MCP 业务工具。待真实登录客户端上的 B1/B2 探测通过后,再决定是否新增 sidecar 调用层和受控发送工具

View File

@@ -0,0 +1,106 @@
# iSphere Live Probe Recorder
Date: 2026-07-10
Purpose: collect read-only runtime evidence from a machine where iSphere / IMPlatformClient can actually log in.
## Why this recorder exists
The current development machine cannot log in because the current network has no reachable server. Simulating login would only prove window rendering and would not prove the real logged-in runtime state required by the B-route sidecar connector.
Therefore the selected path is to carry a dedicated recorder executable to a working environment, run it after manual login, and bring the generated JSON evidence back.
## Built artifact
Package directory:
```text
runs/live-probe-recorder-package/
```
Executable:
```text
runs/live-probe-recorder-package/ISphereLiveProbeRecorder.exe
```
Zip package:
```text
runs/live-probe-recorder-package.zip
```
The package is generated by:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\package-live-probe-recorder.ps1
```
## Operator steps
1. Copy `runs/live-probe-recorder-package.zip` to the machine/network where iSphere can connect to its server.
2. Extract the zip.
3. Manually open and log in to iSphere / `IMPlatformClient.exe`.
4. Manually open one direct-contact chat window and one group-chat window if possible. Keep the editor/send/attachment area visible, but do not send anything.
5. Keep the client window open.
6. Double-click `ISphereLiveProbeRecorder.exe`.
7. The program writes a folder under:
```text
probe-output/isphere-live-probe-<timestamp>/
```
8. Compress that generated folder and return it.
## What it records
The recorder writes:
```text
manifest.json
probe_client_runtime.json
process_details.json
network_inventory.json
filesystem_inventory.json
services_registry_shortcuts.json
scan_windows.json
uia_summary.json
uia/*.json
feasibility_summary.json
README.txt
NEXT_STEP.txt
```
The important evidence is:
- target process PID/name/title/path;
- process bitness;
- loaded module list;
- command-line metadata with basic secret redaction;
- key module presence, including `smack.dll`, `IMPP.Interface.dll`, `IMPP.ServiceBase.dll`, `IMPP.Service.dll`, `TcpFileTransfer.dll`;
- visible window metadata;
- UIA tree for target windows, useful if route A UI/RPA is needed later.
- install/cache/config/log/database candidate metadata;
- version and SHA256 for important binaries;
- redacted text samples for small config/log files;
- uninstall registry entries;
- related services and shortcuts;
- target-process TCP connections;
- related named pipes.
## What it does not do
The recorder does not:
- send messages;
- send or upload files;
- click UI;
- type text;
- inject hooks;
- attach instrumentation;
- modify client files or data.
## Decision after returned evidence
If `probe_client_runtime.json` proves the loaded modules and bitness match the static evidence, continue with B-route sidecar design.
If the running client cannot be inspected, or the expected modules are absent, switch to the A-route constrained UI/RPA fallback.

View File

@@ -0,0 +1,357 @@
# Send Connector B-First Plan
Date: 2026-07-10
Node: C29 / write-side connector route correction
Decision owner: user/business manager
## Decision
The selected send route is now:
1. **Primary route B: in-process / sidecar connector** that reuses the already logged-in `IMPlatformClient.exe` runtime and its existing message/file send classes.
2. **Fallback route A: constrained UI/RPA wrapper** only if B cannot attach, load, or invoke safely.
3. **Network replay/protocol reimplementation remains deferred** because it would require independently reproducing login/session/ack behavior.
This document supersedes the previous C15/R5 conclusion for future send work. The old conclusion was correct for the evidence available at that time: no write connector had been selected. This node records the newly approved route and the evidence that makes B worth trying first.
## Business goal
Expose controlled MCP actions for digital employees:
- `isphere_send_message`
- `isphere_send_file`
The implementation must preserve these business controls:
- target must be resolved from existing contact/group search results;
- text/file content must be previewed before execution;
- execution must use an `idempotency_key` and content hash;
- every outbound attempt must produce an audit record;
- early versions should support sandbox/test-target verification before normal production use.
## Static evidence summary
Offline package evidence under:
```text
runs/offline-evidence-intake/zyl-qqfile-20260709/
```
Relevant extracted binaries:
```text
zyl/Impp/IMPlatformClient.exe
zyl/Impp/smack.dll
zyl/Impp/IMPP.Interface.dll
zyl/Impp/IMPP.ServiceBase.dll
zyl/Impp/IMPP.Service.dll
zyl/Impp/TcpFileTransfer.dll
zyl/Impp/HYHC.IMPP.DAL.dll
```
Relevant IL snapshots:
```text
runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c28-il/IMPlatformClient.exe.il
runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c28-il/smack.dll.il
runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c28-il/IMPP.Interface.dll.il
runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c28-il/IMPP.Service.dll.il
runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c28-il/IMPP.ServiceBase.dll.il
```
## Text-send call chain
### Preferred sidecar candidate
`IMPlatformClient.exe` contains a high-level helper:
```text
IMPP.Client.Core.Plugins.Manager.AppContextManager.SendTxtMessageByJid(jid, chatType, content)
```
Observed behavior from IL:
- for direct/P2P chat, it gets a `P2PChatManager` from `IMPPManager.Instance`;
- it resolves a `Chat` by JID;
- it finds or opens a chat form;
- it calls `frmP2PChat.SendTxtMessage(content)`;
- for temporary/reserved group chat, it calls the corresponding room form send method.
This is the best B-route first target because it reuses the logged-in client's own state and UI/business rules.
### Central message construction candidate
`IMPlatformClient.exe` also contains:
```text
IMPP.Client.Core.MessageEngine.MessageScheduling.SendChatMessage(chat, msgText, toJid, messageType, isSaveMessage, msgGuid, IsReceipt)
```
Observed behavior from IL:
- reads local font/style settings;
- builds message body via `UtilsText.GetMessageStyleBodyText`;
- decides `chat` vs `groupchat`;
- creates `smack.packet.XmppMessage`;
- sets body, subject, offline flag, receipt flag, time, and message type;
- calls `chat.SendMessage(xmppMessage)`;
- optionally persists/parses message through `MessageManager.MessageParsing`.
This is the cleanest lower-level B candidate if the sidecar can obtain a valid `Chat` object from the running client context.
### Protocol bottom
`smack.dll` provides the real wire-send chain:
```text
com.vision.smack.Chat.SendMessage(XmppMessage)
-> com.vision.smack.XMPPConnection.send(string)
-> Sharp.Xmpp.Core.XmppCore.Send(string)
-> stream.Write(...)
```
This proves that the send capability exists in the installed client binaries. It also shows why an external reimplementation is less attractive: it would need the same active connection, stanza format, message id, receipt, and session state.
## Important trap: plugin interface text send is not enough
`IMPP.Interface.dll` declares:
```text
IAppContextManager.SendP2PMessage(string pJid, string pMessage)
IAppContextManager.SendP2PFiles(UserInfo[] pUserInfo, string[] pFiles)
IAppContextManager.SendChatRoomMessage(string pRoomJid, string pMessage, string pluginID)
IAppContextManager.SendPluginMessage(string pluginID, int command, string para)
```
But the implementation of:
```text
IMPP.Client.Core.Plugins.Manager.AppContextManager.SendP2PMessage(...)
```
records the plugin call and then throws `NotImplementedException`.
Therefore the B route must **not** choose `SendP2PMessage` as the text-send entry. The sidecar should prefer `SendTxtMessageByJid` or, if necessary, `MessageScheduling.SendChatMessage` with an existing `Chat` object.
## File-send call chain
File sending appears split into upload plus file-message notification.
### Upload engine
`IMPP.ServiceBase.dll` defines `IFileTransfer`.
`IMPP.Service.dll` implements:
```text
IMPP.Service.BLL.FileTransfer.FileUpload(...)
IMPP.Service.BLL.FileTransfer.AsynFileUpload(...)
IMPP.Service.BLL.FileTransfer.FileDownload(...)
IMPP.Service.BLL.FileTransfer.SyncFileTransfer(...)
```
### Offline file send
`IMPlatformClient.exe` contains:
```text
IMPP.Client.OffLineFileSend.sendFile()
IMPP.Client.OffLineFileSend.trans_UploadCompleted(fileId)
```
Observed behavior:
- builds a generated file GUID;
- builds remote name as `filename____guid.ext`;
- uses `Config.ServerInfo.HTTPFileServer` and `FileTransferManager.GetDomain`;
- creates `FileUploadPara`;
- calls `IMPPManager.Instance.Service.FileTransfer.FileUpload(uploadPara)`;
- after upload completion, creates an `OFFLINE_FILE_TRANSFER;...` message body;
- calls `Chat.sendFileMessage(...)`;
- sets packet id to `fileId` and records metadata.
### Native TCP file transfer
`TcpFileTransfer.dll` is native and exposes strings/exports indicating:
```text
Send
SendFile
GetTcpFileMsgGuid
_StartWaitForSendFileThread@8
_StartRecvFileThread@24
```
This is a candidate for online/TCP file transfer, but the first B route should use the managed offline-file path because it is closer to the normal client business flow and already integrates upload metadata with XMPP file messages.
## Proposed sidecar architecture
```text
Go MCP Server
-> controlled action contract and audit
-> C# WinHelper / Sidecar command
-> B-route sidecar adapter
-> running IMPlatformClient context
-> existing AppContextManager / MessageScheduling / OffLineFileSend / smack.dll
```
The sidecar should be a narrow adapter, not a general-purpose remote code executor.
### Candidate sidecar operations
```text
version
self_check
probe_client_runtime
probe_send_entrypoints
resolve_runtime_jid
preview_send_message
send_message_after_approval
preview_send_file
send_file_after_approval
read_send_audit
```
The first implementation slice should stop before real production send:
```text
version
self_check
probe_client_runtime
probe_send_entrypoints
```
Then run a live sandbox observation before enabling `send_message_after_approval`.
## B-route validation gates
### Gate B1: runtime discovery
Pass condition:
- find a running `IMPlatformClient.exe` process;
- record PID, bitness, install path, module list summary;
- confirm the discovered path matches the extracted evidence family;
- confirm whether the sidecar must be x86 or x64.
Stop condition:
- no logged-in process;
- process bitness incompatible with available sidecar build;
- module names differ too much from the extracted package.
### Gate B2: entrypoint availability
Pass condition:
- confirm `IMPlatformClient.exe` exposes `AppContextManager` and `MessageScheduling` in the runtime module set;
- confirm `smack.dll` is loaded or loadable from the same install directory;
- confirm `IMPP.Interface.dll` and `IMPP.Service*.dll` are present.
Stop condition:
- app is not .NET Framework / cannot inspect CLR runtime safely;
- required assemblies are missing;
- only `SendP2PMessage` is available but `SendTxtMessageByJid`/`MessageScheduling` cannot be reached.
### Gate B3: non-mutating dynamic observation
Pass condition:
- during one operator-approved manual test send, observe the expected chain:
- `SendTxtMessageByJid` or UI send method;
- `MessageScheduling.SendChatMessage`;
- `Chat.SendMessage`;
- `XMPPConnection.send`;
- capture only redacted method names, argument shape, message id/hash, and success/ack indicator.
Stop condition:
- method chain differs from static evidence;
- no success/ack indicator can be mapped;
- message id/idempotency cannot be correlated.
### Gate B4: sidecar dry run
Pass condition:
- sidecar can resolve the target JID/chat type;
- sidecar can build a preview object without sending;
- preview contains target, content hash, connector, and proposed entrypoint;
- audit event is appended.
Stop condition:
- no deterministic target resolution;
- preview cannot distinguish direct vs group chat;
- no auditable dry-run object.
### Gate B5: one sandbox send
Pass condition:
- one explicit test target only;
- one idempotency key only;
- one message content hash only;
- success/ack or local sent-record evidence captured;
- duplicate retry with same idempotency key is rejected locally.
Stop condition:
- duplicate send risk;
- wrong target risk;
- no post-send verification.
## A-route fallback
A remains the backup route if B cannot be made reliable.
A should not be arbitrary desktop control. It should expose only:
```text
search_contact(query)
open_conversation(target)
write_draft(text)
verify_draft(target, text_hash)
send_after_approval(approval_id)
upload_file(path)
verify_send_result()
```
A-route fallback is activated when any of these happen:
- B cannot attach/probe safely;
- required runtime classes are unavailable in the logged-in process;
- B can observe but cannot invoke without unstable side effects;
- B cannot provide idempotency/audit guarantees;
- sidecar bitness/runtime mismatch is too costly to resolve in the current cycle.
## MCP contract impact
The MCP business tools should not expose B/A internals directly. They should keep the stable user-facing shape:
```text
isphere_send_message(target_type, target_id, content_text, mode, idempotency_key, content_sha256)
isphere_send_file(target_type, target_id, file_path, mode, idempotency_key, file_sha256)
```
Connector metadata should show the route:
```text
connector = "implatform-sidecar" | "uia-rpa"
connector_stage = "preview" | "sandbox_send" | "production"
```
## Next implementation loop
Next node should be **C30 B-route runtime probe**:
1. Use the C# WinHelper read-only op `probe_client_runtime`.
2. Probe running `IMPlatformClient.exe` process, bitness, path, loaded modules, and installed assembly presence.
3. Do not send, click, type, upload, or attach hooks in this node.
4. Write probe output to `runs/real-loggedin-lab/sidecar-probe/` if a live client is available.
5. Update `capability-source-matrix.md` after B1/B2 pass or fail.
## Current status
B is selected as the primary send/file-send route. The first non-mutating runtime probe op has been added to `ISphereWinHelper` as `probe_client_runtime`; local verification passed with no target client running. The next executable work is to run that probe while the real iSphere/`IMPlatformClient.exe` client is logged in, then perform non-mutating entrypoint confirmation.

View File

@@ -12,6 +12,8 @@ Build the first business read capability path for `isphere_receive_messages` fro
- `docs/source-discovery/2026-07-09-n12-pre-zyl-index.md`
- `docs/source-discovery/2026-07-09-n12-pre-zyl-schema-notes.md`
- `docs/source-discovery/capability-source-matrix.md`
- `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md`
- `docs/source-discovery/2026-07-10-live-probe-recorder.md`
- `docs/mcp-core-tools-contract.md`
- `docs/mcp-core-business-plan.md`
@@ -41,3 +43,7 @@ See `docs/superpowers/plans/2026-07-09-stage-c-log-backed-receive-messages-loop.
## Last completed discovery result
Stage B2 showed that selected `MsgLib.db` files are not direct SQLite. Decrypted `PacketReader.ProcessPacket` XML is now the first implementable source for `isphere_receive_messages`.
C29 corrected the write-side route after static binary evidence review and user decision: `isphere_send_message` should prioritize the running-client sidecar / in-process connector route, with constrained UI/RPA as fallback. The next write-side loop is a non-mutating B-route runtime probe.
C30 adds a portable `ISphereLiveProbeRecorder.exe` package for environments where iSphere can actually log in. The recorder collects read-only runtime evidence and writes JSON output for B-route sidecar feasibility analysis.

View File

@@ -7,11 +7,12 @@ Schema notes: `docs/source-discovery/2026-07-09-n12-pre-zyl-schema-notes.md`
## Source priority
1. Existing bridge / API / local service.
2. Local data, log, cache, or database source.
3. UIA helper source through C# WinHelper.
4. Network/protocol source.
5. Mock source for tests only.
1. Running-client sidecar / in-process connector that reuses the logged-in `IMPlatformClient.exe` runtime.
2. Existing bridge / API / local service.
3. Local data, log, cache, or database source.
4. UIA helper source through C# WinHelper.
5. Network/protocol source.
6. Mock source for tests only.
## Matrix
@@ -21,8 +22,8 @@ Schema notes: `docs/source-discovery/2026-07-09-n12-pre-zyl-schema-notes.md`
| `isphere_search_contacts` | bare sender/receiver JIDs extracted from normalized log-backed messages loaded from configured PacketReader file or directory source | validated copied `MsgLib.db` tables: `TD_Roster`, `TD_CustomEffigy`, `tblRecent`, `tblChatLevel`, `tblPersonMsg`; decrypted roster/contact stanzas from `Smark.SendReceive`; UIA helper source if display names are still missing | `docs/source-discovery/2026-07-10-msglib-readonly-schema-extraction.md`; `internal/isphere/contacts_test.go`; `internal/tools/isphere_contacts_test.go` | C34 documents optional MsgLib contact display enrichment; R2 adds deterministic exact-match-first ranking, case-insensitive de-duplication across log/MsgLib candidates, and preserves `source`/`raw_ref` | core contact search complete; optional richer fields later |
| `isphere_search_groups` | decrypted `PacketReader.ProcessPacket` `type="groupchat"` stanzas and conference/MUC JIDs loaded from configured PacketReader file or directory source | validated copied `MsgLib.db` tables: `tblMsgGroupPersonMsg`, `TD_WorkGroupAuth`, `tblRecent`; UIA helper source if group display names are still missing | `docs/source-discovery/2026-07-10-msglib-readonly-schema-extraction.md`; `internal/isphere/groups_test.go`; `internal/tools/isphere_groups_test.go`; C9 ignored-log scan: PacketReader 86 groupchat/86 conference hits; Smark 24 groupchat/658 conference/631 muc hits | C34 documents optional MsgLib group display enrichment; R2 adds deterministic exact-match-first ranking, case-insensitive de-duplication across log/MsgLib candidates, and preserves `source`/`raw_ref` | core group search complete; optional member/owner hierarchy later |
| `isphere_receive_files` | decrypted `PacketReader.ProcessPacket` file-transfer message stanzas via `internal/isphere.ListFilesFromMessages` and `isphere_receive_files` list mode; configured PacketReader file or directory source; `zyl\importal\<hash>` cache entries remain unlinked | MsgLib `TD_ReceiveFileRecord` safe metadata through explicit copied-DB path; decrypted `Smark.SendReceive` and `SaveToDB` traces for file-reference reconciliation; future UIA/client connector for download | `docs/source-discovery/2026-07-09-n12-pre-zyl-schema-notes.md#c12-file-transfer-evidence-precheck`; `docs/source-discovery/2026-07-10-file-download-mapping-precheck.md`; `docs/source-discovery/2026-07-10-file-cache-mapping-diagnostic.md` | C22 verifies safe file-list contract args; R3 confirms list metadata is available; R3b diagnostic finds 0 current cache/archive matches, so R4 remains blocked | blocked pending better cache evidence or UI/client download connector |
| `isphere_send_message` | none validated yet | existing bridge/API/local service preferred; UIA write connector only after internal-sandbox action evidence; network/protocol connector only after protocol discovery | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md` | C15 and R5 blocked: contract exists, but no committed bridge/API/local service, helper write op, UIA action chain, or protocol connector is validated | blocked pending connector evidence package |
| `isphere_send_file` | none validated yet | depends on send-message connector plus outbound file/upload evidence | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md` | blocked behind `isphere_send_message` connector selection and file upload/source policy; R5 found no send connector | blocked pending send connector evidence |
| `isphere_send_message` | B-route selected: running-client sidecar / in-process connector, preferring `AppContextManager.SendTxtMessageByJid(...)` or `MessageScheduling.SendChatMessage(...)` over the unimplemented `SendP2PMessage(...)` interface path | A-route fallback: constrained UI/RPA wrapper only if B cannot pass runtime probe, entrypoint availability, dynamic observation, and idempotent dry-run gates; network/protocol replay remains deferred | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md`; `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md` | C29 route correction: previous C15/R5 block remains historical evidence; user approved B primary and A backup. Static IL evidence identifies the client-side send chain `IMPlatformClient.exe -> smack.dll`, but no runtime sidecar send is implemented yet | next: C30 B-route runtime probe, then non-mutating manual-send observation before enabling sandbox send |
| `isphere_send_file` | B-route selected after send-message probe: managed offline-file path through `OffLineFileSend.sendFile()`, `IMPP.Service*.dll` `IFileTransfer.FileUpload(...)`, and `Chat.sendFileMessage(...)` | A-route fallback: constrained UI/RPA upload/send-file flow; native `TcpFileTransfer.dll` is a later candidate only after managed path is rejected | `docs/source-discovery/2026-07-10-send-message-source-precheck.md`; `docs/source-discovery/2026-07-10-send-message-connector-selection.md`; `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md` | C29 route correction: static IL evidence identifies upload-plus-file-message chain, but runtime probe and one approved sandbox file-send observation are still required | next: wait for C30/C31 message-send probe; then C32 file-send runtime/upload probe |
## Stage C entry rule

View File

@@ -0,0 +1,146 @@
# C30 Send Sidecar Runtime Probe Plan
Date: 2026-07-10
Route decision: B primary, A fallback
Parent: `docs/source-discovery/2026-07-10-send-sidecar-b-first-plan.md`
## Objective
Prove whether the running logged-in iSphere / `IMPlatformClient.exe` client on this machine can support the B-route sidecar connector.
This node is read-only. It does not send messages, upload files, click UI, type text, inject hooks, or attach runtime instrumentation.
## Scope
Use `ISphereWinHelper` op:
```text
probe_client_runtime
```
For a machine where iSphere can actually log in, prefer the portable package:
```text
runs/live-probe-recorder-package.zip
```
It collects the runtime probe plus process details, network metadata, filesystem candidates, registry/service/shortcut inventory, and UIA target-window dumps in one run.
Collect:
- target process PID;
- process name;
- main window title/handle;
- executable path;
- process bitness;
- helper host bitness;
- target-process command-line metadata with redaction;
- key module presence:
- `IMPlatformClient.exe`
- `smack.dll`
- `IMPP.Interface.dll`
- `IMPP.ServiceBase.dll`
- `IMPP.Service.dll`
- `TcpFileTransfer.dll`
- `HYHC.IMPP.DAL.dll`
- install/cache/config/log/database candidate metadata;
- key file versions and hashes;
- target-process TCP connections and related named pipes;
- registry uninstall entries, services, shortcuts;
- UIA target-window dumps for A-route fallback.
## Acceptance gates
### B1 runtime discovery
Pass when:
- at least one target process is returned;
- target score favors `IMPlatformClient` / iSphere;
- executable path is present;
- bitness is known or module probing still succeeds.
Fail when:
- no target process is running;
- process cannot be inspected enough to determine path/bitness;
- discovered process does not match iSphere/IMPlatformClient.
### B2 module availability
Pass when:
- `IMPlatformClient.exe` is confirmed;
- `smack.dll` is present in loaded modules or install path evidence;
- `IMPP.Interface.dll`, `IMPP.ServiceBase.dll`, and `IMPP.Service.dll` are present or explainably loadable.
Fail when:
- `smack.dll` is absent and no install-path fallback is available;
- service/interface DLLs are absent;
- helper bitness prevents module inspection and no x86/x64 helper variant is available.
## Commands
Build and verify helper:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\verify-win-helper.ps1
```
Run live runtime probe after the user has logged in to iSphere:
```powershell
$request = @{
protocol = 'isphere.helper.v1'
request_id = 'c30-live-runtime-probe'
op = 'probe_client_runtime'
timeout_ms = 5000
args = @{
process_names = @('IMPlatformClient', 'IMPP.ISphere', 'iSphere', 'importal')
include_modules = $true
max_modules = 160
}
} | ConvertTo-Json -Depth 8 -Compress
$request | .\runs\win-helper\ISphereWinHelper.exe | Tee-Object -FilePath .\runs\real-loggedin-lab\sidecar-probe\c30-runtime-probe.json
```
If the target is 32-bit and module probing fails from the default helper, rebuild x86 helper:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\build-win-helper.ps1 -Platform x86 -OutputDir runs\win-helper-x86
```
Then rerun the same request against:
```powershell
.\runs\win-helper-x86\ISphereWinHelper.exe
```
## Output artifacts
If a logged-in client is available, write:
```text
runs/real-loggedin-lab/sidecar-probe/c30-runtime-probe.json
```
Then update:
```text
docs/source-discovery/capability-source-matrix.md
```
## Next node decision
If B1/B2 pass:
- move to C31 non-mutating manual-send observation plan;
- observe whether manual send hits `SendTxtMessageByJid`, `MessageScheduling.SendChatMessage`, `Chat.SendMessage`, and `XMPPConnection.send`.
If B1/B2 fail:
- document exact failure;
- decide whether to try x86/x64 helper variant;
- if still blocked, activate A-route constrained UI/RPA fallback.